| Index: chrome/browser/plugins/plugin_power_saver_browsertest.cc
|
| diff --git a/chrome/browser/plugins/plugin_power_saver_browsertest.cc b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..839f4b09ba6190746547c20d351fd2d0334ac76d
|
| --- /dev/null
|
| +++ b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
|
| @@ -0,0 +1,135 @@
|
| +// Copyright 2015 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 "base/command_line.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "chrome/test/base/ui_test_utils.h"
|
| +#include "content/public/test/browser_test_utils.h"
|
| +#include "content/public/test/ppapi_test_utils.h"
|
| +#include "content/public/test/test_utils.h"
|
| +#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| +#include "ui/gfx/geometry/point.h"
|
| +
|
| +class PluginPowerSaverBrowserTest : virtual public InProcessBrowserTest {
|
| + public:
|
| + void SetUpCommandLine(base::CommandLine* command_line) override {
|
| + command_line->AppendSwitch(switches::kEnablePluginPowerSaver);
|
| +
|
| + ppapi::RegisterTestPlugin(command_line);
|
| + }
|
| +
|
| + protected:
|
| + void LoadHTML(const char* html) {
|
| + std::string url_str = "data:text/html;charset=utf-8,";
|
| + url_str.append(html);
|
| + ui_test_utils::NavigateToURL(browser(), GURL(url_str));
|
| + EXPECT_TRUE(content::WaitForRenderFrameReady(
|
| + GetActiveWebContents()->GetMainFrame()));
|
| + }
|
| +
|
| + content::WebContents* GetActiveWebContents() {
|
| + return browser()->tab_strip_model()->GetActiveWebContents();
|
| + }
|
| +
|
| + bool IsPluginPeripheral(const char* element_id) {
|
| + std::string script = base::StringPrintf(
|
| + "var plugin = window.document.getElementById('%s');"
|
| + "if (plugin != undefined) {"
|
| + " var b = plugin.postMessage == undefined || plugin.isPeripheral();"
|
| + " window.domAutomationController.send(b);"
|
| + "}",
|
| + element_id);
|
| +
|
| + bool result = false;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractBool(GetActiveWebContents(),
|
| + script, &result));
|
| + return result;
|
| + }
|
| +
|
| + // This sends a simulated click at |point| and waits (by polling) for the
|
| + // plugin to be marked essential and run. Simply cycling the message loops
|
| + // does not work, as the renderer process must mark the plugin essential.
|
| + void SimulateClickAndAwaitMarkedEssential(const char* element_id,
|
| + const gfx::Point& point) {
|
| + content::SimulateMouseClickAt(GetActiveWebContents(), 0 /* modifiers */,
|
| + blink::WebMouseEvent::ButtonLeft,
|
| + point);
|
| +
|
| + std::string script = base::StringPrintf(
|
| + "function checkEssential() {"
|
| + " var plugin = window.document.getElementById('%s');"
|
| + " if (plugin == undefined) {"
|
| + " window.domAutomationController.send(false);"
|
| + " return;"
|
| + " }"
|
| + " if (plugin.postMessage != undefined && !plugin.isPeripheral()) {"
|
| + " window.domAutomationController.send(true);"
|
| + " } else {"
|
| + " setTimeout(checkEssential, 50);"
|
| + " }"
|
| + "}"
|
| + "checkEssential();",
|
| + element_id);
|
| +
|
| + bool result = false;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractBool(GetActiveWebContents(),
|
| + script, &result));
|
| + EXPECT_TRUE(result);
|
| + }
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, SmallSameOrigin) {
|
| + LoadHTML(
|
| + "<object id='plugin' data='fake.swf' "
|
| + "type='application/x-ppapi-tests' width='400' height='100'></object>");
|
| + EXPECT_FALSE(IsPluginPeripheral("plugin"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, SmallCrossOrigin) {
|
| + LoadHTML(
|
| + "<object id='plugin' data='http://otherorigin.com/fake.swf' "
|
| + "type='application/x-ppapi-tests' width='400' height='100'></object>");
|
| + EXPECT_TRUE(IsPluginPeripheral("plugin"));
|
| +
|
| + SimulateClickAndAwaitMarkedEssential("plugin", gfx::Point(50, 50));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, LargeCrossOrigin) {
|
| + LoadHTML(
|
| + "<object id='plugin' data='http://otherorigin.com/fake.swf' "
|
| + "type='application/x-ppapi-tests' width='400' height='500'></object>");
|
| + EXPECT_FALSE(IsPluginPeripheral("plugin"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, LargePluginsUsePosters) {
|
| + LoadHTML(
|
| + "<object id='plugin' type='application/x-ppapi-tests' "
|
| + " width='400' height='500'>"
|
| + " <param name='poster' value='snapshot1x.png 1x, snapshot2x.png 2x' />"
|
| + "</object>");
|
| + EXPECT_TRUE(IsPluginPeripheral("plugin"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, OriginWhitelisting) {
|
| + LoadHTML(
|
| + "<object id='plugin1' data='http://otherorigin.com/fake1.swf' "
|
| + "type='application/x-ppapi-tests' width='400' height='100'></object>"
|
| + "<object id='plugin2' data='http://otherorigin.com/fake2.swf' "
|
| + "type='application/x-ppapi-tests' width='400' height='500'></object>");
|
| + EXPECT_FALSE(IsPluginPeripheral("plugin1"));
|
| + EXPECT_FALSE(IsPluginPeripheral("plugin2"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PluginPowerSaverBrowserTest, LargeCrossOriginObscured) {
|
| + LoadHTML(
|
| + "<div style='width: 100px; height: 100px; overflow: hidden;'>"
|
| + " <object id='plugin' data='http://otherorigin.com/fake.swf' "
|
| + " type='application/x-ppapi-tests' width='400' height='500'></object>"
|
| + "</div>");
|
| + EXPECT_TRUE(IsPluginPeripheral("plugin"));
|
| +}
|
|
|