OLD | NEW |
---|---|
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 kDeclarativeContent, | |
50 kDeclarativeWebRequest, | |
51 kDeclarativeWebRequestWebview, | |
52 kUnknown, | |
53 }; | |
54 | |
55 // Describes the possible types of declarative API function calls. | |
56 // These values are written to logs. New enum values can be added, but existing | |
57 // enum values must never be renumbered or deleted and reused. | |
58 enum DeclarativeAPIFunctionCallType { | |
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 GetDeclarativeAPITypeFromEventName( | |
lazyboy
2017/05/05 23:11:16
nit: FromEventName is redundant since it should be
karandeepb
2017/05/05 23:35:05
Done.
| |
72 const std::string& event_name) { | |
73 if (base::StartsWith(event_name, kDeclarativeContentEventPrefix, | |
74 base::CompareCase::SENSITIVE)) | |
75 return DeclarativeAPIType::kDeclarativeContent; | |
76 if (base::StartsWith(event_name, kDeclarativeWebRequestEventPrefix, | |
77 base::CompareCase::SENSITIVE)) | |
78 return DeclarativeAPIType::kDeclarativeWebRequest; | |
79 if (base::StartsWith(event_name, kDeclarativeWebRequestWebViewEventPrefix, | |
80 base::CompareCase::SENSITIVE)) | |
81 return DeclarativeAPIType::kDeclarativeWebRequestWebview; | |
82 return DeclarativeAPIType::kUnknown; | |
83 } | |
84 | |
85 void RecordUMAHelper(DeclarativeAPIFunctionCallType call_type) { | |
86 DCHECK_LT(call_type, kDeclarativeApiFunctionCallTypeMax); | |
87 UMA_HISTOGRAM_ENUMERATION("Extensions.DeclarativeAPIFunctionCalls", call_type, | |
88 kDeclarativeApiFunctionCallTypeMax); | |
89 } | |
39 | 90 |
40 void ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict); | 91 void ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict); |
41 | 92 |
42 // Encodes |binary| as base64 and returns a new StringValue populated with the | 93 // Encodes |binary| as base64 and returns a new StringValue populated with the |
43 // encoded string. | 94 // encoded string. |
44 std::unique_ptr<base::Value> ConvertBinaryToBase64(base::Value* binary) { | 95 std::unique_ptr<base::Value> ConvertBinaryToBase64(base::Value* binary) { |
45 std::string binary_data(binary->GetBlob().data(), binary->GetBlob().size()); | 96 std::string binary_data(binary->GetBlob().data(), binary->GetBlob().size()); |
46 std::string data64; | 97 std::string data64; |
47 base::Base64Encode(binary_data, &data64); | 98 base::Base64Encode(binary_data, &data64); |
48 return std::unique_ptr<base::Value>(new base::Value(data64)); | 99 return std::unique_ptr<base::Value>(new base::Value(data64)); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 } | 169 } |
119 | 170 |
120 bool RulesFunction::RunAsync() { | 171 bool RulesFunction::RunAsync() { |
121 std::string event_name; | 172 std::string event_name; |
122 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 173 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
123 | 174 |
124 int web_view_instance_id = 0; | 175 int web_view_instance_id = 0; |
125 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &web_view_instance_id)); | 176 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &web_view_instance_id)); |
126 int embedder_process_id = render_frame_host()->GetProcess()->GetID(); | 177 int embedder_process_id = render_frame_host()->GetProcess()->GetID(); |
127 | 178 |
179 RecordUMA(event_name); | |
lazyboy
2017/05/05 23:11:16
Since this requires us to search for 3 prefixes in
karandeepb
2017/05/05 23:35:05
Acknowledged.
Ilya Sherman
2017/05/05 23:45:15
It's possible, but you should not do this. We do
lazyboy
2017/05/05 23:59:12
Good to know that! Thanks.
The code here isn't a b
| |
180 | |
128 bool from_web_view = web_view_instance_id != 0; | 181 bool from_web_view = web_view_instance_id != 0; |
129 // If we are not operating on a particular <webview>, then the key is 0. | 182 // If we are not operating on a particular <webview>, then the key is 0. |
130 int rules_registry_id = RulesRegistryService::kDefaultRulesRegistryID; | 183 int rules_registry_id = RulesRegistryService::kDefaultRulesRegistryID; |
131 if (from_web_view) { | 184 if (from_web_view) { |
132 // Sample event names: | 185 // Sample event names: |
133 // webViewInternal.declarativeWebRequest.onRequest. | 186 // webViewInternal.declarativeWebRequest.onRequest. |
134 // webViewInternal.declarativeWebRequest.onMessage. | 187 // webViewInternal.declarativeWebRequest.onMessage. |
135 // The "webViewInternal." prefix is removed from the event name. | 188 // The "webViewInternal." prefix is removed from the event name. |
136 std::size_t found = event_name.find(kDeclarativeEventPrefix); | 189 std::size_t found = event_name.find(kDeclarativeEventPrefix); |
137 EXTENSION_FUNCTION_VALIDATE(found != std::string::npos); | 190 EXTENSION_FUNCTION_VALIDATE(found != std::string::npos); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 if (error_.empty()) { | 235 if (error_.empty()) { |
183 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); | 236 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); |
184 for (const auto& rule : linked_rules) | 237 for (const auto& rule : linked_rules) |
185 rules_value->Append(rule->ToValue()); | 238 rules_value->Append(rule->ToValue()); |
186 SetResult(std::move(rules_value)); | 239 SetResult(std::move(rules_value)); |
187 } | 240 } |
188 | 241 |
189 return error_.empty(); | 242 return error_.empty(); |
190 } | 243 } |
191 | 244 |
245 void EventsEventAddRulesFunction::RecordUMA( | |
246 const std::string& event_name) const { | |
247 DeclarativeAPIFunctionCallType call_type = kDeclarativeApiFunctionCallTypeMax; | |
248 switch (GetDeclarativeAPITypeFromEventName(event_name)) { | |
249 case DeclarativeAPIType::kDeclarativeContent: | |
250 call_type = kDeclarativeContentAddRules; | |
251 break; | |
252 case DeclarativeAPIType::kDeclarativeWebRequest: | |
253 call_type = kDeclarativeWebRequestAddRules; | |
254 break; | |
255 case DeclarativeAPIType::kDeclarativeWebRequestWebview: | |
256 call_type = kDeclarativeWebRequestWebviewAddRules; | |
257 break; | |
258 case DeclarativeAPIType::kUnknown: | |
259 NOTREACHED(); | |
260 return; | |
261 } | |
262 RecordUMAHelper(call_type); | |
263 } | |
264 | |
192 bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() { | 265 bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() { |
193 std::unique_ptr<RemoveRules::Params> params( | 266 std::unique_ptr<RemoveRules::Params> params( |
194 RemoveRules::Params::Create(*args_)); | 267 RemoveRules::Params::Create(*args_)); |
195 EXTENSION_FUNCTION_VALIDATE(params.get()); | 268 EXTENSION_FUNCTION_VALIDATE(params.get()); |
196 | 269 |
197 if (params->rule_identifiers.get()) { | 270 if (params->rule_identifiers.get()) { |
198 error_ = rules_registry_->RemoveRules(extension_id(), | 271 error_ = rules_registry_->RemoveRules(extension_id(), |
199 *params->rule_identifiers); | 272 *params->rule_identifiers); |
200 } else { | 273 } else { |
201 error_ = rules_registry_->RemoveAllRules(extension_id()); | 274 error_ = rules_registry_->RemoveAllRules(extension_id()); |
202 } | 275 } |
203 | 276 |
204 return error_.empty(); | 277 return error_.empty(); |
205 } | 278 } |
206 | 279 |
280 void EventsEventRemoveRulesFunction::RecordUMA( | |
281 const std::string& event_name) const { | |
282 DeclarativeAPIFunctionCallType call_type = kDeclarativeApiFunctionCallTypeMax; | |
283 switch (GetDeclarativeAPITypeFromEventName(event_name)) { | |
284 case DeclarativeAPIType::kDeclarativeContent: | |
285 call_type = kDeclarativeContentRemoveRules; | |
286 break; | |
287 case DeclarativeAPIType::kDeclarativeWebRequest: | |
288 call_type = kDeclarativeWebRequestRemoveRules; | |
289 break; | |
290 case DeclarativeAPIType::kDeclarativeWebRequestWebview: | |
291 call_type = kDeclarativeWebRequestWebviewRemoveRules; | |
292 break; | |
293 case DeclarativeAPIType::kUnknown: | |
294 NOTREACHED(); | |
295 return; | |
296 } | |
297 RecordUMAHelper(call_type); | |
298 } | |
299 | |
207 bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() { | 300 bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() { |
208 std::unique_ptr<GetRules::Params> params(GetRules::Params::Create(*args_)); | 301 std::unique_ptr<GetRules::Params> params(GetRules::Params::Create(*args_)); |
209 EXTENSION_FUNCTION_VALIDATE(params.get()); | 302 EXTENSION_FUNCTION_VALIDATE(params.get()); |
210 | 303 |
211 std::vector<linked_ptr<Rule> > rules; | 304 std::vector<linked_ptr<Rule> > rules; |
212 if (params->rule_identifiers.get()) { | 305 if (params->rule_identifiers.get()) { |
213 rules_registry_->GetRules( | 306 rules_registry_->GetRules( |
214 extension_id(), *params->rule_identifiers, &rules); | 307 extension_id(), *params->rule_identifiers, &rules); |
215 } else { | 308 } else { |
216 rules_registry_->GetAllRules(extension_id(), &rules); | 309 rules_registry_->GetAllRules(extension_id(), &rules); |
217 } | 310 } |
218 | 311 |
219 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); | 312 std::unique_ptr<base::ListValue> rules_value(new base::ListValue()); |
220 for (const auto& rule : rules) | 313 for (const auto& rule : rules) |
221 rules_value->Append(rule->ToValue()); | 314 rules_value->Append(rule->ToValue()); |
222 SetResult(std::move(rules_value)); | 315 SetResult(std::move(rules_value)); |
223 | 316 |
224 return true; | 317 return true; |
225 } | 318 } |
226 | 319 |
320 void EventsEventGetRulesFunction::RecordUMA( | |
321 const std::string& event_name) const { | |
322 DeclarativeAPIFunctionCallType call_type = kDeclarativeApiFunctionCallTypeMax; | |
323 switch (GetDeclarativeAPITypeFromEventName(event_name)) { | |
324 case DeclarativeAPIType::kDeclarativeContent: | |
325 call_type = kDeclarativeContentGetRules; | |
326 break; | |
327 case DeclarativeAPIType::kDeclarativeWebRequest: | |
328 call_type = kDeclarativeWebRequestGetRules; | |
329 break; | |
330 case DeclarativeAPIType::kDeclarativeWebRequestWebview: | |
331 call_type = kDeclarativeWebRequestWebviewGetRules; | |
332 break; | |
333 case DeclarativeAPIType::kUnknown: | |
334 NOTREACHED(); | |
335 return; | |
336 } | |
337 RecordUMAHelper(call_type); | |
338 } | |
339 | |
227 } // namespace extensions | 340 } // namespace extensions |
OLD | NEW |