1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/core/timing/performance_server_timing.h"
6 
7 #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
8 #include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h"
9 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
10 
11 namespace blink {
12 
PerformanceServerTiming(const String & name,double duration,const String & description)13 PerformanceServerTiming::PerformanceServerTiming(const String& name,
14                                                  double duration,
15                                                  const String& description)
16     : name_(name), duration_(duration), description_(description) {}
17 
18 PerformanceServerTiming::~PerformanceServerTiming() = default;
19 
toJSONForBinding(ScriptState * script_state) const20 ScriptValue PerformanceServerTiming::toJSONForBinding(
21     ScriptState* script_state) const {
22   V8ObjectBuilder builder(script_state);
23   builder.AddString("name", name());
24   builder.AddNumber("duration", duration());
25   builder.AddString("description", description());
26   return builder.GetScriptValue();
27 }
28 
29 Vector<mojom::blink::ServerTimingInfoPtr>
ParseServerTimingToMojo(const ResourceTimingInfo & info)30 PerformanceServerTiming::ParseServerTimingToMojo(
31     const ResourceTimingInfo& info) {
32   Vector<mojom::blink::ServerTimingInfoPtr> result;
33   const ResourceResponse& response = info.FinalResponse();
34   std::unique_ptr<ServerTimingHeaderVector> headers = ParseServerTimingHeader(
35       response.HttpHeaderField(http_names::kServerTiming));
36   result.ReserveCapacity(headers->size());
37   for (const auto& header : *headers) {
38     result.emplace_back(mojom::blink::ServerTimingInfo::New(
39         header->Name(), header->Duration(), header->Description()));
40   }
41   return result;
42 }
43 
44 HeapVector<Member<PerformanceServerTiming>>
ParseServerTiming(const ResourceTimingInfo & info)45 PerformanceServerTiming::ParseServerTiming(const ResourceTimingInfo& info) {
46   HeapVector<Member<PerformanceServerTiming>> result;
47   const ResourceResponse& response = info.FinalResponse();
48   std::unique_ptr<ServerTimingHeaderVector> headers = ParseServerTimingHeader(
49       response.HttpHeaderField(http_names::kServerTiming));
50   result.ReserveCapacity(headers->size());
51   for (const auto& header : *headers) {
52     result.push_back(MakeGarbageCollected<PerformanceServerTiming>(
53         header->Name(), header->Duration(), header->Description()));
54   }
55   return result;
56 }
57 
58 HeapVector<Member<PerformanceServerTiming>>
FromParsedServerTiming(const Vector<mojom::blink::ServerTimingInfoPtr> & entries)59 PerformanceServerTiming::FromParsedServerTiming(
60     const Vector<mojom::blink::ServerTimingInfoPtr>& entries) {
61   HeapVector<Member<PerformanceServerTiming>> result;
62   for (const auto& entry : entries) {
63     result.push_back(MakeGarbageCollected<PerformanceServerTiming>(
64         entry->name, entry->duration, entry->description));
65   }
66   return result;
67 }
68 
69 }  // namespace blink
70