1 // Copyright 2019 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 "content/browser/cache_storage/cache_storage_trace_utils.h"
6 
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/trace_event/traced_value.h"
9 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
10 
11 namespace content {
12 
13 namespace {
14 
15 template <typename T>
MojoEnumToString(T value)16 std::string MojoEnumToString(T value) {
17   std::ostringstream oss;
18   oss << value;
19   return oss.str();
20 }
21 
22 }  // namespace
23 
24 using base::trace_event::TracedValue;
25 
CacheStorageTracedValue(blink::mojom::CacheStorageError error)26 std::string CacheStorageTracedValue(blink::mojom::CacheStorageError error) {
27   return MojoEnumToString(error);
28 }
29 
CacheStorageTracedValue(const blink::mojom::FetchAPIRequestPtr & request)30 std::unique_ptr<TracedValue> CacheStorageTracedValue(
31     const blink::mojom::FetchAPIRequestPtr& request) {
32   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
33   if (request) {
34     value->SetString("url", request->url.spec());
35     value->SetString("method", MojoEnumToString(request->method));
36     value->SetString("mode", MojoEnumToString(request->mode));
37   }
38   return value;
39 }
40 
CacheStorageTracedValue(const std::vector<blink::mojom::FetchAPIRequestPtr> & request_list)41 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
42     const std::vector<blink::mojom::FetchAPIRequestPtr>& request_list) {
43   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
44   value->SetInteger("count", request_list.size());
45   if (!request_list.empty()) {
46     value->SetValue("first",
47                     CacheStorageTracedValue(request_list.front()).get());
48   }
49   return value;
50 }
51 
CacheStorageTracedValue(const blink::mojom::FetchAPIResponsePtr & response)52 std::unique_ptr<TracedValue> CacheStorageTracedValue(
53     const blink::mojom::FetchAPIResponsePtr& response) {
54   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
55   if (response) {
56     if (!response->url_list.empty())
57       value->SetString("url", response->url_list.back().spec());
58     value->SetString("type", MojoEnumToString(response->response_type));
59   }
60   return value;
61 }
62 
CacheStorageTracedValue(const std::vector<blink::mojom::FetchAPIResponsePtr> & response_list)63 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
64     const std::vector<blink::mojom::FetchAPIResponsePtr>& response_list) {
65   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
66   value->SetInteger("count", response_list.size());
67   if (!response_list.empty()) {
68     value->SetValue("first",
69                     CacheStorageTracedValue(response_list.front()).get());
70   }
71   return value;
72 }
73 
CacheStorageTracedValue(const blink::mojom::CacheQueryOptionsPtr & options)74 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
75     const blink::mojom::CacheQueryOptionsPtr& options) {
76   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
77   if (options) {
78     value->SetBoolean("ignore_method", options->ignore_method);
79     value->SetBoolean("ignore_search", options->ignore_search);
80     value->SetBoolean("ignore_vary", options->ignore_vary);
81   }
82   return value;
83 }
84 
CacheStorageTracedValue(const blink::mojom::MultiCacheQueryOptionsPtr & options)85 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
86     const blink::mojom::MultiCacheQueryOptionsPtr& options) {
87   if (!options)
88     return std::make_unique<TracedValue>();
89   std::unique_ptr<TracedValue> value =
90       CacheStorageTracedValue(options->query_options);
91   if (options->cache_name) {
92     value->SetString("cache_name", base::UTF16ToUTF8(*options->cache_name));
93   }
94   return value;
95 }
96 
CacheStorageTracedValue(const blink::mojom::BatchOperationPtr & op)97 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
98     const blink::mojom::BatchOperationPtr& op) {
99   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
100   if (op) {
101     value->SetString("operation_type", MojoEnumToString(op->operation_type));
102     value->SetValue("request", CacheStorageTracedValue(op->request).get());
103     value->SetValue("response", CacheStorageTracedValue(op->response).get());
104     value->SetValue("options",
105                     CacheStorageTracedValue(op->match_options).get());
106   }
107   return value;
108 }
109 
CacheStorageTracedValue(const std::vector<blink::mojom::BatchOperationPtr> & operation_list)110 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
111     const std::vector<blink::mojom::BatchOperationPtr>& operation_list) {
112   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
113   value->SetInteger("count", operation_list.size());
114   if (!operation_list.empty()) {
115     value->SetValue("first",
116                     CacheStorageTracedValue(operation_list.front()).get());
117   }
118   return value;
119 }
120 
CacheStorageTracedValue(const std::vector<base::string16> string_list)121 std::unique_ptr<base::trace_event::TracedValue> CacheStorageTracedValue(
122     const std::vector<base::string16> string_list) {
123   std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>();
124   value->SetInteger("count", string_list.size());
125   if (!string_list.empty()) {
126     value->SetString("first", base::UTF16ToUTF8(string_list.front()));
127   }
128   return value;
129 }
130 
131 }  // namespace content
132