| 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 4e41031658142b0439b2af20b01802ab4d7932fc..53a01d2164c80f58de0794a41b75e85b631b4d09 100644
|
| --- a/extensions/browser/api/web_request/web_request_api.cc
|
| +++ b/extensions/browser/api/web_request/web_request_api.cc
|
| @@ -25,6 +25,7 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/resource_request_info.h"
|
| #include "content/public/browser/user_metrics.h"
|
| +#include "content/public/common/browser_side_navigation_policy.h"
|
| #include "content/public/common/child_process_host.h"
|
| #include "extensions/browser/api/activity_log/web_request_constants.h"
|
| #include "extensions/browser/api/declarative/rules_registry_service.h"
|
| @@ -39,6 +40,7 @@
|
| #include "extensions/browser/api/web_request/web_request_time_tracker.h"
|
| #include "extensions/browser/api_activity_monitor.h"
|
| #include "extensions/browser/event_router.h"
|
| +#include "extensions/browser/extension_navigation_ui_data.h"
|
| #include "extensions/browser/extension_prefs.h"
|
| #include "extensions/browser/extension_registry.h"
|
| #include "extensions/browser/extension_system.h"
|
| @@ -555,6 +557,7 @@ ExtensionWebRequestEventRouter::CreateEventDetails(
|
| int ExtensionWebRequestEventRouter::OnBeforeRequest(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const net::CompletionCallback& callback,
|
| GURL* new_url) {
|
| @@ -587,8 +590,9 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest(
|
| CreateEventDetails(request, extra_info_spec));
|
| event_details->SetRequestBody(request);
|
|
|
| - initialize_blocked_requests |= DispatchEvent(
|
| - browser_context, request, listeners, std::move(event_details));
|
| + initialize_blocked_requests |=
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| if (!initialize_blocked_requests)
|
| @@ -614,6 +618,7 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest(
|
| int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const net::CompletionCallback& callback,
|
| net::HttpRequestHeaders* headers) {
|
| @@ -636,8 +641,9 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
|
| CreateEventDetails(request, extra_info_spec));
|
| event_details->SetRequestHeaders(*headers);
|
|
|
| - initialize_blocked_requests |= DispatchEvent(
|
| - browser_context, request, listeners, std::move(event_details));
|
| + initialize_blocked_requests |=
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| if (!initialize_blocked_requests)
|
| @@ -663,6 +669,7 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
|
| void ExtensionWebRequestEventRouter::OnSendHeaders(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const net::HttpRequestHeaders& headers) {
|
| if (ShouldHideEvent(browser_context, extension_info_map, request))
|
| @@ -684,12 +691,14 @@ void ExtensionWebRequestEventRouter::OnSendHeaders(
|
| CreateEventDetails(request, extra_info_spec));
|
| event_details->SetRequestHeaders(headers);
|
|
|
| - DispatchEvent(browser_context, request, listeners, std::move(event_details));
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| int ExtensionWebRequestEventRouter::OnHeadersReceived(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const net::CompletionCallback& callback,
|
| const net::HttpResponseHeaders* original_response_headers,
|
| @@ -715,8 +724,9 @@ int ExtensionWebRequestEventRouter::OnHeadersReceived(
|
| CreateEventDetails(request, extra_info_spec));
|
| event_details->SetResponseHeaders(request, original_response_headers);
|
|
|
| - initialize_blocked_requests |= DispatchEvent(
|
| - browser_context, request, listeners, std::move(event_details));
|
| + initialize_blocked_requests |=
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| if (!initialize_blocked_requests)
|
| @@ -745,6 +755,7 @@ net::NetworkDelegate::AuthRequiredResponse
|
| ExtensionWebRequestEventRouter::OnAuthRequired(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const net::AuthChallengeInfo& auth_info,
|
| const net::NetworkDelegate::AuthCallback& callback,
|
| @@ -768,7 +779,7 @@ ExtensionWebRequestEventRouter::OnAuthRequired(
|
| event_details->SetResponseHeaders(request, request->response_headers());
|
| event_details->SetAuthInfo(auth_info);
|
|
|
| - if (DispatchEvent(browser_context, request, listeners,
|
| + if (DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| std::move(event_details))) {
|
| BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
|
| blocked_request.event = kOnAuthRequired;
|
| @@ -785,6 +796,7 @@ ExtensionWebRequestEventRouter::OnAuthRequired(
|
| void ExtensionWebRequestEventRouter::OnBeforeRedirect(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| const GURL& new_location) {
|
| if (ShouldHideEvent(browser_context, extension_info_map, request))
|
| @@ -811,12 +823,14 @@ void ExtensionWebRequestEventRouter::OnBeforeRedirect(
|
| event_details->SetResponseSource(request);
|
| event_details->SetString(keys::kRedirectUrlKey, new_location.spec());
|
|
|
| - DispatchEvent(browser_context, request, listeners, std::move(event_details));
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| void ExtensionWebRequestEventRouter::OnResponseStarted(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| int net_error) {
|
| DCHECK_NE(net::ERR_IO_PENDING, net_error);
|
| @@ -840,7 +854,8 @@ void ExtensionWebRequestEventRouter::OnResponseStarted(
|
| event_details->SetResponseHeaders(request, request->response_headers());
|
| event_details->SetResponseSource(request);
|
|
|
| - DispatchEvent(browser_context, request, listeners, std::move(event_details));
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| // Deprecated.
|
| @@ -848,14 +863,16 @@ void ExtensionWebRequestEventRouter::OnResponseStarted(
|
| void ExtensionWebRequestEventRouter::OnResponseStarted(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request) {
|
| - OnResponseStarted(browser_context, extension_info_map, request,
|
| - request->status().error());
|
| + OnResponseStarted(browser_context, extension_info_map, navigation_ui_data,
|
| + request, request->status().error());
|
| }
|
|
|
| void ExtensionWebRequestEventRouter::OnCompleted(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| int net_error) {
|
| // We hide events from the system context as well as sensitive requests.
|
| @@ -889,7 +906,8 @@ void ExtensionWebRequestEventRouter::OnCompleted(
|
| event_details->SetResponseHeaders(request, request->response_headers());
|
| event_details->SetResponseSource(request);
|
|
|
| - DispatchEvent(browser_context, request, listeners, std::move(event_details));
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| // Deprecated.
|
| @@ -897,14 +915,16 @@ void ExtensionWebRequestEventRouter::OnCompleted(
|
| void ExtensionWebRequestEventRouter::OnCompleted(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request) {
|
| - OnCompleted(browser_context, extension_info_map, request,
|
| + OnCompleted(browser_context, extension_info_map, navigation_ui_data, request,
|
| request->status().error());
|
| }
|
|
|
| void ExtensionWebRequestEventRouter::OnErrorOccurred(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| bool started,
|
| int net_error) {
|
| @@ -943,16 +963,18 @@ void ExtensionWebRequestEventRouter::OnErrorOccurred(
|
| event_details->SetBoolean(keys::kFromCache, request->was_cached());
|
| event_details->SetString(keys::kErrorKey, net::ErrorToString(net_error));
|
|
|
| - DispatchEvent(browser_context, request, listeners, std::move(event_details));
|
| + DispatchEvent(browser_context, request, listeners, navigation_ui_data,
|
| + std::move(event_details));
|
| }
|
|
|
| void ExtensionWebRequestEventRouter::OnErrorOccurred(
|
| void* browser_context,
|
| const InfoMap* extension_info_map,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| net::URLRequest* request,
|
| bool started) {
|
| - OnErrorOccurred(browser_context, extension_info_map, request, started,
|
| - request->status().error());
|
| + OnErrorOccurred(browser_context, extension_info_map, navigation_ui_data,
|
| + request, started, request->status().error());
|
| }
|
|
|
| void ExtensionWebRequestEventRouter::OnURLRequestDestroyed(
|
| @@ -975,6 +997,7 @@ bool ExtensionWebRequestEventRouter::DispatchEvent(
|
| void* browser_context,
|
| net::URLRequest* request,
|
| const RawListeners& listeners,
|
| + ExtensionNavigationUIData* navigation_ui_data,
|
| std::unique_ptr<WebRequestEventDetails> event_details) {
|
| // TODO(mpcomplete): Consider consolidating common (extension_id,json_args)
|
| // pairs into a single message sent to a list of sub_event_names.
|
| @@ -1001,9 +1024,28 @@ bool ExtensionWebRequestEventRouter::DispatchEvent(
|
| }
|
| }
|
|
|
| - event_details.release()->DetermineFrameDataOnIO(base::Bind(
|
| - &ExtensionWebRequestEventRouter::DispatchEventToListeners, AsWeakPtr(),
|
| - browser_context, base::Passed(&listeners_to_dispatch)));
|
| + // PlzNavigate: if this request corresponds to a navigation, use the
|
| + // NavigationUIData that was provided to the navigation on the UI thread to
|
| + // get the FrameData.
|
| + // For subresources loads, the request is first received on the IO thread,
|
| + // therefore a construct such as the NavigationUIData cannot be used. Instead,
|
| + // use the map of FrameData with the ids of the renderer that sent the
|
| + // request.
|
| + // Note: it's possible for ResourceRequestInfo to be null in certain cases
|
| + // (eg when created by a URLFetcher instead of the ResourceDispatcherHost).
|
| + const content::ResourceRequestInfo* info =
|
| + content::ResourceRequestInfo::ForRequest(request);
|
| + if (content::IsBrowserSideNavigationEnabled() && info &&
|
| + IsResourceTypeFrame(info->GetResourceType())) {
|
| + DCHECK(navigation_ui_data);
|
| + event_details->SetFrameData(navigation_ui_data->frame_data());
|
| + DispatchEventToListeners(browser_context, std::move(listeners_to_dispatch),
|
| + std::move(event_details));
|
| + } else {
|
| + event_details.release()->DetermineFrameDataOnIO(base::Bind(
|
| + &ExtensionWebRequestEventRouter::DispatchEventToListeners, AsWeakPtr(),
|
| + browser_context, base::Passed(&listeners_to_dispatch)));
|
| + }
|
|
|
| if (num_handlers_blocking > 0) {
|
| BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
|
|
|