Skip to content

Commit

Permalink
Prerender: allow same-origin main frame navigations
Browse files Browse the repository at this point in the history
Allowing main frame navigations in a prerendered page (crbug.com/1239281) is being implemented in 2 CLs and this CL is one
of them:
1. Allow same-origin navigations in a prerendered page. <-- this CL
2. Allow same-site navigations in a prerendered page. (https://chromium-review.googlesource.com/c/chromium/src/+/4040627)

design docs: https://docs.google.com/document/d/1fq3ywTnDee1bKPlWleyRVcW3vEvKIug5m_7r4p5NcbI/edit?usp=sharing&resourcekey=0-LAwzE7wJODURIJA5ewAj_g

Bug: 1239281
Change-Id: Ia5329fe6be5cc4ea6bcb1c74ca73602099526aee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3970286
Commit-Queue: Asami Doi <asamidoi@chromium.org>
Reviewed-by: Scott Violet <sky@chromium.org>
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: Lingqi Chi <lingqi@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1099094}
  • Loading branch information
d0iasm authored and Chromium LUCI CQ committed Jan 31, 2023
1 parent 828c1ec commit 3965173
Show file tree
Hide file tree
Showing 19 changed files with 438 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1512,12 +1512,13 @@ IN_PROC_BROWSER_TEST_F(SearchPreloadUnifiedBrowserTest,
"Omnibox.SearchPrefetch.PrefetchServingReason2.Prerender",
SearchPrefetchServingReason::kPrerendered, 1);

// 4. Fail the prerender by navigating it to another page.
// 4. Fail the prerender by navigating it to a cross-site page.
content::test::PrerenderHostObserver prerender_observer(
*GetActiveWebContents(), expected_prerender_url);
int host_id = prerender_helper().GetHostForUrl(expected_prerender_url);
ASSERT_NE(host_id, content::RenderFrameHost::kNoFrameTreeNodeId);
prerender_helper().NavigatePrerenderedPage(host_id, expected_prefetch_url);
prerender_helper().NavigatePrerenderedPage(
host_id, embedded_test_server()->GetURL("a.com", "/title1.html"));
prerender_observer.WaitForDestroyed();
EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetch_url));
EXPECT_EQ(0, prerender_helper().GetRequestCount(expected_prerender_url));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,8 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterPrerenderingBrowserTest,
IN_PROC_BROWSER_TEST_F(SubresourceFilterPrerenderingBrowserTest,
NavigatePrerenderedPage) {
const GURL kPrerenderUrl1 = embedded_test_server()->GetURL("/title1.html");
const GURL kPrerenderUrl2 = embedded_test_server()->GetURL("/title2.html");
const GURL kPrerenderUrl2 =
embedded_test_server()->GetURL("a.com", "/title2.html");
const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");

// Navigate to the initial URL.
Expand All @@ -318,8 +319,8 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterPrerenderingBrowserTest,
// Trigger a prerendering of title1.html.
const int prerender_host_id = prerender_helper_.AddPrerender(kPrerenderUrl1);

// Now navigate the prerendered page to title2.html. Ensure the prerender is
// canceled.
// Now navigate the prerendered page to a cross-site page. Ensure the
// prerender is canceled.
// TODO(bokan): If this is ever changed, we should ensure this test checks
// that we navigate the prerender between filtered and unfiltered pages, and
// ensure subresources are correctly filtered (or not).
Expand Down
2 changes: 2 additions & 0 deletions content/browser/devtools/protocol/page_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1599,6 +1599,8 @@ Page::PrerenderFinalStatus PrerenderFinalStatusToProtocol(
return Page::PrerenderFinalStatusEnum::PreloadingDisabled;
case PrerenderFinalStatus::kBatterySaverEnabled:
return Page::PrerenderFinalStatusEnum::BatterySaverEnabled;
case PrerenderFinalStatus::kActivatedDuringMainFrameNavigation:
return Page::PrerenderFinalStatusEnum::ActivatedDuringMainFrameNavigation;
}
}

Expand Down
5 changes: 4 additions & 1 deletion content/browser/preloading/preloading_attempt_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,11 @@ void DCHECKTriggeringOutcomeTransitions(PreloadingTriggeringOutcome old_state,
// It can be possible that the preloading attempt may end up failing
// after being ready to use, for cases where we have to cancel the
// attempt for performance and security reasons.
// The transition of kReady to kReady occurs when the main frame
// navigation is completed in a preloaded page.
{PreloadingTriggeringOutcome::kReady,
{PreloadingTriggeringOutcome::kSuccess,
{PreloadingTriggeringOutcome::kReady,
PreloadingTriggeringOutcome::kSuccess,
PreloadingTriggeringOutcome::kFailure,
PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender}},

Expand Down

0 comments on commit 3965173

Please sign in to comment.