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

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api.cc

Issue 568583002: Introduce WebRequestEventRouterDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase. Created 6 years, 3 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 "chrome/browser/extensions/api/web_request/web_request_api.h" 5 #include "chrome/browser/extensions/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/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/browser/browser_process.h"
20 #include "chrome/browser/chrome_content_browser_client.h"
21 #include "chrome/browser/extensions/activity_log/activity_action_constants.h"
22 #include "chrome/browser/extensions/activity_log/activity_actions.h"
23 #include "chrome/browser/extensions/activity_log/activity_log.h"
24 #include "chrome/browser/extensions/activity_log/web_request_constants.h"
25 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" 19 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h"
26 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" 20 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h"
27 #include "chrome/browser/extensions/extension_renderer_state.h"
28 #include "chrome/browser/profiles/profile.h"
29 #include "chrome/browser/profiles/profile_manager.h"
30 #include "chrome/common/extensions/api/web_request.h" 21 #include "chrome/common/extensions/api/web_request.h"
31 #include "chrome/common/extensions/extension_constants.h"
32 #include "chrome/common/url_constants.h"
33 #include "chrome/grit/generated_resources.h"
34 #include "content/public/browser/browser_message_filter.h" 22 #include "content/public/browser/browser_message_filter.h"
35 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
36 #include "content/public/browser/render_frame_host.h" 24 #include "content/public/browser/render_frame_host.h"
37 #include "content/public/browser/render_process_host.h" 25 #include "content/public/browser/render_process_host.h"
38 #include "content/public/browser/resource_request_info.h" 26 #include "content/public/browser/resource_request_info.h"
39 #include "content/public/browser/user_metrics.h" 27 #include "content/public/browser/user_metrics.h"
40 #include "extensions/browser/api/declarative_webrequest/request_stage.h" 28 #include "extensions/browser/api/declarative_webrequest/request_stage.h"
41 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 29 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
42 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h" 30 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h"
31 #include "extensions/browser/api/extensions_api_client.h"
43 #include "extensions/browser/api/web_request/web_request_api_constants.h" 32 #include "extensions/browser/api/web_request/web_request_api_constants.h"
44 #include "extensions/browser/api/web_request/web_request_api_helpers.h" 33 #include "extensions/browser/api/web_request/web_request_api_helpers.h"
45 #include "extensions/browser/api/web_request/web_request_api_utils.h" 34 #include "extensions/browser/api/web_request/web_request_api_utils.h"
35 #include "extensions/browser/api/web_request/web_request_api_utils.h"
36 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h "
46 #include "extensions/browser/event_router.h" 37 #include "extensions/browser/event_router.h"
47 #include "extensions/browser/extension_message_filter.h" 38 #include "extensions/browser/extension_message_filter.h"
48 #include "extensions/browser/extension_prefs.h" 39 #include "extensions/browser/extension_prefs.h"
40 #include "extensions/browser/extension_registry.h"
41 #include "extensions/browser/extension_system.h"
42 #include "extensions/browser/extensions_browser_client.h"
49 #include "extensions/browser/guest_view/web_view/web_view_constants.h" 43 #include "extensions/browser/guest_view/web_view/web_view_constants.h"
50 #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"
51 #include "extensions/browser/info_map.h" 45 #include "extensions/browser/info_map.h"
52 #include "extensions/browser/runtime_data.h" 46 #include "extensions/browser/runtime_data.h"
53 #include "extensions/browser/warning_service.h" 47 #include "extensions/browser/warning_service.h"
54 #include "extensions/browser/warning_set.h" 48 #include "extensions/browser/warning_set.h"
55 #include "extensions/common/error_utils.h" 49 #include "extensions/common/error_utils.h"
56 #include "extensions/common/event_filtering_info.h" 50 #include "extensions/common/event_filtering_info.h"
57 #include "extensions/common/extension.h" 51 #include "extensions/common/extension.h"
58 #include "extensions/common/features/feature.h" 52 #include "extensions/common/features/feature.h"
59 #include "extensions/common/permissions/permissions_data.h" 53 #include "extensions/common/permissions/permissions_data.h"
60 #include "extensions/common/url_pattern.h" 54 #include "extensions/common/url_pattern.h"
55 #include "extensions/strings/grit/extensions_strings.h"
61 #include "net/base/auth.h" 56 #include "net/base/auth.h"
62 #include "net/base/net_errors.h" 57 #include "net/base/net_errors.h"
63 #include "net/base/upload_data_stream.h" 58 #include "net/base/upload_data_stream.h"
64 #include "net/http/http_response_headers.h" 59 #include "net/http/http_response_headers.h"
65 #include "net/http/http_util.h" 60 #include "net/http/http_util.h"
66 #include "net/url_request/url_request.h" 61 #include "net/url_request/url_request.h"
67 #include "ui/base/l10n/l10n_util.h" 62 #include "ui/base/l10n/l10n_util.h"
68 #include "url/gurl.h" 63 #include "url/gurl.h"
69 64
70 using base::DictionaryValue; 65 using base::DictionaryValue;
(...skipping 10 matching lines...) Expand all
81 using extensions::RulesRegistryService; 76 using extensions::RulesRegistryService;
82 using extensions::Warning; 77 using extensions::Warning;
83 using extensions::WarningService; 78 using extensions::WarningService;
84 using extensions::WarningSet; 79 using extensions::WarningSet;
85 80
86 namespace helpers = extension_web_request_api_helpers; 81 namespace helpers = extension_web_request_api_helpers;
87 namespace utils = extension_web_request_api_utils; 82 namespace utils = extension_web_request_api_utils;
88 namespace keys = extension_web_request_api_constants; 83 namespace keys = extension_web_request_api_constants;
89 namespace web_request = extensions::api::web_request; 84 namespace web_request = extensions::api::web_request;
90 namespace declarative_keys = extensions::declarative_webrequest_constants; 85 namespace declarative_keys = extensions::declarative_webrequest_constants;
91 namespace activitylog = activity_log_web_request_constants;
92 86
93 namespace { 87 namespace {
94 88
95 const char kWebRequestEventPrefix[] = "webRequest."; 89 const char kWebRequestEventPrefix[] = "webRequest.";
96 90
97 // List of all the webRequest events. 91 // List of all the webRequest events.
98 const char* const kWebRequestEvents[] = { 92 const char* const kWebRequestEvents[] = {
99 keys::kOnBeforeRedirectEvent, 93 keys::kOnBeforeRedirectEvent,
100 web_request::OnBeforeRequest::kEventName, 94 web_request::OnBeforeRequest::kEventName,
101 keys::kOnBeforeSendHeadersEvent, 95 keys::kOnBeforeSendHeadersEvent,
102 keys::kOnCompletedEvent, 96 keys::kOnCompletedEvent,
103 web_request::OnErrorOccurred::kEventName, 97 web_request::OnErrorOccurred::kEventName,
104 keys::kOnSendHeadersEvent, 98 keys::kOnSendHeadersEvent,
105 keys::kOnAuthRequiredEvent, 99 keys::kOnAuthRequiredEvent,
106 keys::kOnResponseStartedEvent, 100 keys::kOnResponseStartedEvent,
107 keys::kOnHeadersReceivedEvent, 101 keys::kOnHeadersReceivedEvent,
108 }; 102 };
109 103
110 #define ARRAYEND(array) (array + arraysize(array))
111
112 const char* GetRequestStageAsString( 104 const char* GetRequestStageAsString(
113 ExtensionWebRequestEventRouter::EventTypes type) { 105 ExtensionWebRequestEventRouter::EventTypes type) {
114 switch (type) { 106 switch (type) {
115 case ExtensionWebRequestEventRouter::kInvalidEvent: 107 case ExtensionWebRequestEventRouter::kInvalidEvent:
116 return "Invalid"; 108 return "Invalid";
117 case ExtensionWebRequestEventRouter::kOnBeforeRequest: 109 case ExtensionWebRequestEventRouter::kOnBeforeRequest:
118 return keys::kOnBeforeRequest; 110 return keys::kOnBeforeRequest;
119 case ExtensionWebRequestEventRouter::kOnBeforeSendHeaders: 111 case ExtensionWebRequestEventRouter::kOnBeforeSendHeaders:
120 return keys::kOnBeforeSendHeaders; 112 return keys::kOnBeforeSendHeaders;
121 case ExtensionWebRequestEventRouter::kOnSendHeaders: 113 case ExtensionWebRequestEventRouter::kOnSendHeaders:
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 ExtractRequestRoutingInfo(request, &render_process_host_id, &routing_id); 184 ExtractRequestRoutingInfo(request, &render_process_host_id, &routing_id);
193 return extensions::WebViewRendererState::GetInstance()-> 185 return extensions::WebViewRendererState::GetInstance()->
194 GetInfo(render_process_host_id, routing_id, web_view_info); 186 GetInfo(render_process_host_id, routing_id, web_view_info);
195 } 187 }
196 188
197 void ExtractRequestInfoDetails(net::URLRequest* request, 189 void ExtractRequestInfoDetails(net::URLRequest* request,
198 bool* is_main_frame, 190 bool* is_main_frame,
199 int* frame_id, 191 int* frame_id,
200 bool* parent_is_main_frame, 192 bool* parent_is_main_frame,
201 int* parent_frame_id, 193 int* parent_frame_id,
202 int* tab_id,
203 int* window_id,
204 int* render_process_host_id, 194 int* render_process_host_id,
205 int* routing_id, 195 int* routing_id,
206 ResourceType* resource_type) { 196 ResourceType* resource_type) {
207 if (!request->GetUserData(NULL)) 197 if (!request->GetUserData(NULL))
208 return; 198 return;
209 199
210 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 200 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
211 ExtensionRendererState::GetInstance()->GetTabAndWindowId(
212 info, tab_id, window_id);
213 *frame_id = info->GetRenderFrameID(); 201 *frame_id = info->GetRenderFrameID();
214 *is_main_frame = info->IsMainFrame(); 202 *is_main_frame = info->IsMainFrame();
215 *parent_frame_id = info->GetParentRenderFrameID(); 203 *parent_frame_id = info->GetParentRenderFrameID();
216 *parent_is_main_frame = info->ParentIsMainFrame(); 204 *parent_is_main_frame = info->ParentIsMainFrame();
217 *render_process_host_id = info->GetChildID(); 205 *render_process_host_id = info->GetChildID();
218 *routing_id = info->GetRouteID(); 206 *routing_id = info->GetRouteID();
219 207
220 // Restrict the resource type to the values we care about. 208 // Restrict the resource type to the values we care about.
221 if (utils::IsRelevantResourceType(info->GetResourceType())) 209 if (utils::IsRelevantResourceType(info->GetResourceType()))
222 *resource_type = info->GetResourceType(); 210 *resource_type = info->GetResourceType();
223 else 211 else
224 *resource_type = content::RESOURCE_TYPE_LAST_TYPE; 212 *resource_type = content::RESOURCE_TYPE_LAST_TYPE;
225 } 213 }
226 214
227 // Extracts from |request| information for the keys requestId, url, method,
228 // frameId, tabId, type, and timeStamp and writes these into |out| to be passed
229 // on to extensions.
230 void ExtractRequestInfo(net::URLRequest* request, base::DictionaryValue* out) {
231 bool is_main_frame = false;
232 int frame_id = -1;
233 bool parent_is_main_frame = false;
234 int parent_frame_id = -1;
235 int frame_id_for_extension = -1;
236 int parent_frame_id_for_extension = -1;
237 int tab_id = -1;
238 int window_id = -1;
239 int render_process_host_id = -1;
240 int routing_id = -1;
241 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
242 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id,
243 &parent_is_main_frame, &parent_frame_id, &tab_id,
244 &window_id, &render_process_host_id, &routing_id,
245 &resource_type);
246 frame_id_for_extension = GetFrameId(is_main_frame, frame_id);
247 parent_frame_id_for_extension = GetFrameId(parent_is_main_frame,
248 parent_frame_id);
249
250 out->SetString(keys::kRequestIdKey,
251 base::Uint64ToString(request->identifier()));
252 out->SetString(keys::kUrlKey, request->url().spec());
253 out->SetString(keys::kMethodKey, request->method());
254 out->SetInteger(keys::kFrameIdKey, frame_id_for_extension);
255 out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension);
256 out->SetInteger(keys::kTabIdKey, tab_id);
257 out->SetString(keys::kTypeKey, utils::ResourceTypeToString(resource_type));
258 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
259 }
260
261 // Extracts the body from |request| and writes the data into |out|. 215 // Extracts the body from |request| and writes the data into |out|.
262 void ExtractRequestInfoBody(const net::URLRequest* request, 216 void ExtractRequestInfoBody(const net::URLRequest* request,
263 base::DictionaryValue* out) { 217 base::DictionaryValue* out) {
264 const net::UploadDataStream* upload_data = request->get_upload(); 218 const net::UploadDataStream* upload_data = request->get_upload();
265 if (!upload_data || 219 if (!upload_data ||
266 (request->method() != "POST" && request->method() != "PUT")) 220 (request->method() != "POST" && request->method() != "PUT"))
267 return; // Need to exit without "out->Set(keys::kRequestBodyKey, ...);" . 221 return; // Need to exit without "out->Set(keys::kRequestBodyKey, ...);" .
268 222
269 base::DictionaryValue* requestBody = new base::DictionaryValue(); 223 base::DictionaryValue* requestBody = new base::DictionaryValue();
270 out->Set(keys::kRequestBodyKey, requestBody); 224 out->Set(keys::kRequestBodyKey, requestBody);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 if (!header_value->HasKey(keys::kHeaderBinaryValueKey)) { 274 if (!header_value->HasKey(keys::kHeaderBinaryValueKey)) {
321 *value = ""; 275 *value = "";
322 } else if (!header_value->GetList(keys::kHeaderBinaryValueKey, &list) || 276 } else if (!header_value->GetList(keys::kHeaderBinaryValueKey, &list) ||
323 !helpers::CharListToString(list, value)) { 277 !helpers::CharListToString(list, value)) {
324 return false; 278 return false;
325 } 279 }
326 } 280 }
327 return true; 281 return true;
328 } 282 }
329 283
330 // Converts the |name|, |value| pair of a http header to a HttpHeaders
331 // dictionary. Ownership is passed to the caller.
332 base::DictionaryValue* ToHeaderDictionary(const std::string& name,
333 const std::string& value) {
334 base::DictionaryValue* header = new base::DictionaryValue();
335 header->SetString(keys::kHeaderNameKey, name);
336 if (base::IsStringUTF8(value)) {
337 header->SetString(keys::kHeaderValueKey, value);
338 } else {
339 header->Set(keys::kHeaderBinaryValueKey,
340 helpers::StringToCharList(value));
341 }
342 return header;
343 }
344
345 // Creates a list of HttpHeaders (see the extension API JSON). If |headers| is 284 // Creates a list of HttpHeaders (see the extension API JSON). If |headers| is
346 // NULL, the list is empty. Ownership is passed to the caller. 285 // NULL, the list is empty. Ownership is passed to the caller.
347 base::ListValue* GetResponseHeadersList( 286 base::ListValue* GetResponseHeadersList(
348 const net::HttpResponseHeaders* headers) { 287 const net::HttpResponseHeaders* headers) {
349 base::ListValue* headers_value = new base::ListValue(); 288 base::ListValue* headers_value = new base::ListValue();
350 if (headers) { 289 if (headers) {
351 void* iter = NULL; 290 void* iter = NULL;
352 std::string name; 291 std::string name;
353 std::string value; 292 std::string value;
354 while (headers->EnumerateHeaderLines(&iter, &name, &value)) 293 while (headers->EnumerateHeaderLines(&iter, &name, &value))
355 headers_value->Append(ToHeaderDictionary(name, value)); 294 headers_value->Append(helpers::ToHeaderDictionary(name, value));
356 } 295 }
357 return headers_value; 296 return headers_value;
358 } 297 }
359 298
360 base::ListValue* GetRequestHeadersList(const net::HttpRequestHeaders& headers) { 299 base::ListValue* GetRequestHeadersList(const net::HttpRequestHeaders& headers) {
361 base::ListValue* headers_value = new base::ListValue(); 300 base::ListValue* headers_value = new base::ListValue();
362 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext(); ) 301 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext(); )
363 headers_value->Append(ToHeaderDictionary(it.name(), it.value())); 302 headers_value->Append(helpers::ToHeaderDictionary(it.name(), it.value()));
364 return headers_value; 303 return headers_value;
365 } 304 }
366 305
367 // Creates a base::StringValue with the status line of |headers|. If |headers| 306 // Creates a base::StringValue with the status line of |headers|. If |headers|
368 // is NULL, an empty string is returned. Ownership is passed to the caller. 307 // is NULL, an empty string is returned. Ownership is passed to the caller.
369 base::StringValue* GetStatusLine(net::HttpResponseHeaders* headers) { 308 base::StringValue* GetStatusLine(net::HttpResponseHeaders* headers) {
370 return new base::StringValue( 309 return new base::StringValue(
371 headers ? headers->GetStatusLine() : std::string()); 310 headers ? headers->GetStatusLine() : std::string());
372 } 311 }
373 312
374 void RemoveEventListenerOnUI( 313 void RemoveEventListenerOnUI(
375 void* profile_id, 314 void* browser_context_id,
376 const std::string& event_name, 315 const std::string& event_name,
377 int process_id, 316 int process_id,
378 const std::string& extension_id) { 317 const std::string& extension_id) {
379 DCHECK_CURRENTLY_ON(BrowserThread::UI); 318 DCHECK_CURRENTLY_ON(BrowserThread::UI);
380 319
381 Profile* profile = reinterpret_cast<Profile*>(profile_id); 320 content::BrowserContext* browser_context =
382 if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 321 reinterpret_cast<content::BrowserContext*>(browser_context_id);
322 if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(
323 browser_context))
383 return; 324 return;
384 325
385 extensions::EventRouter* event_router = extensions::EventRouter::Get(profile); 326 extensions::EventRouter* event_router =
327 extensions::EventRouter::Get(browser_context);
386 if (!event_router) 328 if (!event_router)
387 return; 329 return;
388 330
389 content::RenderProcessHost* process = 331 content::RenderProcessHost* process =
390 content::RenderProcessHost::FromID(process_id); 332 content::RenderProcessHost::FromID(process_id);
391 if (!process) 333 if (!process)
392 return; 334 return;
393 335
394 event_router->RemoveEventListener(event_name, process, extension_id); 336 event_router->RemoveEventListener(event_name, process, extension_id);
395 } 337 }
396 338
397 // Sends an event to subscribers of chrome.declarativeWebRequest.onMessage or 339 // Sends an event to subscribers of chrome.declarativeWebRequest.onMessage or
398 // to subscribers of webview.onMessage if the action is being operated upon 340 // to subscribers of webview.onMessage if the action is being operated upon
399 // a <webview> guest renderer. 341 // a <webview> guest renderer.
400 // |extension_id| identifies the extension that sends and receives the event. 342 // |extension_id| identifies the extension that sends and receives the event.
401 // |is_web_view_guest| indicates whether the action is for a <webview>. 343 // |is_web_view_guest| indicates whether the action is for a <webview>.
402 // |web_view_info| is a struct containing information about the <webview> 344 // |web_view_info| is a struct containing information about the <webview>
403 // embedder. 345 // embedder.
404 // |event_argument| is passed to the event listener. 346 // |event_argument| is passed to the event listener.
405 void SendOnMessageEventOnUI( 347 void SendOnMessageEventOnUI(
406 void* profile_id, 348 void* browser_context_id,
407 const std::string& extension_id, 349 const std::string& extension_id,
408 bool is_web_view_guest, 350 bool is_web_view_guest,
409 const extensions::WebViewRendererState::WebViewInfo& web_view_info, 351 const extensions::WebViewRendererState::WebViewInfo& web_view_info,
410 scoped_ptr<base::DictionaryValue> event_argument) { 352 scoped_ptr<base::DictionaryValue> event_argument) {
411 DCHECK_CURRENTLY_ON(BrowserThread::UI); 353 DCHECK_CURRENTLY_ON(BrowserThread::UI);
412 354
413 Profile* profile = reinterpret_cast<Profile*>(profile_id); 355 content::BrowserContext* browser_context =
414 if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 356 reinterpret_cast<content::BrowserContext*>(browser_context_id);
357 if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(
358 browser_context))
415 return; 359 return;
416 360
417 scoped_ptr<base::ListValue> event_args(new base::ListValue); 361 scoped_ptr<base::ListValue> event_args(new base::ListValue);
418 event_args->Append(event_argument.release()); 362 event_args->Append(event_argument.release());
419 363
420 extensions::EventRouter* event_router = extensions::EventRouter::Get(profile); 364 extensions::EventRouter* event_router =
365 extensions::EventRouter::Get(browser_context);
421 366
422 extensions::EventFilteringInfo event_filtering_info; 367 extensions::EventFilteringInfo event_filtering_info;
423 368
424 std::string event_name; 369 std::string event_name;
425 // The instance ID uniquely identifies a <webview> instance within an embedder 370 // The instance ID uniquely identifies a <webview> instance within an embedder
426 // process. We use a filter here so that only event listeners for a particular 371 // process. We use a filter here so that only event listeners for a particular
427 // <webview> will fire. 372 // <webview> will fire.
428 if (is_web_view_guest) { 373 if (is_web_view_guest) {
429 event_filtering_info.SetInstanceID(web_view_info.instance_id); 374 event_filtering_info.SetInstanceID(web_view_info.instance_id);
430 event_name = webview::kEventMessage; 375 event_name = webview::kEventMessage;
431 } else { 376 } else {
432 event_name = declarative_keys::kOnMessage; 377 event_name = declarative_keys::kOnMessage;
433 } 378 }
434 379
435 scoped_ptr<extensions::Event> event(new extensions::Event( 380 scoped_ptr<extensions::Event> event(new extensions::Event(
436 event_name, 381 event_name,
437 event_args.Pass(), profile, GURL(), 382 event_args.Pass(), browser_context, GURL(),
438 extensions::EventRouter::USER_GESTURE_UNKNOWN, 383 extensions::EventRouter::USER_GESTURE_UNKNOWN,
439 event_filtering_info)); 384 event_filtering_info));
440 event_router->DispatchEventToExtension(extension_id, event.Pass()); 385 event_router->DispatchEventToExtension(extension_id, event.Pass());
441 } 386 }
442 387
443 void RemoveEventListenerOnIOThread( 388 void RemoveEventListenerOnIOThread(
444 content::BrowserContext* browser_context, 389 content::BrowserContext* browser_context,
445 const std::string& extension_id, 390 const std::string& extension_id,
446 const std::string& sub_event_name) { 391 const std::string& sub_event_name) {
447 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 392 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 ExtensionWebRequestEventRouter::EventResponse::EventResponse( 620 ExtensionWebRequestEventRouter::EventResponse::EventResponse(
676 const std::string& extension_id, const base::Time& extension_install_time) 621 const std::string& extension_id, const base::Time& extension_install_time)
677 : extension_id(extension_id), 622 : extension_id(extension_id),
678 extension_install_time(extension_install_time), 623 extension_install_time(extension_install_time),
679 cancel(false) { 624 cancel(false) {
680 } 625 }
681 626
682 ExtensionWebRequestEventRouter::EventResponse::~EventResponse() { 627 ExtensionWebRequestEventRouter::EventResponse::~EventResponse() {
683 } 628 }
684 629
685
686 ExtensionWebRequestEventRouter::RequestFilter::RequestFilter() 630 ExtensionWebRequestEventRouter::RequestFilter::RequestFilter()
687 : tab_id(-1), window_id(-1) { 631 : tab_id(-1), window_id(-1) {
688 } 632 }
689 633
690 ExtensionWebRequestEventRouter::RequestFilter::~RequestFilter() { 634 ExtensionWebRequestEventRouter::RequestFilter::~RequestFilter() {
691 } 635 }
692 636
693 // 637 //
694 // ExtensionWebRequestEventRouter 638 // ExtensionWebRequestEventRouter
695 // 639 //
696 640
697 // static 641 // static
698 ExtensionWebRequestEventRouter* ExtensionWebRequestEventRouter::GetInstance() { 642 ExtensionWebRequestEventRouter* ExtensionWebRequestEventRouter::GetInstance() {
699 return Singleton<ExtensionWebRequestEventRouter>::get(); 643 return Singleton<ExtensionWebRequestEventRouter>::get();
700 } 644 }
701 645
702 ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() 646 ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter()
703 : request_time_tracker_(new ExtensionWebRequestTimeTracker) { 647 : request_time_tracker_(new ExtensionWebRequestTimeTracker) {
648 web_request_event_router_delegate_.reset(
649 extensions::ExtensionsAPIClient::Get()->
650 CreateWebRequestEventRouterDelegate());
704 } 651 }
705 652
706 ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { 653 ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() {
707 } 654 }
708 655
709 void ExtensionWebRequestEventRouter::RegisterRulesRegistry( 656 void ExtensionWebRequestEventRouter::RegisterRulesRegistry(
710 void* profile, 657 void* browser_context,
711 const RulesRegistryService::WebViewKey& webview_key, 658 const RulesRegistryService::WebViewKey& webview_key,
712 scoped_refptr<extensions::WebRequestRulesRegistry> rules_registry) { 659 scoped_refptr<extensions::WebRequestRulesRegistry> rules_registry) {
713 RulesRegistryKey key(profile, webview_key); 660 RulesRegistryKey key(browser_context, webview_key);
714 if (rules_registry.get()) 661 if (rules_registry.get())
715 rules_registries_[key] = rules_registry; 662 rules_registries_[key] = rules_registry;
716 else 663 else
717 rules_registries_.erase(key); 664 rules_registries_.erase(key);
718 } 665 }
719 666
667 void ExtensionWebRequestEventRouter::ExtractRequestInfo(
668 net::URLRequest* request, base::DictionaryValue* out) {
669 bool is_main_frame = false;
670 int frame_id = -1;
671 bool parent_is_main_frame = false;
672 int parent_frame_id = -1;
673 int frame_id_for_extension = -1;
674 int parent_frame_id_for_extension = -1;
675 int render_process_host_id = -1;
676 int routing_id = -1;
677 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
678 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id,
679 &parent_is_main_frame, &parent_frame_id,
680 &render_process_host_id, &routing_id,
681 &resource_type);
682 frame_id_for_extension = GetFrameId(is_main_frame, frame_id);
683 parent_frame_id_for_extension = GetFrameId(parent_is_main_frame,
684 parent_frame_id);
685
686 out->SetString(keys::kRequestIdKey,
687 base::Uint64ToString(request->identifier()));
688 out->SetString(keys::kUrlKey, request->url().spec());
689 out->SetString(keys::kMethodKey, request->method());
690 out->SetInteger(keys::kFrameIdKey, frame_id_for_extension);
691 out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension);
692 out->SetString(keys::kTypeKey, utils::ResourceTypeToString(resource_type));
693 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
694 if (web_request_event_router_delegate_) {
695 web_request_event_router_delegate_->ExtractExtraRequestDetails(
696 request, out);
697 }
698 }
699
720 int ExtensionWebRequestEventRouter::OnBeforeRequest( 700 int ExtensionWebRequestEventRouter::OnBeforeRequest(
721 void* profile, 701 void* browser_context,
722 InfoMap* extension_info_map, 702 InfoMap* extension_info_map,
723 net::URLRequest* request, 703 net::URLRequest* request,
724 const net::CompletionCallback& callback, 704 const net::CompletionCallback& callback,
725 GURL* new_url) { 705 GURL* new_url) {
726 // We hide events from the system context as well as sensitive requests. 706 // We hide events from the system context as well as sensitive requests.
727 if (!profile || 707 if (!browser_context ||
728 WebRequestPermissions::HideRequest(extension_info_map, request)) 708 WebRequestPermissions::HideRequest(extension_info_map, request))
729 return net::OK; 709 return net::OK;
730 710
731 if (IsPageLoad(request)) 711 if (IsPageLoad(request))
732 NotifyPageLoad(); 712 NotifyPageLoad();
733 713
734 request_time_tracker_->LogRequestStartTime(request->identifier(), 714 request_time_tracker_->LogRequestStartTime(request->identifier(),
735 base::Time::Now(), 715 base::Time::Now(),
736 request->url(), 716 request->url(),
737 profile); 717 browser_context);
738 718
739 // Whether to initialized blocked_requests_. 719 // Whether to initialized blocked_requests_.
740 bool initialize_blocked_requests = false; 720 bool initialize_blocked_requests = false;
741 721
742 initialize_blocked_requests |= 722 initialize_blocked_requests |=
743 ProcessDeclarativeRules(profile, extension_info_map, 723 ProcessDeclarativeRules(browser_context, extension_info_map,
744 web_request::OnBeforeRequest::kEventName, request, 724 web_request::OnBeforeRequest::kEventName, request,
745 extensions::ON_BEFORE_REQUEST, NULL); 725 extensions::ON_BEFORE_REQUEST, NULL);
746 726
747 int extra_info_spec = 0; 727 int extra_info_spec = 0;
748 std::vector<const EventListener*> listeners = 728 std::vector<const EventListener*> listeners =
749 GetMatchingListeners(profile, extension_info_map, 729 GetMatchingListeners(browser_context, extension_info_map,
750 web_request::OnBeforeRequest::kEventName, request, 730 web_request::OnBeforeRequest::kEventName, request,
751 &extra_info_spec); 731 &extra_info_spec);
752 if (!listeners.empty() && 732 if (!listeners.empty() &&
753 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { 733 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) {
754 base::ListValue args; 734 base::ListValue args;
755 base::DictionaryValue* dict = new base::DictionaryValue(); 735 base::DictionaryValue* dict = new base::DictionaryValue();
756 ExtractRequestInfo(request, dict); 736 ExtractRequestInfo(request, dict);
757 if (extra_info_spec & ExtraInfoSpec::REQUEST_BODY) 737 if (extra_info_spec & ExtraInfoSpec::REQUEST_BODY)
758 ExtractRequestInfoBody(request, dict); 738 ExtractRequestInfoBody(request, dict);
759 args.Append(dict); 739 args.Append(dict);
760 740
761 initialize_blocked_requests |= 741 initialize_blocked_requests |=
762 DispatchEvent(profile, request, listeners, args); 742 DispatchEvent(browser_context, request, listeners, args);
763 } 743 }
764 744
765 if (!initialize_blocked_requests) 745 if (!initialize_blocked_requests)
766 return net::OK; // Nobody saw a reason for modifying the request. 746 return net::OK; // Nobody saw a reason for modifying the request.
767 747
768 blocked_requests_[request->identifier()].event = kOnBeforeRequest; 748 blocked_requests_[request->identifier()].event = kOnBeforeRequest;
769 blocked_requests_[request->identifier()].is_incognito |= 749 blocked_requests_[request->identifier()].is_incognito |=
770 IsIncognitoProfile(profile); 750 IsIncognitoBrowserContext(browser_context);
771 blocked_requests_[request->identifier()].request = request; 751 blocked_requests_[request->identifier()].request = request;
772 blocked_requests_[request->identifier()].callback = callback; 752 blocked_requests_[request->identifier()].callback = callback;
773 blocked_requests_[request->identifier()].new_url = new_url; 753 blocked_requests_[request->identifier()].new_url = new_url;
774 blocked_requests_[request->identifier()].net_log = &request->net_log(); 754 blocked_requests_[request->identifier()].net_log = &request->net_log();
775 755
776 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) { 756 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) {
777 // If there are no blocking handlers, only the declarative rules tried 757 // If there are no blocking handlers, only the declarative rules tried
778 // to modify the request and we can respond synchronously. 758 // to modify the request and we can respond synchronously.
779 return ExecuteDeltas(profile, request->identifier(), 759 return ExecuteDeltas(browser_context, request->identifier(),
780 false /* call_callback*/); 760 false /* call_callback*/);
781 } else { 761 } else {
782 return net::ERR_IO_PENDING; 762 return net::ERR_IO_PENDING;
783 } 763 }
784 } 764 }
785 765
786 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( 766 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
787 void* profile, 767 void* browser_context,
788 InfoMap* extension_info_map, 768 InfoMap* extension_info_map,
789 net::URLRequest* request, 769 net::URLRequest* request,
790 const net::CompletionCallback& callback, 770 const net::CompletionCallback& callback,
791 net::HttpRequestHeaders* headers) { 771 net::HttpRequestHeaders* headers) {
792 // We hide events from the system context as well as sensitive requests. 772 // We hide events from the system context as well as sensitive requests.
793 if (!profile || 773 if (!browser_context ||
794 WebRequestPermissions::HideRequest(extension_info_map, request)) 774 WebRequestPermissions::HideRequest(extension_info_map, request))
795 return net::OK; 775 return net::OK;
796 776
797 bool initialize_blocked_requests = false; 777 bool initialize_blocked_requests = false;
798 778
799 initialize_blocked_requests |= 779 initialize_blocked_requests |=
800 ProcessDeclarativeRules(profile, extension_info_map, 780 ProcessDeclarativeRules(browser_context, extension_info_map,
801 keys::kOnBeforeSendHeadersEvent, request, 781 keys::kOnBeforeSendHeadersEvent, request,
802 extensions::ON_BEFORE_SEND_HEADERS, NULL); 782 extensions::ON_BEFORE_SEND_HEADERS, NULL);
803 783
804 int extra_info_spec = 0; 784 int extra_info_spec = 0;
805 std::vector<const EventListener*> listeners = 785 std::vector<const EventListener*> listeners =
806 GetMatchingListeners(profile, extension_info_map, 786 GetMatchingListeners(browser_context, extension_info_map,
807 keys::kOnBeforeSendHeadersEvent, request, 787 keys::kOnBeforeSendHeadersEvent, request,
808 &extra_info_spec); 788 &extra_info_spec);
809 if (!listeners.empty() && 789 if (!listeners.empty() &&
810 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) { 790 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) {
811 base::ListValue args; 791 base::ListValue args;
812 base::DictionaryValue* dict = new base::DictionaryValue(); 792 base::DictionaryValue* dict = new base::DictionaryValue();
813 ExtractRequestInfo(request, dict); 793 ExtractRequestInfo(request, dict);
814 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) 794 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)
815 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(*headers)); 795 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(*headers));
816 args.Append(dict); 796 args.Append(dict);
817 797
818 initialize_blocked_requests |= 798 initialize_blocked_requests |=
819 DispatchEvent(profile, request, listeners, args); 799 DispatchEvent(browser_context, request, listeners, args);
820 } 800 }
821 801
822 if (!initialize_blocked_requests) 802 if (!initialize_blocked_requests)
823 return net::OK; // Nobody saw a reason for modifying the request. 803 return net::OK; // Nobody saw a reason for modifying the request.
824 804
825 blocked_requests_[request->identifier()].event = kOnBeforeSendHeaders; 805 blocked_requests_[request->identifier()].event = kOnBeforeSendHeaders;
826 blocked_requests_[request->identifier()].is_incognito |= 806 blocked_requests_[request->identifier()].is_incognito |=
827 IsIncognitoProfile(profile); 807 IsIncognitoBrowserContext(browser_context);
828 blocked_requests_[request->identifier()].request = request; 808 blocked_requests_[request->identifier()].request = request;
829 blocked_requests_[request->identifier()].callback = callback; 809 blocked_requests_[request->identifier()].callback = callback;
830 blocked_requests_[request->identifier()].request_headers = headers; 810 blocked_requests_[request->identifier()].request_headers = headers;
831 blocked_requests_[request->identifier()].net_log = &request->net_log(); 811 blocked_requests_[request->identifier()].net_log = &request->net_log();
832 812
833 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) { 813 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) {
834 // If there are no blocking handlers, only the declarative rules tried 814 // If there are no blocking handlers, only the declarative rules tried
835 // to modify the request and we can respond synchronously. 815 // to modify the request and we can respond synchronously.
836 return ExecuteDeltas(profile, request->identifier(), 816 return ExecuteDeltas(browser_context, request->identifier(),
837 false /* call_callback*/); 817 false /* call_callback*/);
838 } else { 818 } else {
839 return net::ERR_IO_PENDING; 819 return net::ERR_IO_PENDING;
840 } 820 }
841 } 821 }
842 822
843 void ExtensionWebRequestEventRouter::OnSendHeaders( 823 void ExtensionWebRequestEventRouter::OnSendHeaders(
844 void* profile, 824 void* browser_context,
845 InfoMap* extension_info_map, 825 InfoMap* extension_info_map,
846 net::URLRequest* request, 826 net::URLRequest* request,
847 const net::HttpRequestHeaders& headers) { 827 const net::HttpRequestHeaders& headers) {
848 // We hide events from the system context as well as sensitive requests. 828 // We hide events from the system context as well as sensitive requests.
849 if (!profile || 829 if (!browser_context ||
850 WebRequestPermissions::HideRequest(extension_info_map, request)) 830 WebRequestPermissions::HideRequest(extension_info_map, request))
851 return; 831 return;
852 832
853 if (GetAndSetSignaled(request->identifier(), kOnSendHeaders)) 833 if (GetAndSetSignaled(request->identifier(), kOnSendHeaders))
854 return; 834 return;
855 835
856 ClearSignaled(request->identifier(), kOnBeforeRedirect); 836 ClearSignaled(request->identifier(), kOnBeforeRedirect);
857 837
858 int extra_info_spec = 0; 838 int extra_info_spec = 0;
859 std::vector<const EventListener*> listeners = 839 std::vector<const EventListener*> listeners =
860 GetMatchingListeners(profile, extension_info_map, 840 GetMatchingListeners(browser_context, extension_info_map,
861 keys::kOnSendHeadersEvent, request, 841 keys::kOnSendHeadersEvent, request,
862 &extra_info_spec); 842 &extra_info_spec);
863 if (listeners.empty()) 843 if (listeners.empty())
864 return; 844 return;
865 845
866 base::ListValue args; 846 base::ListValue args;
867 base::DictionaryValue* dict = new base::DictionaryValue(); 847 base::DictionaryValue* dict = new base::DictionaryValue();
868 ExtractRequestInfo(request, dict); 848 ExtractRequestInfo(request, dict);
869 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) 849 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)
870 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(headers)); 850 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(headers));
871 args.Append(dict); 851 args.Append(dict);
872 852
873 DispatchEvent(profile, request, listeners, args); 853 DispatchEvent(browser_context, request, listeners, args);
874 } 854 }
875 855
876 int ExtensionWebRequestEventRouter::OnHeadersReceived( 856 int ExtensionWebRequestEventRouter::OnHeadersReceived(
877 void* profile, 857 void* browser_context,
878 InfoMap* extension_info_map, 858 InfoMap* extension_info_map,
879 net::URLRequest* request, 859 net::URLRequest* request,
880 const net::CompletionCallback& callback, 860 const net::CompletionCallback& callback,
881 const net::HttpResponseHeaders* original_response_headers, 861 const net::HttpResponseHeaders* original_response_headers,
882 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 862 scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
883 GURL* allowed_unsafe_redirect_url) { 863 GURL* allowed_unsafe_redirect_url) {
884 // We hide events from the system context as well as sensitive requests. 864 // We hide events from the system context as well as sensitive requests.
885 if (!profile || 865 if (!browser_context ||
886 WebRequestPermissions::HideRequest(extension_info_map, request)) 866 WebRequestPermissions::HideRequest(extension_info_map, request))
887 return net::OK; 867 return net::OK;
888 868
889 bool initialize_blocked_requests = false; 869 bool initialize_blocked_requests = false;
890 870
891 initialize_blocked_requests |= 871 initialize_blocked_requests |=
892 ProcessDeclarativeRules(profile, extension_info_map, 872 ProcessDeclarativeRules(browser_context, extension_info_map,
893 keys::kOnHeadersReceivedEvent, request, 873 keys::kOnHeadersReceivedEvent, request,
894 extensions::ON_HEADERS_RECEIVED, 874 extensions::ON_HEADERS_RECEIVED,
895 original_response_headers); 875 original_response_headers);
896 876
897 int extra_info_spec = 0; 877 int extra_info_spec = 0;
898 std::vector<const EventListener*> listeners = 878 std::vector<const EventListener*> listeners =
899 GetMatchingListeners(profile, extension_info_map, 879 GetMatchingListeners(browser_context, extension_info_map,
900 keys::kOnHeadersReceivedEvent, request, 880 keys::kOnHeadersReceivedEvent, request,
901 &extra_info_spec); 881 &extra_info_spec);
902 882
903 if (!listeners.empty() && 883 if (!listeners.empty() &&
904 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) { 884 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) {
905 base::ListValue args; 885 base::ListValue args;
906 base::DictionaryValue* dict = new base::DictionaryValue(); 886 base::DictionaryValue* dict = new base::DictionaryValue();
907 ExtractRequestInfo(request, dict); 887 ExtractRequestInfo(request, dict);
908 dict->SetString(keys::kStatusLineKey, 888 dict->SetString(keys::kStatusLineKey,
909 original_response_headers->GetStatusLine()); 889 original_response_headers->GetStatusLine());
910 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { 890 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) {
911 dict->Set(keys::kResponseHeadersKey, 891 dict->Set(keys::kResponseHeadersKey,
912 GetResponseHeadersList(original_response_headers)); 892 GetResponseHeadersList(original_response_headers));
913 } 893 }
914 args.Append(dict); 894 args.Append(dict);
915 895
916 initialize_blocked_requests |= 896 initialize_blocked_requests |=
917 DispatchEvent(profile, request, listeners, args); 897 DispatchEvent(browser_context, request, listeners, args);
918 } 898 }
919 899
920 if (!initialize_blocked_requests) 900 if (!initialize_blocked_requests)
921 return net::OK; // Nobody saw a reason for modifying the request. 901 return net::OK; // Nobody saw a reason for modifying the request.
922 902
923 blocked_requests_[request->identifier()].event = kOnHeadersReceived; 903 blocked_requests_[request->identifier()].event = kOnHeadersReceived;
924 blocked_requests_[request->identifier()].is_incognito |= 904 blocked_requests_[request->identifier()].is_incognito |=
925 IsIncognitoProfile(profile); 905 IsIncognitoBrowserContext(browser_context);
926 blocked_requests_[request->identifier()].request = request; 906 blocked_requests_[request->identifier()].request = request;
927 blocked_requests_[request->identifier()].callback = callback; 907 blocked_requests_[request->identifier()].callback = callback;
928 blocked_requests_[request->identifier()].net_log = &request->net_log(); 908 blocked_requests_[request->identifier()].net_log = &request->net_log();
929 blocked_requests_[request->identifier()].override_response_headers = 909 blocked_requests_[request->identifier()].override_response_headers =
930 override_response_headers; 910 override_response_headers;
931 blocked_requests_[request->identifier()].original_response_headers = 911 blocked_requests_[request->identifier()].original_response_headers =
932 original_response_headers; 912 original_response_headers;
933 blocked_requests_[request->identifier()].new_url = 913 blocked_requests_[request->identifier()].new_url =
934 allowed_unsafe_redirect_url; 914 allowed_unsafe_redirect_url;
935 915
936 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) { 916 if (blocked_requests_[request->identifier()].num_handlers_blocking == 0) {
937 // If there are no blocking handlers, only the declarative rules tried 917 // If there are no blocking handlers, only the declarative rules tried
938 // to modify the request and we can respond synchronously. 918 // to modify the request and we can respond synchronously.
939 return ExecuteDeltas(profile, request->identifier(), 919 return ExecuteDeltas(browser_context, request->identifier(),
940 false /* call_callback*/); 920 false /* call_callback*/);
941 } else { 921 } else {
942 return net::ERR_IO_PENDING; 922 return net::ERR_IO_PENDING;
943 } 923 }
944 } 924 }
945 925
946 net::NetworkDelegate::AuthRequiredResponse 926 net::NetworkDelegate::AuthRequiredResponse
947 ExtensionWebRequestEventRouter::OnAuthRequired( 927 ExtensionWebRequestEventRouter::OnAuthRequired(
948 void* profile, 928 void* browser_context,
949 InfoMap* extension_info_map, 929 InfoMap* extension_info_map,
950 net::URLRequest* request, 930 net::URLRequest* request,
951 const net::AuthChallengeInfo& auth_info, 931 const net::AuthChallengeInfo& auth_info,
952 const net::NetworkDelegate::AuthCallback& callback, 932 const net::NetworkDelegate::AuthCallback& callback,
953 net::AuthCredentials* credentials) { 933 net::AuthCredentials* credentials) {
954 // No profile means that this is for authentication challenges in the 934 // No browser_context means that this is for authentication challenges in the
955 // system context. Skip in that case. Also skip sensitive requests. 935 // system context. Skip in that case. Also skip sensitive requests.
956 if (!profile || 936 if (!browser_context ||
957 WebRequestPermissions::HideRequest(extension_info_map, request)) 937 WebRequestPermissions::HideRequest(extension_info_map, request))
958 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 938 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
959 939
960 int extra_info_spec = 0; 940 int extra_info_spec = 0;
961 std::vector<const EventListener*> listeners = 941 std::vector<const EventListener*> listeners =
962 GetMatchingListeners(profile, extension_info_map, 942 GetMatchingListeners(browser_context, extension_info_map,
963 keys::kOnAuthRequiredEvent, request, 943 keys::kOnAuthRequiredEvent, request,
964 &extra_info_spec); 944 &extra_info_spec);
965 if (listeners.empty()) 945 if (listeners.empty())
966 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 946 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
967 947
968 base::ListValue args; 948 base::ListValue args;
969 base::DictionaryValue* dict = new base::DictionaryValue(); 949 base::DictionaryValue* dict = new base::DictionaryValue();
970 ExtractRequestInfo(request, dict); 950 ExtractRequestInfo(request, dict);
971 dict->SetBoolean(keys::kIsProxyKey, auth_info.is_proxy); 951 dict->SetBoolean(keys::kIsProxyKey, auth_info.is_proxy);
972 if (!auth_info.scheme.empty()) 952 if (!auth_info.scheme.empty())
973 dict->SetString(keys::kSchemeKey, auth_info.scheme); 953 dict->SetString(keys::kSchemeKey, auth_info.scheme);
974 if (!auth_info.realm.empty()) 954 if (!auth_info.realm.empty())
975 dict->SetString(keys::kRealmKey, auth_info.realm); 955 dict->SetString(keys::kRealmKey, auth_info.realm);
976 base::DictionaryValue* challenger = new base::DictionaryValue(); 956 base::DictionaryValue* challenger = new base::DictionaryValue();
977 challenger->SetString(keys::kHostKey, auth_info.challenger.host()); 957 challenger->SetString(keys::kHostKey, auth_info.challenger.host());
978 challenger->SetInteger(keys::kPortKey, auth_info.challenger.port()); 958 challenger->SetInteger(keys::kPortKey, auth_info.challenger.port());
979 dict->Set(keys::kChallengerKey, challenger); 959 dict->Set(keys::kChallengerKey, challenger);
980 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); 960 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers()));
981 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { 961 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) {
982 dict->Set(keys::kResponseHeadersKey, 962 dict->Set(keys::kResponseHeadersKey,
983 GetResponseHeadersList(request->response_headers())); 963 GetResponseHeadersList(request->response_headers()));
984 } 964 }
985 args.Append(dict); 965 args.Append(dict);
986 966
987 if (DispatchEvent(profile, request, listeners, args)) { 967 if (DispatchEvent(browser_context, request, listeners, args)) {
988 blocked_requests_[request->identifier()].event = kOnAuthRequired; 968 blocked_requests_[request->identifier()].event = kOnAuthRequired;
989 blocked_requests_[request->identifier()].is_incognito |= 969 blocked_requests_[request->identifier()].is_incognito |=
990 IsIncognitoProfile(profile); 970 IsIncognitoBrowserContext(browser_context);
991 blocked_requests_[request->identifier()].request = request; 971 blocked_requests_[request->identifier()].request = request;
992 blocked_requests_[request->identifier()].auth_callback = callback; 972 blocked_requests_[request->identifier()].auth_callback = callback;
993 blocked_requests_[request->identifier()].auth_credentials = credentials; 973 blocked_requests_[request->identifier()].auth_credentials = credentials;
994 blocked_requests_[request->identifier()].net_log = &request->net_log(); 974 blocked_requests_[request->identifier()].net_log = &request->net_log();
995 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING; 975 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING;
996 } 976 }
997 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 977 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
998 } 978 }
999 979
1000 void ExtensionWebRequestEventRouter::OnBeforeRedirect( 980 void ExtensionWebRequestEventRouter::OnBeforeRedirect(
1001 void* profile, 981 void* browser_context,
1002 InfoMap* extension_info_map, 982 InfoMap* extension_info_map,
1003 net::URLRequest* request, 983 net::URLRequest* request,
1004 const GURL& new_location) { 984 const GURL& new_location) {
1005 // We hide events from the system context as well as sensitive requests. 985 // We hide events from the system context as well as sensitive requests.
1006 if (!profile || 986 if (!browser_context ||
1007 WebRequestPermissions::HideRequest(extension_info_map, request)) 987 WebRequestPermissions::HideRequest(extension_info_map, request))
1008 return; 988 return;
1009 989
1010 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect)) 990 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect))
1011 return; 991 return;
1012 992
1013 ClearSignaled(request->identifier(), kOnBeforeRequest); 993 ClearSignaled(request->identifier(), kOnBeforeRequest);
1014 ClearSignaled(request->identifier(), kOnBeforeSendHeaders); 994 ClearSignaled(request->identifier(), kOnBeforeSendHeaders);
1015 ClearSignaled(request->identifier(), kOnSendHeaders); 995 ClearSignaled(request->identifier(), kOnSendHeaders);
1016 ClearSignaled(request->identifier(), kOnHeadersReceived); 996 ClearSignaled(request->identifier(), kOnHeadersReceived);
1017 997
1018 int extra_info_spec = 0; 998 int extra_info_spec = 0;
1019 std::vector<const EventListener*> listeners = 999 std::vector<const EventListener*> listeners =
1020 GetMatchingListeners(profile, extension_info_map, 1000 GetMatchingListeners(browser_context, extension_info_map,
1021 keys::kOnBeforeRedirectEvent, request, 1001 keys::kOnBeforeRedirectEvent, request,
1022 &extra_info_spec); 1002 &extra_info_spec);
1023 if (listeners.empty()) 1003 if (listeners.empty())
1024 return; 1004 return;
1025 1005
1026 int http_status_code = request->GetResponseCode(); 1006 int http_status_code = request->GetResponseCode();
1027 1007
1028 std::string response_ip = request->GetSocketAddress().host(); 1008 std::string response_ip = request->GetSocketAddress().host();
1029 1009
1030 base::ListValue args; 1010 base::ListValue args;
1031 base::DictionaryValue* dict = new base::DictionaryValue(); 1011 base::DictionaryValue* dict = new base::DictionaryValue();
1032 ExtractRequestInfo(request, dict); 1012 ExtractRequestInfo(request, dict);
1033 dict->SetString(keys::kRedirectUrlKey, new_location.spec()); 1013 dict->SetString(keys::kRedirectUrlKey, new_location.spec());
1034 dict->SetInteger(keys::kStatusCodeKey, http_status_code); 1014 dict->SetInteger(keys::kStatusCodeKey, http_status_code);
1035 if (!response_ip.empty()) 1015 if (!response_ip.empty())
1036 dict->SetString(keys::kIpKey, response_ip); 1016 dict->SetString(keys::kIpKey, response_ip);
1037 dict->SetBoolean(keys::kFromCache, request->was_cached()); 1017 dict->SetBoolean(keys::kFromCache, request->was_cached());
1038 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); 1018 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers()));
1039 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { 1019 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) {
1040 dict->Set(keys::kResponseHeadersKey, 1020 dict->Set(keys::kResponseHeadersKey,
1041 GetResponseHeadersList(request->response_headers())); 1021 GetResponseHeadersList(request->response_headers()));
1042 } 1022 }
1043 args.Append(dict); 1023 args.Append(dict);
1044 1024
1045 DispatchEvent(profile, request, listeners, args); 1025 DispatchEvent(browser_context, request, listeners, args);
1046 } 1026 }
1047 1027
1048 void ExtensionWebRequestEventRouter::OnResponseStarted( 1028 void ExtensionWebRequestEventRouter::OnResponseStarted(
1049 void* profile, 1029 void* browser_context,
1050 InfoMap* extension_info_map, 1030 InfoMap* extension_info_map,
1051 net::URLRequest* request) { 1031 net::URLRequest* request) {
1052 // We hide events from the system context as well as sensitive requests. 1032 // We hide events from the system context as well as sensitive requests.
1053 if (!profile || 1033 if (!browser_context ||
1054 WebRequestPermissions::HideRequest(extension_info_map, request)) 1034 WebRequestPermissions::HideRequest(extension_info_map, request))
1055 return; 1035 return;
1056 1036
1057 // OnResponseStarted is even triggered, when the request was cancelled. 1037 // OnResponseStarted is even triggered, when the request was cancelled.
1058 if (request->status().status() != net::URLRequestStatus::SUCCESS) 1038 if (request->status().status() != net::URLRequestStatus::SUCCESS)
1059 return; 1039 return;
1060 1040
1061 int extra_info_spec = 0; 1041 int extra_info_spec = 0;
1062 std::vector<const EventListener*> listeners = 1042 std::vector<const EventListener*> listeners =
1063 GetMatchingListeners(profile, extension_info_map, 1043 GetMatchingListeners(browser_context, extension_info_map,
1064 keys::kOnResponseStartedEvent, request, 1044 keys::kOnResponseStartedEvent, request,
1065 &extra_info_spec); 1045 &extra_info_spec);
1066 if (listeners.empty()) 1046 if (listeners.empty())
1067 return; 1047 return;
1068 1048
1069 // UrlRequestFileJobs do not send headers, so we simulate their behavior. 1049 // UrlRequestFileJobs do not send headers, so we simulate their behavior.
1070 int response_code = 200; 1050 int response_code = 200;
1071 if (request->response_headers()) 1051 if (request->response_headers())
1072 response_code = request->response_headers()->response_code(); 1052 response_code = request->response_headers()->response_code();
1073 1053
1074 std::string response_ip = request->GetSocketAddress().host(); 1054 std::string response_ip = request->GetSocketAddress().host();
1075 1055
1076 base::ListValue args; 1056 base::ListValue args;
1077 base::DictionaryValue* dict = new base::DictionaryValue(); 1057 base::DictionaryValue* dict = new base::DictionaryValue();
1078 ExtractRequestInfo(request, dict); 1058 ExtractRequestInfo(request, dict);
1079 if (!response_ip.empty()) 1059 if (!response_ip.empty())
1080 dict->SetString(keys::kIpKey, response_ip); 1060 dict->SetString(keys::kIpKey, response_ip);
1081 dict->SetBoolean(keys::kFromCache, request->was_cached()); 1061 dict->SetBoolean(keys::kFromCache, request->was_cached());
1082 dict->SetInteger(keys::kStatusCodeKey, response_code); 1062 dict->SetInteger(keys::kStatusCodeKey, response_code);
1083 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); 1063 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers()));
1084 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { 1064 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) {
1085 dict->Set(keys::kResponseHeadersKey, 1065 dict->Set(keys::kResponseHeadersKey,
1086 GetResponseHeadersList(request->response_headers())); 1066 GetResponseHeadersList(request->response_headers()));
1087 } 1067 }
1088 args.Append(dict); 1068 args.Append(dict);
1089 1069
1090 DispatchEvent(profile, request, listeners, args); 1070 DispatchEvent(browser_context, request, listeners, args);
1091 } 1071 }
1092 1072
1093 void ExtensionWebRequestEventRouter::OnCompleted(void* profile, 1073 void ExtensionWebRequestEventRouter::OnCompleted(void* browser_context,
1094 InfoMap* extension_info_map, 1074 InfoMap* extension_info_map,
1095 net::URLRequest* request) { 1075 net::URLRequest* request) {
1096 // We hide events from the system context as well as sensitive requests. 1076 // We hide events from the system context as well as sensitive requests.
1097 // However, if the request first became sensitive after redirecting we have 1077 // However, if the request first became sensitive after redirecting we have
1098 // already signaled it and thus we have to signal the end of it. This is 1078 // already signaled it and thus we have to signal the end of it. This is
1099 // risk-free because the handler cannot modify the request now. 1079 // risk-free because the handler cannot modify the request now.
1100 if (!profile || 1080 if (!browser_context ||
1101 (WebRequestPermissions::HideRequest(extension_info_map, request) && 1081 (WebRequestPermissions::HideRequest(extension_info_map, request) &&
1102 !WasSignaled(*request))) 1082 !WasSignaled(*request)))
1103 return; 1083 return;
1104 1084
1105 request_time_tracker_->LogRequestEndTime(request->identifier(), 1085 request_time_tracker_->LogRequestEndTime(request->identifier(),
1106 base::Time::Now()); 1086 base::Time::Now());
1107 1087
1108 DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS); 1088 DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS);
1109 1089
1110 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); 1090 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted));
1111 1091
1112 ClearPendingCallbacks(request); 1092 ClearPendingCallbacks(request);
1113 1093
1114 int extra_info_spec = 0; 1094 int extra_info_spec = 0;
1115 std::vector<const EventListener*> listeners = 1095 std::vector<const EventListener*> listeners =
1116 GetMatchingListeners(profile, extension_info_map, 1096 GetMatchingListeners(browser_context, extension_info_map,
1117 keys::kOnCompletedEvent, request, &extra_info_spec); 1097 keys::kOnCompletedEvent, request, &extra_info_spec);
1118 if (listeners.empty()) 1098 if (listeners.empty())
1119 return; 1099 return;
1120 1100
1121 // UrlRequestFileJobs do not send headers, so we simulate their behavior. 1101 // UrlRequestFileJobs do not send headers, so we simulate their behavior.
1122 int response_code = 200; 1102 int response_code = 200;
1123 if (request->response_headers()) 1103 if (request->response_headers())
1124 response_code = request->response_headers()->response_code(); 1104 response_code = request->response_headers()->response_code();
1125 1105
1126 std::string response_ip = request->GetSocketAddress().host(); 1106 std::string response_ip = request->GetSocketAddress().host();
1127 1107
1128 base::ListValue args; 1108 base::ListValue args;
1129 base::DictionaryValue* dict = new base::DictionaryValue(); 1109 base::DictionaryValue* dict = new base::DictionaryValue();
1130 ExtractRequestInfo(request, dict); 1110 ExtractRequestInfo(request, dict);
1131 dict->SetInteger(keys::kStatusCodeKey, response_code); 1111 dict->SetInteger(keys::kStatusCodeKey, response_code);
1132 if (!response_ip.empty()) 1112 if (!response_ip.empty())
1133 dict->SetString(keys::kIpKey, response_ip); 1113 dict->SetString(keys::kIpKey, response_ip);
1134 dict->SetBoolean(keys::kFromCache, request->was_cached()); 1114 dict->SetBoolean(keys::kFromCache, request->was_cached());
1135 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); 1115 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers()));
1136 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { 1116 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) {
1137 dict->Set(keys::kResponseHeadersKey, 1117 dict->Set(keys::kResponseHeadersKey,
1138 GetResponseHeadersList(request->response_headers())); 1118 GetResponseHeadersList(request->response_headers()));
1139 } 1119 }
1140 args.Append(dict); 1120 args.Append(dict);
1141 1121
1142 DispatchEvent(profile, request, listeners, args); 1122 DispatchEvent(browser_context, request, listeners, args);
1143 } 1123 }
1144 1124
1145 void ExtensionWebRequestEventRouter::OnErrorOccurred( 1125 void ExtensionWebRequestEventRouter::OnErrorOccurred(
1146 void* profile, 1126 void* browser_context,
1147 InfoMap* extension_info_map, 1127 InfoMap* extension_info_map,
1148 net::URLRequest* request, 1128 net::URLRequest* request,
1149 bool started) { 1129 bool started) {
1150 // We hide events from the system context as well as sensitive requests. 1130 // We hide events from the system context as well as sensitive requests.
1151 // However, if the request first became sensitive after redirecting we have 1131 // However, if the request first became sensitive after redirecting we have
1152 // already signaled it and thus we have to signal the end of it. This is 1132 // already signaled it and thus we have to signal the end of it. This is
1153 // risk-free because the handler cannot modify the request now. 1133 // risk-free because the handler cannot modify the request now.
1154 if (!profile || 1134 if (!browser_context ||
1155 (WebRequestPermissions::HideRequest(extension_info_map, request) && 1135 (WebRequestPermissions::HideRequest(extension_info_map, request) &&
1156 !WasSignaled(*request))) 1136 !WasSignaled(*request)))
1157 return; 1137 return;
1158 1138
1159 request_time_tracker_->LogRequestEndTime(request->identifier(), 1139 request_time_tracker_->LogRequestEndTime(request->identifier(),
1160 base::Time::Now()); 1140 base::Time::Now());
1161 1141
1162 DCHECK(request->status().status() == net::URLRequestStatus::FAILED || 1142 DCHECK(request->status().status() == net::URLRequestStatus::FAILED ||
1163 request->status().status() == net::URLRequestStatus::CANCELED); 1143 request->status().status() == net::URLRequestStatus::CANCELED);
1164 1144
1165 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred)); 1145 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred));
1166 1146
1167 ClearPendingCallbacks(request); 1147 ClearPendingCallbacks(request);
1168 1148
1169 int extra_info_spec = 0; 1149 int extra_info_spec = 0;
1170 std::vector<const EventListener*> listeners = 1150 std::vector<const EventListener*> listeners =
1171 GetMatchingListeners(profile, extension_info_map, 1151 GetMatchingListeners(browser_context, extension_info_map,
1172 web_request::OnErrorOccurred::kEventName, request, 1152 web_request::OnErrorOccurred::kEventName, request,
1173 &extra_info_spec); 1153 &extra_info_spec);
1174 if (listeners.empty()) 1154 if (listeners.empty())
1175 return; 1155 return;
1176 1156
1177 base::ListValue args; 1157 base::ListValue args;
1178 base::DictionaryValue* dict = new base::DictionaryValue(); 1158 base::DictionaryValue* dict = new base::DictionaryValue();
1179 ExtractRequestInfo(request, dict); 1159 ExtractRequestInfo(request, dict);
1180 if (started) { 1160 if (started) {
1181 std::string response_ip = request->GetSocketAddress().host(); 1161 std::string response_ip = request->GetSocketAddress().host();
1182 if (!response_ip.empty()) 1162 if (!response_ip.empty())
1183 dict->SetString(keys::kIpKey, response_ip); 1163 dict->SetString(keys::kIpKey, response_ip);
1184 } 1164 }
1185 dict->SetBoolean(keys::kFromCache, request->was_cached()); 1165 dict->SetBoolean(keys::kFromCache, request->was_cached());
1186 dict->SetString(keys::kErrorKey, 1166 dict->SetString(keys::kErrorKey,
1187 net::ErrorToString(request->status().error())); 1167 net::ErrorToString(request->status().error()));
1188 args.Append(dict); 1168 args.Append(dict);
1189 1169
1190 DispatchEvent(profile, request, listeners, args); 1170 DispatchEvent(browser_context, request, listeners, args);
1191 } 1171 }
1192 1172
1193 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( 1173 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed(
1194 void* profile, net::URLRequest* request) { 1174 void* browser_context, net::URLRequest* request) {
1195 ClearPendingCallbacks(request); 1175 ClearPendingCallbacks(request);
1196 1176
1197 signaled_requests_.erase(request->identifier()); 1177 signaled_requests_.erase(request->identifier());
1198 1178
1199 request_time_tracker_->LogRequestEndTime(request->identifier(), 1179 request_time_tracker_->LogRequestEndTime(request->identifier(),
1200 base::Time::Now()); 1180 base::Time::Now());
1201 } 1181 }
1202 1182
1203 void ExtensionWebRequestEventRouter::ClearPendingCallbacks( 1183 void ExtensionWebRequestEventRouter::ClearPendingCallbacks(
1204 net::URLRequest* request) { 1184 net::URLRequest* request) {
1205 blocked_requests_.erase(request->identifier()); 1185 blocked_requests_.erase(request->identifier());
1206 } 1186 }
1207 1187
1208 bool ExtensionWebRequestEventRouter::DispatchEvent( 1188 bool ExtensionWebRequestEventRouter::DispatchEvent(
1209 void* profile_id, 1189 void* browser_context,
1210 net::URLRequest* request, 1190 net::URLRequest* request,
1211 const std::vector<const EventListener*>& listeners, 1191 const std::vector<const EventListener*>& listeners,
1212 const base::ListValue& args) { 1192 const base::ListValue& args) {
1213 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) 1193 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args)
1214 // pairs into a single message sent to a list of sub_event_names. 1194 // pairs into a single message sent to a list of sub_event_names.
1215 int num_handlers_blocking = 0; 1195 int num_handlers_blocking = 0;
1216 for (std::vector<const EventListener*>::const_iterator it = listeners.begin(); 1196 for (std::vector<const EventListener*>::const_iterator it = listeners.begin();
1217 it != listeners.end(); ++it) { 1197 it != listeners.end(); ++it) {
1218 // Filter out the optional keys that this listener didn't request. 1198 // Filter out the optional keys that this listener didn't request.
1219 scoped_ptr<base::ListValue> args_filtered(args.DeepCopy()); 1199 scoped_ptr<base::ListValue> args_filtered(args.DeepCopy());
1220 base::DictionaryValue* dict = NULL; 1200 base::DictionaryValue* dict = NULL;
1221 CHECK(args_filtered->GetDictionary(0, &dict) && dict); 1201 CHECK(args_filtered->GetDictionary(0, &dict) && dict);
1222 if (!((*it)->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)) 1202 if (!((*it)->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS))
1223 dict->Remove(keys::kRequestHeadersKey, NULL); 1203 dict->Remove(keys::kRequestHeadersKey, NULL);
1224 if (!((*it)->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS)) 1204 if (!((*it)->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS))
1225 dict->Remove(keys::kResponseHeadersKey, NULL); 1205 dict->Remove(keys::kResponseHeadersKey, NULL);
1226 1206
1227 extensions::EventRouter::DispatchEvent( 1207 extensions::EventRouter::DispatchEvent(
1228 (*it)->ipc_sender.get(), profile_id, 1208 (*it)->ipc_sender.get(), browser_context,
1229 (*it)->extension_id, (*it)->sub_event_name, 1209 (*it)->extension_id, (*it)->sub_event_name,
1230 args_filtered.Pass(), 1210 args_filtered.Pass(),
1231 extensions::EventRouter::USER_GESTURE_UNKNOWN, 1211 extensions::EventRouter::USER_GESTURE_UNKNOWN,
1232 extensions::EventFilteringInfo()); 1212 extensions::EventFilteringInfo());
1233 if ((*it)->extra_info_spec & 1213 if ((*it)->extra_info_spec &
1234 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { 1214 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) {
1235 (*it)->blocked_requests.insert(request->identifier()); 1215 (*it)->blocked_requests.insert(request->identifier());
1236 // If this is the first delegate blocking the request, go ahead and log 1216 // If this is the first delegate blocking the request, go ahead and log
1237 // it. 1217 // it.
1238 if (num_handlers_blocking == 0) { 1218 if (num_handlers_blocking == 0) {
1239 std::string delegate_info = 1219 std::string delegate_info =
1240 l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION, 1220 l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION,
1241 base::UTF8ToUTF16((*it)->extension_name)); 1221 base::UTF8ToUTF16((*it)->extension_name));
1242 // LobAndReport allows extensions that block requests to be displayed in 1222 // LobAndReport allows extensions that block requests to be displayed in
1243 // the load status bar. 1223 // the load status bar.
1244 request->LogAndReportBlockedBy(delegate_info.c_str()); 1224 request->LogAndReportBlockedBy(delegate_info.c_str());
1245 } 1225 }
1246 ++num_handlers_blocking; 1226 ++num_handlers_blocking;
1247 } 1227 }
1248 } 1228 }
1249 1229
1250 if (num_handlers_blocking > 0) { 1230 if (num_handlers_blocking > 0) {
1251 blocked_requests_[request->identifier()].request = request; 1231 blocked_requests_[request->identifier()].request = request;
1252 blocked_requests_[request->identifier()].is_incognito |= 1232 blocked_requests_[request->identifier()].is_incognito |=
1253 IsIncognitoProfile(profile_id); 1233 IsIncognitoBrowserContext(browser_context);
1254 blocked_requests_[request->identifier()].num_handlers_blocking += 1234 blocked_requests_[request->identifier()].num_handlers_blocking +=
1255 num_handlers_blocking; 1235 num_handlers_blocking;
1256 blocked_requests_[request->identifier()].blocking_time = base::Time::Now(); 1236 blocked_requests_[request->identifier()].blocking_time = base::Time::Now();
1257 1237
1258 return true; 1238 return true;
1259 } 1239 }
1260 1240
1261 return false; 1241 return false;
1262 } 1242 }
1263 1243
1264 void ExtensionWebRequestEventRouter::OnEventHandled( 1244 void ExtensionWebRequestEventRouter::OnEventHandled(
1265 void* profile, 1245 void* browser_context,
1266 const std::string& extension_id, 1246 const std::string& extension_id,
1267 const std::string& event_name, 1247 const std::string& event_name,
1268 const std::string& sub_event_name, 1248 const std::string& sub_event_name,
1269 uint64 request_id, 1249 uint64 request_id,
1270 EventResponse* response) { 1250 EventResponse* response) {
1271 EventListener listener; 1251 EventListener listener;
1272 listener.extension_id = extension_id; 1252 listener.extension_id = extension_id;
1273 listener.sub_event_name = sub_event_name; 1253 listener.sub_event_name = sub_event_name;
1274 1254
1275 // The listener may have been removed (e.g. due to the process going away) 1255 // The listener may have been removed (e.g. due to the process going away)
1276 // before we got here. 1256 // before we got here.
1277 std::set<EventListener>::iterator found = 1257 std::set<EventListener>::iterator found =
1278 listeners_[profile][event_name].find(listener); 1258 listeners_[browser_context][event_name].find(listener);
1279 if (found != listeners_[profile][event_name].end()) 1259 if (found != listeners_[browser_context][event_name].end())
1280 found->blocked_requests.erase(request_id); 1260 found->blocked_requests.erase(request_id);
1281 1261
1282 DecrementBlockCount(profile, extension_id, event_name, request_id, response); 1262 DecrementBlockCount(
1263 browser_context, extension_id, event_name, request_id, response);
1283 } 1264 }
1284 1265
1285 bool ExtensionWebRequestEventRouter::AddEventListener( 1266 bool ExtensionWebRequestEventRouter::AddEventListener(
1286 void* profile, 1267 void* browser_context,
1287 const std::string& extension_id, 1268 const std::string& extension_id,
1288 const std::string& extension_name, 1269 const std::string& extension_name,
1289 const std::string& event_name, 1270 const std::string& event_name,
1290 const std::string& sub_event_name, 1271 const std::string& sub_event_name,
1291 const RequestFilter& filter, 1272 const RequestFilter& filter,
1292 int extra_info_spec, 1273 int extra_info_spec,
1293 int embedder_process_id, 1274 int embedder_process_id,
1294 int webview_instance_id, 1275 int webview_instance_id,
1295 base::WeakPtr<IPC::Sender> ipc_sender) { 1276 base::WeakPtr<IPC::Sender> ipc_sender) {
1296 if (!IsWebRequestEvent(event_name)) 1277 if (!IsWebRequestEvent(event_name))
1297 return false; 1278 return false;
1298 1279
1299 EventListener listener; 1280 EventListener listener;
1300 listener.extension_id = extension_id; 1281 listener.extension_id = extension_id;
1301 listener.extension_name = extension_name; 1282 listener.extension_name = extension_name;
1302 listener.sub_event_name = sub_event_name; 1283 listener.sub_event_name = sub_event_name;
1303 listener.filter = filter; 1284 listener.filter = filter;
1304 listener.extra_info_spec = extra_info_spec; 1285 listener.extra_info_spec = extra_info_spec;
1305 listener.ipc_sender = ipc_sender; 1286 listener.ipc_sender = ipc_sender;
1306 listener.embedder_process_id = embedder_process_id; 1287 listener.embedder_process_id = embedder_process_id;
1307 listener.webview_instance_id = webview_instance_id; 1288 listener.webview_instance_id = webview_instance_id;
1308 if (listener.webview_instance_id) { 1289 if (listener.webview_instance_id) {
1309 content::RecordAction( 1290 content::RecordAction(
1310 base::UserMetricsAction("WebView.WebRequest.AddListener")); 1291 base::UserMetricsAction("WebView.WebRequest.AddListener"));
1311 } 1292 }
1312 1293
1313 if (listeners_[profile][event_name].count(listener) != 0u) { 1294 if (listeners_[browser_context][event_name].count(listener) != 0u) {
1314 // This is likely an abuse of the API by a malicious extension. 1295 // This is likely an abuse of the API by a malicious extension.
1315 return false; 1296 return false;
1316 } 1297 }
1317 listeners_[profile][event_name].insert(listener); 1298 listeners_[browser_context][event_name].insert(listener);
1318 return true; 1299 return true;
1319 } 1300 }
1320 1301
1321 void ExtensionWebRequestEventRouter::RemoveEventListener( 1302 void ExtensionWebRequestEventRouter::RemoveEventListener(
1322 void* profile, 1303 void* browser_context,
1323 const std::string& extension_id, 1304 const std::string& extension_id,
1324 const std::string& sub_event_name) { 1305 const std::string& sub_event_name) {
1325 std::string event_name = 1306 std::string event_name =
1326 extensions::EventRouter::GetBaseEventName(sub_event_name); 1307 extensions::EventRouter::GetBaseEventName(sub_event_name);
1327 DCHECK(IsWebRequestEvent(event_name)); 1308 DCHECK(IsWebRequestEvent(event_name));
1328 1309
1329 EventListener listener; 1310 EventListener listener;
1330 listener.extension_id = extension_id; 1311 listener.extension_id = extension_id;
1331 listener.sub_event_name = sub_event_name; 1312 listener.sub_event_name = sub_event_name;
1332 1313
1333 // It's possible for AddEventListener to fail asynchronously. In that case, 1314 // It's possible for AddEventListener to fail asynchronously. In that case,
1334 // the renderer believes the listener exists, while the browser does not. 1315 // the renderer believes the listener exists, while the browser does not.
1335 // Ignore a RemoveEventListener in that case. 1316 // Ignore a RemoveEventListener in that case.
1336 std::set<EventListener>::iterator found = 1317 std::set<EventListener>::iterator found =
1337 listeners_[profile][event_name].find(listener); 1318 listeners_[browser_context][event_name].find(listener);
1338 if (found == listeners_[profile][event_name].end()) 1319 if (found == listeners_[browser_context][event_name].end())
1339 return; 1320 return;
1340 1321
1341 CHECK_EQ(listeners_[profile][event_name].count(listener), 1u) << 1322 CHECK_EQ(listeners_[browser_context][event_name].count(listener), 1u) <<
1342 "extension=" << extension_id << " event=" << event_name; 1323 "extension=" << extension_id << " event=" << event_name;
1343 1324
1344 // Unblock any request that this event listener may have been blocking. 1325 // Unblock any request that this event listener may have been blocking.
1345 for (std::set<uint64>::iterator it = found->blocked_requests.begin(); 1326 for (std::set<uint64>::iterator it = found->blocked_requests.begin();
1346 it != found->blocked_requests.end(); ++it) { 1327 it != found->blocked_requests.end(); ++it) {
1347 DecrementBlockCount(profile, extension_id, event_name, *it, NULL); 1328 DecrementBlockCount(browser_context, extension_id, event_name, *it, NULL);
1348 } 1329 }
1349 1330
1350 listeners_[profile][event_name].erase(listener); 1331 listeners_[browser_context][event_name].erase(listener);
1351 1332
1352 helpers::ClearCacheOnNavigation(); 1333 helpers::ClearCacheOnNavigation();
1353 } 1334 }
1354 1335
1355 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( 1336 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners(
1356 void* profile, 1337 void* browser_context,
1357 const std::string& extension_id, 1338 const std::string& extension_id,
1358 int embedder_process_id, 1339 int embedder_process_id,
1359 int webview_instance_id) { 1340 int webview_instance_id) {
1360 // Iterate over all listeners of all WebRequest events to delete 1341 // Iterate over all listeners of all WebRequest events to delete
1361 // any listeners that belong to the provided <webview>. 1342 // any listeners that belong to the provided <webview>.
1362 ListenerMapForProfile& map_for_profile = listeners_[profile]; 1343 ListenerMapForBrowserContext& map_for_browser_context =
1363 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); 1344 listeners_[browser_context];
1364 event_iter != map_for_profile.end(); ++event_iter) { 1345 for (ListenerMapForBrowserContext::iterator event_iter =
1346 map_for_browser_context.begin();
1347 event_iter != map_for_browser_context.end(); ++event_iter) {
1365 std::vector<EventListener> listeners_to_delete; 1348 std::vector<EventListener> listeners_to_delete;
1366 std::set<EventListener>& listeners = event_iter->second; 1349 std::set<EventListener>& listeners = event_iter->second;
1367 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); 1350 for (std::set<EventListener>::iterator listener_iter = listeners.begin();
1368 listener_iter != listeners.end(); ++listener_iter) { 1351 listener_iter != listeners.end(); ++listener_iter) {
1369 const EventListener& listener = *listener_iter; 1352 const EventListener& listener = *listener_iter;
1370 if (listener.embedder_process_id == embedder_process_id && 1353 if (listener.embedder_process_id == embedder_process_id &&
1371 listener.webview_instance_id == webview_instance_id) 1354 listener.webview_instance_id == webview_instance_id)
1372 listeners_to_delete.push_back(listener); 1355 listeners_to_delete.push_back(listener);
1373 } 1356 }
1374 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { 1357 for (size_t i = 0; i < listeners_to_delete.size(); ++i) {
1375 EventListener& listener = listeners_to_delete[i]; 1358 EventListener& listener = listeners_to_delete[i];
1376 content::BrowserThread::PostTask( 1359 content::BrowserThread::PostTask(
1377 content::BrowserThread::UI, 1360 content::BrowserThread::UI,
1378 FROM_HERE, 1361 FROM_HERE,
1379 base::Bind(&RemoveEventListenerOnUI, 1362 base::Bind(&RemoveEventListenerOnUI,
1380 profile, 1363 browser_context,
1381 listener.sub_event_name, 1364 listener.sub_event_name,
1382 embedder_process_id, 1365 embedder_process_id,
1383 extension_id)); 1366 extension_id));
1384 } 1367 }
1385 } 1368 }
1386 } 1369 }
1387 1370
1388 void ExtensionWebRequestEventRouter::OnOTRProfileCreated( 1371 void ExtensionWebRequestEventRouter::OnOTRBrowserContextCreated(
1389 void* original_profile, void* otr_profile) { 1372 void* original_browser_context, void* otr_browser_context) {
1390 cross_profile_map_[original_profile] = std::make_pair(false, otr_profile); 1373 cross_browser_context_map_[original_browser_context] =
1391 cross_profile_map_[otr_profile] = std::make_pair(true, original_profile); 1374 std::make_pair(false, otr_browser_context);
1375 cross_browser_context_map_[otr_browser_context] =
1376 std::make_pair(true, original_browser_context);
1392 } 1377 }
1393 1378
1394 void ExtensionWebRequestEventRouter::OnOTRProfileDestroyed( 1379 void ExtensionWebRequestEventRouter::OnOTRBrowserContextDestroyed(
1395 void* original_profile, void* otr_profile) { 1380 void* original_browser_context, void* otr_browser_context) {
1396 cross_profile_map_.erase(otr_profile); 1381 cross_browser_context_map_.erase(otr_browser_context);
1397 cross_profile_map_.erase(original_profile); 1382 cross_browser_context_map_.erase(original_browser_context);
1398 } 1383 }
1399 1384
1400 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( 1385 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad(
1401 const base::Closure& callback) { 1386 const base::Closure& callback) {
1402 callbacks_for_page_load_.push_back(callback); 1387 callbacks_for_page_load_.push_back(callback);
1403 } 1388 }
1404 1389
1405 bool ExtensionWebRequestEventRouter::IsPageLoad( 1390 bool ExtensionWebRequestEventRouter::IsPageLoad(
1406 net::URLRequest* request) const { 1391 net::URLRequest* request) const {
1407 bool is_main_frame = false; 1392 bool is_main_frame = false;
1408 int frame_id = -1; 1393 int frame_id = -1;
1409 bool parent_is_main_frame = false; 1394 bool parent_is_main_frame = false;
1410 int parent_frame_id = -1; 1395 int parent_frame_id = -1;
1411 int tab_id = -1;
1412 int window_id = -1;
1413 int render_process_host_id = -1; 1396 int render_process_host_id = -1;
1414 int routing_id = -1; 1397 int routing_id = -1;
1415 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 1398 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
1416 1399
1417 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, 1400 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id,
1418 &parent_is_main_frame, &parent_frame_id, 1401 &parent_is_main_frame, &parent_frame_id,
1419 &tab_id, &window_id, &render_process_host_id, 1402 &render_process_host_id,
1420 &routing_id, &resource_type); 1403 &routing_id, &resource_type);
1421 1404
1422 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME; 1405 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME;
1423 } 1406 }
1424 1407
1425 void ExtensionWebRequestEventRouter::NotifyPageLoad() { 1408 void ExtensionWebRequestEventRouter::NotifyPageLoad() {
1426 for (CallbacksForPageLoad::const_iterator i = 1409 for (CallbacksForPageLoad::const_iterator i =
1427 callbacks_for_page_load_.begin(); 1410 callbacks_for_page_load_.begin();
1428 i != callbacks_for_page_load_.end(); ++i) { 1411 i != callbacks_for_page_load_.end(); ++i) {
1429 i->Run(); 1412 i->Run();
1430 } 1413 }
1431 callbacks_for_page_load_.clear(); 1414 callbacks_for_page_load_.clear();
1432 } 1415 }
1433 1416
1434 void* ExtensionWebRequestEventRouter::GetCrossProfile(void* profile) const { 1417 void* ExtensionWebRequestEventRouter::GetCrossBrowserContext(
1435 CrossProfileMap::const_iterator cross_profile = 1418 void* browser_context) const {
1436 cross_profile_map_.find(profile); 1419 CrossBrowserContextMap::const_iterator cross_browser_context =
1437 if (cross_profile == cross_profile_map_.end()) 1420 cross_browser_context_map_.find(browser_context);
1421 if (cross_browser_context == cross_browser_context_map_.end())
1438 return NULL; 1422 return NULL;
1439 return cross_profile->second.second; 1423 return cross_browser_context->second.second;
1440 } 1424 }
1441 1425
1442 bool ExtensionWebRequestEventRouter::IsIncognitoProfile(void* profile) const { 1426 bool ExtensionWebRequestEventRouter::IsIncognitoBrowserContext(
1443 CrossProfileMap::const_iterator cross_profile = 1427 void* browser_context) const {
1444 cross_profile_map_.find(profile); 1428 CrossBrowserContextMap::const_iterator cross_browser_context =
1445 if (cross_profile == cross_profile_map_.end()) 1429 cross_browser_context_map_.find(browser_context);
1430 if (cross_browser_context == cross_browser_context_map_.end())
1446 return false; 1431 return false;
1447 return cross_profile->second.first; 1432 return cross_browser_context->second.first;
1448 } 1433 }
1449 1434
1450 bool ExtensionWebRequestEventRouter::WasSignaled( 1435 bool ExtensionWebRequestEventRouter::WasSignaled(
1451 const net::URLRequest& request) const { 1436 const net::URLRequest& request) const {
1452 SignaledRequestMap::const_iterator flag = 1437 SignaledRequestMap::const_iterator flag =
1453 signaled_requests_.find(request.identifier()); 1438 signaled_requests_.find(request.identifier());
1454 return (flag != signaled_requests_.end()) && (flag->second != 0); 1439 return (flag != signaled_requests_.end()) && (flag->second != 0);
1455 } 1440 }
1456 1441
1457 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( 1442 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl(
1458 void* profile, 1443 void* browser_context,
1444 net::URLRequest* request,
1459 InfoMap* extension_info_map, 1445 InfoMap* extension_info_map,
1460 bool crosses_incognito, 1446 bool crosses_incognito,
1461 const std::string& event_name, 1447 const std::string& event_name,
1462 const GURL& url, 1448 const GURL& url,
1463 int tab_id,
1464 int window_id,
1465 int render_process_host_id, 1449 int render_process_host_id,
1466 int routing_id, 1450 int routing_id,
1467 ResourceType resource_type, 1451 ResourceType resource_type,
1468 bool is_async_request, 1452 bool is_async_request,
1469 bool is_request_from_extension, 1453 bool is_request_from_extension,
1470 int* extra_info_spec, 1454 int* extra_info_spec,
1471 std::vector<const ExtensionWebRequestEventRouter::EventListener*>* 1455 std::vector<const ExtensionWebRequestEventRouter::EventListener*>*
1472 matching_listeners) { 1456 matching_listeners) {
1473 std::string web_request_event_name(event_name); 1457 std::string web_request_event_name(event_name);
1474 extensions::WebViewRendererState::WebViewInfo web_view_info; 1458 extensions::WebViewRendererState::WebViewInfo web_view_info;
1475 bool is_web_view_guest = extensions::WebViewRendererState::GetInstance()-> 1459 bool is_web_view_guest = extensions::WebViewRendererState::GetInstance()->
1476 GetInfo(render_process_host_id, routing_id, &web_view_info); 1460 GetInfo(render_process_host_id, routing_id, &web_view_info);
1477 if (is_web_view_guest) { 1461 if (is_web_view_guest) {
1478 web_request_event_name.replace( 1462 web_request_event_name.replace(
1479 0, sizeof(kWebRequestEventPrefix) - 1, webview::kWebViewEventPrefix); 1463 0, sizeof(kWebRequestEventPrefix) - 1, webview::kWebViewEventPrefix);
1480 } 1464 }
1481 1465
1482 std::set<EventListener>& listeners = 1466 std::set<EventListener>& listeners =
1483 listeners_[profile][web_request_event_name]; 1467 listeners_[browser_context][web_request_event_name];
1484 for (std::set<EventListener>::iterator it = listeners.begin(); 1468 for (std::set<EventListener>::iterator it = listeners.begin();
1485 it != listeners.end(); ++it) { 1469 it != listeners.end(); ++it) {
1486 if (!it->ipc_sender.get()) { 1470 if (!it->ipc_sender.get()) {
1487 // The IPC sender has been deleted. This listener will be removed soon 1471 // The IPC sender has been deleted. This listener will be removed soon
1488 // via a call to RemoveEventListener. For now, just skip it. 1472 // via a call to RemoveEventListener. For now, just skip it.
1489 continue; 1473 continue;
1490 } 1474 }
1491 1475
1492 if (is_web_view_guest && 1476 if (is_web_view_guest &&
1493 (it->embedder_process_id != web_view_info.embedder_process_id || 1477 (it->embedder_process_id != web_view_info.embedder_process_id ||
1494 it->webview_instance_id != web_view_info.instance_id)) 1478 it->webview_instance_id != web_view_info.instance_id))
1495 continue; 1479 continue;
1496 1480
1497 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) 1481 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url))
1498 continue; 1482 continue;
1499 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) 1483 if (web_request_event_router_delegate_ &&
1500 continue; 1484 web_request_event_router_delegate_->OnGetMachingListernersImplCheck(
1501 if (it->filter.window_id != -1 && window_id != it->filter.window_id) 1485 it->filter.tab_id, it->filter.window_id, request))
1502 continue; 1486 continue;
1503 if (!it->filter.types.empty() && 1487 if (!it->filter.types.empty() &&
1504 std::find(it->filter.types.begin(), it->filter.types.end(), 1488 std::find(it->filter.types.begin(), it->filter.types.end(),
1505 resource_type) == it->filter.types.end()) 1489 resource_type) == it->filter.types.end())
1506 continue; 1490 continue;
1507 1491
1508 if (!is_web_view_guest && !WebRequestPermissions::CanExtensionAccessURL( 1492 if (!is_web_view_guest && !WebRequestPermissions::CanExtensionAccessURL(
1509 extension_info_map, it->extension_id, url, crosses_incognito, 1493 extension_info_map, it->extension_id, url, crosses_incognito,
1510 WebRequestPermissions::REQUIRE_HOST_PERMISSION)) 1494 WebRequestPermissions::REQUIRE_HOST_PERMISSION))
1511 continue; 1495 continue;
(...skipping 16 matching lines...) Expand all
1528 if (blocking_listener && synchronous_xhr_from_extension) 1512 if (blocking_listener && synchronous_xhr_from_extension)
1529 continue; 1513 continue;
1530 1514
1531 matching_listeners->push_back(&(*it)); 1515 matching_listeners->push_back(&(*it));
1532 *extra_info_spec |= it->extra_info_spec; 1516 *extra_info_spec |= it->extra_info_spec;
1533 } 1517 }
1534 } 1518 }
1535 1519
1536 std::vector<const ExtensionWebRequestEventRouter::EventListener*> 1520 std::vector<const ExtensionWebRequestEventRouter::EventListener*>
1537 ExtensionWebRequestEventRouter::GetMatchingListeners( 1521 ExtensionWebRequestEventRouter::GetMatchingListeners(
1538 void* profile, 1522 void* browser_context,
1539 InfoMap* extension_info_map, 1523 InfoMap* extension_info_map,
1540 const std::string& event_name, 1524 const std::string& event_name,
1541 net::URLRequest* request, 1525 net::URLRequest* request,
1542 int* extra_info_spec) { 1526 int* extra_info_spec) {
1543 // TODO(mpcomplete): handle profile == NULL (should collect all listeners). 1527 // TODO(mpcomplete): handle browser_context == NULL (should collect all
1528 // listeners).
1544 *extra_info_spec = 0; 1529 *extra_info_spec = 0;
1545 1530
1546 bool is_main_frame = false; 1531 bool is_main_frame = false;
1547 int frame_id = -1; 1532 int frame_id = -1;
1548 bool parent_is_main_frame = false; 1533 bool parent_is_main_frame = false;
1549 int parent_frame_id = -1; 1534 int parent_frame_id = -1;
1550 int tab_id = -1;
1551 int window_id = -1;
1552 int render_process_host_id = -1; 1535 int render_process_host_id = -1;
1553 int routing_id = -1; 1536 int routing_id = -1;
1554 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 1537 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
1555 const GURL& url = request->url(); 1538 const GURL& url = request->url();
1556 1539
1557 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, 1540 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id,
1558 &parent_is_main_frame, &parent_frame_id, 1541 &parent_is_main_frame, &parent_frame_id,
1559 &tab_id, &window_id, &render_process_host_id, 1542 &render_process_host_id,
1560 &routing_id, &resource_type); 1543 &routing_id, &resource_type);
1561 1544
1562 std::vector<const ExtensionWebRequestEventRouter::EventListener*> 1545 std::vector<const ExtensionWebRequestEventRouter::EventListener*>
1563 matching_listeners; 1546 matching_listeners;
1564 1547
1565 bool is_request_from_extension = 1548 bool is_request_from_extension =
1566 IsRequestFromExtension(request, extension_info_map); 1549 IsRequestFromExtension(request, extension_info_map);
1567 1550
1568 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 1551 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
1569 // We are conservative here and assume requests are asynchronous in case 1552 // We are conservative here and assume requests are asynchronous in case
1570 // we don't have an info object. We don't want to risk a deadlock. 1553 // we don't have an info object. We don't want to risk a deadlock.
1571 bool is_async_request = !info || info->IsAsync(); 1554 bool is_async_request = !info || info->IsAsync();
1572 1555
1573 GetMatchingListenersImpl( 1556 GetMatchingListenersImpl(
1574 profile, extension_info_map, false, event_name, url, 1557 browser_context, request, extension_info_map, false, event_name,
1575 tab_id, window_id, render_process_host_id, routing_id, resource_type, 1558 url, render_process_host_id, routing_id, resource_type,
1576 is_async_request, is_request_from_extension, extra_info_spec, 1559 is_async_request, is_request_from_extension, extra_info_spec,
1577 &matching_listeners); 1560 &matching_listeners);
1578 void* cross_profile = GetCrossProfile(profile); 1561 void* cross_browser_context = GetCrossBrowserContext(browser_context);
1579 if (cross_profile) { 1562 if (cross_browser_context) {
1580 GetMatchingListenersImpl( 1563 GetMatchingListenersImpl(
1581 cross_profile, extension_info_map, true, event_name, url, tab_id, 1564 cross_browser_context, request, extension_info_map, true, event_name,
1582 window_id, render_process_host_id, routing_id, resource_type, 1565 url, render_process_host_id, routing_id, resource_type,
1583 is_async_request, is_request_from_extension, extra_info_spec, 1566 is_async_request, is_request_from_extension, extra_info_spec,
1584 &matching_listeners); 1567 &matching_listeners);
1585 } 1568 }
1586 1569
1587 return matching_listeners; 1570 return matching_listeners;
1588 } 1571 }
1589 1572
1590 namespace { 1573 namespace {
1591 1574
1592 helpers::EventResponseDelta* CalculateDelta( 1575 helpers::EventResponseDelta* CalculateDelta(
(...skipping 28 matching lines...) Expand all
1621 return helpers::CalculateOnAuthRequiredDelta( 1604 return helpers::CalculateOnAuthRequiredDelta(
1622 response->extension_id, response->extension_install_time, 1605 response->extension_id, response->extension_install_time,
1623 response->cancel, &response->auth_credentials); 1606 response->cancel, &response->auth_credentials);
1624 default: 1607 default:
1625 NOTREACHED(); 1608 NOTREACHED();
1626 break; 1609 break;
1627 } 1610 }
1628 return NULL; 1611 return NULL;
1629 } 1612 }
1630 1613
1631 base::Value* SerializeResponseHeaders(const helpers::ResponseHeaders& headers) {
1632 scoped_ptr<base::ListValue> serialized_headers(new base::ListValue());
1633 for (helpers::ResponseHeaders::const_iterator i = headers.begin();
1634 i != headers.end(); ++i) {
1635 serialized_headers->Append(ToHeaderDictionary(i->first, i->second));
1636 }
1637 return serialized_headers.release();
1638 }
1639
1640 // Convert a RequestCookieModifications/ResponseCookieModifications object to a
1641 // base::ListValue which summarizes the changes made. This is templated since
1642 // the two types (request/response) are different but contain essentially the
1643 // same fields.
1644 template<typename CookieType>
1645 base::ListValue* SummarizeCookieModifications(
1646 const std::vector<linked_ptr<CookieType> >& modifications) {
1647 scoped_ptr<base::ListValue> cookie_modifications(new base::ListValue());
1648 for (typename std::vector<linked_ptr<CookieType> >::const_iterator i =
1649 modifications.begin();
1650 i != modifications.end(); ++i) {
1651 scoped_ptr<base::DictionaryValue> summary(new base::DictionaryValue());
1652 const CookieType& mod = *i->get();
1653 switch (mod.type) {
1654 case helpers::ADD:
1655 summary->SetString(activitylog::kCookieModificationTypeKey,
1656 activitylog::kCookieModificationAdd);
1657 break;
1658 case helpers::EDIT:
1659 summary->SetString(activitylog::kCookieModificationTypeKey,
1660 activitylog::kCookieModificationEdit);
1661 break;
1662 case helpers::REMOVE:
1663 summary->SetString(activitylog::kCookieModificationTypeKey,
1664 activitylog::kCookieModificationRemove);
1665 break;
1666 }
1667 if (mod.filter) {
1668 if (mod.filter->name)
1669 summary->SetString(activitylog::kCookieFilterNameKey,
1670 *mod.modification->name);
1671 if (mod.filter->domain)
1672 summary->SetString(activitylog::kCookieFilterDomainKey,
1673 *mod.modification->name);
1674 }
1675 if (mod.modification) {
1676 if (mod.modification->name)
1677 summary->SetString(activitylog::kCookieModDomainKey,
1678 *mod.modification->name);
1679 if (mod.modification->domain)
1680 summary->SetString(activitylog::kCookieModDomainKey,
1681 *mod.modification->name);
1682 }
1683 cookie_modifications->Append(summary.release());
1684 }
1685 return cookie_modifications.release();
1686 }
1687
1688 // Converts an EventResponseDelta object to a dictionary value suitable for the
1689 // activity log.
1690 scoped_ptr<base::DictionaryValue> SummarizeResponseDelta(
1691 const std::string& event_name,
1692 const helpers::EventResponseDelta& delta) {
1693 scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue());
1694 if (delta.cancel) {
1695 details->SetBoolean(activitylog::kCancelKey, true);
1696 }
1697 if (!delta.new_url.is_empty()) {
1698 details->SetString(activitylog::kNewUrlKey, delta.new_url.spec());
1699 }
1700
1701 scoped_ptr<base::ListValue> modified_headers(new base::ListValue());
1702 net::HttpRequestHeaders::Iterator iter(delta.modified_request_headers);
1703 while (iter.GetNext()) {
1704 modified_headers->Append(ToHeaderDictionary(iter.name(), iter.value()));
1705 }
1706 if (!modified_headers->empty()) {
1707 details->Set(activitylog::kModifiedRequestHeadersKey,
1708 modified_headers.release());
1709 }
1710
1711 scoped_ptr<base::ListValue> deleted_headers(new base::ListValue());
1712 deleted_headers->AppendStrings(delta.deleted_request_headers);
1713 if (!deleted_headers->empty()) {
1714 details->Set(activitylog::kDeletedRequestHeadersKey,
1715 deleted_headers.release());
1716 }
1717
1718 if (!delta.added_response_headers.empty()) {
1719 details->Set(activitylog::kAddedRequestHeadersKey,
1720 SerializeResponseHeaders(delta.added_response_headers));
1721 }
1722 if (!delta.deleted_response_headers.empty()) {
1723 details->Set(activitylog::kDeletedResponseHeadersKey,
1724 SerializeResponseHeaders(delta.deleted_response_headers));
1725 }
1726 if (delta.auth_credentials) {
1727 details->SetString(activitylog::kAuthCredentialsKey,
1728 base::UTF16ToUTF8(
1729 delta.auth_credentials->username()) + ":*");
1730 }
1731
1732 if (!delta.response_cookie_modifications.empty()) {
1733 details->Set(
1734 activitylog::kResponseCookieModificationsKey,
1735 SummarizeCookieModifications(delta.response_cookie_modifications));
1736 }
1737
1738 return details.Pass();
1739 }
1740
1741 void LogExtensionActivity(void* profile_id,
1742 bool is_incognito,
1743 const std::string& extension_id,
1744 const GURL& url,
1745 const std::string& api_call,
1746 scoped_ptr<base::DictionaryValue> details) {
1747 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
1748 BrowserThread::PostTask(BrowserThread::UI,
1749 FROM_HERE,
1750 base::Bind(&LogExtensionActivity,
1751 profile_id,
1752 is_incognito,
1753 extension_id,
1754 url,
1755 api_call,
1756 base::Passed(&details)));
1757 } else {
1758 Profile* profile = static_cast<Profile*>(profile_id);
1759 if (!g_browser_process->profile_manager()->IsValidProfile(profile))
1760 return;
1761 scoped_refptr<extensions::Action> action =
1762 new extensions::Action(extension_id,
1763 base::Time::Now(),
1764 extensions::Action::ACTION_WEB_REQUEST,
1765 api_call);
1766 action->set_page_url(url);
1767 action->set_page_incognito(is_incognito);
1768 action->mutable_other()->Set(activity_log_constants::kActionWebRequest,
1769 details.release());
1770 extensions::ActivityLog::GetInstance(profile)->LogAction(action);
1771 }
1772 }
1773
1774 } // namespace 1614 } // namespace
1775 1615
1776 void ExtensionWebRequestEventRouter::DecrementBlockCount( 1616 void ExtensionWebRequestEventRouter::DecrementBlockCount(
1777 void* profile, 1617 void* browser_context,
1778 const std::string& extension_id, 1618 const std::string& extension_id,
1779 const std::string& event_name, 1619 const std::string& event_name,
1780 uint64 request_id, 1620 uint64 request_id,
1781 EventResponse* response) { 1621 EventResponse* response) {
1782 scoped_ptr<EventResponse> response_scoped(response); 1622 scoped_ptr<EventResponse> response_scoped(response);
1783 1623
1784 // It's possible that this request was deleted, or cancelled by a previous 1624 // It's possible that this request was deleted, or cancelled by a previous
1785 // event handler. If so, ignore this response. 1625 // event handler. If so, ignore this response.
1786 if (blocked_requests_.find(request_id) == blocked_requests_.end()) 1626 if (blocked_requests_.find(request_id) == blocked_requests_.end())
1787 return; 1627 return;
1788 1628
1789 BlockedRequest& blocked_request = blocked_requests_[request_id]; 1629 BlockedRequest& blocked_request = blocked_requests_[request_id];
1790 int num_handlers_blocking = --blocked_request.num_handlers_blocking; 1630 int num_handlers_blocking = --blocked_request.num_handlers_blocking;
1791 CHECK_GE(num_handlers_blocking, 0); 1631 CHECK_GE(num_handlers_blocking, 0);
1792 1632
1793 if (response) { 1633 if (response) {
1794 helpers::EventResponseDelta* delta = 1634 helpers::EventResponseDelta* delta =
1795 CalculateDelta(&blocked_request, response); 1635 CalculateDelta(&blocked_request, response);
1796 1636
1797 LogExtensionActivity(profile, 1637 if (web_request_event_router_delegate_) {
1798 blocked_request.is_incognito, 1638 web_request_event_router_delegate_->LogExtensionActivity(
1799 extension_id, 1639 browser_context,
1800 blocked_request.request->url(), 1640 blocked_request.is_incognito,
1801 event_name, 1641 extension_id,
1802 SummarizeResponseDelta(event_name, *delta)); 1642 blocked_request.request->url(),
1643 event_name,
1644 *delta);
1645 }
1803 1646
1804 blocked_request.response_deltas.push_back( 1647 blocked_request.response_deltas.push_back(
1805 linked_ptr<helpers::EventResponseDelta>(delta)); 1648 linked_ptr<helpers::EventResponseDelta>(delta));
1806 } 1649 }
1807 1650
1808 base::TimeDelta block_time = 1651 base::TimeDelta block_time =
1809 base::Time::Now() - blocked_request.blocking_time; 1652 base::Time::Now() - blocked_request.blocking_time;
1810 if (!extension_id.empty()) { 1653 if (!extension_id.empty()) {
1811 request_time_tracker_->IncrementExtensionBlockTime( 1654 request_time_tracker_->IncrementExtensionBlockTime(
1812 extension_id, request_id, block_time); 1655 extension_id, request_id, block_time);
1813 } else { 1656 } else {
1814 // |extension_id| is empty for requests blocked on startup waiting for the 1657 // |extension_id| is empty for requests blocked on startup waiting for the
1815 // declarative rules to be read from disk. 1658 // declarative rules to be read from disk.
1816 UMA_HISTOGRAM_TIMES("Extensions.NetworkDelayStartup", block_time); 1659 UMA_HISTOGRAM_TIMES("Extensions.NetworkDelayStartup", block_time);
1817 } 1660 }
1818 1661
1819 if (num_handlers_blocking == 0) { 1662 if (num_handlers_blocking == 0) {
1820 blocked_request.request->LogUnblocked(); 1663 blocked_request.request->LogUnblocked();
1821 ExecuteDeltas(profile, request_id, true); 1664 ExecuteDeltas(browser_context, request_id, true);
1822 } else { 1665 } else {
1823 // Update the URLRequest to make sure it's tagged with an extension that's 1666 // Update the URLRequest to make sure it's tagged with an extension that's
1824 // still blocking it. This may end up being the same extension as before. 1667 // still blocking it. This may end up being the same extension as before.
1825 std::set<EventListener>& listeners = listeners_[profile][event_name]; 1668 std::set<EventListener>& listeners =
1669 listeners_[browser_context][event_name];
1826 1670
1827 for (std::set<EventListener>::iterator it = listeners.begin(); 1671 for (std::set<EventListener>::iterator it = listeners.begin();
1828 it != listeners.end(); ++it) { 1672 it != listeners.end(); ++it) {
1829 if (it->blocked_requests.count(request_id) == 0) 1673 if (it->blocked_requests.count(request_id) == 0)
1830 continue; 1674 continue;
1831 std::string delegate_info = 1675 std::string delegate_info =
1832 l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION, 1676 l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION,
1833 base::UTF8ToUTF16(it->extension_name)); 1677 base::UTF8ToUTF16(it->extension_name));
1834 blocked_request.request->LogAndReportBlockedBy(delegate_info.c_str()); 1678 blocked_request.request->LogAndReportBlockedBy(delegate_info.c_str());
1835 break; 1679 break;
1836 } 1680 }
1837 } 1681 }
1838 } 1682 }
1839 1683
1840 void ExtensionWebRequestEventRouter::SendMessages( 1684 void ExtensionWebRequestEventRouter::SendMessages(
1841 void* profile, 1685 void* browser_context,
1842 const BlockedRequest& blocked_request) { 1686 const BlockedRequest& blocked_request) {
1843 const helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; 1687 const helpers::EventResponseDeltas& deltas = blocked_request.response_deltas;
1844 for (helpers::EventResponseDeltas::const_iterator delta = deltas.begin(); 1688 for (helpers::EventResponseDeltas::const_iterator delta = deltas.begin();
1845 delta != deltas.end(); ++delta) { 1689 delta != deltas.end(); ++delta) {
1846 const std::set<std::string>& messages = (*delta)->messages_to_extension; 1690 const std::set<std::string>& messages = (*delta)->messages_to_extension;
1847 for (std::set<std::string>::const_iterator message = messages.begin(); 1691 for (std::set<std::string>::const_iterator message = messages.begin();
1848 message != messages.end(); ++message) { 1692 message != messages.end(); ++message) {
1849 scoped_ptr<base::DictionaryValue> argument(new base::DictionaryValue); 1693 scoped_ptr<base::DictionaryValue> argument(new base::DictionaryValue);
1850 ExtractRequestInfo(blocked_request.request, argument.get()); 1694 ExtractRequestInfo(blocked_request.request, argument.get());
1851 extensions::WebViewRendererState::WebViewInfo web_view_info; 1695 extensions::WebViewRendererState::WebViewInfo web_view_info;
1852 bool is_web_view_guest = GetWebViewInfo(blocked_request.request, 1696 bool is_web_view_guest = GetWebViewInfo(blocked_request.request,
1853 &web_view_info); 1697 &web_view_info);
1854 argument->SetString(keys::kMessageKey, *message); 1698 argument->SetString(keys::kMessageKey, *message);
1855 argument->SetString(keys::kStageKey, 1699 argument->SetString(keys::kStageKey,
1856 GetRequestStageAsString(blocked_request.event)); 1700 GetRequestStageAsString(blocked_request.event));
1857 1701
1858 BrowserThread::PostTask( 1702 BrowserThread::PostTask(
1859 BrowserThread::UI, 1703 BrowserThread::UI,
1860 FROM_HERE, 1704 FROM_HERE,
1861 base::Bind(&SendOnMessageEventOnUI, 1705 base::Bind(&SendOnMessageEventOnUI,
1862 profile, 1706 browser_context,
1863 (*delta)->extension_id, 1707 (*delta)->extension_id,
1864 is_web_view_guest, 1708 is_web_view_guest,
1865 web_view_info, 1709 web_view_info,
1866 base::Passed(&argument))); 1710 base::Passed(&argument)));
1867 } 1711 }
1868 } 1712 }
1869 } 1713 }
1870 1714
1871 int ExtensionWebRequestEventRouter::ExecuteDeltas( 1715 int ExtensionWebRequestEventRouter::ExecuteDeltas(
1872 void* profile, 1716 void* browser_context,
1873 uint64 request_id, 1717 uint64 request_id,
1874 bool call_callback) { 1718 bool call_callback) {
1875 BlockedRequest& blocked_request = blocked_requests_[request_id]; 1719 BlockedRequest& blocked_request = blocked_requests_[request_id];
1876 CHECK(blocked_request.num_handlers_blocking == 0); 1720 CHECK(blocked_request.num_handlers_blocking == 0);
1877 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; 1721 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas;
1878 base::TimeDelta block_time = 1722 base::TimeDelta block_time =
1879 base::Time::Now() - blocked_request.blocking_time; 1723 base::Time::Now() - blocked_request.blocking_time;
1880 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); 1724 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time);
1881 1725
1882 bool credentials_set = false; 1726 bool credentials_set = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 CHECK(!blocked_request.auth_callback.is_null()); 1762 CHECK(!blocked_request.auth_callback.is_null());
1919 credentials_set = helpers::MergeOnAuthRequiredResponses( 1763 credentials_set = helpers::MergeOnAuthRequiredResponses(
1920 blocked_request.response_deltas, 1764 blocked_request.response_deltas,
1921 blocked_request.auth_credentials, 1765 blocked_request.auth_credentials,
1922 &warnings, 1766 &warnings,
1923 blocked_request.net_log); 1767 blocked_request.net_log);
1924 } else { 1768 } else {
1925 NOTREACHED(); 1769 NOTREACHED();
1926 } 1770 }
1927 1771
1928 SendMessages(profile, blocked_request); 1772 SendMessages(browser_context, blocked_request);
1929 1773
1930 if (!warnings.empty()) { 1774 if (!warnings.empty()) {
1931 BrowserThread::PostTask( 1775 BrowserThread::PostTask(
1932 BrowserThread::UI, 1776 BrowserThread::UI,
1933 FROM_HERE, 1777 FROM_HERE,
1934 base::Bind(&WarningService::NotifyWarningsOnUI, profile, warnings)); 1778 base::Bind(&WarningService::NotifyWarningsOnUI,
1779 browser_context, warnings));
1935 } 1780 }
1936 1781
1937 if (canceled) { 1782 if (canceled) {
1938 request_time_tracker_->SetRequestCanceled(request_id); 1783 request_time_tracker_->SetRequestCanceled(request_id);
1939 } else if (blocked_request.new_url && 1784 } else if (blocked_request.new_url &&
1940 !blocked_request.new_url->is_empty()) { 1785 !blocked_request.new_url->is_empty()) {
1941 request_time_tracker_->SetRequestRedirected(request_id); 1786 request_time_tracker_->SetRequestRedirected(request_id);
1942 } 1787 }
1943 1788
1944 // This triggers onErrorOccurred if canceled is true. 1789 // This triggers onErrorOccurred if canceled is true.
(...skipping 18 matching lines...) Expand all
1963 blocked_requests_.erase(request_id); 1808 blocked_requests_.erase(request_id);
1964 if (call_callback) 1809 if (call_callback)
1965 callback.Run(response); 1810 callback.Run(response);
1966 } else { 1811 } else {
1967 blocked_requests_.erase(request_id); 1812 blocked_requests_.erase(request_id);
1968 } 1813 }
1969 return rv; 1814 return rv;
1970 } 1815 }
1971 1816
1972 bool ExtensionWebRequestEventRouter::ProcessDeclarativeRules( 1817 bool ExtensionWebRequestEventRouter::ProcessDeclarativeRules(
1973 void* profile, 1818 void* browser_context,
1974 InfoMap* extension_info_map, 1819 InfoMap* extension_info_map,
1975 const std::string& event_name, 1820 const std::string& event_name,
1976 net::URLRequest* request, 1821 net::URLRequest* request,
1977 extensions::RequestStage request_stage, 1822 extensions::RequestStage request_stage,
1978 const net::HttpResponseHeaders* original_response_headers) { 1823 const net::HttpResponseHeaders* original_response_headers) {
1979 extensions::WebViewRendererState::WebViewInfo web_view_info; 1824 extensions::WebViewRendererState::WebViewInfo web_view_info;
1980 bool is_web_view_guest = GetWebViewInfo(request, &web_view_info); 1825 bool is_web_view_guest = GetWebViewInfo(request, &web_view_info);
1981 1826
1982 RulesRegistryService::WebViewKey webview_key( 1827 RulesRegistryService::WebViewKey webview_key(
1983 is_web_view_guest ? web_view_info.embedder_process_id : 0, 1828 is_web_view_guest ? web_view_info.embedder_process_id : 0,
1984 is_web_view_guest ? web_view_info.instance_id : 0); 1829 is_web_view_guest ? web_view_info.instance_id : 0);
1985 RulesRegistryKey rules_key(profile, webview_key); 1830 RulesRegistryKey rules_key(browser_context, webview_key);
1986 // If this check fails, check that the active stages are up-to-date in 1831 // If this check fails, check that the active stages are up-to-date in
1987 // extensions/browser/api/declarative_webrequest/request_stage.h . 1832 // extensions/browser/api/declarative_webrequest/request_stage.h .
1988 DCHECK(request_stage & extensions::kActiveStages); 1833 DCHECK(request_stage & extensions::kActiveStages);
1989 1834
1990 // Rules of the current |profile| may apply but we need to check also whether 1835 // Rules of the current |browser_context| may apply but we need to check also
1991 // there are applicable rules from extensions whose background page 1836 // whether there are applicable rules from extensions whose background page
1992 // spans from regular to incognito mode. 1837 // spans from regular to incognito mode.
1993 1838
1994 // First parameter identifies the registry, the second indicates whether the 1839 // First parameter identifies the registry, the second indicates whether the
1995 // registry belongs to the cross profile. 1840 // registry belongs to the cross browser_context.
1996 typedef std::pair<extensions::WebRequestRulesRegistry*, bool> 1841 typedef std::pair<extensions::WebRequestRulesRegistry*, bool>
1997 RelevantRegistry; 1842 RelevantRegistry;
1998 typedef std::vector<RelevantRegistry> RelevantRegistries; 1843 typedef std::vector<RelevantRegistry> RelevantRegistries;
1999 RelevantRegistries relevant_registries; 1844 RelevantRegistries relevant_registries;
2000 1845
2001 if (rules_registries_.find(rules_key) != rules_registries_.end()) { 1846 if (rules_registries_.find(rules_key) != rules_registries_.end()) {
2002 relevant_registries.push_back( 1847 relevant_registries.push_back(
2003 std::make_pair(rules_registries_[rules_key].get(), false)); 1848 std::make_pair(rules_registries_[rules_key].get(), false));
2004 } 1849 }
2005 1850
2006 void* cross_profile = GetCrossProfile(profile); 1851 void* cross_browser_context = GetCrossBrowserContext(browser_context);
2007 RulesRegistryKey cross_profile_rules_key(cross_profile, webview_key); 1852 RulesRegistryKey cross_browser_context_rules_key(
2008 if (cross_profile && 1853 cross_browser_context, webview_key);
2009 rules_registries_.find(cross_profile_rules_key) != 1854 if (cross_browser_context &&
1855 rules_registries_.find(cross_browser_context_rules_key) !=
2010 rules_registries_.end()) { 1856 rules_registries_.end()) {
2011 relevant_registries.push_back( 1857 relevant_registries.push_back(
2012 std::make_pair(rules_registries_[cross_profile_rules_key].get(), true)); 1858 std::make_pair(
1859 rules_registries_[cross_browser_context_rules_key].get(), true));
2013 } 1860 }
2014 1861
2015 // The following block is experimentally enabled and its impact on load time 1862 // The following block is experimentally enabled and its impact on load time
2016 // logged with UMA Extensions.NetworkDelayRegistryLoad. crbug.com/175961 1863 // logged with UMA Extensions.NetworkDelayRegistryLoad. crbug.com/175961
2017 for (RelevantRegistries::iterator i = relevant_registries.begin(); 1864 for (RelevantRegistries::iterator i = relevant_registries.begin();
2018 i != relevant_registries.end(); ++i) { 1865 i != relevant_registries.end(); ++i) {
2019 extensions::WebRequestRulesRegistry* rules_registry = i->first; 1866 extensions::WebRequestRulesRegistry* rules_registry = i->first;
2020 if (!rules_registry->ready().is_signaled()) { 1867 if (!rules_registry->ready().is_signaled()) {
2021 // The rules registry is still loading. Block this request until it 1868 // The rules registry is still loading. Block this request until it
2022 // finishes. 1869 // finishes.
2023 rules_registry->ready().Post( 1870 rules_registry->ready().Post(
2024 FROM_HERE, 1871 FROM_HERE,
2025 base::Bind(&ExtensionWebRequestEventRouter::OnRulesRegistryReady, 1872 base::Bind(&ExtensionWebRequestEventRouter::OnRulesRegistryReady,
2026 AsWeakPtr(), 1873 AsWeakPtr(),
2027 profile, 1874 browser_context,
2028 event_name, 1875 event_name,
2029 request->identifier(), 1876 request->identifier(),
2030 request_stage)); 1877 request_stage));
2031 blocked_requests_[request->identifier()].num_handlers_blocking++; 1878 blocked_requests_[request->identifier()].num_handlers_blocking++;
2032 blocked_requests_[request->identifier()].request = request; 1879 blocked_requests_[request->identifier()].request = request;
2033 blocked_requests_[request->identifier()].is_incognito |= 1880 blocked_requests_[request->identifier()].is_incognito |=
2034 IsIncognitoProfile(profile); 1881 IsIncognitoBrowserContext(browser_context);
2035 blocked_requests_[request->identifier()].blocking_time = 1882 blocked_requests_[request->identifier()].blocking_time =
2036 base::Time::Now(); 1883 base::Time::Now();
2037 blocked_requests_[request->identifier()].original_response_headers = 1884 blocked_requests_[request->identifier()].original_response_headers =
2038 original_response_headers; 1885 original_response_headers;
2039 blocked_requests_[request->identifier()].extension_info_map = 1886 blocked_requests_[request->identifier()].extension_info_map =
2040 extension_info_map; 1887 extension_info_map;
2041 return true; 1888 return true;
2042 } 1889 }
2043 } 1890 }
2044 1891
(...skipping 20 matching lines...) Expand all
2065 } 1912 }
2066 1913
2067 base::TimeDelta elapsed_time = start - base::Time::Now(); 1914 base::TimeDelta elapsed_time = start - base::Time::Now();
2068 UMA_HISTOGRAM_TIMES("Extensions.DeclarativeWebRequestNetworkDelay", 1915 UMA_HISTOGRAM_TIMES("Extensions.DeclarativeWebRequestNetworkDelay",
2069 elapsed_time); 1916 elapsed_time);
2070 1917
2071 return deltas_created; 1918 return deltas_created;
2072 } 1919 }
2073 1920
2074 void ExtensionWebRequestEventRouter::OnRulesRegistryReady( 1921 void ExtensionWebRequestEventRouter::OnRulesRegistryReady(
2075 void* profile, 1922 void* browser_context,
2076 const std::string& event_name, 1923 const std::string& event_name,
2077 uint64 request_id, 1924 uint64 request_id,
2078 extensions::RequestStage request_stage) { 1925 extensions::RequestStage request_stage) {
2079 // It's possible that this request was deleted, or cancelled by a previous 1926 // It's possible that this request was deleted, or cancelled by a previous
2080 // event handler. If so, ignore this response. 1927 // event handler. If so, ignore this response.
2081 if (blocked_requests_.find(request_id) == blocked_requests_.end()) 1928 if (blocked_requests_.find(request_id) == blocked_requests_.end())
2082 return; 1929 return;
2083 1930
2084 BlockedRequest& blocked_request = blocked_requests_[request_id]; 1931 BlockedRequest& blocked_request = blocked_requests_[request_id];
2085 base::TimeDelta block_time = 1932 base::TimeDelta block_time =
2086 base::Time::Now() - blocked_request.blocking_time; 1933 base::Time::Now() - blocked_request.blocking_time;
2087 UMA_HISTOGRAM_TIMES("Extensions.NetworkDelayRegistryLoad", block_time); 1934 UMA_HISTOGRAM_TIMES("Extensions.NetworkDelayRegistryLoad", block_time);
2088 1935
2089 ProcessDeclarativeRules(profile, 1936 ProcessDeclarativeRules(browser_context,
2090 blocked_request.extension_info_map, 1937 blocked_request.extension_info_map,
2091 event_name, 1938 event_name,
2092 blocked_request.request, 1939 blocked_request.request,
2093 request_stage, 1940 request_stage,
2094 blocked_request.original_response_headers.get()); 1941 blocked_request.original_response_headers.get());
2095 // Reset to NULL so that nobody relies on this being set. 1942 // Reset to NULL so that nobody relies on this being set.
2096 blocked_request.extension_info_map = NULL; 1943 blocked_request.extension_info_map = NULL;
2097 DecrementBlockCount(profile, std::string(), event_name, request_id, NULL); 1944 DecrementBlockCount(
1945 browser_context, std::string(), event_name, request_id, NULL);
2098 } 1946 }
2099 1947
2100 bool ExtensionWebRequestEventRouter::GetAndSetSignaled(uint64 request_id, 1948 bool ExtensionWebRequestEventRouter::GetAndSetSignaled(uint64 request_id,
2101 EventTypes event_type) { 1949 EventTypes event_type) {
2102 SignaledRequestMap::iterator iter = signaled_requests_.find(request_id); 1950 SignaledRequestMap::iterator iter = signaled_requests_.find(request_id);
2103 if (iter == signaled_requests_.end()) { 1951 if (iter == signaled_requests_.end()) {
2104 signaled_requests_[request_id] = event_type; 1952 signaled_requests_[request_id] = event_type;
2105 return false; 1953 return false;
2106 } 1954 }
2107 bool was_signaled_before = (iter->second & event_type) != 0; 1955 bool was_signaled_before = (iter->second & event_type) != 0;
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
2462 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); 2310 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings));
2463 2311
2464 // Continue gracefully. 2312 // Continue gracefully.
2465 RunSync(); 2313 RunSync();
2466 } 2314 }
2467 2315
2468 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { 2316 bool WebRequestHandlerBehaviorChangedFunction::RunSync() {
2469 helpers::ClearCacheOnNavigation(); 2317 helpers::ClearCacheOnNavigation();
2470 return true; 2318 return true;
2471 } 2319 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698