From 34139b1b9dfb91cea022ffe31414ffe722dc49f5 Mon Sep 17 00:00:00 2001 From: "Brian R. Bondy" Date: Mon, 28 May 2018 11:54:27 -0400 Subject: [PATCH] Add browsertest for Flash --- ...ent_settings_observer_flash_browsertest.cc | 203 ++++++++++++++++++ test/BUILD.gn | 6 + test/data/flash.html | 22 ++ 3 files changed, 231 insertions(+) create mode 100644 renderer/brave_content_settings_observer_flash_browsertest.cc create mode 100644 test/data/flash.html diff --git a/renderer/brave_content_settings_observer_flash_browsertest.cc b/renderer/brave_content_settings_observer_flash_browsertest.cc new file mode 100644 index 000000000000..df7f9649c6d2 --- /dev/null +++ b/renderer/brave_content_settings_observer_flash_browsertest.cc @@ -0,0 +1,203 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "base/path_service.h" +#include "brave/browser/brave_content_browser_client.h" +#include "brave/common/brave_paths.h" +#include "brave/components/brave_shields/common/brave_shield_constants.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h" +#include "chrome/common/chrome_content_client.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/common/content_switches.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/ppapi_test_utils.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings_types.h" +#include "net/dns/mock_host_resolver.h" + +const char kFlashPluginExists[] = + "domAutomationController.send(Array.from(navigator.plugins).filter(" + " x => Array.from(x).some(" + " y => y.type === 'application/x-shockwave-flash')).length)"; + +namespace { + +class PageReloadWaiter { + public: + explicit PageReloadWaiter(content::WebContents* web_contents) + : web_contents_(web_contents), + navigation_observer_(web_contents, + web_contents->GetLastCommittedURL()) {} + + bool Wait() { + navigation_observer_.WaitForNavigationFinished(); + return content::WaitForLoadStop(web_contents_); + } + + private: + content::WebContents* web_contents_; + content::TestNavigationManager navigation_observer_; +}; + +} // namespace + +class BraveContentSettingsObserverFlashBrowserTest : public InProcessBrowserTest { + public: + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + + content_client_.reset(new ChromeContentClient); + content::SetContentClient(content_client_.get()); + browser_content_client_.reset(new BraveContentBrowserClient()); + content::SetBrowserClientForTesting(browser_content_client_.get()); + + host_resolver()->AddRule("*", "127.0.0.1"); + content::SetupCrossSiteRedirector(embedded_test_server()); + + brave::RegisterPathProvider(); + base::FilePath test_data_dir; + PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); + embedded_test_server()->ServeFilesFromDirectory(test_data_dir); + + ASSERT_TRUE(embedded_test_server()->Start()); + + url_ = embedded_test_server()->GetURL("a.com", "/flash.html"); + top_level_page_pattern_ = + ContentSettingsPattern::FromString("http://a.com/*"); + } + + // PermissionsBrowserTest + void SetUpCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpCommandLine(command_line); + ASSERT_TRUE(ppapi::RegisterFlashTestPlugin(command_line)); + // These tests are for the permission prompt to add and remove Flash from + // navigator.plugins. We disable Plugin Power Saver, because its plugin + // throttling make it harder to test if Flash was succcessfully enabled. + command_line->AppendSwitchASCII( + switches::kOverridePluginPowerSaverForTesting, "never"); + } + + void TearDown() override { + browser_content_client_.reset(); + content_client_.reset(); + } + + const GURL& url() { return url_; } + + const ContentSettingsPattern& top_level_page_pattern() { + return top_level_page_pattern_; + } + + const ContentSettingsPattern& empty_pattern() { + return empty_pattern_; + } + + HostContentSettingsMap * content_settings() { + return HostContentSettingsMapFactory::GetForProfile(browser()->profile()); + } + + void UnblockFlash() { + content_settings()->SetContentSettingCustomScope( + top_level_page_pattern_, + ContentSettingsPattern::Wildcard(), + CONTENT_SETTINGS_TYPE_PLUGINS, + std::string(), + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT); + } + + void AllowFlash() { + content_settings()->SetContentSettingCustomScope( + top_level_page_pattern_, + ContentSettingsPattern::Wildcard(), + CONTENT_SETTINGS_TYPE_PLUGINS, + std::string(), + CONTENT_SETTING_ALLOW); + } + + content::WebContents* contents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + bool RunScriptReturnBool(const std::string &script) { + bool value; + EXPECT_TRUE(ExecuteScriptAndExtractBool(contents(), script, &value)); + return value; + } + + + bool NavigateToURLUntilLoadStop(const GURL& url) { + ui_test_utils::NavigateToURL(browser(), url); + return WaitForLoadStop(contents()); + } + + private: + GURL url_; + ContentSettingsPattern top_level_page_pattern_; + ContentSettingsPattern empty_pattern_; + std::unique_ptr content_client_; + std::unique_ptr browser_content_client_; + + base::ScopedTempDir temp_user_data_dir_; +}; + +// Flash is blocked by default +IN_PROC_BROWSER_TEST_F(BraveContentSettingsObserverFlashBrowserTest, + BlockFlashByDefault) { + NavigateToURLUntilLoadStop(url()); + int len; + ASSERT_TRUE(ExecuteScriptAndExtractInt(contents(), + kFlashPluginExists, &len)); + ASSERT_EQ(len, 0); +} + +// Flash is unblocked and click to play eventually allows +IN_PROC_BROWSER_TEST_F(BraveContentSettingsObserverFlashBrowserTest, + UnblockFlash) { + UnblockFlash(); + NavigateToURLUntilLoadStop(url()); + int len; + ASSERT_TRUE(ExecuteScriptAndExtractInt(contents(), + kFlashPluginExists, &len)); + ASSERT_EQ(len, 0); + + PermissionRequestManager* manager = PermissionRequestManager::FromWebContents( + contents()); + + auto popup_prompt_factory = + std::make_unique(manager); + + EXPECT_EQ(0, popup_prompt_factory->TotalRequestCount()); + popup_prompt_factory->set_response_type(PermissionRequestManager::ACCEPT_ALL); + + PageReloadWaiter reload_waiter(contents()); + EXPECT_TRUE(RunScriptReturnBool("triggerPrompt();")); + EXPECT_TRUE(reload_waiter.Wait()); + + EXPECT_EQ(1, popup_prompt_factory->TotalRequestCount()); + + // Shut down the popup window tab, as the normal test teardown assumes there + // is only one test tab. + popup_prompt_factory.reset(); + + ASSERT_TRUE(ExecuteScriptAndExtractInt(contents(), + kFlashPluginExists, &len)); + ASSERT_GT(len, 0); +} + +// Flash is explicitly allowed +IN_PROC_BROWSER_TEST_F(BraveContentSettingsObserverFlashBrowserTest, + AllowFlashExplicitAllows) { + AllowFlash(); + NavigateToURLUntilLoadStop(url()); + int len; + ASSERT_TRUE(ExecuteScriptAndExtractInt(contents(), + kFlashPluginExists, &len)); + ASSERT_GT(len, 0); +} + diff --git a/test/BUILD.gn b/test/BUILD.gn index 5843d5315084..11f46e295cf3 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -77,6 +77,7 @@ test("brave_browser_tests") { "//brave/components/brave_shields/browser/tracking_protection_service_browsertest.cc", "//brave/extensions/browser/brave_extension_provider_browsertest.cc", "//brave/renderer/brave_content_settings_observer_browsertest.cc", + "//brave/renderer/brave_content_settings_observer_flash_browsertest.cc", "//chrome/browser/extensions/browsertest_util.cc", "//chrome/browser/extensions/browsertest_util.h", "//chrome/browser/extensions/extension_browsertest.cc", @@ -90,6 +91,11 @@ test("brave_browser_tests") { deps = [ "//chrome/browser/ui", "//chrome/test:browser_tests_runner", + "//ppapi/features", ":brave_browser_tests_deps", ] + data_deps = [ + "//ppapi:ppapi_tests", + "//ppapi:power_saver_test_plugin", + ] } diff --git a/test/data/flash.html b/test/data/flash.html new file mode 100644 index 000000000000..31ff2ed4a787 --- /dev/null +++ b/test/data/flash.html @@ -0,0 +1,22 @@ + + + + + + + + Flash not supported. +
+ + Download Flash. + +
+ + +