From c94a0d209dee1da75c4131360b75702a8245dd5c Mon Sep 17 00:00:00 2001 From: Sreeja Kamishetty Date: Wed, 6 Jul 2022 20:43:06 +0000 Subject: [PATCH] [Prerender] Move IsPrerenderSupported check to CreateAndStartHost With support for prerender on different predictors, we want to move the common logic to check if prerender is supported or not to PrerenderHostRegistry::CreateAndStartHost to clean up the code. In order for tests to support Prerender2, we introduce ScopedPrerenderWebContentsDelegate class which sets IsPrerender2Supported to true. BUG=1292422 Change-Id: I518b41b2b42d481f94c71fe493fa8bbbeb599d6f Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3724048 Reviewed-by: Mikel Astiz Reviewed-by: Avi Drissman Reviewed-by: Simon Pelchat Reviewed-by: Sandro Maggi Reviewed-by: Francois Pierre Doray Reviewed-by: Takashi Toyoshima Reviewed-by: Sophie Chang Commit-Queue: Sreeja Kamishetty Reviewed-by: Balazs Engedy Reviewed-by: Hiroki Nakagawa Reviewed-by: Glen Robertson Reviewed-by: Sylvain Defresne Cr-Commit-Position: refs/heads/main@{#1021356} --- .../history/history_tab_helper_unittest.cc | 4 ++++ ...dia_engagement_contents_observer_unittest.cc | 4 ++++ ...slate_page_load_metrics_observer_unittest.cc | 4 ++++ .../predictors/autocomplete_action_predictor.cc | 11 ----------- .../prerender/prerender_manager_unittest.cc | 6 ++++++ .../tab_manager_stats_collector_unittest.cc | 3 +++ .../browser/signin/dice_tab_helper_unittest.cc | 3 +++ .../signin/reauth_tab_helper_unittest.cc | 4 ++++ .../sync_encryption_keys_tab_helper_unittest.cc | 3 +++ .../web_app_icon_downloader_unittest.cc | 4 ++++ .../authenticator_request_scheduler_unittest.cc | 4 ++++ .../browser/controller_unittest.cc | 4 ++++ .../browser/starter_unittest.cc | 3 +++ .../trigger_script_coordinator_unittest.cc | 4 ++++ .../page_specific_content_settings_unittest.cc | 6 ++++++ .../browser/page_text_observer_unittest.cc | 8 +++++++- .../browser/page_load_tracker_unittest.cc | 17 +++++++++++++++++ .../prerender/prerender_host_registry.cc | 9 +++++++++ .../prerender_host_registry_unittest.cc | 1 + .../speculation_rules/speculation_host_impl.cc | 13 ++----------- content/public/test/prerender_test_util.cc | 16 ++++++++++++++++ content/public/test/prerender_test_util.h | 15 +++++++++++++++ 22 files changed, 123 insertions(+), 23 deletions(-) diff --git a/chrome/browser/history/history_tab_helper_unittest.cc b/chrome/browser/history/history_tab_helper_unittest.cc index 8f64b031c8b6e5..208c2bbb6f3fb6 100644 --- a/chrome/browser/history/history_tab_helper_unittest.cc +++ b/chrome/browser/history/history_tab_helper_unittest.cc @@ -29,6 +29,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -429,6 +430,9 @@ INSTANTIATE_TEST_SUITE_P(All, MPArchType::kPrerender)); TEST_P(HistoryTabHelperMPArchTest, DoNotAffectToLimitTitleUpdates) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + web_contents_tester()->NavigateAndCommit(page_url_); content::NavigationEntry* entry = diff --git a/chrome/browser/media/media_engagement_contents_observer_unittest.cc b/chrome/browser/media/media_engagement_contents_observer_unittest.cc index 526d88ceb71e28..2672b05429d06a 100644 --- a/chrome/browser/media/media_engagement_contents_observer_unittest.cc +++ b/chrome/browser/media/media_engagement_contents_observer_unittest.cc @@ -30,6 +30,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "media/base/media_switches.h" #include "services/metrics/public/cpp/ukm_builders.h" @@ -1383,6 +1384,9 @@ class MediaEngagementContentsObserverPrerenderTest TEST_F(MediaEngagementContentsObserverPrerenderTest, EnsureDoNotCleanupAfterNavigation_AudioContextInPrerendering) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + GURL url = GURL("https://example.com"); content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(), url); diff --git a/chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer_unittest.cc index d692c24dfbd098..1937a8ac099ace 100644 --- a/chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer_unittest.cc @@ -10,6 +10,7 @@ #include "components/page_load_metrics/browser/page_load_tracker.h" #include "components/translate/core/browser/mock_translate_metrics_logger.h" #include "components/translate/core/browser/translate_metrics_logger.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "testing/gmock/include/gmock/gmock.h" @@ -264,6 +265,9 @@ TEST_F(TranslatePageLoadMetricsObserverTest, RepeatedAppEntersBackground) { } TEST_F(TranslatePageLoadMetricsObserverTest, PrerenderAndActivation) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + PrepareMock(2); EXPECT_CALL(*mock_translate_metrics_loggers()[0], OnPageLoadStart(true)) diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc index 0180a922127e47..8e89fc5cca00db 100644 --- a/chrome/browser/predictors/autocomplete_action_predictor.cc +++ b/chrome/browser/predictors/autocomplete_action_predictor.cc @@ -194,17 +194,6 @@ void AutocompleteActionPredictor::StartPrerendering( const gfx::Size& size) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (prerender_utils::IsDirectUrlInputPrerenderEnabled()) { - // Check whether preloading is enabled. If users disable this - // setting, it means users do not want to preload pages. - // TODO(https://crbug.com/1292422): Move this check into - // content::PrerenderHostRegistry::CreateAndStartHost(). - content::WebContentsDelegate* web_contents_delegate = - web_contents.GetDelegate(); - if (!web_contents_delegate || - !web_contents_delegate->IsPrerender2Supported(web_contents)) { - return; - } - PrerenderManager::CreateForWebContents(&web_contents); auto* prerender_manager = PrerenderManager::FromWebContents(&web_contents); direct_url_input_prerender_handle_ = diff --git a/chrome/browser/prerender/prerender_manager_unittest.cc b/chrome/browser/prerender/prerender_manager_unittest.cc index 6f02271eb55f5f..38b97cbf80eec1 100644 --- a/chrome/browser/prerender/prerender_manager_unittest.cc +++ b/chrome/browser/prerender/prerender_manager_unittest.cc @@ -42,6 +42,9 @@ class PrerenderManagerTest : public ChromeRenderViewHostTestHarness { prerender_manager_ = PrerenderManager::FromWebContents(web_contents()); ASSERT_TRUE(prerender_manager_); prerender_manager_->set_skip_template_url_service_for_testing(); + web_contents_delegate_ = + std::make_unique( + *web_contents()); } content::WebContents* GetActiveWebContents() { return web_contents(); } @@ -84,6 +87,9 @@ class PrerenderManagerTest : public ChromeRenderViewHostTestHarness { private: content::test::PrerenderTestHelper prerender_helper_; base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr + web_contents_delegate_; + net::EmbeddedTestServer test_server_; raw_ptr prerender_manager_; }; diff --git a/chrome/browser/resource_coordinator/tab_manager_stats_collector_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_stats_collector_unittest.cc index def5f0b3537ddf..178bb1198f28ef 100644 --- a/chrome/browser/resource_coordinator/tab_manager_stats_collector_unittest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_stats_collector_unittest.cc @@ -29,6 +29,7 @@ #include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/web_contents.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -267,6 +268,8 @@ TEST_F(TabManagerStatsCollectorPrerenderingTest, KeepingWebContentsMapInPrerendering) { std::unique_ptr tab1(CreateTestWebContents()); std::unique_ptr tab2(CreateTestWebContents()); + content::test::ScopedPrerenderWebContentsDelegate tab1_delegate(*tab1.get()); + content::test::ScopedPrerenderWebContentsDelegate tab2_delegate(*tab2.get()); GURL init_url("https://example1.test/"); content::NavigationSimulator::NavigateAndCommitFromBrowser(tab2.get(), diff --git a/chrome/browser/signin/dice_tab_helper_unittest.cc b/chrome/browser/signin/dice_tab_helper_unittest.cc index 85cf9a71c86af5..706e965fd245d3 100644 --- a/chrome/browser/signin/dice_tab_helper_unittest.cc +++ b/chrome/browser/signin/dice_tab_helper_unittest.cc @@ -12,6 +12,7 @@ #include "content/public/common/content_features.h" #include "content/public/test/back_forward_cache_util.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" #include "google_apis/gaia/gaia_urls.h" @@ -230,6 +231,8 @@ class DiceTabHelperPrerenderTest : public DiceTabHelperTest { }; TEST_F(DiceTabHelperPrerenderTest, SigninStatusAfterPrerendering) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); base::UserActionTester ua_tester; DiceTabHelper::CreateForWebContents(web_contents()); DiceTabHelper* dice_tab_helper = diff --git a/chrome/browser/signin/reauth_tab_helper_unittest.cc b/chrome/browser/signin/reauth_tab_helper_unittest.cc index a17078cb067a8e..0a95f46e67d604 100644 --- a/chrome/browser/signin/reauth_tab_helper_unittest.cc +++ b/chrome/browser/signin/reauth_tab_helper_unittest.cc @@ -9,6 +9,7 @@ #include "chrome/browser/signin/reauth_result.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "net/base/net_errors.h" #include "testing/gmock/include/gmock/gmock.h" @@ -166,6 +167,9 @@ class ReauthTabHelperPrerenderTest : public ReauthTabHelperTest { TEST_F(ReauthTabHelperPrerenderTest, PrerenderDoesNotAffectLastCommittedErrorPage) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(), reauth_url()); EXPECT_FALSE(tab_helper()->has_last_committed_error_page()); diff --git a/chrome/browser/sync/sync_encryption_keys_tab_helper_unittest.cc b/chrome/browser/sync/sync_encryption_keys_tab_helper_unittest.cc index a5bd0df349b2d2..4b0163b04efd74 100644 --- a/chrome/browser/sync/sync_encryption_keys_tab_helper_unittest.cc +++ b/chrome/browser/sync/sync_encryption_keys_tab_helper_unittest.cc @@ -155,6 +155,9 @@ class SyncEncryptionKeysTabHelperPrerenderingTest // canceling prerendering. TEST_F(SyncEncryptionKeysTabHelperPrerenderingTest, CreateEncryptionKeysInPrerendering) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + // Load a page. ASSERT_FALSE(HasEncryptionKeysApiInMainFrame()); web_contents_tester()->NavigateAndCommit(GaiaUrls::GetInstance()->gaia_url()); diff --git a/chrome/browser/web_applications/web_app_icon_downloader_unittest.cc b/chrome/browser/web_applications/web_app_icon_downloader_unittest.cc index 8117f3cdc3f6f6..a1be3cd838dce9 100644 --- a/chrome/browser/web_applications/web_app_icon_downloader_unittest.cc +++ b/chrome/browser/web_applications/web_app_icon_downloader_unittest.cc @@ -15,6 +15,7 @@ #include "chrome/browser/web_applications/web_app_constants.h" #include "content/public/browser/web_contents.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "net/http/http_status_code.h" #include "testing/gtest/include/gtest/gtest.h" @@ -420,6 +421,9 @@ class WebAppIconDownloaderPrerenderTest : public WebAppIconDownloaderTest { }; TEST_F(WebAppIconDownloaderPrerenderTest, PrerenderedPageNavigates) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + // Navigate to an initial page. NavigateAndCommit(GURL("http://foo.example")); diff --git a/chrome/browser/webauthn/authenticator_request_scheduler_unittest.cc b/chrome/browser/webauthn/authenticator_request_scheduler_unittest.cc index c366dab3d31a65..2ddcbbf3d8f273 100644 --- a/chrome/browser/webauthn/authenticator_request_scheduler_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_scheduler_unittest.cc @@ -8,6 +8,7 @@ #include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "content/public/browser/web_contents.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/web_contents_tester.h" #include "third_party/blink/public/common/features.h" @@ -99,6 +100,9 @@ class AuthenticatorRequestSchedulerPrerenderTest TEST_F(AuthenticatorRequestSchedulerPrerenderTest, SingleWebContents_OneRequestInPrerendering) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + // Navigate to an initial page. NavigateAndCommit(GURL("https://example.com")); diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc index 1cbc9d6eafeecc..49f85f2a2de8bb 100644 --- a/components/autofill_assistant/browser/controller_unittest.cc +++ b/components/autofill_assistant/browser/controller_unittest.cc @@ -41,6 +41,7 @@ #include "components/ukm/content/source_url_recorder.h" #include "components/ukm/test_ukm_recorder.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" @@ -2219,6 +2220,9 @@ class ControllerPrerenderTest : public ControllerTest { }; TEST_F(ControllerPrerenderTest, SuccessfulNavigation) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + EXPECT_FALSE(controller_->IsNavigatingToNewDocument()); EXPECT_FALSE(controller_->HasNavigationError()); diff --git a/components/autofill_assistant/browser/starter_unittest.cc b/components/autofill_assistant/browser/starter_unittest.cc index 1db2da4e80aabb..036041bb3a522b 100644 --- a/components/autofill_assistant/browser/starter_unittest.cc +++ b/components/autofill_assistant/browser/starter_unittest.cc @@ -35,6 +35,7 @@ #include "components/ukm/test_ukm_recorder.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" @@ -2104,6 +2105,8 @@ class StarterPrerenderTest : public StarterTest { TEST_F(StarterPrerenderTest, DoNotAffectRecordUkmDuringPrendering) { SetupPlatformDelegateForFirstTimeUser(); + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); fake_platform_delegate_.feature_module_installed_ = true; // Empty callback to keep the onboarding open indefinitely. diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc index db071dc868ce18..d7cae9cb6ea5e4 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc @@ -28,6 +28,7 @@ #include "components/ukm/test_ukm_recorder.h" #include "components/version_info/version_info.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" @@ -1649,6 +1650,9 @@ class TriggerScriptCoordinatorPrerenderTest }; TEST_F(TriggerScriptCoordinatorPrerenderTest, DoNotRecordIfPrerenderingFailed) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + GetTriggerScriptsResponseProto response; response.add_trigger_scripts(); std::string serialized_response; diff --git a/components/content_settings/browser/page_specific_content_settings_unittest.cc b/components/content_settings/browser/page_specific_content_settings_unittest.cc index 30760b83c11804..a1f3f62ddd3d30 100644 --- a/components/content_settings/browser/page_specific_content_settings_unittest.cc +++ b/components/content_settings/browser/page_specific_content_settings_unittest.cc @@ -18,6 +18,7 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" #include "net/cookies/canonical_cookie.h" @@ -528,6 +529,9 @@ class PageSpecificContentSettingsWithPrerenderTest ~PageSpecificContentSettingsWithPrerenderTest() override = default; content::RenderFrameHost* AddPrerender(const GURL& prerender_url) { + web_contents_delegate_ = + std::make_unique( + *web_contents()); content::RenderFrameHost* prerender_frame = content::WebContentsTester::For(web_contents()) ->AddPrerenderAndCommitNavigation(prerender_url); @@ -540,6 +544,8 @@ class PageSpecificContentSettingsWithPrerenderTest private: base::test::ScopedFeatureList feature_list_; + std::unique_ptr + web_contents_delegate_; }; TEST_F(PageSpecificContentSettingsWithPrerenderTest, SiteDataAccessed) { diff --git a/components/optimization_guide/content/browser/page_text_observer_unittest.cc b/components/optimization_guide/content/browser/page_text_observer_unittest.cc index 97f8acf5baa2be..c3c5a4fded5601 100644 --- a/components/optimization_guide/content/browser/page_text_observer_unittest.cc +++ b/components/optimization_guide/content/browser/page_text_observer_unittest.cc @@ -18,6 +18,7 @@ #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" #include "mojo/public/cpp/bindings/associated_remote.h" @@ -1088,7 +1089,10 @@ class PageTextObserverWithPrerenderTest : public PageTextObserverTest { }; TEST_F(PageTextObserverWithPrerenderTest, - PrerenderingShouldNotResetOutstatndingRequest) { + PrerenderingShouldNotResetOutstandingRequest) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); + TestConsumer consumer; observer()->AddConsumer(&consumer); EXPECT_FALSE(consumer.was_called()); @@ -1122,6 +1126,8 @@ TEST_F(PageTextObserverWithPrerenderTest, } TEST_F(PageTextObserverWithPrerenderTest, AMPRequestedOnOOPIFInPrerendering) { + content::test::ScopedPrerenderWebContentsDelegate web_contents_delegate( + *web_contents()); TestConsumer consumer; observer()->AddConsumer(&consumer); diff --git a/components/page_load_metrics/browser/page_load_tracker_unittest.cc b/components/page_load_metrics/browser/page_load_tracker_unittest.cc index f01a09b6b443e9..dea5045d451cd9 100644 --- a/components/page_load_metrics/browser/page_load_tracker_unittest.cc +++ b/components/page_load_metrics/browser/page_load_tracker_unittest.cc @@ -7,6 +7,7 @@ #include "base/containers/flat_map.h" #include "components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h" #include "content/public/test/navigation_simulator.h" +#include "content/public/test/prerender_test_util.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -29,6 +30,8 @@ struct PageLoadMetricsObserverEvents final { size_t sub_frame_navigation_count = 0; }; +using content::test::ScopedPrerenderWebContentsDelegate; + class TestPageLoadMetricsObserver final : public PageLoadMetricsObserver { public: TestPageLoadMetricsObserver(raw_ptr events) @@ -134,6 +137,8 @@ class PageLoadTrackerTest : public PageLoadMetricsObserverContentTestHarness { }; TEST_F(PageLoadTrackerTest, PrimaryPageType) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. SetTargetUrl(kTestUrl); @@ -162,6 +167,8 @@ TEST_F(PageLoadTrackerTest, PrimaryPageType) { } TEST_F(PageLoadTrackerTest, EventForwarding) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // In the end, we'll construct frame trees as the following: // // A : primary main frame @@ -282,6 +289,8 @@ TEST_F(PageLoadTrackerTest, EventForwarding) { } TEST_F(PageLoadTrackerTest, PrerenderPageType) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. const char kPrerenderingUrl[] = "https://a.test/prerender"; SetTargetUrl(kPrerenderingUrl); @@ -313,6 +322,8 @@ TEST_F(PageLoadTrackerTest, PrerenderPageType) { } TEST_F(PageLoadTrackerTest, FencedFramesPageType) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. const char kFencedFramesUrl[] = "https://a.test/fenced_frames"; SetTargetUrl(kFencedFramesUrl); @@ -364,6 +375,8 @@ TEST_F(PageLoadTrackerTest, FencedFramesPageType) { } TEST_F(PageLoadTrackerTest, StopObservingOnPrerender) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. const char kPrerenderingUrl[] = "https://a.test/prerender"; SetTargetUrl(kPrerenderingUrl); @@ -384,6 +397,8 @@ TEST_F(PageLoadTrackerTest, StopObservingOnPrerender) { } TEST_F(PageLoadTrackerTest, StopObservingOnFencedFrames) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. const char kFencedFramesUrl[] = "https://a.test/fenced_frames"; SetTargetUrl(kFencedFramesUrl); @@ -409,6 +424,8 @@ TEST_F(PageLoadTrackerTest, StopObservingOnFencedFrames) { } TEST_F(PageLoadTrackerTest, ResumeOnPrerenderActivation) { + ScopedPrerenderWebContentsDelegate web_contents_delegate(*web_contents()); + // Target URL to monitor the tracker via the test observer. const char kPrerenderingUrl[] = "https://a.test/prerender"; SetTargetUrl(kPrerenderingUrl); diff --git a/content/browser/prerender/prerender_host_registry.cc b/content/browser/prerender/prerender_host_registry.cc index 56ffed67c02cb3..b3f1ea8368de6b 100644 --- a/content/browser/prerender/prerender_host_registry.cc +++ b/content/browser/prerender/prerender_host_registry.cc @@ -21,6 +21,7 @@ #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" #include "third_party/blink/public/common/features.h" namespace content { @@ -89,6 +90,14 @@ int PrerenderHostRegistry::CreateAndStartHost( base::BindOnce(&PrerenderHostRegistry::NotifyTrigger, base::Unretained(this), attributes.prerendering_url)); + // Check whether preloading is enabled. If users disable this + // setting, it means users do not want to preload pages. + WebContentsDelegate* web_contents_delegate = web_contents.GetDelegate(); + if (!web_contents_delegate || + !web_contents_delegate->IsPrerender2Supported(web_contents)) { + return RenderFrameHost::kNoFrameTreeNodeId; + } + // Don't prerender when the trigger is in the background. if (web_contents.GetVisibility() == Visibility::HIDDEN) { RecordPrerenderHostFinalStatus( diff --git a/content/browser/prerender/prerender_host_registry_unittest.cc b/content/browser/prerender/prerender_host_registry_unittest.cc index 79d3f1cd0ea4ab..22736073fdd7e4 100644 --- a/content/browser/prerender/prerender_host_registry_unittest.cc +++ b/content/browser/prerender/prerender_host_registry_unittest.cc @@ -210,6 +210,7 @@ class PrerenderHostRegistryTest : public RenderViewHostImplTestHarness { const GURL kOriginalUrl("https://example.com/"); TestWebContents* wc = static_cast(web_contents()); + web_contents()->SetDelegate(&web_contents_delegate_); wc->NavigateAndCommit(kOriginalUrl); RenderFrameHostImpl* render_frame_host = wc->GetPrimaryMainFrame(); ASSERT_TRUE(render_frame_host); diff --git a/content/browser/speculation_rules/speculation_host_impl.cc b/content/browser/speculation_rules/speculation_host_impl.cc index 7d018aca77b3ff..ee0f9a70585e8a 100644 --- a/content/browser/speculation_rules/speculation_host_impl.cc +++ b/content/browser/speculation_rules/speculation_host_impl.cc @@ -15,7 +15,6 @@ #include "content/browser/speculation_rules/prefetch/prefetch_features.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_delegate.h" #include "content/public/common/content_client.h" #include "content/public/common/referrer.h" #include "mojo/public/cpp/bindings/message.h" @@ -134,16 +133,6 @@ void SpeculationHostImpl::ProcessCandidatesForPrerender( return; DCHECK(blink::features::IsPrerender2Enabled()); - // TODO(https://crbug.com/1292422): Move this check into - // PrerenderHostRegistry::CreateAndStartHost(). - WebContents* web_contents = - WebContents::FromRenderFrameHost(render_frame_host()); - WebContentsDelegate* web_contents_delegate = web_contents->GetDelegate(); - if (!web_contents_delegate || - !web_contents_delegate->IsPrerender2Supported(*web_contents)) { - return; - } - // Extract only the candidates which apply to prerender, and sort them by URL // so we can efficiently compare them to `started_prerenders_`. std::vector prerender_candidates; @@ -245,6 +234,8 @@ void SpeculationHostImpl::ProcessCandidatesForPrerender( } Referrer referrer(*(it->referrer)); + WebContents* web_contents = + WebContents::FromRenderFrameHost(render_frame_host()); int prerender_host_id = registry_->CreateAndStartHost( PrerenderAttributes( it->url, PrerenderTriggerType::kSpeculationRule, diff --git a/content/public/test/prerender_test_util.cc b/content/public/test/prerender_test_util.cc index d2d8829e57f200..ef5332bc290db6 100644 --- a/content/public/test/prerender_test_util.cc +++ b/content/public/test/prerender_test_util.cc @@ -493,6 +493,22 @@ std::string PrerenderTestHelper::GenerateHistogramName( NOTREACHED(); } +ScopedPrerenderWebContentsDelegate::ScopedPrerenderWebContentsDelegate( + WebContents& web_contents) + : web_contents_(web_contents.GetWeakPtr()) { + web_contents_->SetDelegate(this); +} + +ScopedPrerenderWebContentsDelegate::~ScopedPrerenderWebContentsDelegate() { + if (web_contents_) + web_contents_.get()->SetDelegate(nullptr); +} + +bool ScopedPrerenderWebContentsDelegate::IsPrerender2Supported( + WebContents& web_contents) { + return true; +} + } // namespace test } // namespace content diff --git a/content/public/test/prerender_test_util.h b/content/public/test/prerender_test_util.h index 4ab0a9a62a35ff..0bf8293a7662d4 100644 --- a/content/public/test/prerender_test_util.h +++ b/content/public/test/prerender_test_util.h @@ -178,6 +178,21 @@ class PrerenderTestHelper { WebContents::Getter get_web_contents_fn_; }; +// This test delegate is used for prerender-tests, in order to support +// prerendering going through the WebContentsDelegate. +class ScopedPrerenderWebContentsDelegate : public WebContentsDelegate { + public: + explicit ScopedPrerenderWebContentsDelegate(WebContents& web_contents); + + ~ScopedPrerenderWebContentsDelegate() override; + + // WebContentsDelegate override. + bool IsPrerender2Supported(content::WebContents& web_contents) override; + + private: + base::WeakPtr web_contents_; +}; + } // namespace test } // namespace content