blob: b9142d457fd8bd73e80b307daad2a0903be302b1 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test.h"
#include "extensions/common/extension.h"
#include "net/dns/mock_host_resolver.h"
namespace extensions {
class ExtensionBackForwardCacheBrowserTest : public ExtensionBrowserTest {
public:
explicit ExtensionBackForwardCacheBrowserTest(
bool allow_content_scripts = true) {
feature_list_.InitWithFeaturesAndParameters(
{{features::kBackForwardCache,
{{"content_injection_supported",
allow_content_scripts ? "true" : "false"}}}},
{features::kBackForwardCacheMemoryControls});
}
void SetUpOnMainThread() override {
host_resolver()->AddRule("*", "127.0.0.1");
ExtensionBrowserTest::SetUpOnMainThread();
}
private:
base::test::ScopedFeatureList feature_list_;
};
class ExtensionBackForwardCacheContentScriptDisabledBrowserTest
: public ExtensionBackForwardCacheBrowserTest {
public:
ExtensionBackForwardCacheContentScriptDisabledBrowserTest()
: ExtensionBackForwardCacheBrowserTest(/*allow_content_scripts=*/false) {}
};
IN_PROC_BROWSER_TEST_F(
ExtensionBackForwardCacheContentScriptDisabledBrowserTest,
ScriptDisallowed) {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("back_forward_cache")
.AppendASCII("content_script")));
ASSERT_TRUE(embedded_test_server()->Start());
GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
// 1) Navigate to A.
content::RenderFrameHost* rfh_a =
ui_test_utils::NavigateToURL(browser(), url_a);
content::RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
// 2) Navigate to B.
content::RenderFrameHost* rfh_b =
ui_test_utils::NavigateToURL(browser(), url_b);
content::RenderFrameDeletedObserver delete_observer_rfh_b(rfh_b);
// Expect that |rfh_a| is destroyed as it wouldn't be placed in the cache.
delete_observer_rfh_a.WaitUntilDeleted();
}
IN_PROC_BROWSER_TEST_F(ExtensionBackForwardCacheBrowserTest, ScriptAllowed) {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("back_forward_cache")
.AppendASCII("content_script")));
ASSERT_TRUE(embedded_test_server()->Start());
GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
// 1) Navigate to A.
content::RenderFrameHost* rfh_a =
ui_test_utils::NavigateToURL(browser(), url_a);
content::RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
// 2) Navigate to B.
content::RenderFrameHost* rfh_b =
ui_test_utils::NavigateToURL(browser(), url_b);
content::RenderFrameDeletedObserver delete_observer_rfh_b(rfh_b);
// Ensure that |rfh_a| is in the cache.
EXPECT_FALSE(delete_observer_rfh_a.deleted());
EXPECT_NE(rfh_a, rfh_b);
EXPECT_EQ(rfh_a->GetLifecycleState(),
content::RenderFrameHost::LifecycleState::kInBackForwardCache);
}
IN_PROC_BROWSER_TEST_F(
ExtensionBackForwardCacheContentScriptDisabledBrowserTest,
CSSDisallowed) {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("back_forward_cache")
.AppendASCII("content_css")));
ASSERT_TRUE(embedded_test_server()->Start());
GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
// 1) Navigate to A.
content::RenderFrameHost* rfh_a =
ui_test_utils::NavigateToURL(browser(), url_a);
content::RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
// 2) Navigate to B.
content::RenderFrameHost* rfh_b =
ui_test_utils::NavigateToURL(browser(), url_b);
content::RenderFrameDeletedObserver delete_observer_rfh_b(rfh_b);
// Expect that |rfh_a| is destroyed as it wouldn't be placed in the cache.
delete_observer_rfh_a.WaitUntilDeleted();
}
IN_PROC_BROWSER_TEST_F(ExtensionBackForwardCacheBrowserTest, CSSAllowed) {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("back_forward_cache")
.AppendASCII("content_css")));
ASSERT_TRUE(embedded_test_server()->Start());
GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
// 1) Navigate to A.
content::RenderFrameHost* rfh_a =
ui_test_utils::NavigateToURL(browser(), url_a);
content::RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
// 2) Navigate to B.
content::RenderFrameHost* rfh_b =
ui_test_utils::NavigateToURL(browser(), url_b);
content::RenderFrameDeletedObserver delete_observer_rfh_b(rfh_b);
// Ensure that |rfh_a| is in the cache.
EXPECT_FALSE(delete_observer_rfh_a.deleted());
EXPECT_NE(rfh_a, rfh_b);
EXPECT_EQ(rfh_a->GetLifecycleState(),
content::RenderFrameHost::LifecycleState::kInBackForwardCache);
}
} // namespace extensions