| 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());
|
|
|