From 5b7a479719280356da58a1f05f9c5fee8206bd54 Mon Sep 17 00:00:00 2001 From: Pavel Beloborodov <73575789+boocmp@users.noreply.github.com> Date: Thu, 22 Jan 2026 23:13:59 +0700 Subject: [PATCH] Prevent blocked events from previous navigation showing up on new page (#33250) * Replaced render_tree_node_id with render_frame_token. * Check the blocking report only for active frames. --- .../brave_shields_web_contents_observer.cc | 20 ++-- .../brave_shields_web_contents_observer.h | 8 +- ...ields_web_contents_observer_browsertest.cc | 86 +++++++++++++++++ ...ave_ad_block_tp_network_delegate_helper.cc | 17 ++-- .../net/brave_proxying_url_loader_factory.cc | 60 +++++++----- .../net/brave_proxying_url_loader_factory.h | 11 +-- browser/net/brave_proxying_web_socket.cc | 92 ++++++++++--------- browser/net/brave_proxying_web_socket.h | 22 ++--- browser/net/resource_context_data.cc | 13 ++- browser/net/resource_context_data.h | 8 +- browser/net/url_context.cc | 8 +- browser/net/url_context.h | 10 +- .../browser/perf_predictor_tab_helper.cc | 34 ++++--- .../browser/perf_predictor_tab_helper.h | 5 +- .../adblock_devtools_instrumentation.cc | 28 +++++- .../adblock_devtools_instumentation.h | 9 +- 16 files changed, 288 insertions(+), 143 deletions(-) diff --git a/browser/brave_shields/brave_shields_web_contents_observer.cc b/browser/brave_shields/brave_shields_web_contents_observer.cc index 20d85892990..c4e9acccc20 100644 --- a/browser/brave_shields/brave_shields_web_contents_observer.cc +++ b/browser/brave_shields/brave_shields_web_contents_observer.cc @@ -111,14 +111,20 @@ void BraveShieldsWebContentsObserver::BindBraveShieldsHost( // static void BraveShieldsWebContentsObserver::DispatchBlockedEvent( const GURL& request_url, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, const std::string& block_type) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + auto* rfh = content::RenderFrameHost::FromFrameToken(render_frame_token); + if (!rfh) { + return; + } + auto subresource = request_url.spec(); - WebContents* web_contents = - WebContents::FromFrameTreeNodeId(frame_tree_node_id); - DispatchBlockedEventForWebContents(block_type, subresource, web_contents); + WebContents* web_contents = WebContents::FromRenderFrameHost(rfh); + if (rfh->IsActive()) { + DispatchBlockedEventForWebContents(block_type, subresource, web_contents); + } if (web_contents) { BraveShieldsWebContentsObserver* observer = @@ -143,8 +149,10 @@ void BraveShieldsWebContentsObserver::DispatchBlockedEvent( } } } - brave_perf_predictor::PerfPredictorTabHelper::DispatchBlockedEvent( - request_url.spec(), frame_tree_node_id); + if (rfh->IsActive()) { + brave_perf_predictor::PerfPredictorTabHelper::DispatchBlockedEvent( + request_url.spec(), render_frame_token); + } } #if !BUILDFLAG(IS_ANDROID) diff --git a/browser/brave_shields/brave_shields_web_contents_observer.h b/browser/brave_shields/brave_shields_web_contents_observer.h index efaffe41d7d..a50f3974881 100644 --- a/browser/brave_shields/brave_shields_web_contents_observer.h +++ b/browser/brave_shields/brave_shields_web_contents_observer.h @@ -56,10 +56,10 @@ class BraveShieldsWebContentsObserver static void DispatchWebcompatFeatureInvokedForWebContents( ContentSettingsType webcompat_content_settings, content::WebContents* web_contents); - static void DispatchBlockedEvent(const GURL& request_url, - content::FrameTreeNodeId frame_tree_node_id, - const std::string& block_type); - static GURL GetTabURLFromRenderFrameInfo(int render_frame_tree_node_id); + static void DispatchBlockedEvent( + const GURL& request_url, + content::GlobalRenderFrameHostToken render_frame_token, + const std::string& block_type); void AllowScriptsOnce(const std::vector& origins); void BlockAllowedScripts(const std::vector& origins); bool IsBlockedSubresource(const std::string& subresource); diff --git a/browser/brave_shields/brave_shields_web_contents_observer_browsertest.cc b/browser/brave_shields/brave_shields_web_contents_observer_browsertest.cc index 831ff2ee24e..01ccfd1e152 100644 --- a/browser/brave_shields/brave_shields_web_contents_observer_browsertest.cc +++ b/browser/brave_shields/brave_shields_web_contents_observer_browsertest.cc @@ -8,7 +8,11 @@ #include "base/memory/raw_ptr.h" #include "base/path_service.h" #include "base/values.h" +#include "brave/browser/brave_browser_process.h" #include "brave/browser/brave_shields/brave_shields_tab_helper.h" +#include "brave/components/brave_shields/content/browser/ad_block_custom_filters_provider.h" +#include "brave/components/brave_shields/content/browser/ad_block_service.h" +#include "brave/components/brave_shields/core/common/brave_shield_constants.h" #include "brave/components/constants/brave_paths.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" @@ -385,4 +389,86 @@ IN_PROC_BROWSER_TEST_F(BraveShieldsWebContentsObserverBrowserTest, EXPECT_EQ(brave_shields_web_contents_observer()->block_javascript_count(), 0); } +IN_PROC_BROWSER_TEST_F(BraveShieldsWebContentsObserverBrowserTest, + DelayedBlocks) { + brave_shields::AdBlockService* ad_block_service = + g_brave_browser_process->ad_block_service(); + ad_block_service->custom_filters_provider()->UpdateCustomFilters("||b.com^"); + + class EmptyAdsBlocked : public BraveShieldsTabHelper::Observer { + public: + EmptyAdsBlocked(content::WebContents* tab, bool wait_for_empty) + : tab_(tab), wait_for_empty_(wait_for_empty) { + auto* tab_helper = BraveShieldsTabHelper::FromWebContents(tab_); + observation_.Observe(tab_helper); + } + + ~EmptyAdsBlocked() override = default; + + void OnResourcesChanged() override { + auto* tab_helper = BraveShieldsTabHelper::FromWebContents(tab_); + if (tab_helper->GetBlockedAdsList().empty() == wait_for_empty_) { + run_loop_.Quit(); + } + } + + void Wait() { run_loop_.Run(); } + + private: + const raw_ptr tab_ = nullptr; + const bool wait_for_empty_ = true; + base::ScopedObservation + observation_{this}; + base::RunLoop run_loop_; + }; + + auto* a_page = ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("a.com", "/simple.html")); + + { + // Open a.com and start spaming requests to the blocked host. + constexpr char kScript[] = R"js( + setInterval( () => { + fetch($1) + }, 100) + )js"; + + EmptyAdsBlocked not_empty_waiter(GetWebContents(), false); + ASSERT_TRUE(content::ExecJs( + a_page, content::JsReplace(kScript, embedded_test_server()->GetURL( + "b.com", "/simple.html")))); + + // Wait for at least one blocking report. + not_empty_waiter.Wait(); + } + + { + EmptyAdsBlocked empty_waiter(GetWebContents(), true); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("c.com", "/simple.html"))); + // Wait the reports are cleared on finish navigation. + empty_waiter.Wait(); + } + + { + // The straight variant: waiting a delayed report for 1 second. + base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), base::Seconds(1)); + run_loop.Run(); + + auto* tab_helper = BraveShieldsTabHelper::FromWebContents(GetWebContents()); + EXPECT_EQ(0u, tab_helper->GetBlockedAdsList().size()); + } + + { + // The synthetic variant: if straight is false positive. + brave_shields::BraveShieldsWebContentsObserver::DispatchBlockedEvent( + GURL("https://test-request.com"), a_page->GetGlobalFrameToken(), kAds); + auto* tab_helper = BraveShieldsTabHelper::FromWebContents(GetWebContents()); + EXPECT_EQ(0u, tab_helper->GetBlockedAdsList().size()); + } +} + } // namespace brave_shields diff --git a/browser/net/brave_ad_block_tp_network_delegate_helper.cc b/browser/net/brave_ad_block_tp_network_delegate_helper.cc index aa8e4344dbc..ea6315ae45c 100644 --- a/browser/net/brave_ad_block_tp_network_delegate_helper.cc +++ b/browser/net/brave_ad_block_tp_network_delegate_helper.cc @@ -103,8 +103,9 @@ class AdblockCnameResolveHostClient : public network::mojom::ResolveHostClient { // Explicitly specify source when DNS over HTTPS is enabled to avoid // using `HostResolverProc` which will be handled by system resolver // See https://crbug.com/872665 - if (secure_dns_config.mode() == net::SecureDnsMode::kSecure) + if (secure_dns_config.mode() == net::SecureDnsMode::kSecure) { optional_parameters->source = net::HostResolverSource::DNS; + } elapsed_timer_ = {}; @@ -115,8 +116,8 @@ class AdblockCnameResolveHostClient : public network::mojom::ResolveHostClient { network_anonymization_key, std::move(optional_parameters), receiver_.BindNewPipeAndPassRemote()); } else { - auto* web_contents = - content::WebContents::FromFrameTreeNodeId(ctx->frame_tree_node_id); + auto* web_contents = content::WebContents::FromRenderFrameHost( + content::RenderFrameHost::FromFrameToken(ctx->render_frame_token)); if (!web_contents) { elapsed_timer_ = {}; this->OnComplete(net::ERR_FAILED, net::ResolveErrorInfo(), @@ -248,7 +249,7 @@ EngineFlags ShouldBlockRequestOnTaskRunner( } content::devtools_instrumentation::SendAdblockInfo( - ctx->frame_tree_node_id, ctx->devtools_request_id.value(), info); + ctx->render_frame_token, ctx->devtools_request_id.value(), info); } return previous_result; @@ -263,7 +264,7 @@ void OnShouldBlockRequestResult( DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (ctx->blocked_by == kAdBlocked) { brave_shields::BraveShieldsWebContentsObserver::DispatchBlockedEvent( - ctx->request_url, ctx->frame_tree_node_id, brave_shields::kAds); + ctx->request_url, ctx->render_frame_token, brave_shields::kAds); } else if (then_check_uncloaked) { // This will be deleted by `AdblockCnameResolveHostClient::OnComplete`. new AdblockCnameResolveHostClient(std::move(next_callback), task_runner, @@ -393,9 +394,9 @@ int OnBeforeURLRequest_AdBlockTPPreWork(const ResponseCallback& next_callback, std::shared_ptr ctx) { // If the following info isn't available, then proper content settings can't // be looked up, so do nothing. - if (ctx->request_url.is_empty() || - ctx->initiator_url.is_empty() || !ctx->initiator_url.has_host() || - !ctx->allow_brave_shields || ctx->allow_ads || + if (ctx->request_url.is_empty() || ctx->initiator_url.is_empty() || + !ctx->initiator_url.has_host() || !ctx->allow_brave_shields || + ctx->allow_ads || ctx->resource_type == BraveRequestInfo::kInvalidResourceType) { return net::OK; } diff --git a/browser/net/brave_proxying_url_loader_factory.cc b/browser/net/brave_proxying_url_loader_factory.cc index 221ba088310..b0cb9acdfff 100644 --- a/browser/net/brave_proxying_url_loader_factory.cc +++ b/browser/net/brave_proxying_url_loader_factory.cc @@ -96,7 +96,7 @@ BraveProxyingURLLoaderFactory::InProgressRequest::InProgressRequest( BraveProxyingURLLoaderFactory& factory, uint64_t request_id, int32_t network_service_request_id, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, uint32_t options, const network::ResourceRequest& request, content::BrowserContext* browser_context, @@ -108,7 +108,7 @@ BraveProxyingURLLoaderFactory::InProgressRequest::InProgressRequest( request_(request), request_id_(request_id), network_service_request_id_(network_service_request_id), - frame_tree_node_id_(frame_tree_node_id), + render_frame_token_(render_frame_token), options_(options), browser_context_(browser_context), traffic_annotation_(traffic_annotation), @@ -150,7 +150,7 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::RestartInternal() { base::BindRepeating(&InProgressRequest::ContinueToBeforeSendHeaders, weak_factory_.GetWeakPtr()); redirect_url_ = GURL(); - ctx_ = brave::BraveRequestInfo::MakeCTX(request_, frame_tree_node_id_, + ctx_ = brave::BraveRequestInfo::MakeCTX(request_, render_frame_token_, request_id_, browser_context_, ctx_); int result = factory_->request_handler_->OnBeforeURLRequest( ctx_, continuation, &redirect_url_); @@ -169,8 +169,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::RestartInternal() { // continue or cancel the request. // // We pause the binding here to prevent further client message processing. - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Pause(); + } return; } @@ -184,11 +185,13 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::FollowRedirect( const net::HttpRequestHeaders& modified_headers, const net::HttpRequestHeaders& modified_cors_exempt_headers, const std::optional& new_url) { - if (new_url) + if (new_url) { request_.url = new_url.value(); + } - for (const std::string& header : removed_headers) + for (const std::string& header : removed_headers) { request_.headers.RemoveHeader(header); + } request_.headers.MergeFrom(modified_headers); UpdateRequestInfo(); @@ -208,8 +211,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::FollowRedirect( void BraveProxyingURLLoaderFactory::InProgressRequest::SetPriority( net::RequestPriority priority, int32_t intra_priority_value) { - if (target_loader_.is_bound()) + if (target_loader_.is_bound()) { target_loader_->SetPriority(priority, intra_priority_value); + } } void BraveProxyingURLLoaderFactory::InProgressRequest::OnReceiveEarlyHints( @@ -334,8 +338,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest:: request_.referrer = ctx_->new_referrer.value(); } - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Resume(); + } // TODO(iefremov): Shorten if (ctx_->blocked_by != brave::kNotBlocked) { @@ -384,7 +389,7 @@ void BraveProxyingURLLoaderFactory::InProgressRequest:: &InProgressRequest::ContinueToSendHeaders, weak_factory_.GetWeakPtr()); ctx_ = brave::BraveRequestInfo::MakeCTX( - request_, frame_tree_node_id_, request_id_, browser_context_, ctx_); + request_, render_frame_token_, request_id_, browser_context_, ctx_); int result = factory_->request_handler_->OnBeforeStartTransaction( ctx_, continuation, &request_.headers); @@ -401,8 +406,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest:: // continue or cancel the request. // // We pause the binding here to prevent further client message processing. - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Pause(); + } return; } DCHECK_EQ(net::OK, result); @@ -418,8 +424,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::ContinueToStartRequest( return; } - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Resume(); + } if (!target_loader_.is_bound() && factory_->target_factory_.is_bound()) { // Nothing has cancelled us up to this point, so it's now OK to @@ -471,8 +478,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::ContinueToSendHeaders( pending_follow_redirect_params_.reset(); } - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Resume(); + } ContinueToStartRequest(net::OK); } @@ -505,8 +513,8 @@ void BraveProxyingURLLoaderFactory::InProgressRequest:: GURL new_url(redirect_location); net::RedirectInfo redirect_info = CreateRedirectInfo( - request_, new_url, override_headers_->response_code(), - net::RedirectUtil::GetReferrerPolicyHeader(override_headers_.get())); + request_, new_url, override_headers_->response_code(), + net::RedirectUtil::GetReferrerPolicyHeader(override_headers_.get())); // These will get re-bound if a new request is initiated by // |FollowRedirect()|. @@ -532,8 +540,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::ContinueToBeforeRedirect( return; } - if (proxied_client_receiver_.is_bound()) + if (proxied_client_receiver_.is_bound()) { proxied_client_receiver_.Resume(); + } if (ctx_->internal_redirect) { ctx_->redirect_source = GURL(); @@ -556,8 +565,9 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::ContinueToBeforeRedirect( // The request method can be changed to "GET". In this case we need to // reset the request body manually. - if (request_.method == net::HttpRequestHeaders::kGetMethod) + if (request_.method == net::HttpRequestHeaders::kGetMethod) { request_.request_body = nullptr; + } request_completed_ = true; } @@ -570,7 +580,7 @@ void BraveProxyingURLLoaderFactory::InProgressRequest:: auto split_once_callback = base::SplitOnceCallback(std::move(continuation)); if (request_.url.SchemeIsHTTPOrHTTPS()) { ctx_ = brave::BraveRequestInfo::MakeCTX( - request_, frame_tree_node_id_, request_id_, browser_context_, ctx_); + request_, render_frame_token_, request_id_, browser_context_, ctx_); int result = factory_->request_handler_->OnHeadersReceived( ctx_, std::move(split_once_callback.first), current_response_head_->headers.get(), &override_headers_, @@ -620,14 +630,14 @@ void BraveProxyingURLLoaderFactory::InProgressRequest::OnRequestError( BraveProxyingURLLoaderFactory::BraveProxyingURLLoaderFactory( BraveRequestHandler& request_handler, content::BrowserContext* browser_context, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, network::URLLoaderFactoryBuilder& factory_builder, scoped_refptr request_id_generator, DisconnectCallback on_disconnect, scoped_refptr navigation_response_task_runner) : request_handler_(request_handler), browser_context_(browser_context), - frame_tree_node_id_(frame_tree_node_id), + render_frame_token_(render_frame_token), request_id_generator_(request_id_generator), disconnect_callback_(std::move(on_disconnect)), navigation_response_task_runner_( @@ -662,8 +672,8 @@ void BraveProxyingURLLoaderFactory::MaybeProxyRequest( DCHECK_CURRENTLY_ON(content::BrowserThread::UI); ResourceContextData::StartProxying( browser_context, - render_frame_host ? render_frame_host->GetFrameTreeNodeId() - : content::FrameTreeNodeId(), + render_frame_host ? render_frame_host->GetGlobalFrameToken() + : content::GlobalRenderFrameHostToken(), factory_builder, navigation_response_task_runner); } @@ -683,7 +693,7 @@ void BraveProxyingURLLoaderFactory::CreateLoaderAndStart( const uint64_t brave_request_id = request_id_generator_->Generate(); auto result = requests_.emplace(std::make_unique( - *this, brave_request_id, request_id, frame_tree_node_id_, options, + *this, brave_request_id, request_id, render_frame_token_, options, request, browser_context_, traffic_annotation, std::move(loader_receiver), std::move(client), navigation_response_task_runner_)); (*result.first)->Restart(); @@ -702,8 +712,9 @@ void BraveProxyingURLLoaderFactory::OnTargetFactoryError() { } void BraveProxyingURLLoaderFactory::OnProxyBindingError() { - if (proxy_receivers_.empty()) + if (proxy_receivers_.empty()) { target_factory_.reset(); + } MaybeRemoveProxy(); } @@ -719,8 +730,9 @@ void BraveProxyingURLLoaderFactory::RemoveRequest(InProgressRequest* request) { void BraveProxyingURLLoaderFactory::MaybeRemoveProxy() { // Even if all URLLoaderFactory pipes connected to this object have been // closed it has to stay alive until all active requests have completed. - if (target_factory_.is_bound() || !requests_.empty()) + if (target_factory_.is_bound() || !requests_.empty()) { return; + } // Deletes |this|. std::move(disconnect_callback_).Run(this); diff --git a/browser/net/brave_proxying_url_loader_factory.h b/browser/net/brave_proxying_url_loader_factory.h index a60d6708875..9bdd1c3917b 100644 --- a/browser/net/brave_proxying_url_loader_factory.h +++ b/browser/net/brave_proxying_url_loader_factory.h @@ -47,8 +47,7 @@ class RenderFrameHost; // Cargoculted from WebRequestProxyingURLLoaderFactory and // signin::ProxyingURLLoaderFactory -class BraveProxyingURLLoaderFactory - : public network::mojom::URLLoaderFactory { +class BraveProxyingURLLoaderFactory : public network::mojom::URLLoaderFactory { public: using DisconnectCallback = base::OnceCallback; @@ -60,7 +59,7 @@ class BraveProxyingURLLoaderFactory BraveProxyingURLLoaderFactory& factory, uint64_t request_id, int32_t network_service_request_id, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, uint32_t options, const network::ResourceRequest& request, content::BrowserContext* browser_context, @@ -125,7 +124,7 @@ class BraveProxyingURLLoaderFactory const uint64_t request_id_; const int32_t network_service_request_id_; - const content::FrameTreeNodeId frame_tree_node_id_; + const content::GlobalRenderFrameHostToken render_frame_token_; const uint32_t options_; raw_ptr browser_context_ = nullptr; @@ -184,7 +183,7 @@ class BraveProxyingURLLoaderFactory BraveProxyingURLLoaderFactory( BraveRequestHandler& request_handler, content::BrowserContext* browser_context, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, network::URLLoaderFactoryBuilder& factory_builder, scoped_refptr request_id_generator, DisconnectCallback on_disconnect, @@ -226,7 +225,7 @@ class BraveProxyingURLLoaderFactory const raw_ref request_handler_; raw_ptr browser_context_ = nullptr; - const content::FrameTreeNodeId frame_tree_node_id_; + const content::GlobalRenderFrameHostToken render_frame_token_; mojo::ReceiverSet proxy_receivers_; mojo::Remote target_factory_; diff --git a/browser/net/brave_proxying_web_socket.cc b/browser/net/brave_proxying_web_socket.cc index 139ba6f47bd..d6071d49d88 100644 --- a/browser/net/brave_proxying_web_socket.cc +++ b/browser/net/brave_proxying_web_socket.cc @@ -23,13 +23,13 @@ BraveProxyingWebSocket::BraveProxyingWebSocket( WebSocketFactory factory, const network::ResourceRequest& request, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, content::BrowserContext* browser_context, scoped_refptr request_id_generator, BraveRequestHandler& handler, DisconnectCallback on_disconnect) : request_handler_(handler), - frame_tree_node_id_(frame_tree_node_id), + render_frame_token_(render_frame_token), factory_(std::move(factory)), browser_context_(browser_context), request_id_generator_(std::move(request_id_generator)), @@ -64,8 +64,8 @@ BraveProxyingWebSocket* BraveProxyingWebSocket::ProxyWebSocket( return ResourceContextData::CreateProxyingWebSocket( std::move(factory), url, site_for_cookies, user_agent, - frame->GetProcess()->GetBrowserContext(), frame->GetRoutingID(), - frame->GetFrameTreeNodeId(), frame->GetLastCommittedOrigin()); + frame->GetProcess()->GetBrowserContext(), frame->GetGlobalFrameToken(), + frame->GetLastCommittedOrigin()); } void BraveProxyingWebSocket::Start( @@ -82,19 +82,19 @@ void BraveProxyingWebSocket::Start( // send these events before the request starts. base::RepeatingCallback continuation; if (proxy_has_extra_headers()) { - continuation = base::BindRepeating( - &BraveProxyingWebSocket::ContinueToStartRequest, - weak_factory_.GetWeakPtr()); + continuation = + base::BindRepeating(&BraveProxyingWebSocket::ContinueToStartRequest, + weak_factory_.GetWeakPtr()); } else { - continuation = base::BindRepeating( - &BraveProxyingWebSocket::OnBeforeRequestComplete, - weak_factory_.GetWeakPtr()); + continuation = + base::BindRepeating(&BraveProxyingWebSocket::OnBeforeRequestComplete, + weak_factory_.GetWeakPtr()); } - ctx_ = brave::BraveRequestInfo::MakeCTX(request_, frame_tree_node_id_, + ctx_ = brave::BraveRequestInfo::MakeCTX(request_, render_frame_token_, request_id_, browser_context_, ctx_); - int result = request_handler_->OnBeforeURLRequest( - ctx_, continuation, &redirect_url_); + int result = + request_handler_->OnBeforeURLRequest(ctx_, continuation, &redirect_url_); // TODO(bridiver) - need to handle general case for redirect_url if (result == net::ERR_BLOCKED_BY_CLIENT || @@ -135,8 +135,9 @@ void BraveProxyingWebSocket::WebSocketFactoryRun( proxy_url_ = url; proxy_auth_handler_.Bind(std::move(auth_handler)); - if (trusted_header_client) + if (trusted_header_client) { proxy_trusted_header_client_.Bind(std::move(trusted_header_client)); + } if (!proxy_has_extra_headers()) { for (const auto& header : additional_headers) { @@ -154,14 +155,14 @@ void BraveProxyingWebSocket::OnOpeningHandshakeStarted( } void BraveProxyingWebSocket::ContinueToHeadersReceived() { - auto continuation = base::BindRepeating( - &BraveProxyingWebSocket::OnHeadersReceivedComplete, - weak_factory_.GetWeakPtr()); - ctx_ = brave::BraveRequestInfo::MakeCTX(request_, frame_tree_node_id_, + auto continuation = + base::BindRepeating(&BraveProxyingWebSocket::OnHeadersReceivedComplete, + weak_factory_.GetWeakPtr()); + ctx_ = brave::BraveRequestInfo::MakeCTX(request_, render_frame_token_, request_id_, browser_context_, ctx_); int result = request_handler_->OnHeadersReceived( - ctx_, continuation, response_.headers.get(), - &override_headers_, &redirect_url_); + ctx_, continuation, response_.headers.get(), &override_headers_, + &redirect_url_); if (result == net::ERR_BLOCKED_BY_CLIENT || // handle adblock kEmptyDataURI @@ -171,8 +172,9 @@ void BraveProxyingWebSocket::ContinueToHeadersReceived() { } PauseIncomingMethodCallProcessing(); - if (result == net::ERR_IO_PENDING) + if (result == net::ERR_IO_PENDING) { return; + } DCHECK_EQ(net::OK, result); OnHeadersReceivedComplete(net::OK); @@ -203,8 +205,8 @@ void BraveProxyingWebSocket::OnAuthRequired( const scoped_refptr& headers, const net::IPEndPoint& remote_endpoint, OnAuthRequiredCallback callback) { - proxy_auth_handler_->OnAuthRequired( - auth_info, headers, remote_endpoint, std::move(callback)); + proxy_auth_handler_->OnAuthRequired(auth_info, headers, remote_endpoint, + std::move(callback)); } void BraveProxyingWebSocket::OnBeforeSendHeaders( @@ -246,8 +248,7 @@ void BraveProxyingWebSocket::OnBeforeRequestComplete(int error_code) { &BraveProxyingWebSocket::OnBeforeSendHeadersCompleteFromProxy, weak_factory_.GetWeakPtr())); } else { - OnBeforeSendHeadersCompleteFromProxy( - net::OK, request_.headers); + OnBeforeSendHeadersCompleteFromProxy(net::OK, request_.headers); } } @@ -262,27 +263,29 @@ void BraveProxyingWebSocket::OnBeforeSendHeadersCompleteFromProxy( } // update the headers from the proxy - if (headers) + if (headers) { request_.headers = *headers; - else + } else { request_.headers.Clear(); + } - auto continuation = base::BindRepeating( - &BraveProxyingWebSocket::OnBeforeSendHeadersComplete, - weak_factory_.GetWeakPtr()); + auto continuation = + base::BindRepeating(&BraveProxyingWebSocket::OnBeforeSendHeadersComplete, + weak_factory_.GetWeakPtr()); - ctx_ = brave::BraveRequestInfo::MakeCTX(request_, frame_tree_node_id_, + ctx_ = brave::BraveRequestInfo::MakeCTX(request_, render_frame_token_, request_id_, browser_context_, ctx_); - int result = request_handler_->OnBeforeStartTransaction( - ctx_, continuation, &request_.headers); + int result = request_handler_->OnBeforeStartTransaction(ctx_, continuation, + &request_.headers); if (result == net::ERR_BLOCKED_BY_CLIENT) { OnError(result); return; } - if (result == net::ERR_IO_PENDING) + if (result == net::ERR_IO_PENDING) { return; + } DCHECK_EQ(net::OK, result); continuation.Run(net::OK); @@ -297,13 +300,15 @@ void BraveProxyingWebSocket::OnBeforeSendHeadersComplete(int error_code) { return; } - if (on_before_send_headers_callback_) + if (on_before_send_headers_callback_) { std::move(on_before_send_headers_callback_) .Run(error_code, std::optional(request_.headers)); + } - if (!proxy_has_extra_headers()) + if (!proxy_has_extra_headers()) { ContinueToStartRequest(error_code); + } } void BraveProxyingWebSocket::ContinueToStartRequest(int error_code) { @@ -323,9 +328,10 @@ void BraveProxyingWebSocket::ContinueToStartRequest(int error_code) { mojo::PendingRemote trusted_header_client = mojo::NullRemote(); - if (proxy_has_extra_headers()) + if (proxy_has_extra_headers()) { trusted_header_client = receiver_as_header_client_.BindNewPipeAndPassRemote(); + } std::move(factory_).Run( request_.url, std::move(additional_headers), @@ -345,9 +351,10 @@ void BraveProxyingWebSocket::OnHeadersReceivedCompleteFromProxy( int error_code, const std::optional& headers, const std::optional& url) { - if (on_headers_received_callback_) + if (on_headers_received_callback_) { std::move(on_headers_received_callback_) .Run(net::OK, headers, std::nullopt); + } if (override_headers_) { response_.headers = override_headers_; @@ -364,8 +371,9 @@ void BraveProxyingWebSocket::OnHeadersReceivedComplete(int error_code) { } std::string headers; - if (override_headers_) + if (override_headers_) { headers = override_headers_->raw_headers(); + } if (proxy_has_extra_headers()) { proxy_trusted_header_client_->OnHeadersReceived( @@ -381,14 +389,16 @@ void BraveProxyingWebSocket::OnHeadersReceivedComplete(int error_code) { void BraveProxyingWebSocket::PauseIncomingMethodCallProcessing() { receiver_as_handshake_client_.Pause(); - if (proxy_has_extra_headers()) + if (proxy_has_extra_headers()) { receiver_as_header_client_.Pause(); + } } void BraveProxyingWebSocket::ResumeIncomingMethodCallProcessing() { receiver_as_handshake_client_.Resume(); - if (proxy_has_extra_headers()) + if (proxy_has_extra_headers()) { receiver_as_header_client_.Resume(); + } } void BraveProxyingWebSocket::OnError(int error_code) { diff --git a/browser/net/brave_proxying_web_socket.h b/browser/net/brave_proxying_web_socket.h index 90864256fe6..62e90f74ece 100644 --- a/browser/net/brave_proxying_web_socket.h +++ b/browser/net/brave_proxying_web_socket.h @@ -32,7 +32,7 @@ namespace content { class BrowserContext; class RenderFrameHost; -} +} // namespace content // Ensures that all web socket requests go through Brave network request // handling framework. Cargoculted from |WebRequestProxyingWebSocket|. @@ -42,17 +42,15 @@ class BraveProxyingWebSocket public network::mojom::TrustedHeaderClient { public: using WebSocketFactory = content::ContentBrowserClient::WebSocketFactory; - using DisconnectCallback = - base::OnceCallback; + using DisconnectCallback = base::OnceCallback; - BraveProxyingWebSocket( - WebSocketFactory factory, - const network::ResourceRequest& request, - content::FrameTreeNodeId frame_tree_node_id, - content::BrowserContext* browser_context, - scoped_refptr request_id_generator, - BraveRequestHandler& handler, - DisconnectCallback on_disconnect); + BraveProxyingWebSocket(WebSocketFactory factory, + const network::ResourceRequest& request, + content::GlobalRenderFrameHostToken render_frame_token, + content::BrowserContext* browser_context, + scoped_refptr request_id_generator, + BraveRequestHandler& handler, + DisconnectCallback on_disconnect); BraveProxyingWebSocket(const BraveProxyingWebSocket&) = delete; BraveProxyingWebSocket& operator=(const BraveProxyingWebSocket&) = delete; ~BraveProxyingWebSocket() override; @@ -132,7 +130,7 @@ class BraveProxyingWebSocket // TODO(iefremov): Init this only once. std::shared_ptr ctx_; - const content::FrameTreeNodeId frame_tree_node_id_; + const content::GlobalRenderFrameHostToken render_frame_token_; content::ContentBrowserClient::WebSocketFactory factory_; const raw_ptr browser_context_; scoped_refptr request_id_generator_; diff --git a/browser/net/resource_context_data.cc b/browser/net/resource_context_data.cc index 40688c0631e..94c8c69cb62 100644 --- a/browser/net/resource_context_data.cc +++ b/browser/net/resource_context_data.cc @@ -34,7 +34,7 @@ ResourceContextData::~ResourceContextData() = default; // static void ResourceContextData::StartProxying( content::BrowserContext* browser_context, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, network::URLLoaderFactoryBuilder& factory_builder, scoped_refptr navigation_response_task_runner) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -44,7 +44,7 @@ void ResourceContextData::StartProxying( if (!self) { self = new ResourceContextData(); browser_context->SetUserData(kResourceContextUserDataKey, - base::WrapUnique(self)); + base::WrapUnique(self)); } if (!self->request_handler_) { @@ -52,7 +52,7 @@ void ResourceContextData::StartProxying( } auto proxy = std::make_unique( - *self->request_handler_, browser_context, frame_tree_node_id, + *self->request_handler_, browser_context, render_frame_token, factory_builder, self->request_id_generator_, base::BindOnce(&ResourceContextData::RemoveProxy, self->weak_factory_.GetWeakPtr()), @@ -68,8 +68,7 @@ BraveProxyingWebSocket* ResourceContextData::CreateProxyingWebSocket( const net::SiteForCookies& site_for_cookies, const std::optional& user_agent, content::BrowserContext* browser_context, - int frame_id, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, const url::Origin& origin) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -78,7 +77,7 @@ BraveProxyingWebSocket* ResourceContextData::CreateProxyingWebSocket( if (!self) { self = new ResourceContextData(); browser_context->SetUserData(kResourceContextUserDataKey, - base::WrapUnique(self)); + base::WrapUnique(self)); } if (!self->request_handler_) { @@ -96,7 +95,7 @@ BraveProxyingWebSocket* ResourceContextData::CreateProxyingWebSocket( request.request_initiator = origin; auto proxy = std::make_unique( - std::move(factory), request, frame_tree_node_id, browser_context, + std::move(factory), request, render_frame_token, browser_context, self->request_id_generator_, *self->request_handler_, base::BindOnce(&ResourceContextData::RemoveProxyWebSocket, self->weak_factory_.GetWeakPtr())); diff --git a/browser/net/resource_context_data.h b/browser/net/resource_context_data.h index 4a55c6cde34..d2ce5f9cbd7 100644 --- a/browser/net/resource_context_data.h +++ b/browser/net/resource_context_data.h @@ -63,7 +63,7 @@ class ResourceContextData : public base::SupportsUserData::Data { static void StartProxying( content::BrowserContext* browser_context, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, network::URLLoaderFactoryBuilder& factory_builder, scoped_refptr navigation_response_task_runner); @@ -73,8 +73,7 @@ class ResourceContextData : public base::SupportsUserData::Data { const net::SiteForCookies& site_for_cookies, const std::optional& user_agent, content::BrowserContext* browser_context, - int frame_id, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, const url::Origin& origin); void RemoveProxy(BraveProxyingURLLoaderFactory* proxy); @@ -90,8 +89,7 @@ class ResourceContextData : public base::SupportsUserData::Data { base::UniquePtrComparator> proxies_; - std::set, - base::UniquePtrComparator> + std::set, base::UniquePtrComparator> websocket_proxies_; base::WeakPtrFactory weak_factory_; diff --git a/browser/net/url_context.cc b/browser/net/url_context.cc index 32a5a390f38..6ccc0e46a1f 100644 --- a/browser/net/url_context.cc +++ b/browser/net/url_context.cc @@ -50,7 +50,7 @@ BraveRequestInfo::~BraveRequestInfo() = default; // static std::shared_ptr BraveRequestInfo::MakeCTX( const network::ResourceRequest& request, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, uint64_t request_identifier, content::BrowserContext* browser_context, std::shared_ptr old_ctx) { @@ -70,7 +70,7 @@ std::shared_ptr BraveRequestInfo::MakeCTX( ctx->resource_type = static_cast(request.resource_type); - ctx->frame_tree_node_id = frame_tree_node_id; + ctx->render_frame_token = render_frame_token; // TODO(iefremov): remove tab_url. Change tab_origin from GURL to Origin. // ctx->tab_url = request.top_frame_origin; @@ -89,8 +89,8 @@ std::shared_ptr BraveRequestInfo::MakeCTX( // |AddChannelRequest| provides only old-fashioned |site_for_cookies|. // (See |BraveProxyingWebSocket|). if (ctx->tab_origin.is_empty()) { - content::WebContents* contents = - content::WebContents::FromFrameTreeNodeId(ctx->frame_tree_node_id); + content::WebContents* contents = content::WebContents::FromRenderFrameHost( + content::RenderFrameHost::FromFrameToken(ctx->render_frame_token)); if (contents) { ctx->tab_origin = url::Origin::Create(contents->GetLastCommittedURL()).GetURL(); diff --git a/browser/net/url_context.h b/browser/net/url_context.h index 03ddc6aa69a..9dc259351c5 100644 --- a/browser/net/url_context.h +++ b/browser/net/url_context.h @@ -13,7 +13,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" -#include "content/public/browser/frame_tree_node_id.h" +#include "content/public/browser/global_routing_id.h" #include "net/base/network_anonymization_key.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" @@ -87,7 +87,11 @@ struct BraveRequestInfo { bool aggressive_blocking = false; bool allow_http_upgradable_resource = false; bool allow_referrers = false; - content::FrameTreeNodeId frame_tree_node_id; + // GlobalRenderFrameHostToken: Uniquely identifies a RenderFrameHost instance. + // FrameTreeNodeId: Identifies a persistent location in the frame tree + // (remains constant across navigations) and is the primary handle for frame + // tree manipulation. + content::GlobalRenderFrameHostToken render_frame_token; uint64_t request_identifier = 0; size_t next_url_request_index = 0; @@ -128,7 +132,7 @@ struct BraveRequestInfo { static std::shared_ptr MakeCTX( const network::ResourceRequest& request, - content::FrameTreeNodeId frame_tree_node_id, + content::GlobalRenderFrameHostToken render_frame_token, uint64_t request_identifier, content::BrowserContext* browser_context, std::shared_ptr old_ctx); diff --git a/components/brave_perf_predictor/browser/perf_predictor_tab_helper.cc b/components/brave_perf_predictor/browser/perf_predictor_tab_helper.cc index bf467eb47db..ebb0a133525 100644 --- a/components/brave_perf_predictor/browser/perf_predictor_tab_helper.cc +++ b/components/brave_perf_predictor/browser/perf_predictor_tab_helper.cc @@ -31,8 +31,9 @@ PerfPredictorTabHelper::PerfPredictorTabHelper( bandwidth_predictor_(std::make_unique( NamedThirdPartyRegistryFactory::GetForBrowserContext( web_contents->GetBrowserContext()))) { - if (web_contents->GetBrowserContext()->IsOffTheRecord()) + if (web_contents->GetBrowserContext()->IsOffTheRecord()) { return; + } bandwidth_tracker_ = std::make_unique( user_prefs::UserPrefs::Get(web_contents->GetBrowserContext())); @@ -54,13 +55,13 @@ void PerfPredictorTabHelper::RegisterProfilePrefs( // static void PerfPredictorTabHelper::DispatchBlockedEvent( const std::string& subresource, - content::FrameTreeNodeId frame_tree_node_id) { + content::GlobalRenderFrameHostToken render_frame_token) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - content::WebContents* web_contents = - content::WebContents::FromFrameTreeNodeId(frame_tree_node_id); - if (!web_contents) + auto* web_contents = content::WebContents::FromRenderFrameHost( + content::RenderFrameHost::FromFrameToken(render_frame_token)); + if (!web_contents) { return; + } PerfPredictorTabHelper* blocking_observer = brave_perf_predictor::PerfPredictorTabHelper::FromWebContents( @@ -79,17 +80,20 @@ void PerfPredictorTabHelper::RecordSavings() { if (savings > 0) { // BrowserContenxt can be null in tests auto* browser_context = web_contents()->GetBrowserContext(); - if (!browser_context) + if (!browser_context) { return; + } PrefService* prefs = user_prefs::UserPrefs::Get(browser_context); - if (prefs) + if (prefs) { prefs->SetUint64( prefs::kBandwidthSavedBytes, prefs->GetUint64(prefs::kBandwidthSavedBytes) + savings); + } - if (bandwidth_tracker_) + if (bandwidth_tracker_) { bandwidth_tracker_->RecordSavings(savings); + } #if BUILDFLAG(IS_ANDROID) chrome::android::BraveShieldsContentSettings::DispatchSavedBandwidth( savings); @@ -105,18 +109,21 @@ void PerfPredictorTabHelper::OnBlockedSubresource( void PerfPredictorTabHelper::DidStartNavigation( content::NavigationHandle* handle) { - if (!handle || !handle->IsInMainFrame() || handle->IsDownload()) + if (!handle || !handle->IsInMainFrame() || handle->IsDownload()) { return; + } // Gather prediction of the _previous_ navigation - if (navigation_id_ != handle->GetNavigationId() && navigation_id_ > 0) + if (navigation_id_ != handle->GetNavigationId() && navigation_id_ > 0) { RecordSavings(); + } } void PerfPredictorTabHelper::DidFinishNavigation( content::NavigationHandle* handle) { if (!handle || !handle->IsInMainFrame() || !handle->HasCommitted() || - handle->IsDownload()) + handle->IsDownload()) { return; + } // Reset predictor state when we're committed to this navigation bandwidth_predictor_->Reset(); // Record current navigation ID to know if we're in the same navigation later @@ -127,9 +134,10 @@ void PerfPredictorTabHelper::ResourceLoadComplete( content::RenderFrameHost* render_frame_host, const content::GlobalRequestID& request_id, const blink::mojom::ResourceLoadInfo& resource_load_info) { - if (render_frame_host) + if (render_frame_host) { bandwidth_predictor_->OnResourceLoadComplete(web_contents()->GetURL(), resource_load_info); + } } void PerfPredictorTabHelper::WebContentsDestroyed() { diff --git a/components/brave_perf_predictor/browser/perf_predictor_tab_helper.h b/components/brave_perf_predictor/browser/perf_predictor_tab_helper.h index b844dc3b6ca..f06fc680c5f 100644 --- a/components/brave_perf_predictor/browser/perf_predictor_tab_helper.h +++ b/components/brave_perf_predictor/browser/perf_predictor_tab_helper.h @@ -54,8 +54,9 @@ class PerfPredictorTabHelper const page_load_metrics::mojom::PageLoadTiming& timing); static void RegisterProfilePrefs(PrefRegistrySimple* registry); // Called from Brave Shields - static void DispatchBlockedEvent(const std::string& subresource, - content::FrameTreeNodeId frame_tree_node_id); + static void DispatchBlockedEvent( + const std::string& subresource, + content::GlobalRenderFrameHostToken render_frame_token); private: friend class content::WebContentsUserData; diff --git a/content/browser/devtools/adblock_devtools_instrumentation.cc b/content/browser/devtools/adblock_devtools_instrumentation.cc index e7271eaecfa..fe68d9283e6 100644 --- a/content/browser/devtools/adblock_devtools_instrumentation.cc +++ b/content/browser/devtools/adblock_devtools_instrumentation.cc @@ -3,8 +3,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include - #include "base/task/sequenced_task_runner.h" #include "brave/content/public/browser/devtools/adblock_devtools_instumentation.h" #include "content/browser/devtools/devtools_agent_host_impl.h" @@ -13,6 +11,7 @@ #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/navigation_request.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/frame_tree_node_id.h" namespace { @@ -34,6 +33,7 @@ void SendAdblockInfoInternal( if (!frame_tree_node) { return; } + content::DevToolsAgentHostImpl* agent_host = content::RenderFrameDevToolsAgentHost::GetFor(frame_tree_node); if (!agent_host) { @@ -66,6 +66,26 @@ void SendAdblockInfoInternal( } } +void SendAdblockInfoRFTInternal( + content::GlobalRenderFrameHostToken render_frame_token, + const std::string& request_id, + const content::devtools_instrumentation::AdblockInfo& info) { + if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { + content::GetUIThreadTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(&SendAdblockInfoRFTInternal, + render_frame_token, request_id, info)); + return; + } + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + auto* render_frame_host = + content::RenderFrameHost::FromFrameToken(render_frame_token); + if (render_frame_host) { + SendAdblockInfoInternal(render_frame_host->GetFrameTreeNodeId(), request_id, + info); + } +} + } // namespace namespace content::devtools_instrumentation { @@ -77,10 +97,10 @@ AdblockInfo::AdblockInfo(AdblockInfo&&) = default; AdblockInfo& AdblockInfo::operator=(const AdblockInfo&) = default; AdblockInfo& AdblockInfo::operator=(AdblockInfo&&) = default; -void SendAdblockInfo(content::FrameTreeNodeId frame_tree_node_id, +void SendAdblockInfo(content::GlobalRenderFrameHostToken render_frame_token, const std::string& request_id, const AdblockInfo& info) { - SendAdblockInfoInternal(frame_tree_node_id, request_id, info); + SendAdblockInfoRFTInternal(render_frame_token, request_id, info); } void SendAdblockInfo(content::NavigationHandle* handle, diff --git a/content/public/browser/devtools/adblock_devtools_instumentation.h b/content/public/browser/devtools/adblock_devtools_instumentation.h index 25d47b99840..efca73c3f92 100644 --- a/content/public/browser/devtools/adblock_devtools_instumentation.h +++ b/content/public/browser/devtools/adblock_devtools_instumentation.h @@ -10,7 +10,7 @@ #include #include "content/common/content_export.h" -#include "content/public/browser/frame_tree_node_id.h" +#include "content/public/browser/global_routing_id.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h" #include "url/gurl.h" @@ -44,9 +44,10 @@ struct CONTENT_EXPORT AdblockInfo { std::optional rewritten_url; }; -CONTENT_EXPORT void SendAdblockInfo(content::FrameTreeNodeId frame_tree_node_id, - const std::string& request_id, - const AdblockInfo& info); +CONTENT_EXPORT void SendAdblockInfo( + content::GlobalRenderFrameHostToken render_frame_token, + const std::string& request_id, + const AdblockInfo& info); CONTENT_EXPORT void SendAdblockInfo(content::NavigationHandle* handle, const AdblockInfo& info);