Add killswitch for the race network request fix
This CL adds the killswitch for the fix to the SWResourceLoader lifetime issue, which was recently added. We'd like to cherry-pick this fix on M123 so we need a killswitch, because a killswitch is one of the criteria of sending a merge request. Bug: 340949948 Change-Id: I8d68f63ec523e59b67b959ef2670826ed8f4b958 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5552694 Reviewed-by: Kouhei Ueno <kouhei@chromium.org> Reviewed-by: Rakina Zata Amni <rakina@chromium.org> Reviewed-by: Minoru Chikamune <chikamune@chromium.org> Reviewed-by: Yoshisato Yanagisawa <yyanagisawa@chromium.org> Commit-Queue: Shunya Shishido <sisidovski@chromium.org> Cr-Commit-Position: refs/heads/main@{#1304201}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
3e21af1f44
commit
8b51c00895
content
browser
service_worker
common
renderer
service_worker
@@ -99,6 +99,11 @@ std::string GetContainerHostClientId(int frame_tree_node_id) {
|
||||
return client_uuid;
|
||||
}
|
||||
|
||||
bool IsStaticRouterRaceRequestFixEnabled() {
|
||||
return base::FeatureList::IsEnabled(
|
||||
features::kServiceWorkerStaticRouterRaceRequestFix);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// This class waits for completion of a stream response from the service worker.
|
||||
@@ -717,11 +722,14 @@ void ServiceWorkerMainResourceLoader::DidDispatchFetchEvent(
|
||||
// When kRaceNetworkRequest preload is triggered, it's possible that the
|
||||
// response is already committed without waiting for the fetch event result.
|
||||
// Invalidate and destruct if the class already detached from the request.
|
||||
has_fetch_event_finished_ = true;
|
||||
if (dispatched_preload_type() == DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
is_detached_ && status_ == Status::kCompleted) {
|
||||
InvalidateAndDeleteIfNeeded();
|
||||
return;
|
||||
if (IsStaticRouterRaceRequestFixEnabled()) {
|
||||
has_fetch_event_finished_ = true;
|
||||
if (dispatched_preload_type() ==
|
||||
DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
is_detached_ && status_ == Status::kCompleted) {
|
||||
InvalidateAndDeleteIfNeeded();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bool is_fallback =
|
||||
@@ -1119,11 +1127,14 @@ void ServiceWorkerMainResourceLoader::InvalidateAndDeleteIfNeeded() {
|
||||
// 1) RaceNetworkRequest is dispatched and the network wins the race.
|
||||
// 2) The fetch event result is not received yet.
|
||||
// The postponed things will be done in DidDispatchFetchEvent().
|
||||
if (dispatched_preload_type() == DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
race_network_request_url_loader_client_.has_value() &&
|
||||
!has_fetch_event_finished_) {
|
||||
CHECK(fetch_dispatcher_);
|
||||
return;
|
||||
if (IsStaticRouterRaceRequestFixEnabled()) {
|
||||
if (dispatched_preload_type() ==
|
||||
DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
race_network_request_url_loader_client_.has_value() &&
|
||||
!has_fetch_event_finished_) {
|
||||
CHECK(fetch_dispatcher_);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// The fetch dispatcher or stream waiter may still be running. Don't let them
|
||||
|
@@ -473,6 +473,13 @@ BASE_FEATURE(kServiceWorkerStaticRouterStartServiceWorker,
|
||||
"ServiceWorkerStaticRouterStartServiceWorker",
|
||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||
|
||||
// (crbug.com/340949948): Killswitch for the fix to address the ServiceWorker
|
||||
// main and subreosurce loader lifetime issue, which introduces fetch() failure
|
||||
// in the sw fetch handler.
|
||||
BASE_FEATURE(kServiceWorkerStaticRouterRaceRequestFix,
|
||||
"kServiceWorkerStaticRouterRaceRequestFix",
|
||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||
|
||||
// The set of ServiceWorker to bypass while making navigation request.
|
||||
// They are represented by a comma separated list of HEX encoded SHA256 hash of
|
||||
// the ServiceWorker's scripts.
|
||||
|
@@ -111,6 +111,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kSendBeaconThrowForBlobWithNonSimpleType);
|
||||
CONTENT_EXPORT BASE_DECLARE_FEATURE(kServiceWorkerAutoPreload);
|
||||
CONTENT_EXPORT BASE_DECLARE_FEATURE(
|
||||
kServiceWorkerStaticRouterStartServiceWorker);
|
||||
CONTENT_EXPORT BASE_DECLARE_FEATURE(kServiceWorkerStaticRouterRaceRequestFix);
|
||||
CONTENT_EXPORT BASE_DECLARE_FEATURE(
|
||||
kServiceWorkerBypassFetchHandlerHashStrings);
|
||||
CONTENT_EXPORT extern const base::FeatureParam<std::string>
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include "base/strings/strcat.h"
|
||||
#include "base/task/sequenced_task_runner.h"
|
||||
#include "base/trace_event/trace_event.h"
|
||||
#include "content/common/features.h"
|
||||
#include "content/common/fetch/fetch_request_type_converters.h"
|
||||
#include "content/common/service_worker/race_network_request_url_loader_client.h"
|
||||
#include "content/common/service_worker/service_worker_router_evaluator.h"
|
||||
@@ -172,6 +173,12 @@ blink::mojom::ServiceWorkerFetchEventTimingPtr AdjustTimingIfNeededCrBug1342408(
|
||||
base::UmaHistogramBoolean(kMetricsName, true);
|
||||
return timing;
|
||||
}
|
||||
|
||||
bool IsStaticRouterRaceRequestFixEnabled() {
|
||||
return base::FeatureList::IsEnabled(
|
||||
features::kServiceWorkerStaticRouterRaceRequestFix);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// A ServiceWorkerStreamCallback implementation which waits for completion of
|
||||
@@ -346,10 +353,13 @@ void ServiceWorkerSubresourceLoader::MaybeDeleteThis() {
|
||||
// 2) The fetch event handler has not been finished yet.
|
||||
// The postponed destruction will be done in
|
||||
// ServiceWorkerFetchResponseCallback methods.
|
||||
if (dispatched_preload_type() == DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
race_network_request_loader_client_.has_value() &&
|
||||
controller_connector_observation_.IsObserving()) {
|
||||
return;
|
||||
if (IsStaticRouterRaceRequestFixEnabled()) {
|
||||
if (dispatched_preload_type() ==
|
||||
DispatchedPreloadType::kRaceNetworkRequest &&
|
||||
race_network_request_loader_client_.has_value() &&
|
||||
controller_connector_observation_.IsObserving()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
delete this;
|
||||
}
|
||||
@@ -627,7 +637,8 @@ void ServiceWorkerSubresourceLoader::OnResponse(
|
||||
TRACE_ID_LOCAL(request_id_)),
|
||||
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
|
||||
SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
|
||||
if (IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
if (IsStaticRouterRaceRequestFixEnabled() &&
|
||||
IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
MaybeDeleteThis();
|
||||
return;
|
||||
}
|
||||
@@ -648,7 +659,8 @@ void ServiceWorkerSubresourceLoader::OnResponseStream(
|
||||
TRACE_ID_LOCAL(request_id_)),
|
||||
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
|
||||
SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
|
||||
if (IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
if (IsStaticRouterRaceRequestFixEnabled() &&
|
||||
IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
MaybeDeleteThis();
|
||||
return;
|
||||
}
|
||||
@@ -660,7 +672,8 @@ void ServiceWorkerSubresourceLoader::OnFallback(
|
||||
std::optional<network::DataElementChunkedDataPipe> request_body,
|
||||
blink::mojom::ServiceWorkerFetchEventTimingPtr timing) {
|
||||
SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
|
||||
if (IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
if (IsStaticRouterRaceRequestFixEnabled() &&
|
||||
IsResponseAlreadyCommittedByRaceNetworkRequest()) {
|
||||
MaybeDeleteThis();
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user