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.
This commit is contained in:
Pavel Beloborodov
2026-01-22 16:13:59 +00:00
committed by GitHub
parent 4813c82002
commit 5b7a479719
16 changed files with 288 additions and 143 deletions
@@ -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)
@@ -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<std::string>& origins);
void BlockAllowedScripts(const std::vector<std::string>& origins);
bool IsBlockedSubresource(const std::string& subresource);
@@ -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<content::WebContents> tab_ = nullptr;
const bool wait_for_empty_ = true;
base::ScopedObservation<BraveShieldsTabHelper,
BraveShieldsTabHelper::Observer>
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
@@ -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<BraveRequestInfo> 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;
}
@@ -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<GURL>& 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<RequestIDGenerator> request_id_generator,
DisconnectCallback on_disconnect,
scoped_refptr<base::SequencedTaskRunner> 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<InProgressRequest>(
*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);
@@ -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<void(BraveProxyingURLLoaderFactory*)>;
@@ -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<content::BrowserContext> 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<RequestIDGenerator> request_id_generator,
DisconnectCallback on_disconnect,
@@ -226,7 +225,7 @@ class BraveProxyingURLLoaderFactory
const raw_ref<BraveRequestHandler> request_handler_;
raw_ptr<content::BrowserContext> browser_context_ = nullptr;
const content::FrameTreeNodeId frame_tree_node_id_;
const content::GlobalRenderFrameHostToken render_frame_token_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> proxy_receivers_;
mojo::Remote<network::mojom::URLLoaderFactory> target_factory_;
+51 -41
View File
@@ -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<RequestIDGenerator> 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<void(int)> 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<net::HttpResponseHeaders>& 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<net::HttpRequestHeaders>(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<network::mojom::TrustedHeaderClient>
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<std::string>& headers,
const std::optional<GURL>& 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) {
+10 -12
View File
@@ -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<void(BraveProxyingWebSocket*)>;
using DisconnectCallback = base::OnceCallback<void(BraveProxyingWebSocket*)>;
BraveProxyingWebSocket(
WebSocketFactory factory,
const network::ResourceRequest& request,
content::FrameTreeNodeId frame_tree_node_id,
content::BrowserContext* browser_context,
scoped_refptr<RequestIDGenerator> 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<RequestIDGenerator> 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<brave::BraveRequestInfo> ctx_;
const content::FrameTreeNodeId frame_tree_node_id_;
const content::GlobalRenderFrameHostToken render_frame_token_;
content::ContentBrowserClient::WebSocketFactory factory_;
const raw_ptr<content::BrowserContext> browser_context_;
scoped_refptr<RequestIDGenerator> request_id_generator_;
+6 -7
View File
@@ -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<base::SequencedTaskRunner> 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<BraveProxyingURLLoaderFactory>(
*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<std::string>& 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<BraveProxyingWebSocket>(
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()));
+3 -5
View File
@@ -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<base::SequencedTaskRunner> navigation_response_task_runner);
@@ -73,8 +73,7 @@ class ResourceContextData : public base::SupportsUserData::Data {
const net::SiteForCookies& site_for_cookies,
const std::optional<std::string>& 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<std::unique_ptr<BraveProxyingWebSocket>,
base::UniquePtrComparator>
std::set<std::unique_ptr<BraveProxyingWebSocket>, base::UniquePtrComparator>
websocket_proxies_;
base::WeakPtrFactory<ResourceContextData> weak_factory_;
+4 -4
View File
@@ -50,7 +50,7 @@ BraveRequestInfo::~BraveRequestInfo() = default;
// static
std::shared_ptr<brave::BraveRequestInfo> 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<brave::BraveRequestInfo> old_ctx) {
@@ -70,7 +70,7 @@ std::shared_ptr<brave::BraveRequestInfo> BraveRequestInfo::MakeCTX(
ctx->resource_type =
static_cast<blink::mojom::ResourceType>(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<brave::BraveRequestInfo> 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();
+7 -3
View File
@@ -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<brave::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<brave::BraveRequestInfo> old_ctx);
@@ -31,8 +31,9 @@ PerfPredictorTabHelper::PerfPredictorTabHelper(
bandwidth_predictor_(std::make_unique<BandwidthSavingsPredictor>(
NamedThirdPartyRegistryFactory::GetForBrowserContext(
web_contents->GetBrowserContext()))) {
if (web_contents->GetBrowserContext()->IsOffTheRecord())
if (web_contents->GetBrowserContext()->IsOffTheRecord()) {
return;
}
bandwidth_tracker_ = std::make_unique<P3ABandwidthSavingsTracker>(
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() {
@@ -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<PerfPredictorTabHelper>;
@@ -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 <utility>
#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,
@@ -10,7 +10,7 @@
#include <string>
#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<std::string> 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);