Index: extensions/browser/api/web_request/web_request_api.cc |
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc |
index 2a3d30ef6baecd31e68a3c33b9f3687d05dfe40f..df348481dd7584ae7845103d936d4c6ad63d3903 100644 |
--- a/extensions/browser/api/web_request/web_request_api.cc |
+++ b/extensions/browser/api/web_request/web_request_api.cc |
@@ -350,6 +350,13 @@ bool IsPublicSession() { |
return false; |
} |
+// Returns event details for a given request. |
+std::unique_ptr<WebRequestEventDetails> CreateEventDetails( |
+ const net::URLRequest* request, |
+ int extra_info_spec) { |
+ return base::MakeUnique<WebRequestEventDetails>(request, extra_info_spec); |
+} |
+ |
} // namespace |
WebRequestAPI::WebRequestAPI(content::BrowserContext* context) |
@@ -491,10 +498,10 @@ bool ExtensionWebRequestEventRouter::RequestFilter::InitFromValue( |
return false; |
for (size_t i = 0; i < urls_value->GetSize(); ++i) { |
std::string url; |
- URLPattern pattern( |
- URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | |
- URLPattern::SCHEME_FTP | URLPattern::SCHEME_FILE | |
- URLPattern::SCHEME_EXTENSION); |
+ URLPattern pattern(URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | |
+ URLPattern::SCHEME_FTP | URLPattern::SCHEME_FILE | |
+ URLPattern::SCHEME_EXTENSION | |
+ URLPattern::SCHEME_WS | URLPattern::SCHEME_WSS); |
if (!urls_value->GetString(i, &url) || |
pattern.Parse(url) != URLPattern::PARSE_SUCCESS) { |
*error = ErrorUtils::FormatErrorMessage( |
@@ -575,16 +582,6 @@ void ExtensionWebRequestEventRouter::RegisterRulesRegistry( |
rules_registries_.erase(key); |
} |
-std::unique_ptr<WebRequestEventDetails> |
-ExtensionWebRequestEventRouter::CreateEventDetails( |
- const net::URLRequest* request, |
- int extra_info_spec) { |
- std::unique_ptr<WebRequestEventDetails> event_details( |
- new WebRequestEventDetails(request, extra_info_spec)); |
- |
- return event_details; |
-} |
- |
int ExtensionWebRequestEventRouter::OnBeforeRequest( |
void* browser_context, |
const InfoMap* extension_info_map, |
@@ -940,7 +937,7 @@ void ExtensionWebRequestEventRouter::OnCompleted( |
request_time_tracker_->LogRequestEndTime(request->identifier(), |
base::Time::Now()); |
- DCHECK_EQ(net::OK, net_error); |
+ DCHECK(net_error == net::OK || net_error == net::ERR_WS_UPGRADE); |
DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); |
@@ -978,6 +975,14 @@ void ExtensionWebRequestEventRouter::OnErrorOccurred( |
net::URLRequest* request, |
bool started, |
int net_error) { |
+ // When WebSocket handshake request finishes, URLRequest is cancelled with an |
+ // ERR_WS_UPGRADE code (see WebSocketStreamRequestImpl::PerformUpgrade). |
+ // WebRequest API reports this as a completed request. |
+ if (net_error == net::ERR_WS_UPGRADE) { |
+ OnCompleted(browser_context, extension_info_map, request, net_error); |
+ return; |
+ } |
+ |
ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get(); |
if (!client) { |
// |client| could be NULL during shutdown. |
@@ -1333,10 +1338,7 @@ void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( |
bool ExtensionWebRequestEventRouter::IsPageLoad( |
const net::URLRequest* request) const { |
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
- if (!info) |
- return false; |
- |
- return info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
+ return info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
} |
void ExtensionWebRequestEventRouter::NotifyPageLoad() { |
@@ -1512,7 +1514,7 @@ ExtensionWebRequestEventRouter::GetMatchingListeners( |
const GURL& url = request->url(); |
int render_process_host_id = content::ChildProcessHost::kInvalidUniqueID; |
int routing_id = MSG_ROUTING_NONE; |
- ResourceTypeExt resource_type; |
+ ResourceTypeExt resource_type(request->url().SchemeIsWSOrWSS()); |
// We are conservative here and assume requests are asynchronous in case |
// we don't have an info object. We don't want to risk a deadlock. |
bool is_async_request = false; |
@@ -1522,8 +1524,10 @@ ExtensionWebRequestEventRouter::GetMatchingListeners( |
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
if (info) { |
is_async_request = info->IsAsync(); |
- if (helpers::IsRelevantResourceType(info->GetResourceType())) |
+ if (!resource_type.is_websocket && |
+ helpers::IsRelevantResourceType(info->GetResourceType())) { |
resource_type.resource_type = info->GetResourceType(); |
+ } |
render_process_host_id = info->GetChildID(); |
routing_id = info->GetRouteID(); |
} |
@@ -1808,10 +1812,8 @@ int ExtensionWebRequestEventRouter::ExecuteDeltas( |
if (blocked_request.event == kOnBeforeRequest) { |
CHECK(!blocked_request.callback.is_null()); |
helpers::MergeOnBeforeRequestResponses( |
- blocked_request.response_deltas, |
- blocked_request.new_url, |
- &warnings, |
- blocked_request.net_log); |
+ blocked_request.request->url(), blocked_request.response_deltas, |
+ blocked_request.new_url, &warnings, blocked_request.net_log); |
} else if (blocked_request.event == kOnBeforeSendHeaders) { |
CHECK(!blocked_request.callback.is_null()); |
helpers::MergeOnBeforeSendHeadersResponses( |
@@ -1822,12 +1824,10 @@ int ExtensionWebRequestEventRouter::ExecuteDeltas( |
} else if (blocked_request.event == kOnHeadersReceived) { |
CHECK(!blocked_request.callback.is_null()); |
helpers::MergeOnHeadersReceivedResponses( |
- blocked_request.response_deltas, |
+ blocked_request.request->url(), blocked_request.response_deltas, |
blocked_request.original_response_headers.get(), |
- blocked_request.override_response_headers, |
- blocked_request.new_url, |
- &warnings, |
- blocked_request.net_log); |
+ blocked_request.override_response_headers, blocked_request.new_url, |
+ &warnings, blocked_request.net_log); |
} else if (blocked_request.event == kOnAuthRequired) { |
CHECK(blocked_request.callback.is_null()); |
CHECK(!blocked_request.auth_callback.is_null()); |