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:
@@ -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_;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user