Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: extensions/browser/api/declarative/declarative_api.cc

Issue 2863053002: Extensions: Add metrics to distinguish between the different kinds of declarative API function call… (Closed)
Patch Set: Address comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/browser/api/declarative/declarative_api.h" 5 #include "extensions/browser/api/declarative/declarative_api.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/metrics/histogram_macros.h"
12 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/strings/string_util.h"
13 #include "base/task_runner_util.h" 15 #include "base/task_runner_util.h"
14 #include "base/values.h" 16 #include "base/values.h"
15 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/render_frame_host.h" 18 #include "content/public/browser/render_frame_host.h"
17 #include "content/public/browser/render_process_host.h" 19 #include "content/public/browser/render_process_host.h"
18 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
19 #include "extensions/browser/api/declarative/rules_registry_service.h" 21 #include "extensions/browser/api/declarative/rules_registry_service.h"
20 #include "extensions/browser/api/extensions_api_client.h" 22 #include "extensions/browser/api/extensions_api_client.h"
21 #include "extensions/browser/extension_system.h" 23 #include "extensions/browser/extension_system.h"
22 #include "extensions/browser/guest_view/web_view/web_view_constants.h" 24 #include "extensions/browser/guest_view/web_view/web_view_constants.h"
23 #include "extensions/browser/guest_view/web_view/web_view_guest.h" 25 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
24 #include "extensions/common/api/events.h" 26 #include "extensions/common/api/events.h"
25 #include "extensions/common/extension_api.h" 27 #include "extensions/common/extension_api.h"
26 #include "extensions/common/permissions/permissions_data.h" 28 #include "extensions/common/permissions/permissions_data.h"
27 29
28 using extensions::api::events::Rule; 30 using extensions::api::events::Rule;
29 31
30 namespace AddRules = extensions::api::events::Event::AddRules; 32 namespace AddRules = extensions::api::events::Event::AddRules;
31 namespace GetRules = extensions::api::events::Event::GetRules; 33 namespace GetRules = extensions::api::events::Event::GetRules;
32 namespace RemoveRules = extensions::api::events::Event::RemoveRules; 34 namespace RemoveRules = extensions::api::events::Event::RemoveRules;
33 35
34 namespace extensions { 36 namespace extensions {
35 37
36 namespace { 38 namespace {
37 39
38 const char kDeclarativeEventPrefix[] = "declarative"; 40 constexpr char kDeclarativeEventPrefix[] = "declarative";
41 constexpr char kDeclarativeContentEventPrefix[] = "declarativeContent.";
42 constexpr char kDeclarativeWebRequestEventPrefix[] = "declarativeWebRequest.";
43 constexpr char kDeclarativeWebRequestWebViewEventPrefix[] =
44 "webViewInternal.declarativeWebRequest.";
45
46 // The type of Declarative API. To collect more granular metrics, a distinction
47 // is made when the declarative web request API is used from a webview.
48 enum class DeclarativeAPIType {
49 kContent,
50 kWebRequest,
51 kWebRequestWebview,
52 kUnknown,
53 };
54
55 // Describes the possible types of declarative API function calls.
56 // These values are recorded as UMA. New enum values can be added, but existing
57 // enum values must never be renumbered or deleted and reused.
58 enum DeclarativeAPIFunctionType {
59 kDeclarativeContentAddRules = 0,
60 kDeclarativeContentRemoveRules = 1,
61 kDeclarativeContentGetRules = 2,
62 kDeclarativeWebRequestAddRules = 3,
63 kDeclarativeWebRequestRemoveRules = 4,
64 kDeclarativeWebRequestGetRules = 5,
65 kDeclarativeWebRequestWebviewAddRules = 6,
66 kDeclarativeWebRequestWebviewRemoveRules = 7,
67 kDeclarativeWebRequestWebviewGetRules = 8,
68 kDeclarativeApiFunctionCallTypeMax,
69 };
70
71 DeclarativeAPIType GetDeclarativeAPIType(const std::string& event_name) {
72 if (base::StartsWith(event_name, kDeclarativeContentEventPrefix,
73 base::CompareCase::SENSITIVE))
74 return DeclarativeAPIType::kContent;
75 if (base::StartsWith(event_name, kDeclarativeWebRequestEventPrefix,
76 base::CompareCase::SENSITIVE))
77 return DeclarativeAPIType::kWebRequest;
78 if (base::StartsWith(event_name, kDeclarativeWebRequestWebViewEventPrefix,
79 base::CompareCase::SENSITIVE))
80 return DeclarativeAPIType::kWebRequestWebview;
81 return DeclarativeAPIType::kUnknown;
82 }
83
84 void RecordUMAHelper(DeclarativeAPIFunctionType type) {
85 DCHECK_LT(type, kDeclarativeApiFunctionCallTypeMax);
86 UMA_HISTOGRAM_ENUMERATION("Extensions.DeclarativeAPIFunctionCalls", type,
87 kDeclarativeApiFunctionCallTypeMax);
88 }
39 89
40 void ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict); 90 void ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict);
41 91
42 // Encodes |binary| as base64 and returns a new StringValue populated with the 92 // Encodes |binary| as base64 and returns a new StringValue populated with the
43 // encoded string. 93 // encoded string.
44 std::unique_ptr<base::Value> ConvertBinaryToBase64(base::Value* binary) { 94 std::unique_ptr<base::Value> ConvertBinaryToBase64(base::Value* binary) {
45 std::string binary_data(binary->GetBlob().data(), binary->GetBlob().size()); 95 std::string binary_data(binary->GetBlob().data(), binary->GetBlob().size());
46 std::string data64; 96 std::string data64;
47 base::Base64Encode(binary_data, &data64); 97 base::Base64Encode(binary_data, &data64);
48 return std::unique_ptr<base::Value>(new base::Value(data64)); 98 return std::unique_ptr<base::Value>(new base::Value(data64));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 } 168 }
119 169
120 bool RulesFunction::RunAsync() { 170 bool RulesFunction::RunAsync() {
121 std::string event_name; 171 std::string event_name;
122 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); 172 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name));
123 173
124 int web_view_instance_id = 0; 174 int web_view_instance_id = 0;
125 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &web_view_instance_id)); 175 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &web_view_instance_id));
126 int embedder_process_id = render_frame_host()->GetProcess()->GetID(); 176 int embedder_process_id = render_frame_host()->GetProcess()->GetID();
127 177
178 RecordUMA(event_name);
179
128 bool from_web_view = web_view_instance_id != 0; 180 bool from_web_view = web_view_instance_id != 0;
129 // If we are not operating on a particular <webview>, then the key is 0. 181 // If we are not operating on a particular <webview>, then the key is 0.
130 int rules_registry_id = RulesRegistryService::kDefaultRulesRegistryID; 182 int rules_registry_id = RulesRegistryService::kDefaultRulesRegistryID;
131 if (from_web_view) { 183 if (from_web_view) {
132 // Sample event names: 184 // Sample event names:
133 // webViewInternal.declarativeWebRequest.onRequest. 185 // webViewInternal.declarativeWebRequest.onRequest.
134 // webViewInternal.declarativeWebRequest.onMessage. 186 // webViewInternal.declarativeWebRequest.onMessage.
135 // The "webViewInternal." prefix is removed from the event name. 187 // The "webViewInternal." prefix is removed from the event name.
136 std::size_t found = event_name.find(kDeclarativeEventPrefix); 188 std::size_t found = event_name.find(kDeclarativeEventPrefix);
137 EXTENSION_FUNCTION_VALIDATE(found != std::string::npos); 189 EXTENSION_FUNCTION_VALIDATE(found != std::string::npos);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 if (error_.empty()) { 234 if (error_.empty()) {
183 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); 235 std::unique_ptr<base::ListValue> rules_value(new base::ListValue());
184 for (const auto& rule : linked_rules) 236 for (const auto& rule : linked_rules)
185 rules_value->Append(rule->ToValue()); 237 rules_value->Append(rule->ToValue());
186 SetResult(std::move(rules_value)); 238 SetResult(std::move(rules_value));
187 } 239 }
188 240
189 return error_.empty(); 241 return error_.empty();
190 } 242 }
191 243
244 void EventsEventAddRulesFunction::RecordUMA(
245 const std::string& event_name) const {
246 DeclarativeAPIFunctionType type = kDeclarativeApiFunctionCallTypeMax;
247 switch (GetDeclarativeAPIType(event_name)) {
248 case DeclarativeAPIType::kContent:
249 type = kDeclarativeContentAddRules;
250 break;
251 case DeclarativeAPIType::kWebRequest:
252 type = kDeclarativeWebRequestAddRules;
253 break;
254 case DeclarativeAPIType::kWebRequestWebview:
255 type = kDeclarativeWebRequestWebviewAddRules;
256 break;
257 case DeclarativeAPIType::kUnknown:
258 NOTREACHED();
259 return;
260 }
261 RecordUMAHelper(type);
262 }
263
192 bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() { 264 bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() {
193 std::unique_ptr<RemoveRules::Params> params( 265 std::unique_ptr<RemoveRules::Params> params(
194 RemoveRules::Params::Create(*args_)); 266 RemoveRules::Params::Create(*args_));
195 EXTENSION_FUNCTION_VALIDATE(params.get()); 267 EXTENSION_FUNCTION_VALIDATE(params.get());
196 268
197 if (params->rule_identifiers.get()) { 269 if (params->rule_identifiers.get()) {
198 error_ = rules_registry_->RemoveRules(extension_id(), 270 error_ = rules_registry_->RemoveRules(extension_id(),
199 *params->rule_identifiers); 271 *params->rule_identifiers);
200 } else { 272 } else {
201 error_ = rules_registry_->RemoveAllRules(extension_id()); 273 error_ = rules_registry_->RemoveAllRules(extension_id());
202 } 274 }
203 275
204 return error_.empty(); 276 return error_.empty();
205 } 277 }
206 278
279 void EventsEventRemoveRulesFunction::RecordUMA(
280 const std::string& event_name) const {
281 DeclarativeAPIFunctionType type = kDeclarativeApiFunctionCallTypeMax;
282 switch (GetDeclarativeAPIType(event_name)) {
283 case DeclarativeAPIType::kContent:
284 type = kDeclarativeContentRemoveRules;
285 break;
286 case DeclarativeAPIType::kWebRequest:
287 type = kDeclarativeWebRequestRemoveRules;
288 break;
289 case DeclarativeAPIType::kWebRequestWebview:
290 type = kDeclarativeWebRequestWebviewRemoveRules;
291 break;
292 case DeclarativeAPIType::kUnknown:
293 NOTREACHED();
294 return;
295 }
296 RecordUMAHelper(type);
297 }
298
207 bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() { 299 bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() {
208 std::unique_ptr<GetRules::Params> params(GetRules::Params::Create(*args_)); 300 std::unique_ptr<GetRules::Params> params(GetRules::Params::Create(*args_));
209 EXTENSION_FUNCTION_VALIDATE(params.get()); 301 EXTENSION_FUNCTION_VALIDATE(params.get());
210 302
211 std::vector<linked_ptr<Rule> > rules; 303 std::vector<linked_ptr<Rule> > rules;
212 if (params->rule_identifiers.get()) { 304 if (params->rule_identifiers.get()) {
213 rules_registry_->GetRules( 305 rules_registry_->GetRules(
214 extension_id(), *params->rule_identifiers, &rules); 306 extension_id(), *params->rule_identifiers, &rules);
215 } else { 307 } else {
216 rules_registry_->GetAllRules(extension_id(), &rules); 308 rules_registry_->GetAllRules(extension_id(), &rules);
217 } 309 }
218 310
219 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); 311 std::unique_ptr<base::ListValue> rules_value(new base::ListValue());
220 for (const auto& rule : rules) 312 for (const auto& rule : rules)
221 rules_value->Append(rule->ToValue()); 313 rules_value->Append(rule->ToValue());
222 SetResult(std::move(rules_value)); 314 SetResult(std::move(rules_value));
223 315
224 return true; 316 return true;
225 } 317 }
226 318
319 void EventsEventGetRulesFunction::RecordUMA(
320 const std::string& event_name) const {
321 DeclarativeAPIFunctionType type = kDeclarativeApiFunctionCallTypeMax;
322 switch (GetDeclarativeAPIType(event_name)) {
323 case DeclarativeAPIType::kContent:
324 type = kDeclarativeContentGetRules;
325 break;
326 case DeclarativeAPIType::kWebRequest:
327 type = kDeclarativeWebRequestGetRules;
328 break;
329 case DeclarativeAPIType::kWebRequestWebview:
330 type = kDeclarativeWebRequestWebviewGetRules;
331 break;
332 case DeclarativeAPIType::kUnknown:
333 NOTREACHED();
334 return;
335 }
336 RecordUMAHelper(type);
337 }
338
227 } // namespace extensions 339 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/declarative/declarative_api.h ('k') | tools/metrics/histograms/enums.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698