Files
cromite/build/patches/Keep-disabled-FetchLaterAPI.patch
T

217 lines
9.8 KiB
Diff

From: uazo <uazo@users.noreply.github.com>
Date: Thu, 28 Sep 2023 08:11:00 +0000
Subject: Keep disabled FetchLaterAPI
Disallow a network request to survive to context destoy.
For Request with active keepalive, if the request does not
start from the same origin.
It also inhibits the blocked request exception to javascript.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../browser/loader/keep_alive_url_loader.cc | 33 +++++++++++++++++--
.../browser/loader/keep_alive_url_loader.h | 3 --
.../Keep-disabled-FetchLaterAPI.inc | 1 +
.../renderer/core/fetch/fetch_manager.cc | 21 ++++++++++--
.../loader/child_url_loader_factory_bundle.cc | 20 +++++++++--
.../platform/loader/fetch/resource_fetcher.cc | 2 +-
.../platform/runtime_enabled_features.json5 | 4 +--
7 files changed, 72 insertions(+), 12 deletions(-)
create mode 100644 cromite_flags/third_party/blink/common/features_cc/Keep-disabled-FetchLaterAPI.inc
diff --git a/content/browser/loader/keep_alive_url_loader.cc b/content/browser/loader/keep_alive_url_loader.cc
--- a/content/browser/loader/keep_alive_url_loader.cc
+++ b/content/browser/loader/keep_alive_url_loader.cc
@@ -48,6 +48,36 @@
#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
#include "third_party/blink/public/common/features.h"
+namespace {
+ constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+ net::DefineNetworkTrafficAnnotation(
+ "keep_alive_url_loader", R"(
+ semantics {
+ sender: "Keep alive urls"
+ description:
+ "Allow a network request to survive to context destoy"
+ trigger:
+ "FetchLater API or keep-alive fetch api."
+ data: "Mutable"
+ destination: WEBSITE
+ last_reviewed: "2024-03-22"
+ internal {
+ contacts {
+ email: "uazo@users.noreply.github.com"
+ }
+ }
+ user_data {
+ type: NONE
+ }
+ }
+ policy {
+ cookies_allowed: YES
+ cookies_store: "user"
+ setting: "This feature cannot be disabled by settings."
+ policy_exception_justification: "Not implemented."
+ })");
+}
+
namespace features {
// See third_party/blink/renderer/core/fetch/retry_options.idl for details of
@@ -435,7 +465,6 @@ KeepAliveURLLoader::KeepAliveURLLoader(
forwarding_client_(
std::make_unique<ForwardingClient>(this,
std::move(forwarding_client))),
- traffic_annotation_(net::NetworkTrafficAnnotationTag(traffic_annotation)),
network_loader_factory_(std::move(network_loader_factory)),
stored_url_load_(std::make_unique<StoredURLLoad>()),
policy_container_host_(std::move(policy_container_host)),
@@ -511,7 +540,7 @@ void KeepAliveURLLoader::StartInternal(bool is_retry) {
url_loader_ = blink::ThrottlingURLLoader::CreateLoaderAndStart(
network_loader_factory_, throttles_getter_.Run(), request_id_, options_,
&resource_request_, forwarding_client_.get(),
- is_retry ? kKeepAliveRetryAnnotationTag : traffic_annotation_,
+ is_retry ? kKeepAliveRetryAnnotationTag : kTrafficAnnotation,
base::SingleThreadTaskRunner::GetCurrentDefault(),
/*cors_exempt_header_list=*/std::nullopt,
// `this`'s lifetime is at least the same as `url_loader_`.
diff --git a/content/browser/loader/keep_alive_url_loader.h b/content/browser/loader/keep_alive_url_loader.h
--- a/content/browser/loader/keep_alive_url_loader.h
+++ b/content/browser/loader/keep_alive_url_loader.h
@@ -431,9 +431,6 @@ class CONTENT_EXPORT KeepAliveURLLoader
// disconnected from the remote of URLLoader in the renderer.
base::OneShotTimer disconnected_loader_timer_;
- // The NetworkTrafficAnnotationTag for the request being loaded.
- net::NetworkTrafficAnnotationTag traffic_annotation_;
-
// A refptr to the URLLoaderFactory implementation that can actually create a
// URLLoader. An extra refptr is required here to support deferred loading.
scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory_;
diff --git a/cromite_flags/third_party/blink/common/features_cc/Keep-disabled-FetchLaterAPI.inc b/cromite_flags/third_party/blink/common/features_cc/Keep-disabled-FetchLaterAPI.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/third_party/blink/common/features_cc/Keep-disabled-FetchLaterAPI.inc
@@ -0,0 +1 @@
+SET_CROMITE_FEATURE_ENABLED(kKeepAliveInBrowserMigration);
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc
--- a/third_party/blink/renderer/core/fetch/fetch_manager.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -276,6 +276,7 @@ class ResponseResolver final : public GarbageCollected<ResponseResolver> {
// Rejects the promise with the supplied object.
void Reject(v8::Local<v8::Value> error);
void Reject(DOMException*);
+ void Detach();
// Rejects the promise with the TypeError exception created at construction
// time. Also optionally passes `devtools_request_id`, `issue_id`, and
@@ -331,6 +332,12 @@ void ResponseResolver::Reject(DOMException* dom_exception) {
Clear();
}
+void ResponseResolver::Detach() {
+ CHECK(resolver_);
+ resolver_->Detach();
+ Clear();
+}
+
void ResponseResolver::RejectBecauseFailed(
std::optional<String> devtools_request_id,
std::optional<base::UnguessableToken> issue_id,
@@ -1312,10 +1319,20 @@ void FetchManager::Loader::Failed(
if (response_resolver_) {
ScriptState::Scope scope(GetScriptState());
if (dom_exception) {
- response_resolver_->Reject(dom_exception);
+ if (!GetFetchRequestData()->Keepalive()) {
+ response_resolver_->Reject(dom_exception);
+ } else {
+ response_resolver_->Detach();
+ }
} else {
- response_resolver_->RejectBecauseFailed(
+ if (!GetFetchRequestData()->Keepalive()) {
+ response_resolver_->RejectBecauseFailed(
std::move(devtools_request_id), issue_id, std::move(issue_summary));
+ } else {
+ devtools_request_id.reset();
+ issue_summary.reset();
+ response_resolver_->Detach();
+ }
LogIfKeepalive("Failed");
}
response_resolver_.Clear();
diff --git a/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc b/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
--- a/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
+++ b/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
@@ -13,6 +13,7 @@
#include "base/check.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "net/base/load_flags.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "services/network/public/cpp/record_ontransfersizeupdate_utils.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/early_hints.mojom.h"
@@ -250,16 +251,31 @@ void ChildURLLoaderFactoryBundle::CreateLoaderAndStart(
return;
}
+ bool keepalive = request.keepalive;
+ if (keepalive && !request.is_fetch_later_api) {
+ if (request.request_initiator
+ && !request.request_initiator->opaque()
+ && net::registry_controlled_domains::SameDomainOrHost(
+ request.url, *request.request_initiator,
+ net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)) {
+ keepalive = false;
+ }
+ else if (url::IsSameOriginWith(request.url, request.referrer)) {
+ keepalive = false;
+ }
+ }
+
// Use |keep_alive_loader_factory_| to send the keepalive requests to the
// KeepAliveURLLoaderService in the browser process and trigger the special
// keepalive request handling.
// |keep_alive_loader_factory_| only presents when
// features::kKeepAliveInBrowserMigration is true.
- if (request.keepalive) {
+ if (keepalive) {
FetchUtils::LogFetchKeepAliveRequestSentToServiceMetric(request);
}
- if (request.keepalive && keep_alive_loader_factory_ &&
+ if (keepalive && keep_alive_loader_factory_ &&
base::FeatureList::IsEnabled(features::kKeepAliveInBrowserMigration)) {
+ // use keep alive loader on the browser side
keep_alive_loader_factory_->CreateLoaderAndStart(
std::move(loader), request_id, options, request, std::move(client),
traffic_annotation);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -3103,7 +3103,7 @@ void ResourceFetcher::PrepareForLeakDetection() {
void ResourceFetcher::StopFetchingInternal(StopFetchingTarget target) {
// TODO(toyoshim): May want to suspend scheduler while canceling loaders so
// that the cancellations below do not awake unnecessary scheduling.
-
+ target = StopFetchingTarget::kIncludingKeepaliveLoaders;
HeapVector<Member<ResourceLoader>> loaders_to_cancel;
for (const auto& loader : non_blocking_loaders_) {
if (target == StopFetchingTarget::kIncludingKeepaliveLoaders ||
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2413,8 +2413,8 @@
{
// The Blink runtime-enabled feature name for the API's IDL.
// https://chromestatus.com/feature/4654499737632768
- name: "FetchLaterAPI",
- status: "stable",
+ name: "FetchLaterAPI", // disabled
+ status: "stable", // by default (note: idl must be active)
},
{
// The retry ability for Fetch keepalive requests.
--