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 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 Loading... |
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 Loading... |
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 |
OLD | NEW |