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/web_request/web_request_api.h" | 5 #include "extensions/browser/api/web_request/web_request_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 13 #include "base/macros.h" |
13 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
14 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
17 #include "base/time/time.h" | 18 #include "base/time/time.h" |
18 #include "base/values.h" | 19 #include "base/values.h" |
19 #include "content/public/browser/browser_message_filter.h" | 20 #include "content/public/browser/browser_message_filter.h" |
20 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
21 #include "content/public/browser/render_frame_host.h" | 22 #include "content/public/browser/render_frame_host.h" |
22 #include "content/public/browser/render_process_host.h" | 23 #include "content/public/browser/render_process_host.h" |
23 #include "content/public/browser/resource_request_info.h" | 24 #include "content/public/browser/resource_request_info.h" |
24 #include "content/public/browser/user_metrics.h" | 25 #include "content/public/browser/user_metrics.h" |
25 #include "extensions/browser/api/activity_log/web_request_constants.h" | 26 #include "extensions/browser/api/activity_log/web_request_constants.h" |
26 #include "extensions/browser/api/declarative/rules_registry_service.h" | 27 #include "extensions/browser/api/declarative/rules_registry_service.h" |
27 #include "extensions/browser/api/declarative_webrequest/request_stage.h" | 28 #include "extensions/browser/api/declarative_webrequest/request_stage.h" |
28 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" | 29 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
29 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr
y.h" | 30 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr
y.h" |
30 #include "extensions/browser/api/extensions_api_client.h" | 31 #include "extensions/browser/api/extensions_api_client.h" |
31 #include "extensions/browser/api/web_request/upload_data_presenter.h" | 32 #include "extensions/browser/api/web_request/upload_data_presenter.h" |
32 #include "extensions/browser/api/web_request/web_request_api_constants.h" | 33 #include "extensions/browser/api/web_request/web_request_api_constants.h" |
33 #include "extensions/browser/api/web_request/web_request_api_helpers.h" | 34 #include "extensions/browser/api/web_request/web_request_api_helpers.h" |
34 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h
" | 35 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h
" |
35 #include "extensions/browser/api/web_request/web_request_time_tracker.h" | 36 #include "extensions/browser/api/web_request/web_request_time_tracker.h" |
36 #include "extensions/browser/event_router.h" | 37 #include "extensions/browser/event_router.h" |
37 #include "extensions/browser/extension_prefs.h" | 38 #include "extensions/browser/extension_prefs.h" |
38 #include "extensions/browser/extension_registry.h" | 39 #include "extensions/browser/extension_registry.h" |
39 #include "extensions/browser/extension_system.h" | 40 #include "extensions/browser/extension_system.h" |
40 #include "extensions/browser/extensions_browser_client.h" | 41 #include "extensions/browser/extensions_browser_client.h" |
| 42 #include "extensions/browser/guest_view/guest_view_events.h" |
41 #include "extensions/browser/guest_view/web_view/web_view_constants.h" | 43 #include "extensions/browser/guest_view/web_view/web_view_constants.h" |
42 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" | 44 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
43 #include "extensions/browser/info_map.h" | 45 #include "extensions/browser/info_map.h" |
44 #include "extensions/browser/io_thread_extension_message_filter.h" | 46 #include "extensions/browser/io_thread_extension_message_filter.h" |
45 #include "extensions/browser/runtime_data.h" | 47 #include "extensions/browser/runtime_data.h" |
46 #include "extensions/browser/warning_service.h" | 48 #include "extensions/browser/warning_service.h" |
47 #include "extensions/browser/warning_set.h" | 49 #include "extensions/browser/warning_set.h" |
48 #include "extensions/common/api/web_request.h" | 50 #include "extensions/common/api/web_request.h" |
49 #include "extensions/common/error_utils.h" | 51 #include "extensions/common/error_utils.h" |
50 #include "extensions/common/event_filtering_info.h" | 52 #include "extensions/common/event_filtering_info.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 web_request::OnBeforeRequest::kEventName, | 91 web_request::OnBeforeRequest::kEventName, |
90 keys::kOnBeforeSendHeadersEvent, | 92 keys::kOnBeforeSendHeadersEvent, |
91 keys::kOnCompletedEvent, | 93 keys::kOnCompletedEvent, |
92 web_request::OnErrorOccurred::kEventName, | 94 web_request::OnErrorOccurred::kEventName, |
93 keys::kOnSendHeadersEvent, | 95 keys::kOnSendHeadersEvent, |
94 keys::kOnAuthRequiredEvent, | 96 keys::kOnAuthRequiredEvent, |
95 keys::kOnResponseStartedEvent, | 97 keys::kOnResponseStartedEvent, |
96 keys::kOnHeadersReceivedEvent, | 98 keys::kOnHeadersReceivedEvent, |
97 }; | 99 }; |
98 | 100 |
99 const size_t kWebRequestEventsLength = arraysize(kWebRequestEvents); | |
100 | |
101 const char* GetRequestStageAsString( | 101 const char* GetRequestStageAsString( |
102 ExtensionWebRequestEventRouter::EventTypes type) { | 102 ExtensionWebRequestEventRouter::EventTypes type) { |
103 switch (type) { | 103 switch (type) { |
104 case ExtensionWebRequestEventRouter::kInvalidEvent: | 104 case ExtensionWebRequestEventRouter::kInvalidEvent: |
105 return "Invalid"; | 105 return "Invalid"; |
106 case ExtensionWebRequestEventRouter::kOnBeforeRequest: | 106 case ExtensionWebRequestEventRouter::kOnBeforeRequest: |
107 return keys::kOnBeforeRequest; | 107 return keys::kOnBeforeRequest; |
108 case ExtensionWebRequestEventRouter::kOnBeforeSendHeaders: | 108 case ExtensionWebRequestEventRouter::kOnBeforeSendHeaders: |
109 return keys::kOnBeforeSendHeaders; | 109 return keys::kOnBeforeSendHeaders; |
110 case ExtensionWebRequestEventRouter::kOnSendHeaders: | 110 case ExtensionWebRequestEventRouter::kOnSendHeaders: |
(...skipping 20 matching lines...) Expand all Loading... |
131 } | 131 } |
132 | 132 |
133 bool IsWebRequestEvent(const std::string& event_name) { | 133 bool IsWebRequestEvent(const std::string& event_name) { |
134 std::string web_request_event_name(event_name); | 134 std::string web_request_event_name(event_name); |
135 if (base::StartsWith(web_request_event_name, | 135 if (base::StartsWith(web_request_event_name, |
136 webview::kWebViewEventPrefix, | 136 webview::kWebViewEventPrefix, |
137 base::CompareCase::SENSITIVE)) { | 137 base::CompareCase::SENSITIVE)) { |
138 web_request_event_name.replace( | 138 web_request_event_name.replace( |
139 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix); | 139 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix); |
140 } | 140 } |
141 return std::find( | 141 auto web_request_events_end = |
142 kWebRequestEvents, | 142 kWebRequestEvents + arraysize(kWebRequestEvents); |
143 kWebRequestEvents + kWebRequestEventsLength, | 143 return std::find(kWebRequestEvents, web_request_events_end, |
144 web_request_event_name) != (kWebRequestEvents + kWebRequestEventsLength); | 144 web_request_event_name) != web_request_events_end; |
145 } | 145 } |
146 | 146 |
147 // Returns whether |request| has been triggered by an extension in | 147 // Returns whether |request| has been triggered by an extension in |
148 // |extension_info_map|. | 148 // |extension_info_map|. |
149 bool IsRequestFromExtension(const net::URLRequest* request, | 149 bool IsRequestFromExtension(const net::URLRequest* request, |
150 const InfoMap* extension_info_map) { | 150 const InfoMap* extension_info_map) { |
151 // |extension_info_map| is NULL for system-level requests. | 151 // |extension_info_map| is NULL for system-level requests. |
152 if (!extension_info_map) | 152 if (!extension_info_map) |
153 return false; | 153 return false; |
154 | 154 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 const std::string& extension_id, | 365 const std::string& extension_id, |
366 const std::string& sub_event_name, | 366 const std::string& sub_event_name, |
367 int embedder_process_id, | 367 int embedder_process_id, |
368 int web_view_instance_id) { | 368 int web_view_instance_id) { |
369 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 369 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
370 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( | 370 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
371 browser_context, extension_id, sub_event_name, | 371 browser_context, extension_id, sub_event_name, |
372 embedder_process_id, web_view_instance_id); | 372 embedder_process_id, web_view_instance_id); |
373 } | 373 } |
374 | 374 |
| 375 events::HistogramValue GetEventHistogramValue(const std::string& event_name) { |
| 376 // Event names will either be webRequest events, or guest view (probably web |
| 377 // view) events that map to webRequest events. Check webRequest first. |
| 378 static struct ValueAndName { |
| 379 events::HistogramValue histogram_value; |
| 380 const char* event_name; |
| 381 } values_and_names[] = { |
| 382 {events::WEB_REQUEST_ON_BEFORE_REDIRECT, keys::kOnBeforeRedirectEvent}, |
| 383 {events::WEB_REQUEST_ON_BEFORE_REQUEST, |
| 384 web_request::OnBeforeRequest::kEventName}, |
| 385 {events::WEB_REQUEST_ON_BEFORE_SEND_HEADERS, |
| 386 keys::kOnBeforeSendHeadersEvent}, |
| 387 {events::WEB_REQUEST_ON_COMPLETED, keys::kOnCompletedEvent}, |
| 388 {events::WEB_REQUEST_ON_ERROR_OCCURRED, |
| 389 web_request::OnErrorOccurred::kEventName}, |
| 390 {events::WEB_REQUEST_ON_SEND_HEADERS, keys::kOnSendHeadersEvent}, |
| 391 {events::WEB_REQUEST_ON_AUTH_REQUIRED, keys::kOnAuthRequiredEvent}, |
| 392 {events::WEB_REQUEST_ON_RESPONSE_STARTED, keys::kOnResponseStartedEvent}, |
| 393 {events::WEB_REQUEST_ON_HEADERS_RECEIVED, keys::kOnHeadersReceivedEvent}}; |
| 394 COMPILE_ASSERT(arraysize(kWebRequestEvents) == arraysize(values_and_names), |
| 395 "kWebRequestEvents and values_and_names must be the same"); |
| 396 for (const ValueAndName& value_and_name : values_and_names) { |
| 397 if (value_and_name.event_name == event_name) |
| 398 return value_and_name.histogram_value; |
| 399 } |
| 400 |
| 401 // If there is no webRequest event, it might be a guest view webRequest event. |
| 402 events::HistogramValue guest_view_histogram_value = |
| 403 guest_view_events::GetEventHistogramValue(event_name); |
| 404 if (guest_view_histogram_value != events::UNKNOWN) |
| 405 return guest_view_histogram_value; |
| 406 |
| 407 // There is no histogram value for this event name. It should be added to |
| 408 // either the mapping here, or in guest_view_events. |
| 409 NOTREACHED() << "Event " << event_name << " must have a histogram value"; |
| 410 return events::UNKNOWN; |
| 411 }; |
| 412 |
375 } // namespace | 413 } // namespace |
376 | 414 |
377 WebRequestAPI::WebRequestAPI(content::BrowserContext* context) | 415 WebRequestAPI::WebRequestAPI(content::BrowserContext* context) |
378 : browser_context_(context) { | 416 : browser_context_(context) { |
379 EventRouter* event_router = EventRouter::Get(browser_context_); | 417 EventRouter* event_router = EventRouter::Get(browser_context_); |
380 for (size_t i = 0; i < arraysize(kWebRequestEvents); ++i) { | 418 for (size_t i = 0; i < arraysize(kWebRequestEvents); ++i) { |
381 // Observe the webRequest event. | 419 // Observe the webRequest event. |
382 std::string event_name = kWebRequestEvents[i]; | 420 std::string event_name = kWebRequestEvents[i]; |
383 event_router->RegisterObserver(this, event_name); | 421 event_router->RegisterObserver(this, event_name); |
384 | 422 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 460 |
423 // Represents a single unique listener to an event, along with whatever filter | 461 // Represents a single unique listener to an event, along with whatever filter |
424 // parameters and extra_info_spec were specified at the time the listener was | 462 // parameters and extra_info_spec were specified at the time the listener was |
425 // added. | 463 // added. |
426 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does | 464 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does |
427 // not play well with event pages. See downloads.onDeterminingFilename and | 465 // not play well with event pages. See downloads.onDeterminingFilename and |
428 // ExtensionDownloadsEventRouter for an alternative approach. | 466 // ExtensionDownloadsEventRouter for an alternative approach. |
429 struct ExtensionWebRequestEventRouter::EventListener { | 467 struct ExtensionWebRequestEventRouter::EventListener { |
430 std::string extension_id; | 468 std::string extension_id; |
431 std::string extension_name; | 469 std::string extension_name; |
| 470 events::HistogramValue histogram_value; |
432 std::string sub_event_name; | 471 std::string sub_event_name; |
433 RequestFilter filter; | 472 RequestFilter filter; |
434 int extra_info_spec; | 473 int extra_info_spec; |
435 int embedder_process_id; | 474 int embedder_process_id; |
436 int web_view_instance_id; | 475 int web_view_instance_id; |
437 base::WeakPtr<IPC::Sender> ipc_sender; | 476 base::WeakPtr<IPC::Sender> ipc_sender; |
438 mutable std::set<uint64> blocked_requests; | 477 mutable std::set<uint64> blocked_requests; |
439 | 478 |
440 // Comparator to work with std::set. | 479 // Comparator to work with std::set. |
441 bool operator<(const EventListener& that) const { | 480 bool operator<(const EventListener& that) const { |
442 if (extension_id != that.extension_id) | 481 if (extension_id != that.extension_id) |
443 return extension_id < that.extension_id; | 482 return extension_id < that.extension_id; |
444 | 483 |
445 if (sub_event_name != that.sub_event_name) | 484 if (sub_event_name != that.sub_event_name) |
446 return sub_event_name < that.sub_event_name; | 485 return sub_event_name < that.sub_event_name; |
447 | 486 |
448 if (embedder_process_id != that.embedder_process_id) | 487 if (embedder_process_id != that.embedder_process_id) |
449 return embedder_process_id < that.embedder_process_id; | 488 return embedder_process_id < that.embedder_process_id; |
450 | 489 |
451 if (web_view_instance_id != that.web_view_instance_id) | 490 if (web_view_instance_id != that.web_view_instance_id) |
452 return web_view_instance_id < that.web_view_instance_id; | 491 return web_view_instance_id < that.web_view_instance_id; |
453 | 492 |
454 return false; | 493 return false; |
455 } | 494 } |
456 | 495 |
457 EventListener() : | 496 EventListener() |
458 extra_info_spec(0), | 497 : histogram_value(events::UNKNOWN), |
459 embedder_process_id(0), | 498 extra_info_spec(0), |
460 web_view_instance_id(0) {} | 499 embedder_process_id(0), |
| 500 web_view_instance_id(0) {} |
461 }; | 501 }; |
462 | 502 |
463 // Contains info about requests that are blocked waiting for a response from | 503 // Contains info about requests that are blocked waiting for a response from |
464 // an extension. | 504 // an extension. |
465 struct ExtensionWebRequestEventRouter::BlockedRequest { | 505 struct ExtensionWebRequestEventRouter::BlockedRequest { |
466 // The request that is being blocked. | 506 // The request that is being blocked. |
467 net::URLRequest* request; | 507 net::URLRequest* request; |
468 | 508 |
469 // Whether the request originates from an incognito tab. | 509 // Whether the request originates from an incognito tab. |
470 bool is_incognito; | 510 bool is_incognito; |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1178 } | 1218 } |
1179 | 1219 |
1180 bool ExtensionWebRequestEventRouter::DispatchEvent( | 1220 bool ExtensionWebRequestEventRouter::DispatchEvent( |
1181 void* browser_context, | 1221 void* browser_context, |
1182 net::URLRequest* request, | 1222 net::URLRequest* request, |
1183 const std::vector<const EventListener*>& listeners, | 1223 const std::vector<const EventListener*>& listeners, |
1184 const base::ListValue& args) { | 1224 const base::ListValue& args) { |
1185 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) | 1225 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) |
1186 // pairs into a single message sent to a list of sub_event_names. | 1226 // pairs into a single message sent to a list of sub_event_names. |
1187 int num_handlers_blocking = 0; | 1227 int num_handlers_blocking = 0; |
1188 for (std::vector<const EventListener*>::const_iterator it = listeners.begin(); | 1228 for (const EventListener* listener : listeners) { |
1189 it != listeners.end(); ++it) { | |
1190 // Filter out the optional keys that this listener didn't request. | 1229 // Filter out the optional keys that this listener didn't request. |
1191 scoped_ptr<base::ListValue> args_filtered(args.DeepCopy()); | 1230 scoped_ptr<base::ListValue> args_filtered(args.DeepCopy()); |
1192 base::DictionaryValue* dict = NULL; | 1231 base::DictionaryValue* dict = NULL; |
1193 CHECK(args_filtered->GetDictionary(0, &dict) && dict); | 1232 CHECK(args_filtered->GetDictionary(0, &dict) && dict); |
1194 if (!((*it)->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)) | 1233 if (!(listener->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)) |
1195 dict->Remove(keys::kRequestHeadersKey, NULL); | 1234 dict->Remove(keys::kRequestHeadersKey, NULL); |
1196 if (!((*it)->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS)) | 1235 if (!(listener->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS)) |
1197 dict->Remove(keys::kResponseHeadersKey, NULL); | 1236 dict->Remove(keys::kResponseHeadersKey, NULL); |
1198 | 1237 |
1199 EventRouter::DispatchEvent( | 1238 EventRouter::DispatchEventToSender( |
1200 (*it)->ipc_sender.get(), browser_context, (*it)->extension_id, | 1239 listener->ipc_sender.get(), browser_context, GURL(), |
1201 (*it)->sub_event_name, args_filtered.Pass(), | 1240 listener->extension_id, listener->histogram_value, |
| 1241 listener->sub_event_name, args_filtered.Pass(), |
1202 EventRouter::USER_GESTURE_UNKNOWN, EventFilteringInfo()); | 1242 EventRouter::USER_GESTURE_UNKNOWN, EventFilteringInfo()); |
1203 if ((*it)->extra_info_spec & | 1243 if (listener->extra_info_spec & |
1204 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { | 1244 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { |
1205 (*it)->blocked_requests.insert(request->identifier()); | 1245 listener->blocked_requests.insert(request->identifier()); |
1206 // If this is the first delegate blocking the request, go ahead and log | 1246 // If this is the first delegate blocking the request, go ahead and log |
1207 // it. | 1247 // it. |
1208 if (num_handlers_blocking == 0) { | 1248 if (num_handlers_blocking == 0) { |
1209 std::string delegate_info = | 1249 std::string delegate_info = l10n_util::GetStringFUTF8( |
1210 l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION, | 1250 IDS_LOAD_STATE_PARAMETER_EXTENSION, |
1211 base::UTF8ToUTF16((*it)->extension_name)); | 1251 base::UTF8ToUTF16(listener->extension_name)); |
1212 // LobAndReport allows extensions that block requests to be displayed in | 1252 // LobAndReport allows extensions that block requests to be displayed in |
1213 // the load status bar. | 1253 // the load status bar. |
1214 request->LogAndReportBlockedBy(delegate_info.c_str()); | 1254 request->LogAndReportBlockedBy(delegate_info.c_str()); |
1215 } | 1255 } |
1216 ++num_handlers_blocking; | 1256 ++num_handlers_blocking; |
1217 } | 1257 } |
1218 } | 1258 } |
1219 | 1259 |
1220 if (num_handlers_blocking > 0) { | 1260 if (num_handlers_blocking > 0) { |
1221 blocked_requests_[request->identifier()].request = request; | 1261 blocked_requests_[request->identifier()].request = request; |
(...skipping 28 matching lines...) Expand all Loading... |
1250 found->blocked_requests.erase(request_id); | 1290 found->blocked_requests.erase(request_id); |
1251 | 1291 |
1252 DecrementBlockCount( | 1292 DecrementBlockCount( |
1253 browser_context, extension_id, event_name, request_id, response); | 1293 browser_context, extension_id, event_name, request_id, response); |
1254 } | 1294 } |
1255 | 1295 |
1256 bool ExtensionWebRequestEventRouter::AddEventListener( | 1296 bool ExtensionWebRequestEventRouter::AddEventListener( |
1257 void* browser_context, | 1297 void* browser_context, |
1258 const std::string& extension_id, | 1298 const std::string& extension_id, |
1259 const std::string& extension_name, | 1299 const std::string& extension_name, |
| 1300 events::HistogramValue histogram_value, |
1260 const std::string& event_name, | 1301 const std::string& event_name, |
1261 const std::string& sub_event_name, | 1302 const std::string& sub_event_name, |
1262 const RequestFilter& filter, | 1303 const RequestFilter& filter, |
1263 int extra_info_spec, | 1304 int extra_info_spec, |
1264 int embedder_process_id, | 1305 int embedder_process_id, |
1265 int web_view_instance_id, | 1306 int web_view_instance_id, |
1266 base::WeakPtr<IPC::Sender> ipc_sender) { | 1307 base::WeakPtr<IPC::Sender> ipc_sender) { |
1267 if (!IsWebRequestEvent(event_name)) | 1308 if (!IsWebRequestEvent(event_name)) |
1268 return false; | 1309 return false; |
1269 | 1310 |
1270 EventListener listener; | 1311 EventListener listener; |
1271 listener.extension_id = extension_id; | 1312 listener.extension_id = extension_id; |
1272 listener.extension_name = extension_name; | 1313 listener.extension_name = extension_name; |
| 1314 listener.histogram_value = histogram_value; |
1273 listener.sub_event_name = sub_event_name; | 1315 listener.sub_event_name = sub_event_name; |
1274 listener.filter = filter; | 1316 listener.filter = filter; |
1275 listener.extra_info_spec = extra_info_spec; | 1317 listener.extra_info_spec = extra_info_spec; |
1276 listener.ipc_sender = ipc_sender; | 1318 listener.ipc_sender = ipc_sender; |
1277 listener.embedder_process_id = embedder_process_id; | 1319 listener.embedder_process_id = embedder_process_id; |
1278 listener.web_view_instance_id = web_view_instance_id; | 1320 listener.web_view_instance_id = web_view_instance_id; |
1279 if (listener.web_view_instance_id) { | 1321 if (listener.web_view_instance_id) { |
1280 content::RecordAction( | 1322 content::RecordAction( |
1281 base::UserMetricsAction("WebView.WebRequest.AddListener")); | 1323 base::UserMetricsAction("WebView.WebRequest.AddListener")); |
1282 } | 1324 } |
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2222 ->GetEffectiveHostPermissions() | 2264 ->GetEffectiveHostPermissions() |
2223 .is_empty()) { | 2265 .is_empty()) { |
2224 error_ = keys::kHostPermissionsRequired; | 2266 error_ = keys::kHostPermissionsRequired; |
2225 return false; | 2267 return false; |
2226 } | 2268 } |
2227 } | 2269 } |
2228 | 2270 |
2229 bool success = | 2271 bool success = |
2230 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2272 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
2231 profile_id(), extension_id_safe(), extension_name, | 2273 profile_id(), extension_id_safe(), extension_name, |
2232 event_name, sub_event_name, filter, extra_info_spec, | 2274 GetEventHistogramValue(event_name), event_name, sub_event_name, |
2233 embedder_process_id, web_view_instance_id, ipc_sender_weak()); | 2275 filter, extra_info_spec, embedder_process_id, web_view_instance_id, |
| 2276 ipc_sender_weak()); |
2234 EXTENSION_FUNCTION_VALIDATE(success); | 2277 EXTENSION_FUNCTION_VALIDATE(success); |
2235 | 2278 |
2236 helpers::ClearCacheOnNavigation(); | 2279 helpers::ClearCacheOnNavigation(); |
2237 | 2280 |
2238 if (!extension_id_safe().empty()) { | 2281 if (!extension_id_safe().empty()) { |
2239 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 2282 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
2240 base::Bind(&helpers::NotifyWebRequestAPIUsed, | 2283 base::Bind(&helpers::NotifyWebRequestAPIUsed, |
2241 profile_id(), extension_id_safe())); | 2284 profile_id(), extension_id_safe())); |
2242 } | 2285 } |
2243 | 2286 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2438 // Continue gracefully. | 2481 // Continue gracefully. |
2439 RunSync(); | 2482 RunSync(); |
2440 } | 2483 } |
2441 | 2484 |
2442 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2485 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
2443 helpers::ClearCacheOnNavigation(); | 2486 helpers::ClearCacheOnNavigation(); |
2444 return true; | 2487 return true; |
2445 } | 2488 } |
2446 | 2489 |
2447 } // namespace extensions | 2490 } // namespace extensions |
OLD | NEW |