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