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