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