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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/active_tab_permission_granter.h"
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/api/commands/command_service.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This extension ID is used for tests require a stable ID over multiple
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// extension installs.
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kId[] = "pgoakhfeplldmjheffidklpoklkppipp";
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Default keybinding to use for emulating user-defined shortcut overrides. The
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// test extensions use Alt+Shift+F and Alt+Shift+H.
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kAltShiftG[] = "Alt+Shift+G";
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandsApiTest : public ExtensionApiTest {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandsApiTest() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CommandsApiTest() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionTestUtil GetBrowserActionsBar() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BrowserActionTestUtil(browser());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool IsGrantedForTab(const Extension* extension,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       const content::WebContents* web_contents) {
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return extension->permissions_data()->HasAPIPermissionForTab(
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        SessionTabHelper::IdForTab(web_contents), APIPermission::kTab);
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RunChromeOSConversionTest(const std::string& extension_path) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Setup the environment.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(test_server()->Start());
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(RunExtensionTest(extension_path)) << message_;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui_test_utils::NavigateToURL(
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(), test_server()->GetURL("files/extensions/test_file.txt"));
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ResultCatcher catcher;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Send all expected keys (Search+Shift+{Left, Up, Right, Down}).
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(), ui::VKEY_LEFT, false, true, false, true));
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(), ui::VKEY_UP, false, true, false, true));
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(), ui::VKEY_RIGHT, false, true, false, true));
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(), ui::VKEY_DOWN, false, true, false, true));
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(catcher.GetNextResult());
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_CHROMEOS
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the basic functionality of the Keybinding API:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - That pressing the shortcut keys should perform actions (activate the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   browser action or send an event).
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Note: Page action keybindings are tested in PageAction test below.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The shortcut keys taken by one extension are not overwritten by the last
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   installed extension.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, Basic) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/basics")) << message_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = GetSingleLoadedExtension();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension) << message_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load this extension, which uses the same keybindings but sets the page
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to different colors. This is so we can see that it doesn't interfere. We
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't test this extension in any other way (it should otherwise be
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immaterial to this test).
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/conflicting")) << message_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that there are two browser actions in the toolbar.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, GetBrowserActionsBar().NumberOfBrowserActions());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/extensions/test_file.txt"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // activeTab shouldn't have been granted yet.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(IsGrantedForTab(extension, tab));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activate the shortcut (Ctrl+Shift+F).
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), ui::VKEY_F, true, true, false, false));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // activeTab should now be granted.
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(IsGrantedForTab(extension, tab));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the command worked.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "setInterval(function(){"
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  if(document.body.bgColor == 'red'){"
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activate the shortcut (Ctrl+Shift+Y).
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), ui::VKEY_Y, true, true, false, false));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = false;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "setInterval(function(){"
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  if(document.body.bgColor == 'blue'){"
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky on linux and chromeos, http://crbug.com/165825
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PageAction PageAction
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PageAction DISABLED_PageAction
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, MAYBE_PageAction) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/page_action")) << message_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = GetSingleLoadedExtension();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension) << message_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load a page, the extension will detect the navigation and request to show
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the page action icon.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResultCatcher catcher;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server()->GetURL("files/extensions/test_file.txt"));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(catcher.GetNextResult());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure it appears and is the right one.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_id = SessionTabHelper::FromWebContents(
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents())->session_id().id();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* action =
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionActionManager::Get(browser()->profile())->
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPageAction(*extension);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(action);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Make this page red", action->GetTitle(tab_id));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activate the shortcut (Alt+Shift+F).
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), ui::VKEY_F, false, true, true, false));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the command worked (the page action turns the page red).
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "setInterval(function(){"
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  if(document.body.bgColor == 'red'){"
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test validates that the getAll query API function returns registered
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commands as well as synthesized ones and that inactive commands (like the
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synthesized ones are in nature) have no shortcuts.
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, SynthesizedCommand) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/synthesized")) << message_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test validates that an extension cannot request a shortcut that is
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// already in use by Chrome.
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, DontOverwriteSystemShortcuts) {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/dont_overwrite_system")) << message_;
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server()->GetURL("files/extensions/test_file.txt"));
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(tab);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Activate the shortcut (Alt+Shift+F) to make the page blue.
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ResultCatcher catcher;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser(), ui::VKEY_F, false, true, true, false));
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(catcher.GetNextResult());
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result = false;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "setInterval(function() {"
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "  if (document.body.bgColor == 'blue') {"
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &result));
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Activate the bookmark shortcut (Ctrl+D) to make the page green (should not
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // work without requesting via chrome_settings_overrides).
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser(), ui::VKEY_D, false, false, false, true));
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser(), ui::VKEY_D, true, false, false, false));
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The page should still be blue.
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  result = false;
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tab,
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "setInterval(function() {"
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "  if (document.body.bgColor == 'blue') {"
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &result));
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(result);
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Activate the shortcut (Ctrl+F) to make the page red (should not work).
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser(), ui::VKEY_F, true, false, false, false));
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The page should still be blue.
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  result = false;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "setInterval(function() {"
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "  if (document.body.bgColor == 'blue') {"
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &result));
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test validates that an extension can override the Chrome bookmark
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// shortcut if it has requested to do so.
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, OverwriteBookmarkShortcut) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This functionality requires a feature flag.
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "--enable-override-bookmarks-ui",
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "1");
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/overwrite_bookmark_shortcut"))
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      test_server()->GetURL("files/extensions/test_file.txt"));
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(tab);
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Activate the shortcut (Ctrl+D) to make the page green.
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ResultCatcher catcher;
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser(), ui::VKEY_D, false, false, false, true));
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser(), ui::VKEY_D, true, false, false, false));
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(catcher.GetNextResult());
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool result = false;
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tab,
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "setInterval(function() {"
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "  if (document.body.bgColor == 'green') {"
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "    window.domAutomationController.send(true)}}, 100)",
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &result));
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(result);
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This test validates that an extension override of the Chrome bookmark
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// shortcut does not supersede the same keybinding by web pages.
313116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(CommandsApiTest,
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       OverwriteBookmarkShortcutDoesNotOverrideWebKeybinding) {
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(test_server()->Start());
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This functionality requires a feature flag.
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "--enable-override-bookmarks-ui",
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "1");
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(RunExtensionTest("keybinding/overwrite_bookmark_shortcut"))
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      << message_;
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_test_utils::NavigateToURL(browser(),
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test_server()->GetURL(
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          "files/extensions/test_file_with_ctrl-d_keybinding.html"));
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(tab);
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Activate the shortcut (Ctrl+D) which should be handled by the page and make
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the background color magenta.
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser(), ui::VKEY_D, false, false, false, true));
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser(), ui::VKEY_D, true, false, false, false));
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool result = false;
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tab,
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "setInterval(function() {"
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "  if (document.body.bgColor == 'magenta') {"
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "    window.domAutomationController.send(true)}}, 100)",
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &result));
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(result);
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This test validates that user-set override of the Chrome bookmark shortcut in
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// an extension that does not request it does supersede the same keybinding by
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// web pages.
357116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(CommandsApiTest,
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       OverwriteBookmarkShortcutByUserOverridesWebKeybinding) {
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(test_server()->Start());
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This functionality requires a feature flag.
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "--enable-override-bookmarks-ui",
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "1");
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(RunExtensionTest("keybinding/basics"))
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      << message_;
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CommandService* command_service = CommandService::Get(browser()->profile());
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Extension* extension = GetSingleLoadedExtension();
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate the user setting the keybinding to Ctrl+D.
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* hotkey = "Command+D";
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* hotkey = "Ctrl+D";
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(OS_MACOSX)
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  command_service->UpdateKeybindingPrefs(
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extension->id(), manifest_values::kBrowserActionCommandEvent, hotkey);
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_test_utils::NavigateToURL(browser(),
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test_server()->GetURL(
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          "files/extensions/test_file_with_ctrl-d_keybinding.html"));
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(tab);
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Activate the shortcut (Ctrl+D) which should be handled by the extension and
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // make the background color red.
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser(), ui::VKEY_D, false, false, false, true));
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser(), ui::VKEY_D, true, false, false, false));
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool result = false;
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tab,
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "setInterval(function() {"
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "  if (document.body.bgColor == 'red') {"
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "    window.domAutomationController.send(true)}}, 100)",
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &result));
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(result);
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Currently this feature is implemented on Windows only.
412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_AllowDuplicatedMediaKeys AllowDuplicatedMediaKeys
413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_AllowDuplicatedMediaKeys DISABLED_AllowDuplicatedMediaKeys
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that media keys go to all extensions that register for them.
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, MAYBE_AllowDuplicatedMediaKeys) {
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ResultCatcher catcher;
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/non_global_media_keys_0"))
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << message_;
422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult());
423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("keybinding/non_global_media_keys_1"))
424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << message_;
425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult());
426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Activate the Media Stop key.
428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser(), ui::VKEY_MEDIA_STOP, false, false, false, false));
430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We should get two success result.
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult());
433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult());
434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, ShortcutAddedOnUpdate) {
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1_unassigned = PackExtensionWithOptions(
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1_unassigned"),
444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1_unassigned.crx"),
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2 = PackExtensionWithOptions(
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2"),
450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2.crx"),
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension without keybinding assigned.
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1_unassigned, 1));
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it is set to nothing.
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_UNKNOWN, accelerator.key_code());
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 with keybinding.
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2, 0));
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+F.
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_F, accelerator.key_code());
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, ShortcutChangedOnUpdate) {
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1 = PackExtensionWithOptions(
487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1"),
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1.crx"),
490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2_reassigned = PackExtensionWithOptions(
493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2_reassigned"),
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2_reassigned.crx"),
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension.
503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1, 1));
504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+F.
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_F, accelerator.key_code());
511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 with different keybinding assigned.
516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2_reassigned, 0));
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+H.
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_H, accelerator.key_code());
524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest, ShortcutRemovedOnUpdate) {
530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1 = PackExtensionWithOptions(
535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1"),
537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1.crx"),
538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2_unassigned = PackExtensionWithOptions(
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2_unassigned"),
543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2_unassigned.crx"),
544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
545f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension.
551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1, 1));
552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+F.
556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_F, accelerator.key_code());
559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 without keybinding assigned.
564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2_unassigned, 0));
565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify the keybinding gets set to nothing.
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_UNKNOWN, accelerator.key_code());
572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       ShortcutAddedOnUpdateAfterBeingAssignedByUser) {
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1_unassigned = PackExtensionWithOptions(
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1_unassigned"),
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1_unassigned.crx"),
584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2 = PackExtensionWithOptions(
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2"),
589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2.crx"),
590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension without keybinding assigned.
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1_unassigned, 1));
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it is set to nothing.
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_UNKNOWN, accelerator.key_code());
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the user setting the keybinding to Alt+Shift+G.
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_service->UpdateKeybindingPrefs(
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent, kAltShiftG);
609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 with keybinding.
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2, 0));
612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify the previously-set keybinding is still set.
616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_G, accelerator.key_code());
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest,
625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       ShortcutChangedOnUpdateAfterBeingReassignedByUser) {
626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1 = PackExtensionWithOptions(
631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1"),
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1.crx"),
634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2_reassigned = PackExtensionWithOptions(
637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2_reassigned"),
639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2_reassigned.crx"),
640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension.
647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1, 1));
648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
651f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+F.
652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_F, accelerator.key_code());
655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the user setting the keybinding to Alt+Shift+G.
660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_service->UpdateKeybindingPrefs(
661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent, kAltShiftG);
662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 with different keybinding assigned.
664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2_reassigned, 0));
665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+G.
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_G, accelerator.key_code());
672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
676f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CommandsApiTest,
678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       ShortcutRemovedOnUpdateAfterBeingReassignedByUser) {
679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedTempDir scoped_temp_dir;
680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path = test_data_dir_.
682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AppendASCII("keybinding").AppendASCII("keybinding.pem");
683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v1 = PackExtensionWithOptions(
684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v1"),
686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v1.crx"),
687f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
689f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path_v2_unassigned = PackExtensionWithOptions(
690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      test_data_dir_.AppendASCII("keybinding").AppendASCII("update")
691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    .AppendASCII("v2_unassigned"),
692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_temp_dir.path().AppendASCII("v2_unassigned.crx"),
693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      pem_path,
694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath());
695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
696f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommandService* command_service = CommandService::Get(browser()->profile());
698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Install v1 of the extension.
700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(path_v1, 1));
701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify it has a command of Alt+Shift+F.
705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Accelerator accelerator = command_service->FindCommandByName(
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_F, accelerator.key_code());
708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the user reassigning the keybinding to Alt+Shift+G.
713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_service->UpdateKeybindingPrefs(
714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent, kAltShiftG);
715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update to version 2 without keybinding assigned.
717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(UpdateExtension(kId, path_v2_unassigned, 0));
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry->GetExtensionById(kId, ExtensionRegistry::ENABLED) !=
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              NULL);
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify the keybinding is still set.
722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  accelerator = command_service->FindCommandByName(
723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kId, manifest_values::kBrowserActionCommandEvent).accelerator();
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(ui::VKEY_G, accelerator.key_code());
725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(accelerator.IsCtrlDown());
726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsShiftDown());
727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(accelerator.IsAltDown());
728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) && !defined(NDEBUG)
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(dtseng): Test times out on Chrome OS debug. See http://crbug.com/412456.
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ContinuePropagation DISABLED_ContinuePropagation
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ContinuePropagation ContinuePropagation
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(CommandsApiTest, MAYBE_ContinuePropagation) {
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Setup the environment.
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(test_server()->Start());
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(RunExtensionTest("keybinding/continue_propagation")) << message_;
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui_test_utils::NavigateToURL(
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), test_server()->GetURL("files/extensions/test_file.txt"));
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResultCatcher catcher;
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Activate the shortcut (Ctrl+Shift+F). The page should capture the
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // keystroke and not the extension since |onCommand| has no event listener
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // initially.
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), ui::VKEY_F, true, true, false, false));
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(catcher.GetNextResult());
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Now, the extension should have added an |onCommand| event listener.
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Send the same key, but the |onCommand| listener should now receive it.
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), ui::VKEY_F, true, true, false, false));
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(catcher.GetNextResult());
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The extension should now have removed its |onCommand| event listener.
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Finally, the page should again receive the key.
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), ui::VKEY_F, true, true, false, false));
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(catcher.GetNextResult());
7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test is only applicable on Chrome OS.
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// http://crbug.com/410534
7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_OZONE)
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ChromeOSConversions DISABLED_ChromeOSConversions
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ChromeOSConversions ChromeOSConversions
7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(CommandsApiTest, MAYBE_ChromeOSConversions) {
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunChromeOSConversionTest("keybinding/chromeos_conversions");
7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_CHROMEOS
7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace extensions
782