Index: chrome/browser/extensions/extension_keybinding_apitest.cc |
diff --git a/chrome/browser/extensions/extension_keybinding_apitest.cc b/chrome/browser/extensions/extension_keybinding_apitest.cc |
index 1d424094a587a91870d7c0716d81922fba33f2fb..e3f2ec38e2308b5f5691dc32401be26496e747ca 100644 |
--- a/chrome/browser/extensions/extension_keybinding_apitest.cc |
+++ b/chrome/browser/extensions/extension_keybinding_apitest.cc |
@@ -10,7 +10,6 @@ |
#include "chrome/browser/extensions/extension_action.h" |
#include "chrome/browser/extensions/extension_action_manager.h" |
#include "chrome/browser/extensions/extension_apitest.h" |
-#include "chrome/browser/extensions/tab_helper.h" |
#include "chrome/browser/sessions/session_tab_helper.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_command_controller.h" |
@@ -20,7 +19,7 @@ |
#include "chrome/test/base/ui_test_utils.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/web_contents.h" |
-#include "content/public/test/browser_test_utils.h" |
+#include "content/public/test/javascript_test_observer.h" |
#include "extensions/browser/extension_registry.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/feature_switch.h" |
@@ -34,6 +33,7 @@ using content::WebContents; |
namespace extensions { |
namespace { |
+ |
// This extension ID is used for tests require a stable ID over multiple |
// extension installs. |
const char kId[] = "pgoakhfeplldmjheffidklpoklkppipp"; |
@@ -42,8 +42,10 @@ const char kId[] = "pgoakhfeplldmjheffidklpoklkppipp"; |
// test extensions use Alt+Shift+F and Alt+Shift+H. |
const char kAltShiftG[] = "Alt+Shift+G"; |
-// Color name of named command for overwrite_bookmark_shortcut test extension. |
-const char kOverwriteBookmarkShortcutCommandColor[] = "green"; |
+// Name of the command for the "basics" test extension. |
+const char kBasicsShortcutCommandName[] = "toggle-feature"; |
+// Name of the command for the overwrite_bookmark_shortcut test extension. |
+const char kOverwriteBookmarkShortcutCommandName[] = "send message"; |
#if defined(OS_MACOSX) |
const char kBookmarkKeybinding[] = "Command+D"; |
@@ -65,6 +67,62 @@ bool SendBookmarkKeyPressSync(Browser* browser) { |
// Named command for media key overwrite test. |
const char kMediaKeyTestCommand[] = "test_mediakeys_update"; |
+// A scoped observer that listens for dom automation messages. |
+class DomMessageListener : public content::TestMessageHandler { |
+ public: |
+ explicit DomMessageListener(content::WebContents* web_contents); |
+ ~DomMessageListener() override; |
+ |
+ // Wait until a message is received. |
+ void Wait(); |
+ |
+ // Clears and resets the observer. |
+ void Clear(); |
+ |
+ const std::string& message() const { return message_; } |
+ |
+ private: |
+ // content::TestMessageHandler: |
+ MessageResponse HandleMessage(const std::string& json) override; |
+ void Reset() override; |
+ |
+ // The message received. Note that this will be JSON, so if it is a string, |
+ // it will be wrapped in quotes. |
+ std::string message_; |
+ |
+ content::JavascriptTestObserver observer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DomMessageListener); |
+}; |
+ |
+DomMessageListener::DomMessageListener(content::WebContents* web_contents) |
+ : observer_(web_contents, this) { |
+} |
+ |
+DomMessageListener::~DomMessageListener() { |
+} |
+ |
+void DomMessageListener::Wait() { |
+ observer_.Run(); |
+} |
+ |
+void DomMessageListener::Clear() { |
+ // We don't just call this in DomMessageListener::Reset() because the |
+ // JavascriptTestObserver's Reset() method also resets its handler (this). |
+ observer_.Reset(); |
+} |
+ |
+content::TestMessageHandler::MessageResponse DomMessageListener::HandleMessage( |
+ const std::string& json) { |
+ message_ = json; |
+ return DONE; |
+} |
+ |
+void DomMessageListener::Reset() { |
+ TestMessageHandler::Reset(); |
+ message_.clear(); |
+} |
+ |
} // namespace |
class CommandsApiTest : public ExtensionApiTest { |
@@ -139,35 +197,22 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, Basic) { |
EXPECT_FALSE(IsGrantedForTab(extension, tab)); |
- // Activate the shortcut (Ctrl+Shift+F). |
+ ExtensionTestMessageListener test_listener(false); // Won't reply. |
+ // Activate the browser action shortcut (Ctrl+Shift+F). |
ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
browser(), ui::VKEY_F, true, true, false, false)); |
- |
+ EXPECT_TRUE(test_listener.WaitUntilSatisfied()); |
// activeTab should now be granted. |
EXPECT_TRUE(IsGrantedForTab(extension, tab)); |
- |
// Verify the command worked. |
- bool result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function(){" |
- " if(document.body.bgColor == 'red'){" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
- |
- // Activate the shortcut (Ctrl+Shift+Y). |
+ EXPECT_EQ(std::string("basics browser action"), test_listener.message()); |
+ |
+ test_listener.Reset(); |
+ // Activate the command shortcut (Ctrl+Shift+Y). |
ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
browser(), ui::VKEY_Y, true, true, false, false)); |
- |
- result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function(){" |
- " if(document.body.bgColor == 'blue'){" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
+ EXPECT_TRUE(test_listener.WaitUntilSatisfied()); |
+ EXPECT_EQ(std::string(kBasicsShortcutCommandName), test_listener.message()); |
} |
IN_PROC_BROWSER_TEST_F(CommandsApiTest, PageAction) { |
@@ -257,53 +302,45 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, DontOverwriteSystemShortcuts) { |
ui_test_utils::NavigateToURL( |
browser(), test_server()->GetURL("files/extensions/test_file.txt")); |
- WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
- ASSERT_TRUE(tab); |
- |
- // Activate the shortcut (Alt+Shift+F) to make the page blue. |
+ // Activate the regular shortcut (Alt+Shift+F). |
+ ExtensionTestMessageListener alt_shift_f_listener("alt_shift_f", false); |
+ ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
+ browser(), ui::VKEY_F, false, true, true, false)); |
+ EXPECT_TRUE(alt_shift_f_listener.WaitUntilSatisfied()); |
+ |
+ // Try to activate the bookmark shortcut (Ctrl+D). This should not work |
+ // without requesting via chrome_settings_overrides. |
+ // |
+ // Since keypresses are sent synchronously, we can check this by first sending |
+ // Ctrl+D (which shouldn't work), followed by Alt+Shift+F (which should work), |
+ // and listening for both. If, by the time we receive the Alt+Shift+F |
+ // response, we haven't received a response for Ctrl+D, it is safe to say we |
+ // won't receive one. |
{ |
- ResultCatcher catcher; |
+ ExtensionTestMessageListener ctrl_d_listener("ctrl_d", false); |
+ alt_shift_f_listener.Reset(); |
+ // Send Ctrl+D. |
+ ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
+ // Send Alt+Shift+F. |
ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
browser(), ui::VKEY_F, false, true, true, false)); |
- ASSERT_TRUE(catcher.GetNextResult()); |
+ EXPECT_TRUE(alt_shift_f_listener.WaitUntilSatisfied()); |
+ EXPECT_FALSE(ctrl_d_listener.was_satisfied()); |
} |
- bool result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function() {" |
- " if (document.body.bgColor == 'blue') {" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
- |
- // Activate the bookmark shortcut (Ctrl+D) to make the page green (should not |
- // work without requesting via chrome_settings_overrides). |
- ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
- |
- // The page should still be blue. |
- result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function() {" |
- " if (document.body.bgColor == 'blue') {" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
- |
- // Activate the shortcut (Ctrl+F) to make the page red (should not work). |
- ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
- browser(), ui::VKEY_F, true, false, false, false)); |
- |
- // The page should still be blue. |
- result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function() {" |
- " if (document.body.bgColor == 'blue') {" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
+ // Try to activate the Ctrl+F shortcut (shouldn't work). |
+ { |
+ ExtensionTestMessageListener ctrl_f_listener("ctrl_f", false); |
+ alt_shift_f_listener.Reset(); |
+ // Send Ctrl+F. |
+ ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
+ browser(), ui::VKEY_F, true, false, false, false)); |
+ // Send Alt+Shift+F. |
+ ASSERT_TRUE(ui_test_utils::SendKeyPressSync( |
+ browser(), ui::VKEY_F, false, true, true, false)); |
+ EXPECT_TRUE(alt_shift_f_listener.WaitUntilSatisfied()); |
+ EXPECT_FALSE(ctrl_f_listener.was_satisfied()); |
+ } |
} |
// This test validates that an extension can remove the Chrome bookmark shortcut |
@@ -384,25 +421,12 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, OverwriteBookmarkShortcut) { |
ui_test_utils::NavigateToURL( |
browser(), test_server()->GetURL("files/extensions/test_file.txt")); |
- WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
- ASSERT_TRUE(tab); |
- |
- // Activate the shortcut (Ctrl+D) to make the page green. |
- { |
- ResultCatcher catcher; |
- ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
- ASSERT_TRUE(catcher.GetNextResult()); |
- } |
- |
- bool result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- std::string("setInterval(function() {") + |
- " if (document.body.bgColor == '" + |
- kOverwriteBookmarkShortcutCommandColor + "') {" + |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
+ // Activate the shortcut (Ctrl+D) to send a test message. |
+ ExtensionTestMessageListener test_listener(false); // Won't reply. |
+ ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
+ EXPECT_TRUE(test_listener.WaitUntilSatisfied()); |
+ EXPECT_EQ(std::string(kOverwriteBookmarkShortcutCommandName), |
+ test_listener.message()); |
} |
// This test validates that an extension that requests to override the Chrome |
@@ -428,11 +452,11 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, |
EXPECT_TRUE(command_service->GetNamedCommands( |
extension->id(), CommandService::SUGGESTED, CommandService::ANY_SCOPE, |
&commands)); |
- EXPECT_EQ(1u, commands.count(kOverwriteBookmarkShortcutCommandColor)); |
+ EXPECT_EQ(1u, commands.count(kOverwriteBookmarkShortcutCommandName)); |
// Simulate the user removing the Ctrl+D keybinding from the command. |
command_service->RemoveKeybindingPrefs( |
- extension->id(), kOverwriteBookmarkShortcutCommandColor); |
+ extension->id(), kOverwriteBookmarkShortcutCommandName); |
// Force the command enable state to be recalculated. |
browser()->command_controller()->ExtensionStateChanged(); |
@@ -463,18 +487,12 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, |
WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
ASSERT_TRUE(tab); |
- // Activate the shortcut (Ctrl+D) which should be handled by the page and make |
- // the background color magenta. |
+ // Activate the shortcut (Ctrl+D) which should be handled by the page and send |
+ // a test message. |
+ DomMessageListener listener(tab); |
ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
- |
- bool result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function() {" |
- " if (document.body.bgColor == 'magenta') {" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
+ listener.Wait(); |
+ EXPECT_EQ(std::string("\"web page received\""), listener.message()); |
} |
// This test validates that user-set override of the Chrome bookmark shortcut in |
@@ -506,21 +524,11 @@ IN_PROC_BROWSER_TEST_F(CommandsApiTest, |
test_server()->GetURL( |
"files/extensions/test_file_with_ctrl-d_keybinding.html")); |
- WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
- ASSERT_TRUE(tab); |
- |
- // Activate the shortcut (Ctrl+D) which should be handled by the extension and |
- // make the background color red. |
+ ExtensionTestMessageListener test_listener(false); // Won't reply. |
+ // Activate the shortcut (Ctrl+D) which should be handled by the extension. |
ASSERT_TRUE(SendBookmarkKeyPressSync(browser())); |
- |
- bool result = false; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- tab, |
- "setInterval(function() {" |
- " if (document.body.bgColor == 'red') {" |
- " window.domAutomationController.send(true)}}, 100)", |
- &result)); |
- ASSERT_TRUE(result); |
+ EXPECT_TRUE(test_listener.WaitUntilSatisfied()); |
+ EXPECT_EQ(std::string("basics browser action"), test_listener.message()); |
} |
#if defined(OS_WIN) |