blob: 085066a743ea75ff6bc13b191d7c9d3557eb1e93 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Julie Jeongeun Kim5a66adb42021-08-11 07:14:102// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Avi Drissmanadac21992023-01-11 23:46:395#include "base/functional/bind.h"
Daniel Cheng9fb887ff2021-10-01 20:27:386#include "content/browser/renderer_host/document_service_echo_impl.h"
7#include "content/public/browser/document_service.h"
Julie Jeongeun Kim5a66adb42021-08-11 07:14:108#include "content/public/browser/render_frame_host.h"
9#include "content/public/browser/web_contents.h"
10#include "content/public/common/content_features.h"
Rakina Zata Amnie59ab762022-02-08 06:50:4711#include "content/public/test/back_forward_cache_util.h"
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1012#include "content/public/test/browser_test.h"
13#include "content/public/test/content_browser_test.h"
14#include "content/public/test/content_browser_test_utils.h"
15#include "content/public/test/prerender_test_util.h"
16#include "content/public/test/test_utils.h"
17#include "content/shell/browser/shell.h"
18#include "content/test/content_browser_test_utils_internal.h"
19#include "content/test/echo.test-mojom.h"
20#include "mojo/public/cpp/bindings/remote.h"
21#include "net/dns/mock_host_resolver.h"
22#include "net/test/embedded_test_server/embedded_test_server.h"
23#include "testing/gtest/include/gtest/gtest.h"
24#include "url/gurl.h"
25
26namespace content {
27
Daniel Cheng9fb887ff2021-10-01 20:27:3828class DocumentServiceBrowserTest : public ContentBrowserTest {
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1029 public:
Daniel Cheng9fb887ff2021-10-01 20:27:3830 DocumentServiceBrowserTest() = default;
31 ~DocumentServiceBrowserTest() override = default;
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1032
33 void SetUpOnMainThread() override {
34 host_resolver()->AddRule("*", "127.0.0.1");
35 ASSERT_TRUE(test_server_handle_ =
36 embedded_test_server()->StartAndReturnHandle());
37 }
38
39 WebContents* web_contents() const { return shell()->web_contents(); }
40
41 private:
42 net::test_server::EmbeddedTestServerHandle test_server_handle_;
43};
44
Daniel Cheng9fb887ff2021-10-01 20:27:3845class DocumentServicePrerenderingBrowserTest
46 : public DocumentServiceBrowserTest {
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1047 public:
Daniel Cheng9fb887ff2021-10-01 20:27:3848 DocumentServicePrerenderingBrowserTest()
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1049 : prerender_helper_(base::BindRepeating(
Daniel Cheng9fb887ff2021-10-01 20:27:3850 &DocumentServicePrerenderingBrowserTest::web_contents,
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1051 base::Unretained(this))) {}
Daniel Cheng9fb887ff2021-10-01 20:27:3852 ~DocumentServicePrerenderingBrowserTest() override = default;
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1053
54 void SetUp() override {
Robert Lineb2a99c2023-08-24 02:42:2655 prerender_helper_.RegisterServerRequestMonitor(embedded_test_server());
Daniel Cheng9fb887ff2021-10-01 20:27:3856 DocumentServiceBrowserTest::SetUp();
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1057 }
58
59 test::PrerenderTestHelper* prerender_helper() { return &prerender_helper_; }
60
61 private:
62 test::PrerenderTestHelper prerender_helper_;
63};
64
Daniel Cheng9fb887ff2021-10-01 20:27:3865// Tests that DocumentService is not destroyed on prerendering activation.
66IN_PROC_BROWSER_TEST_F(DocumentServicePrerenderingBrowserTest,
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1067 NotClosedInPrerenderingActivation) {
68 const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");
69 const GURL kPrerenderingUrl = embedded_test_server()->GetURL("/title1.html");
Rakina Zata Amnie59ab762022-02-08 06:50:4770 // The test assumes documents and their DocumentServices get deleted after
71 // non-activation navigations. To ensure this, disable back/forward cache.
72 DisableBackForwardCacheForTesting(
73 shell()->web_contents(),
74 content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1075
76 // Navigate to an initial page.
77 ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
78
Avi Drissman580a3da62024-09-04 16:16:5679 FrameTreeNodeId host_id = prerender_helper()->AddPrerender(kPrerenderingUrl);
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1080 RenderFrameHost* prerendered_frame_host =
81 prerender_helper()->GetPrerenderedMainFrameHost(host_id);
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1082
83 mojo::Remote<mojom::Echo> echo_remote;
84 bool echo_deleted = false;
Daniel Cheng9fb887ff2021-10-01 20:27:3885 new DocumentServiceEchoImpl(
danakjc70aec1f2022-07-07 15:48:1986 *prerendered_frame_host, echo_remote.BindNewPipeAndPassReceiver(),
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1087 base::BindOnce([](bool* deleted) { *deleted = true; }, &echo_deleted));
88
89 // Activate the prerendered page.
90 prerender_helper()->NavigatePrimaryPage(kPrerenderingUrl);
Daniel Cheng9fb887ff2021-10-01 20:27:3891 // DocumentService should not be destroyed.
Julie Jeongeun Kim5a66adb42021-08-11 07:14:1092 EXPECT_FALSE(echo_deleted);
93
94 ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
95 // It should be destroyed on navigation.
96 EXPECT_TRUE(echo_deleted);
97}
98
Daniel Cheng9fb887ff2021-10-01 20:27:3899class DocumentServiceBFCacheBrowserTest : public DocumentServiceBrowserTest {
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10100 public:
Daniel Cheng9fb887ff2021-10-01 20:27:38101 DocumentServiceBFCacheBrowserTest() {
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10102 feature_list_.InitWithFeaturesAndParameters(
Ming-Ying Chung72636182023-02-28 12:16:04103 GetDefaultEnabledBackForwardCacheFeaturesForTesting(),
104 GetDefaultDisabledBackForwardCacheFeaturesForTesting());
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10105 }
Daniel Cheng9fb887ff2021-10-01 20:27:38106 ~DocumentServiceBFCacheBrowserTest() override = default;
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10107
108 private:
109 base::test::ScopedFeatureList feature_list_;
110};
111
Daniel Cheng9fb887ff2021-10-01 20:27:38112IN_PROC_BROWSER_TEST_F(DocumentServiceBFCacheBrowserTest, DocumentService) {
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10113 GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
114 GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
115
116 // 1) Navigate to A.
117 ASSERT_TRUE(NavigateToURL(shell(), url_a));
118 RenderFrameHost* rfh_a =
Dave Tapuska327c06c92022-06-13 20:31:51119 web_contents()->GetPrimaryMainFrame(); // current_frame_host();
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10120 RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
121
122 mojo::Remote<mojom::Echo> echo_remote;
123 bool echo_deleted = false;
Daniel Cheng9fb887ff2021-10-01 20:27:38124 new DocumentServiceEchoImpl(
danakjc70aec1f2022-07-07 15:48:19125 *rfh_a, echo_remote.BindNewPipeAndPassReceiver(),
Julie Jeongeun Kim5a66adb42021-08-11 07:14:10126 base::BindOnce([](bool* deleted) { *deleted = true; }, &echo_deleted));
127
128 // 2) Navigate to B.
129 ASSERT_TRUE(NavigateToURL(shell(), url_b));
130
131 // - Page A should be in the cache.
132 ASSERT_FALSE(delete_observer_rfh_a.deleted());
133 EXPECT_EQ(rfh_a->GetLifecycleState(),
134 RenderFrameHost::LifecycleState::kInBackForwardCache);
135 EXPECT_FALSE(echo_deleted);
136
137 // 3) Go back.
138 web_contents()->GetController().GoBack();
139 EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
140 EXPECT_FALSE(echo_deleted);
141
142 // 4) Prevent caching and navigate to B.
143 DisableBFCacheForRFHForTesting(rfh_a);
144 ASSERT_TRUE(NavigateToURL(shell(), url_b));
145 delete_observer_rfh_a.WaitUntilDeleted();
146 EXPECT_TRUE(echo_deleted);
147}
148
149} // namespace content