217 lines
9.8 KiB
Diff
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.
|
|
--
|