Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 2449913002: Support WebSocket in WebRequest API. (Closed)
Patch Set: Fix unittest; add 'websocket' type to WebRequest API. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698