Defer navigation cancellations when navigations are deferred
(cherry picked from commit d6cd41c67f
)
Bug: 357977710
Change-Id: I067a5c957f10454c19b99f448119b5b568a2d27f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6318765
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Philip Pfaffe <pfaffe@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1429609}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6350177
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/branch-heads/7049@{#575}
Cr-Branched-From: 2dab7846d0951a552bdc4f350dad497f986e6fed-refs/heads/main@{#1427262}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
436151b6a2
commit
4301f3caba
content/renderer
third_party/blink/web_tests/http/tests/inspector-protocol/runtime
@@ -4469,6 +4469,15 @@ base::UnguessableToken RenderFrameImpl::GetDevToolsFrameToken() {
|
|||||||
|
|
||||||
void RenderFrameImpl::AbortClientNavigation(bool for_new_navigation) {
|
void RenderFrameImpl::AbortClientNavigation(bool for_new_navigation) {
|
||||||
CHECK(in_frame_tree_);
|
CHECK(in_frame_tree_);
|
||||||
|
|
||||||
|
// If the navigations are deferred, cancellations should be deferred too.
|
||||||
|
client_navigation_throttler_.DispatchOrScheduleNavigation(
|
||||||
|
base::BindOnce(&RenderFrameImpl::AbortClientNavigationImpl,
|
||||||
|
base::Unretained(this), for_new_navigation));
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderFrameImpl::AbortClientNavigationImpl(bool for_new_navigation) {
|
||||||
|
CHECK(navigation_client_impl_);
|
||||||
is_requesting_navigation_ = false;
|
is_requesting_navigation_ = false;
|
||||||
if (mhtml_body_loader_client_) {
|
if (mhtml_body_loader_client_) {
|
||||||
mhtml_body_loader_client_->Detach();
|
mhtml_body_loader_client_->Detach();
|
||||||
@@ -4478,7 +4487,6 @@ void RenderFrameImpl::AbortClientNavigation(bool for_new_navigation) {
|
|||||||
// See comment in header for more information of how navigation cleanup works.
|
// See comment in header for more information of how navigation cleanup works.
|
||||||
// Note: This might not actually cancel the navigation if the navigation is
|
// Note: This might not actually cancel the navigation if the navigation is
|
||||||
// already in the process of committing to a different RenderFrame.
|
// already in the process of committing to a different RenderFrame.
|
||||||
|
|
||||||
if (for_new_navigation) {
|
if (for_new_navigation) {
|
||||||
navigation_client_impl_->ResetForNewNavigation(
|
navigation_client_impl_->ResetForNewNavigation(
|
||||||
/*is_duplicate_navigation=*/false);
|
/*is_duplicate_navigation=*/false);
|
||||||
@@ -5727,7 +5735,6 @@ void RenderFrameImpl::BeginNavigation(
|
|||||||
for (auto& observer : observers_) {
|
for (auto& observer : observers_) {
|
||||||
observer.DidStartNavigation(info->url_request.Url(), info->navigation_type);
|
observer.DidStartNavigation(info->url_request.Url(), info->navigation_type);
|
||||||
}
|
}
|
||||||
is_requesting_navigation_ = true;
|
|
||||||
|
|
||||||
// Everything else is handled asynchronously by the browser process through
|
// Everything else is handled asynchronously by the browser process through
|
||||||
// BeginNavigation.
|
// BeginNavigation.
|
||||||
@@ -6179,6 +6186,8 @@ void RenderFrameImpl::BeginNavigationInternal(
|
|||||||
// Provisional frames shouldn't initiate navigations.
|
// Provisional frames shouldn't initiate navigations.
|
||||||
CHECK(!GetWebFrame()->IsProvisional());
|
CHECK(!GetWebFrame()->IsProvisional());
|
||||||
|
|
||||||
|
is_requesting_navigation_ = true;
|
||||||
|
|
||||||
// Set SiteForCookies.
|
// Set SiteForCookies.
|
||||||
WebDocument frame_document = frame_->GetDocument();
|
WebDocument frame_document = frame_->GetDocument();
|
||||||
if (info->frame_type == blink::mojom::RequestContextFrameType::kTopLevel) {
|
if (info->frame_type == blink::mojom::RequestContextFrameType::kTopLevel) {
|
||||||
|
@@ -1243,6 +1243,10 @@ class CONTENT_EXPORT RenderFrameImpl
|
|||||||
// CommitNavigation() and DidCommitNavigation().
|
// CommitNavigation() and DidCommitNavigation().
|
||||||
void ResetMembersUsedForDurationOfCommit();
|
void ResetMembersUsedForDurationOfCommit();
|
||||||
|
|
||||||
|
// Actual implementation of AbortClientNavigation(), as one may be deferred in
|
||||||
|
// case the page is being instrumented by devtools,
|
||||||
|
void AbortClientNavigationImpl(bool for_new_navigation);
|
||||||
|
|
||||||
// Stores the WebLocalFrame we are associated with. This is null from the
|
// Stores the WebLocalFrame we are associated with. This is null from the
|
||||||
// constructor until BindToFrame() is called, and it is null after
|
// constructor until BindToFrame() is called, and it is null after
|
||||||
// FrameDetached() is called until destruction (which is asynchronous in the
|
// FrameDetached() is called until destruction (which is asynchronous in the
|
||||||
|
3
third_party/blink/web_tests/http/tests/inspector-protocol/runtime/eval-cancel-navigation-expected.txt
vendored
Normal file
3
third_party/blink/web_tests/http/tests/inspector-protocol/runtime/eval-cancel-navigation-expected.txt
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Tests that client-side navigation can be cancelled.
|
||||||
|
http://first.test:8000/inspector-protocol/resources/test-page.html
|
||||||
|
|
18
third_party/blink/web_tests/http/tests/inspector-protocol/runtime/eval-cancel-navigation.js
vendored
Normal file
18
third_party/blink/web_tests/http/tests/inspector-protocol/runtime/eval-cancel-navigation.js
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
|
||||||
|
const {session, dp} = await testRunner.startURL(
|
||||||
|
'http://first.test:8000/inspector-protocol/resources/test-page.html',
|
||||||
|
`Tests that client-side navigation can be cancelled.`);
|
||||||
|
await dp.Page.enable();
|
||||||
|
|
||||||
|
const navigate_to = 'http://second.test:8000/inspector-protocol/resources/test-page.html';
|
||||||
|
session.evaluate(`
|
||||||
|
location.href = '${navigate_to}';
|
||||||
|
window.stop();
|
||||||
|
`);
|
||||||
|
|
||||||
|
await dp.Page.onceFrameStartedLoading();
|
||||||
|
await dp.Page.onceFrameStoppedLoading();
|
||||||
|
|
||||||
|
testRunner.log(await session.evaluate('location.href'));
|
||||||
|
testRunner.completeTest();
|
||||||
|
})
|
Reference in New Issue
Block a user