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

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

Powered by Google App Engine
This is Rietveld 408576698