| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Forked from: //chrome/browser/policy/test/jit_policy_browsertest.cc |
| |
| #include <vector> |
| |
| #include "base/values.h" |
| #include "chrome/browser/policy/policy_test_utils.h" |
| #include "chrome/test/base/chrome_test_utils.h" |
| #include "components/content_settings/core/common/content_settings.h" |
| #include "components/policy/core/common/policy_map.h" |
| #include "components/policy/policy_constants.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test.h" |
| #include "content/public/test/test_utils.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| |
| namespace policy { |
| |
| namespace { |
| |
| enum DefaultV8OptimizerPolicyVariants { |
| DISABLED_BY_DEFAULT, |
| ENABLED_BY_DEFAULT, |
| NOT_SET |
| }; |
| |
| } // namespace |
| |
| class V8OptimizerPolicyTest |
| : public PolicyTest, |
| public testing::WithParamInterface<DefaultV8OptimizerPolicyVariants> { |
| public: |
| V8OptimizerPolicyTest() = default; |
| ~V8OptimizerPolicyTest() override = default; |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| PolicyTest::SetUpCommandLine(command_line); |
| // This is needed for this test to run properly on platforms where |
| // --site-per-process isn't the default, such as Android. |
| content::IsolateAllSitesForTesting(command_line); |
| } |
| |
| void SetPolicyValue(PolicyMap* map, const char* key, const char* value) { |
| base::Value::List value_list; |
| if (value) { |
| value_list.Append(value); |
| } |
| SetPolicy(map, key, base::Value(std::move(value_list))); |
| } |
| |
| // Set the allowed and blocked policies. Each of |allowed_site| and |
| // |blocked_site| is a single domain ("foo.com") or domain wildcard |
| // ("[*.]foo.com"). |
| void ConfigurePolicy(const char* allowed_site, const char* blocked_site) { |
| PolicyMap policies; |
| AddDefaultPolicy(&policies); |
| |
| SetPolicyValue(&policies, key::kJavaScriptOptimizerAllowedForSites, |
| allowed_site); |
| SetPolicyValue(&policies, key::kJavaScriptOptimizerBlockedForSites, |
| blocked_site); |
| |
| provider_.UpdateChromePolicy(policies); |
| } |
| |
| void NavigateAndExpectPolicyResult(const char* hostname, |
| bool expect_disabled) { |
| ASSERT_TRUE(NavigateToUrl( |
| embedded_test_server()->GetURL(hostname, "/title1.html"), this)); |
| EXPECT_EQ(expect_disabled, |
| current_frame_host()->GetProcess()->AreV8OptimizationsDisabled()); |
| } |
| |
| content::RenderFrameHost* current_frame_host() { |
| return chrome_test_utils::GetActiveWebContents(this)->GetPrimaryMainFrame(); |
| } |
| |
| protected: |
| void AddDefaultPolicy(PolicyMap* policies) { |
| switch (GetParam()) { |
| case DISABLED_BY_DEFAULT: |
| SetPolicy(policies, key::kDefaultJavaScriptOptimizerSetting, |
| base::Value(CONTENT_SETTING_BLOCK)); |
| break; |
| case ENABLED_BY_DEFAULT: |
| SetPolicy(policies, key::kDefaultJavaScriptOptimizerSetting, |
| base::Value(CONTENT_SETTING_ALLOW)); |
| break; |
| case NOT_SET: |
| break; |
| } |
| } |
| |
| bool DetermineExpectedResultForDefault() { |
| switch (GetParam()) { |
| case DISABLED_BY_DEFAULT: |
| return true; |
| case ENABLED_BY_DEFAULT: |
| case NOT_SET: |
| return false; |
| } |
| } |
| }; |
| |
| IN_PROC_BROWSER_TEST_P(V8OptimizerPolicyTest, V8OptimizerAllowedAndDisallowed) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| |
| ConfigurePolicy("optimizer-enabled.com", "optimizer-disabled.com"); |
| |
| GURL disabled_url = |
| embedded_test_server()->GetURL("optimizer-disabled.com", "/title1.html"); |
| ASSERT_TRUE(NavigateToUrl(disabled_url, this)); |
| auto* render_frame_host = current_frame_host(); |
| EXPECT_FALSE(render_frame_host->GetProcess()->IsJitDisabled()); |
| EXPECT_TRUE(render_frame_host->GetProcess()->AreV8OptimizationsDisabled()); |
| |
| GURL enabled_url = |
| embedded_test_server()->GetURL("optimizer-enabled.com", "/title1.html"); |
| ASSERT_TRUE(NavigateToUrl(enabled_url, this)); |
| render_frame_host = current_frame_host(); |
| EXPECT_FALSE(render_frame_host->GetProcess()->IsJitDisabled()); |
| EXPECT_FALSE(render_frame_host->GetProcess()->AreV8OptimizationsDisabled()); |
| |
| GURL default_url = embedded_test_server()->GetURL("foo.com", "/title1.html"); |
| ASSERT_TRUE(NavigateToUrl(default_url, this)); |
| |
| render_frame_host = current_frame_host(); |
| |
| EXPECT_FALSE(render_frame_host->GetProcess()->IsJitDisabled()); |
| EXPECT_EQ(DetermineExpectedResultForDefault(), |
| render_frame_host->GetProcess()->AreV8OptimizationsDisabled()); |
| } |
| |
| IN_PROC_BROWSER_TEST_P(V8OptimizerPolicyTest, V8OptimizerHostnameMatching) { |
| // For brevity, this test only tests Deny rules, because Allow rules are |
| // tested above. |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| |
| // Check subdomains work. |
| ConfigurePolicy(nullptr, "foo.com"); |
| NavigateAndExpectPolicyResult("foo.com", true); |
| NavigateAndExpectPolicyResult("subdomain.foo.com", true); |
| ConfigurePolicy(nullptr, "[*.]foo.com"); |
| NavigateAndExpectPolicyResult("subdomain.foo.com", true); |
| |
| const bool expected = DetermineExpectedResultForDefault(); |
| |
| // Policy applies to different domain. |
| ConfigurePolicy(nullptr, "foo.com"); |
| NavigateAndExpectPolicyResult("bar.com", expected); |
| |
| // Here there is an invalid policy as the V8 optimizer policies only support |
| // eTLD+1 as origin. |
| ConfigurePolicy(nullptr, "subdomain.foo.com"); |
| NavigateAndExpectPolicyResult("foo.com", expected); |
| NavigateAndExpectPolicyResult("subdomain.foo.com", expected); |
| } |
| |
| INSTANTIATE_TEST_SUITE_P(DefaultDisabled, |
| V8OptimizerPolicyTest, |
| testing::Values(DISABLED_BY_DEFAULT)); |
| INSTANTIATE_TEST_SUITE_P(DefaultEnabled, |
| V8OptimizerPolicyTest, |
| testing::Values(ENABLED_BY_DEFAULT)); |
| INSTANTIATE_TEST_SUITE_P(DefaultNotSet, |
| V8OptimizerPolicyTest, |
| testing::Values(NOT_SET)); |
| |
| } // namespace policy |