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