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

Side by Side Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 2449913002: Support WebSocket in WebRequest API. (Closed)
Patch Set: Add tests for onAuthRequired path for WS handshake. 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 unified diff | Download patch
OLDNEW
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 "extensions/browser/api/web_request/web_request_api.h" 5 #include "extensions/browser/api/web_request/web_request_api.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 // Returns true if we're in a Public Session. 345 // Returns true if we're in a Public Session.
346 bool IsPublicSession() { 346 bool IsPublicSession() {
347 #if defined(OS_CHROMEOS) 347 #if defined(OS_CHROMEOS)
348 if (chromeos::LoginState::IsInitialized()) { 348 if (chromeos::LoginState::IsInitialized()) {
349 return chromeos::LoginState::Get()->IsPublicSessionUser(); 349 return chromeos::LoginState::Get()->IsPublicSessionUser();
350 } 350 }
351 #endif 351 #endif
352 return false; 352 return false;
353 } 353 }
354 354
355 // Returns event details for a given request.
356 std::unique_ptr<WebRequestEventDetails> CreateEventDetails(
357 const net::URLRequest* request,
358 int extra_info_spec) {
359 return base::MakeUnique<WebRequestEventDetails>(request, extra_info_spec);
360 }
361
355 } // namespace 362 } // namespace
356 363
357 WebRequestAPI::WebRequestAPI(content::BrowserContext* context) 364 WebRequestAPI::WebRequestAPI(content::BrowserContext* context)
358 : browser_context_(context) { 365 : browser_context_(context) {
359 EventRouter* event_router = EventRouter::Get(browser_context_); 366 EventRouter* event_router = EventRouter::Get(browser_context_);
360 for (size_t i = 0; i < arraysize(kWebRequestEvents); ++i) { 367 for (size_t i = 0; i < arraysize(kWebRequestEvents); ++i) {
361 // Observe the webRequest event. 368 // Observe the webRequest event.
362 std::string event_name = kWebRequestEvents[i]; 369 std::string event_name = kWebRequestEvents[i];
363 event_router->RegisterObserver(this, event_name); 370 event_router->RegisterObserver(this, event_name);
364 371
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 if (!value.HasKey("urls")) 493 if (!value.HasKey("urls"))
487 return false; 494 return false;
488 495
489 for (base::DictionaryValue::Iterator it(value); !it.IsAtEnd(); it.Advance()) { 496 for (base::DictionaryValue::Iterator it(value); !it.IsAtEnd(); it.Advance()) {
490 if (it.key() == "urls") { 497 if (it.key() == "urls") {
491 const base::ListValue* urls_value = NULL; 498 const base::ListValue* urls_value = NULL;
492 if (!it.value().GetAsList(&urls_value)) 499 if (!it.value().GetAsList(&urls_value))
493 return false; 500 return false;
494 for (size_t i = 0; i < urls_value->GetSize(); ++i) { 501 for (size_t i = 0; i < urls_value->GetSize(); ++i) {
495 std::string url; 502 std::string url;
496 URLPattern pattern( 503 URLPattern pattern(URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS |
497 URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | 504 URLPattern::SCHEME_FTP | URLPattern::SCHEME_FILE |
498 URLPattern::SCHEME_FTP | URLPattern::SCHEME_FILE | 505 URLPattern::SCHEME_EXTENSION |
499 URLPattern::SCHEME_EXTENSION); 506 URLPattern::SCHEME_WS | URLPattern::SCHEME_WSS);
500 if (!urls_value->GetString(i, &url) || 507 if (!urls_value->GetString(i, &url) ||
501 pattern.Parse(url) != URLPattern::PARSE_SUCCESS) { 508 pattern.Parse(url) != URLPattern::PARSE_SUCCESS) {
502 *error = ErrorUtils::FormatErrorMessage( 509 *error = ErrorUtils::FormatErrorMessage(
503 keys::kInvalidRequestFilterUrl, url); 510 keys::kInvalidRequestFilterUrl, url);
504 return false; 511 return false;
505 } 512 }
506 urls.AddPattern(pattern); 513 urls.AddPattern(pattern);
507 } 514 }
508 } else if (it.key() == "types") { 515 } else if (it.key() == "types") {
509 const base::ListValue* types_value = NULL; 516 const base::ListValue* types_value = NULL;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 void* browser_context, 578 void* browser_context,
572 int rules_registry_id, 579 int rules_registry_id,
573 scoped_refptr<WebRequestRulesRegistry> rules_registry) { 580 scoped_refptr<WebRequestRulesRegistry> rules_registry) {
574 RulesRegistryKey key(browser_context, rules_registry_id); 581 RulesRegistryKey key(browser_context, rules_registry_id);
575 if (rules_registry.get()) 582 if (rules_registry.get())
576 rules_registries_[key] = rules_registry; 583 rules_registries_[key] = rules_registry;
577 else 584 else
578 rules_registries_.erase(key); 585 rules_registries_.erase(key);
579 } 586 }
580 587
581 std::unique_ptr<WebRequestEventDetails>
582 ExtensionWebRequestEventRouter::CreateEventDetails(
583 const net::URLRequest* request,
584 int extra_info_spec) {
585 std::unique_ptr<WebRequestEventDetails> event_details(
586 new WebRequestEventDetails(request, extra_info_spec));
587
588 return event_details;
589 }
590
591 int ExtensionWebRequestEventRouter::OnBeforeRequest( 588 int ExtensionWebRequestEventRouter::OnBeforeRequest(
592 void* browser_context, 589 void* browser_context,
593 const InfoMap* extension_info_map, 590 const InfoMap* extension_info_map,
594 net::URLRequest* request, 591 net::URLRequest* request,
595 const net::CompletionCallback& callback, 592 const net::CompletionCallback& callback,
596 GURL* new_url) { 593 GURL* new_url) {
597 ExtensionNavigationUIData* navigation_ui_data = 594 ExtensionNavigationUIData* navigation_ui_data =
598 ExtensionsBrowserClient::Get()->GetExtensionNavigationUIData(request); 595 ExtensionsBrowserClient::Get()->GetExtensionNavigationUIData(request);
599 if (ShouldHideEvent(browser_context, extension_info_map, request, 596 if (ShouldHideEvent(browser_context, extension_info_map, request,
600 navigation_ui_data)) { 597 navigation_ui_data)) {
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 if (!browser_context || 933 if (!browser_context ||
937 (WebRequestPermissions::HideRequest(extension_info_map, request, 934 (WebRequestPermissions::HideRequest(extension_info_map, request,
938 navigation_ui_data) && 935 navigation_ui_data) &&
939 !WasSignaled(*request))) { 936 !WasSignaled(*request))) {
940 return; 937 return;
941 } 938 }
942 939
943 request_time_tracker_->LogRequestEndTime(request->identifier(), 940 request_time_tracker_->LogRequestEndTime(request->identifier(),
944 base::Time::Now()); 941 base::Time::Now());
945 942
946 DCHECK_EQ(net::OK, net_error); 943 DCHECK(net_error == net::OK || net_error == net::ERR_WS_UPGRADE);
Devlin 2017/02/21 16:10:44 nit: Can we add // See comment in OnErrorOccurred
pkalinnikov 2017/02/21 19:18:16 What is "re"? I put "regarding", looks good?
Devlin 2017/02/21 20:34:11 Looks good. Yep, re == regarding. [1] [1] https:
947 944
948 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); 945 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted));
949 946
950 ClearPendingCallbacks(request); 947 ClearPendingCallbacks(request);
951 948
952 int extra_info_spec = 0; 949 int extra_info_spec = 0;
953 RawListeners listeners = GetMatchingListeners( 950 RawListeners listeners = GetMatchingListeners(
954 browser_context, extension_info_map, navigation_ui_data, 951 browser_context, extension_info_map, navigation_ui_data,
955 keys::kOnCompletedEvent, request, &extra_info_spec); 952 keys::kOnCompletedEvent, request, &extra_info_spec);
956 if (listeners.empty()) 953 if (listeners.empty())
(...skipping 17 matching lines...) Expand all
974 OnCompleted(browser_context, extension_info_map, request, 971 OnCompleted(browser_context, extension_info_map, request,
975 request->status().error()); 972 request->status().error());
976 } 973 }
977 974
978 void ExtensionWebRequestEventRouter::OnErrorOccurred( 975 void ExtensionWebRequestEventRouter::OnErrorOccurred(
979 void* browser_context, 976 void* browser_context,
980 const InfoMap* extension_info_map, 977 const InfoMap* extension_info_map,
981 net::URLRequest* request, 978 net::URLRequest* request,
982 bool started, 979 bool started,
983 int net_error) { 980 int net_error) {
981 // When WebSocket handshake request finishes, URLRequest is cancelled with an
982 // ERR_WS_UPGRADE code (see WebSocketStreamRequestImpl::PerformUpgrade).
983 // WebRequest API reports this as a completed request.
984 if (net_error == net::ERR_WS_UPGRADE) {
985 OnCompleted(browser_context, extension_info_map, request, net_error);
986 return;
987 }
988
984 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get(); 989 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get();
985 if (!client) { 990 if (!client) {
986 // |client| could be NULL during shutdown. 991 // |client| could be NULL during shutdown.
987 return; 992 return;
988 } 993 }
989 ExtensionNavigationUIData* navigation_ui_data = 994 ExtensionNavigationUIData* navigation_ui_data =
990 client->GetExtensionNavigationUIData(request); 995 client->GetExtensionNavigationUIData(request);
991 // We hide events from the system context as well as sensitive requests. 996 // We hide events from the system context as well as sensitive requests.
992 // However, if the request first became sensitive after redirecting we have 997 // However, if the request first became sensitive after redirecting we have
993 // already signaled it and thus we have to signal the end of it. This is 998 // already signaled it and thus we have to signal the end of it. This is
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); 1804 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder);
1800 1805
1801 bool canceled = false; 1806 bool canceled = false;
1802 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled, 1807 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled,
1803 blocked_request.net_log); 1808 blocked_request.net_log);
1804 1809
1805 WarningSet warnings; 1810 WarningSet warnings;
1806 if (blocked_request.event == kOnBeforeRequest) { 1811 if (blocked_request.event == kOnBeforeRequest) {
1807 CHECK(!blocked_request.callback.is_null()); 1812 CHECK(!blocked_request.callback.is_null());
1808 helpers::MergeOnBeforeRequestResponses( 1813 helpers::MergeOnBeforeRequestResponses(
1809 blocked_request.response_deltas, 1814 blocked_request.request->url(), blocked_request.response_deltas,
1810 blocked_request.new_url, 1815 blocked_request.new_url, &warnings, blocked_request.net_log);
1811 &warnings,
1812 blocked_request.net_log);
1813 } else if (blocked_request.event == kOnBeforeSendHeaders) { 1816 } else if (blocked_request.event == kOnBeforeSendHeaders) {
1814 CHECK(!blocked_request.callback.is_null()); 1817 CHECK(!blocked_request.callback.is_null());
1815 helpers::MergeOnBeforeSendHeadersResponses( 1818 helpers::MergeOnBeforeSendHeadersResponses(
1816 blocked_request.response_deltas, 1819 blocked_request.response_deltas,
1817 blocked_request.request_headers, 1820 blocked_request.request_headers,
1818 &warnings, 1821 &warnings,
1819 blocked_request.net_log); 1822 blocked_request.net_log);
1820 } else if (blocked_request.event == kOnHeadersReceived) { 1823 } else if (blocked_request.event == kOnHeadersReceived) {
1821 CHECK(!blocked_request.callback.is_null()); 1824 CHECK(!blocked_request.callback.is_null());
1822 helpers::MergeOnHeadersReceivedResponses( 1825 helpers::MergeOnHeadersReceivedResponses(
1823 blocked_request.response_deltas, 1826 blocked_request.request->url(), blocked_request.response_deltas,
1824 blocked_request.original_response_headers.get(), 1827 blocked_request.original_response_headers.get(),
1825 blocked_request.override_response_headers, 1828 blocked_request.override_response_headers, blocked_request.new_url,
1826 blocked_request.new_url, 1829 &warnings, blocked_request.net_log);
1827 &warnings,
1828 blocked_request.net_log);
1829 } else if (blocked_request.event == kOnAuthRequired) { 1830 } else if (blocked_request.event == kOnAuthRequired) {
1830 CHECK(blocked_request.callback.is_null()); 1831 CHECK(blocked_request.callback.is_null());
1831 CHECK(!blocked_request.auth_callback.is_null()); 1832 CHECK(!blocked_request.auth_callback.is_null());
1832 credentials_set = helpers::MergeOnAuthRequiredResponses( 1833 credentials_set = helpers::MergeOnAuthRequiredResponses(
1833 blocked_request.response_deltas, 1834 blocked_request.response_deltas,
1834 blocked_request.auth_credentials, 1835 blocked_request.auth_credentials,
1835 &warnings, 1836 &warnings,
1836 blocked_request.net_log); 1837 blocked_request.net_log);
1837 } else { 1838 } else {
1838 NOTREACHED(); 1839 NOTREACHED();
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
2388 // Since EventListeners are segmented by browser_context, check that 2389 // Since EventListeners are segmented by browser_context, check that
2389 // last, as it is exceedingly unlikely to be different. 2390 // last, as it is exceedingly unlikely to be different.
2390 return extension_id == that.extension_id && 2391 return extension_id == that.extension_id &&
2391 sub_event_name == that.sub_event_name && 2392 sub_event_name == that.sub_event_name &&
2392 web_view_instance_id == that.web_view_instance_id && 2393 web_view_instance_id == that.web_view_instance_id &&
2393 embedder_process_id == that.embedder_process_id && 2394 embedder_process_id == that.embedder_process_id &&
2394 browser_context == that.browser_context; 2395 browser_context == that.browser_context;
2395 } 2396 }
2396 2397
2397 } // namespace extensions 2398 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698