diff options
author | jeremycho@chromium.org <jeremycho@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 00:28:08 +0000 |
---|---|---|
committer | jeremycho@chromium.org <jeremycho@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 00:28:08 +0000 |
commit | 3473ae0b1c61b56164c960b030174b0ab7904e74 (patch) | |
tree | a52be99c389538d036cb7e3714fcbd6aa9c13c99 | |
parent | 1612015462fa13cc354b42b84b51b63c12ee8a04 (diff) | |
download | chromium_src-3473ae0b1c61b56164c960b030174b0ab7904e74.zip chromium_src-3473ae0b1c61b56164c960b030174b0ab7904e74.tar.gz chromium_src-3473ae0b1c61b56164c960b030174b0ab7904e74.tar.bz2 |
Handle key sequence for toggling voice search. This is a no-op until ontogglevoicesearch is added server-side.
This will be used in lieu of the current server-side implementation of this keyboard shortcut to handle cases where Chrome is capturing keystrokes (see internal bug b/9123020). In the future, we may also use this API to initiate voice search from an icon in the omnibox.
BUG=230417
Review URL: https://chromiumcodereview.appspot.com/15721006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204677 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/browser_commands.cc | 2 | ||||
-rw-r--r-- | chrome/browser/ui/browser_instant_controller.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/browser_instant_controller.h | 3 | ||||
-rw-r--r-- | chrome/browser/ui/search/instant_controller.cc | 5 | ||||
-rw-r--r-- | chrome/browser/ui/search/instant_controller.h | 4 | ||||
-rw-r--r-- | chrome/browser/ui/search/instant_extended_interactive_uitest.cc | 36 | ||||
-rw-r--r-- | chrome/browser/ui/search/instant_page.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/search/instant_page.h | 3 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 2 | ||||
-rw-r--r-- | chrome/renderer/resources/extensions/searchbox_api.js | 3 | ||||
-rw-r--r-- | chrome/renderer/searchbox/searchbox.cc | 9 | ||||
-rw-r--r-- | chrome/renderer/searchbox/searchbox.h | 1 | ||||
-rw-r--r-- | chrome/renderer/searchbox/searchbox_extension.cc | 27 | ||||
-rw-r--r-- | chrome/renderer/searchbox/searchbox_extension.h | 1 | ||||
-rw-r--r-- | chrome/test/data/instant_extended.html | 6 |
15 files changed, 103 insertions, 7 deletions
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 81e4c91..e5ee6e8a 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc @@ -929,6 +929,8 @@ void OpenUpdateChromeDialog(Browser* browser) { void ToggleSpeechInput(Browser* browser) { browser->tab_strip_model()->GetActiveWebContents()-> GetRenderViewHost()->ToggleSpeechInput(); + if (browser->instant_controller()) + browser->instant_controller()->ToggleVoiceSearch(); } bool CanRequestTabletSite(WebContents* current_tab) { diff --git a/chrome/browser/ui/browser_instant_controller.cc b/chrome/browser/ui/browser_instant_controller.cc index c2d3ab4..8bf0279 100644 --- a/chrome/browser/ui/browser_instant_controller.cc +++ b/chrome/browser/ui/browser_instant_controller.cc @@ -242,6 +242,10 @@ void BrowserInstantController::SetOmniboxBounds(const gfx::Rect& bounds) { instant_.SetOmniboxBounds(bounds); } +void BrowserInstantController::ToggleVoiceSearch() { + instant_.ToggleVoiceSearch(); +} + void BrowserInstantController::ResetInstant(const std::string& pref_name) { bool instant_checkbox_checked = chrome::IsInstantCheckboxChecked(profile()); bool use_local_overlay_only = diff --git a/chrome/browser/ui/browser_instant_controller.h b/chrome/browser/ui/browser_instant_controller.h index 8143e0a..2821438 100644 --- a/chrome/browser/ui/browser_instant_controller.h +++ b/chrome/browser/ui/browser_instant_controller.h @@ -99,6 +99,9 @@ class BrowserInstantController : public content::NotificationObserver, // Sets the stored omnibox bounds. void SetOmniboxBounds(const gfx::Rect& bounds); + // Notifies |instant_| to toggle voice search. + void ToggleVoiceSearch(); + private: // Sets the value of |instant_| based on value from profile. Invoked // on pref change. diff --git a/chrome/browser/ui/search/instant_controller.cc b/chrome/browser/ui/search/instant_controller.cc index d3cf87a2..4e93098 100644 --- a/chrome/browser/ui/search/instant_controller.cc +++ b/chrome/browser/ui/search/instant_controller.cc @@ -740,6 +740,11 @@ void InstantController::OmniboxNavigateToURL() { instant_tab_->Submit(string16()); } +void InstantController::ToggleVoiceSearch() { + if (instant_tab_) + instant_tab_->ToggleVoiceSearch(); +} + void InstantController::InstantPageLoadFailed(content::WebContents* contents) { if (!chrome::ShouldPreferRemoteNTPOnStartup() || !extended_enabled()) { // We only need to fall back on errors if we're showing the online page diff --git a/chrome/browser/ui/search/instant_controller.h b/chrome/browser/ui/search/instant_controller.h index 96634be..45aea2b 100644 --- a/chrome/browser/ui/search/instant_controller.h +++ b/chrome/browser/ui/search/instant_controller.h @@ -146,6 +146,9 @@ class InstantController : public InstantPage::Delegate { // an onsubmit notification to the instant page. void OmniboxNavigateToURL(); + // Notifies |instant_Tab_| to toggle voice search. + void ToggleVoiceSearch(); + // The overlay WebContents. May be NULL. InstantController retains ownership. content::WebContents* GetOverlayContents() const; @@ -301,6 +304,7 @@ class InstantController : public InstantPage::Delegate { FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, LogDropdownShown); FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, OverlayDoesNotEchoSearchProviderNAVSUGGEST); + FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, KeyboardTogglesVoiceSearch); Profile* profile() const; diff --git a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc index 2c7ce55..d5048cb 100644 --- a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc +++ b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc @@ -124,7 +124,8 @@ class InstantExtendedTest : public InProcessBrowserTest, submit_count_(0), on_esc_key_press_event_calls_(0), on_focus_changed_calls_(0), - is_focused_(false) { + is_focused_(false), + on_toggle_voice_search_calls_(0) { } protected: virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { @@ -192,7 +193,9 @@ class InstantExtendedTest : public InProcessBrowserTest, GetIntFromJS(contents, "onFocusChangedCalls", &on_focus_changed_calls_) && GetBoolFromJS(contents, "isFocused", - &is_focused_); + &is_focused_) && + GetIntFromJS(contents, "onToggleVoiceSearchCalls", + &on_toggle_voice_search_calls_); } TemplateURL* GetDefaultSearchProviderTemplateURL() { @@ -246,6 +249,7 @@ class InstantExtendedTest : public InProcessBrowserTest, std::string query_value_; int on_focus_changed_calls_; bool is_focused_; + int on_toggle_voice_search_calls_; }; // Test class used to verify chrome-search: scheme and access policy from the @@ -2681,3 +2685,31 @@ IN_PROC_BROWSER_TEST_F(InstantExtendedTest, TaskManagerPrefix) { } EXPECT_EQ(2, instant_overlays); } + +// Broken on mac: http://crbug.com/247448 +#if defined(OS_MACOSX) +#define MAYBE_KeyboardTogglesVoiceSearch DISABLED_KeyboardTogglesVoiceSearch +#else +#define MAYBE_KeyboardTogglesVoiceSearch KeyboardTogglesVoiceSearch +#endif +IN_PROC_BROWSER_TEST_F(InstantExtendedTest, MAYBE_KeyboardTogglesVoiceSearch) { + ASSERT_NO_FATAL_FAILURE(SetupInstant(browser())); + FocusOmniboxAndWaitForInstantOverlayAndNTPSupport(); + + // Test that toggle is not fired when no tab is open. + ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_OEM_PERIOD, + true, true, false, false)); + EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents())); + EXPECT_EQ(0, on_toggle_voice_search_calls_); + + // Open new tab and test that toggle is fired. + ui_test_utils::NavigateToURLWithDisposition( + browser(), + GURL(chrome::kChromeUINewTabURL), + NEW_FOREGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_OEM_PERIOD, + true, true, false, false)); + EXPECT_TRUE(UpdateSearchState(instant()->instant_tab()->contents())); + EXPECT_EQ(1, on_toggle_voice_search_calls_); +} diff --git a/chrome/browser/ui/search/instant_page.cc b/chrome/browser/ui/search/instant_page.cc index 40ce71d..9b4a021 100644 --- a/chrome/browser/ui/search/instant_page.cc +++ b/chrome/browser/ui/search/instant_page.cc @@ -122,6 +122,10 @@ void InstantPage::SendMostVisitedItems( Send(new ChromeViewMsg_SearchBoxMostVisitedItemsChanged(routing_id(), items)); } +void InstantPage::ToggleVoiceSearch() { + Send(new ChromeViewMsg_SearchBoxToggleVoiceSearch(routing_id())); +} + InstantPage::InstantPage(Delegate* delegate, const std::string& instant_url) : delegate_(delegate), instant_url_(instant_url), diff --git a/chrome/browser/ui/search/instant_page.h b/chrome/browser/ui/search/instant_page.h index 8f58bbc..56d1291 100644 --- a/chrome/browser/ui/search/instant_page.h +++ b/chrome/browser/ui/search/instant_page.h @@ -195,6 +195,9 @@ class InstantPage : public content::WebContentsObserver { void SendMostVisitedItems( const std::vector<InstantMostVisitedItemIDPair>& items); + // Tells the page to toggle voice search. + void ToggleVoiceSearch(); + protected: InstantPage(Delegate* delegate, const std::string& instant_url); diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index 349b50f..2c43b60 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -378,6 +378,8 @@ IPC_MESSAGE_ROUTED1(ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion, IPC_MESSAGE_ROUTED0(ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions) +IPC_MESSAGE_ROUTED0(ChromeViewMsg_SearchBoxToggleVoiceSearch) + // Toggles visual muting of the render view area. This is on when a constrained // window is showing. IPC_MESSAGE_ROUTED1(ChromeViewMsg_SetVisuallyDeemphasized, diff --git a/chrome/renderer/resources/extensions/searchbox_api.js b/chrome/renderer/resources/extensions/searchbox_api.js index 1ab18a7..c17ae98 100644 --- a/chrome/renderer/resources/extensions/searchbox_api.js +++ b/chrome/renderer/resources/extensions/searchbox_api.js @@ -211,7 +211,7 @@ if (!chrome.embeddedSearch) { }; this.navigateContentWindow = function(destination, disposition) { NavigateSearchBox(destination, disposition); - } + }; this.showBars = function() { ShowBars(); }; @@ -228,6 +228,7 @@ if (!chrome.embeddedSearch) { this.onnativesuggestions = null; this.onbarshidden = null; this.onfocuschange = null; + this.ontogglevoicesearch = null; // DEPRECATED. These methods are from the legacy searchbox API. // TODO(jered): Delete these. diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc index 4aa93c3..0791727 100644 --- a/chrome/renderer/searchbox/searchbox.cc +++ b/chrome/renderer/searchbox/searchbox.cc @@ -182,6 +182,8 @@ bool SearchBox::OnMessageReceived(const IPC::Message& message) { OnFontInformationReceived) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged, OnMostVisitedChanged) + IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch, + OnToggleVoiceSearch) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -430,3 +432,10 @@ GURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const { InstantMostVisitedItem item; return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL(); } + +void SearchBox::OnToggleVoiceSearch() { + if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { + extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch( + render_view()->GetWebView()->mainFrame()); + } +} diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h index ec58f40..21ff065 100644 --- a/chrome/renderer/searchbox/searchbox.h +++ b/chrome/renderer/searchbox/searchbox.h @@ -145,6 +145,7 @@ class SearchBox : public content::RenderViewObserver, size_t omnibox_font_size); void OnMostVisitedChanged( const std::vector<InstantMostVisitedItemIDPair>& items); + void OnToggleVoiceSearch(); // Returns the current zoom factor of the render view or 1 on failure. double GetZoom() const; diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc index 8d823f4..27545ae 100644 --- a/chrome/renderer/searchbox/searchbox_extension.cc +++ b/chrome/renderer/searchbox/searchbox_extension.cc @@ -433,10 +433,12 @@ static const char kDispatchMostVisitedChangedScript[] = static const char kDispatchBarsHiddenEventScript[] = "if (window.chrome &&" - " window.chrome.searchBox &&" - " window.chrome.searchBox.onbarshidden &&" - " typeof window.chrome.searchBox.onbarshidden == 'function') {" - " window.chrome.searchBox.onbarshidden();" + " window.chrome.embeddedSearch &&" + " window.chrome.embeddedSearch.searchBox &&" + " window.chrome.embeddedSearch.searchBox.onbarshidden &&" + " typeof window.chrome.embeddedSearch.searchBox.onbarshidden ==" + " 'function') {" + " window.chrome.embeddedSearch.searchBox.onbarshidden();" " true;" "}"; @@ -451,6 +453,17 @@ static const char kDispatchFocusChangedScript[] = " true;" "}"; +static const char kDispatchToggleVoiceSearchScript[] = + "if (window.chrome &&" + " window.chrome.embeddedSearch &&" + " window.chrome.embeddedSearch.searchBox &&" + " window.chrome.embeddedSearch.searchBox.ontogglevoicesearch &&" + " typeof window.chrome.embeddedSearch.searchBox.ontogglevoicesearch ==" + " 'function') {" + " window.chrome.embeddedSearch.searchBox.ontogglevoicesearch();" + " true;" + "}"; + // ---------------------------------------------------------------------------- class SearchBoxExtensionWrapper : public v8::Extension { @@ -1479,4 +1492,10 @@ void SearchBoxExtension::DispatchFocusChange(WebKit::WebFrame* frame) { Dispatch(frame, kDispatchFocusChangedScript); } +// static +void SearchBoxExtension::DispatchToggleVoiceSearch( + WebKit::WebFrame* frame) { + Dispatch(frame, kDispatchToggleVoiceSearchScript); +} + } // namespace extensions_v8 diff --git a/chrome/renderer/searchbox/searchbox_extension.h b/chrome/renderer/searchbox/searchbox_extension.h index 3ff7fad..45adc92 100644 --- a/chrome/renderer/searchbox/searchbox_extension.h +++ b/chrome/renderer/searchbox/searchbox_extension.h @@ -41,6 +41,7 @@ class SearchBoxExtension { static void DispatchThemeChange(WebKit::WebFrame* frame); static void DispatchBarsHidden(WebKit::WebFrame* frame); static void DispatchFocusChange(WebKit::WebFrame* frame); + static void DispatchToggleVoiceSearch(WebKit::WebFrame* frame); // New Tab Page API. static void DispatchMostVisitedChanged(WebKit::WebFrame* frame); diff --git a/chrome/test/data/instant_extended.html b/chrome/test/data/instant_extended.html index 151485f..acff3da 100644 --- a/chrome/test/data/instant_extended.html +++ b/chrome/test/data/instant_extended.html @@ -18,6 +18,7 @@ var onChangeCalls = 0; var submitCount = 0; var onEscKeyPressedCalls = 0; var onFocusChangedCalls = 0; +var onToggleVoiceSearchCalls = 0; var isFocused = false; var onvisibilitycalls = 0; @@ -112,6 +113,10 @@ function handleFocusChange() { isFocused = apiHandle.isFocused; } +function handleToggleVoiceSearch() { + onToggleVoiceSearchCalls++; +} + function setUp() { apiHandle = getApiHandle(); if (!apiHandle) @@ -123,6 +128,7 @@ function setUp() { apiHandle.onchange = handleOnChange; apiHandle.onkeypress = handleKeyPress; apiHandle.onfocuschange = handleFocusChange; + apiHandle.ontogglevoicesearch = handleToggleVoiceSearch; newTabPageHandle.onmostvisitedchange = handleMostVisitedChange; if (apiHandle.value) { handleNativeSuggestions(); |