summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeremycho@chromium.org <jeremycho@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 00:28:08 +0000
committerjeremycho@chromium.org <jeremycho@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 00:28:08 +0000
commit3473ae0b1c61b56164c960b030174b0ab7904e74 (patch)
treea52be99c389538d036cb7e3714fcbd6aa9c13c99
parent1612015462fa13cc354b42b84b51b63c12ee8a04 (diff)
downloadchromium_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.cc2
-rw-r--r--chrome/browser/ui/browser_instant_controller.cc4
-rw-r--r--chrome/browser/ui/browser_instant_controller.h3
-rw-r--r--chrome/browser/ui/search/instant_controller.cc5
-rw-r--r--chrome/browser/ui/search/instant_controller.h4
-rw-r--r--chrome/browser/ui/search/instant_extended_interactive_uitest.cc36
-rw-r--r--chrome/browser/ui/search/instant_page.cc4
-rw-r--r--chrome/browser/ui/search/instant_page.h3
-rw-r--r--chrome/common/render_messages.h2
-rw-r--r--chrome/renderer/resources/extensions/searchbox_api.js3
-rw-r--r--chrome/renderer/searchbox/searchbox.cc9
-rw-r--r--chrome/renderer/searchbox/searchbox.h1
-rw-r--r--chrome/renderer/searchbox/searchbox_extension.cc27
-rw-r--r--chrome/renderer/searchbox/searchbox_extension.h1
-rw-r--r--chrome/test/data/instant_extended.html6
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();