15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardApiTest : public ExtensionApiTest {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadHostedApp(const std::string& app_name,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& launch_page);
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ExecuteCopyInSelectedTab();
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ExecutePasteInSelectedTab();
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ExecuteCommandInIframeInSelectedTab(const char* command);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ExecuteScriptInSelectedTab(const std::string& script);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ClipboardApiTest::LoadHostedApp(const std::string& app_name,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& launch_page) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("*", "127.0.0.1");
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!StartEmbeddedTestServer()) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_ = "Failed to start test server.";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!LoadExtension(test_data_dir_.AppendASCII("clipboard")
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   .AppendASCII(app_name))) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_ = "Failed to load hosted app.";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL base_url = embedded_test_server()->GetURL(
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/extensions/api_test/clipboard/");
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replace_host;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_str("localhost");  // Must stay in scope with replace_host.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replace_host.SetHostStr(host_str);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_url = base_url.ReplaceComponents(replace_host);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string launch_page_path =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("%s/%s", app_name.c_str(), launch_page.c_str());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), base_url.Resolve(launch_page_path));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ClipboardApiTest::ExecuteCopyInSelectedTab() {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kScript[] =
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(document.execCommand('copy'))";
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return ExecuteScriptInSelectedTab(kScript);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ClipboardApiTest::ExecutePasteInSelectedTab() {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kScript[] =
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(document.execCommand('paste'))";
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return ExecuteScriptInSelectedTab(kScript);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ClipboardApiTest::ExecuteCommandInIframeInSelectedTab(
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const char* command) {
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char kScript[] =
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "var ifr = document.createElement('iframe');\n"
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "document.body.appendChild(ifr);\n"
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "ifr.contentDocument.write('<script>parent.domAutomationController.send("
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          "document.execCommand(\"%s\"))</script>');";
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return ExecuteScriptInSelectedTab(base::StringPrintf(kScript, command));
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ClipboardApiTest::ExecuteScriptInSelectedTab(const std::string& script) {
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool result;
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK(content::ExecuteScriptAndExtractBool(
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        script,
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &result));
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return result;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClipboardApiTest, Extension) {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("clipboard/extension")) << message_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClipboardApiTest, ExtensionNoPermission) {
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("clipboard/extension_no_permission"))
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClipboardApiTest, HostedApp) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadHostedApp("hosted_app", "main.html")) << message_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExecuteCopyInSelectedTab()) << message_;
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExecutePasteInSelectedTab()) << message_;
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExecuteCommandInIframeInSelectedTab("copy")) << message_;
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExecuteCommandInIframeInSelectedTab("paste")) << message_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClipboardApiTest, HostedAppNoPermission) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadHostedApp("hosted_app_no_permission", "main.html"))
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(ExecuteCopyInSelectedTab()) << message_;
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(ExecutePasteInSelectedTab()) << message_;
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(ExecuteCommandInIframeInSelectedTab("copy")) << message_;
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(ExecuteCommandInIframeInSelectedTab("paste")) << message_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122