searchbox.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/searchbox/searchbox.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <string>
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/omnibox_focus_state.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/searchbox/searchbox_extension.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "googleurl/src/gurl.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/renderer_resources.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/escape.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size of the results cache.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxInstantAutocompleteResultItemCacheSize = 100;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if items stored in |old_item_id_pairs| and |new_items| are
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// equal.
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AreMostVisitedItemsEqual(
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<InstantMostVisitedItemIDPair>& old_item_id_pairs,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<InstantMostVisitedItem>& new_items) {
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (old_item_id_pairs.size() != new_items.size())
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < new_items.size(); ++i) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (new_items[i].url != old_item_id_pairs[i].second.url ||
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new_items[i].title != old_item_id_pairs[i].second.title) {
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return false;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal {  // for testing
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Parses |url| and fills in |id| with the InstantRestrictedID obtained from the
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// |url|. |render_view_id| is the ID of the associated RenderView.
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Valid |url| forms:
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://favicon/<view_id>/<restricted_id>
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://thumb/<view_id>/<restricted_id>
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If the |url| is valid, returns true and fills in |id| with restricted_id
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// value. If the |url| is invalid, returns false and |id| is not set.
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetInstantRestrictedIDFromURL(int render_view_id,
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   const GURL& url,
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   InstantRestrictedID* id) {
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Strip leading path.
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string path = url.path().substr(1);
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check that the path is of Most visited item ID form.
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<std::string> tokens;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (Tokenize(path, "/", &tokens) != 2)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int view_id = 0;
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(tokens[0], &view_id) || view_id != render_view_id)
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::StringToInt(tokens[1], id);
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace internal
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : content::RenderViewObserver(render_view),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewObserverTracker<SearchBox>(render_view),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      verbatim_(false),
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      query_is_restricted_(false),
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_start_(0),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_end_(0),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_margin_(0),
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_focused_(false),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_key_capture_enabled_(false),
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      is_input_in_progress_(false),
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_instant_results_(false),
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      omnibox_font_size_(0),
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      app_launcher_enabled_(false),
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      autocomplete_results_cache_(kMaxInstantAutocompleteResultItemCacheSize),
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::SetSuggestions(
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantSuggestion>& suggestions) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!suggestions.empty() &&
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggestions[0].behavior == INSTANT_COMPLETE_REPLACE) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetQuery(suggestions[0].text, true);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly allow empty vector to be sent to the browser.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SetSuggestions(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), suggestions));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::SetVoiceSearchSupported(bool supported) {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  render_view()->Send(new ChromeViewHostMsg_SetVoiceSearchSupported(
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId(), supported));
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::MarkQueryAsRestricted() {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = true;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  query_.clear();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowInstantOverlay(int height, InstantSizeUnits units) {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_ShowInstantOverlay(
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), height,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      units));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::FocusOmnibox() {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_VISIBLE));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StartCapturingKeyStrokes() {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_INVISIBLE));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StopCapturingKeyStrokes() {
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_NONE));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              content::PageTransition transition,
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              WindowOpenDisposition disposition,
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              bool is_search_type) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      url, transition, disposition, is_search_type));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::DeleteMostVisitedItem(
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem(
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetURLForMostVisitedItem(most_visited_item_id)));
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoMostVisitedDeletion(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion(
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetURLForMostVisitedItem(most_visited_item_id)));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions(
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowBars() {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << render_view() << " ShowBars";
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxShowBars(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::HideBars() {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << render_view() << " HideBars";
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxHideBars(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int SearchBox::GetStartMargin() const {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<int>(start_margin_ / GetZoom());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect SearchBox::GetPopupBounds() const {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double zoom = GetZoom();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Rect(static_cast<int>(popup_bounds_.x() / zoom),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.y() / zoom),
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.width() / zoom),
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.height() / zoom));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetAutocompleteResults(
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<InstantAutocompleteResultIDPair>* results) const {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autocomplete_results_cache_.GetCurrentItems(results);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetAutocompleteResultWithID(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID autocomplete_result_id,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantAutocompleteResult* result) const {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return autocomplete_results_cache_.GetItemWithRestrictedID(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      autocomplete_result_id, result);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return theme_info_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url,
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     GURL* url) const {
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantRestrictedID rid = 0;
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               transient_url, &rid)) {
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (most_visited_item_url.is_empty())
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *url = GURL(base::StringPrintf("chrome-search://thumb/%s",
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 most_visited_item_url.spec().c_str()));
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url,
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                   GURL* url) const {
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantRestrictedID rid = 0;
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               transient_url, &rid)) {
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (most_visited_item_url.is_empty())
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *url = GURL(base::StringPrintf("chrome-search://favicon/%s",
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 most_visited_item_url.spec().c_str()));
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(SearchBox, message)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxChange, OnChange)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancel, OnCancel)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPopupResize, OnPopupResize)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxBarsHidden, OnBarsHidden)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDetermineIfPageSupportsInstant)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxAutocompleteResults,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnAutocompleteResults)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxUpOrDownKeyPressed,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnUpOrDownKeyPressed)
263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxEscKeyPressed, OnEscKeyPressed)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancelSelection,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCancelSelection)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnSetDisplayInstantResults)
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged)
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetInputInProgress,
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        OnSetInputInProgress)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnThemeChanged)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnFontInformationReceived)
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPromoInformation,
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        OnPromoInformationReceived)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnMostVisitedChanged)
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch,
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        OnToggleVoiceSearch)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnChange(const string16& query,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool verbatim,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t selection_start,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t selection_end) {
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, verbatim);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_start_ = selection_start;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_end_ = selection_end;
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |query| is empty, this is due to the user backspacing away all the text
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // in the omnibox, or hitting Escape to restore the "permanent URL", or
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // switching tabs, etc. In all these cases, there will be no corresponding
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OnAutocompleteResults(), so clear the autocomplete results ourselves, by
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // adding an empty set. Don't notify the page using an "onnativesuggestions"
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // event, though.
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (query.empty()) {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_results_cache_.AddItems(
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::vector<InstantAutocompleteResult>());
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnChange";
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchChange(
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnSubmit(const string16& query) {
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Submit() is called when the user hits Enter to commit the omnibox text.
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |query| is non-blank, the user committed a search. If it's blank, the
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // omnibox text was a URL, and the user is navigating to it, in which case
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we shouldn't update the |query_| or associated state.
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!query.empty()) {
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetQuery(query, true);
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnSubmit";
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchSubmit(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!query.empty())
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Reset();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnCancel(const string16& query) {
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, true);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_start_ = selection_end_ = query_.size();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnCancel";
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchCancel(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnPopupResize(const gfx::Rect& bounds) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_ = bounds;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnPopupResize";
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchResize(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMarginChange(int margin, int width) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_margin_ = margin;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Override only the width parameter of the popup bounds.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_.set_width(width);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMarginChange(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnBarsHidden() {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchBarsHidden(
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " PageSupportsInstant: " << result;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetRoutingID(), render_view()->GetPageId(), result));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnAutocompleteResults(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantAutocompleteResult>& results) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autocomplete_results_cache_.AddItems(results);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnAutocompleteResults";
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchAutocompleteResults(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnUpOrDownKeyPressed(int count) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress: " << count;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchUpOrDownKeyPress(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame(), count);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SearchBox::OnEscKeyPressed() {
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DVLOG(1) << render_view() << " OnEscKeyPressed ";
402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchEscKeyPress(
403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnCancelSelection(const string16& query,
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  bool verbatim,
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_start,
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_end) {
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, verbatim);
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_start_ = selection_start;
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_end_ = selection_end;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress ESC";
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchEscKeyPress(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state,
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               OmniboxFocusChangeReason reason) {
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE;
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (key_capture_enabled != is_key_capture_enabled_) {
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Tell the page if the key capture mode changed unless the focus state
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // changed because of TYPING. This is because in that case, the browser
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // hasn't really stopped capturing key strokes.
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // (More practically, if we don't do this check, the page would receive
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // onkeycapturechange before the corresponding onchange, and the page would
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // have no way of telling whether the keycapturechange happened because of
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // some actual user action or just because they started typing.)
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (reason != OMNIBOX_FOCUS_CHANGE_TYPING &&
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView() &&
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_key_capture_enabled_ = key_capture_enabled;
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DVLOG(1) << render_view() << " OnKeyCaptureChange";
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange(
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          render_view()->GetWebView()->mainFrame());
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE;
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_focused != is_focused_) {
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    is_focused_ = is_focused;
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DVLOG(1) << render_view() << " OnFocusChange";
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (render_view()->GetWebView() &&
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extensions_v8::SearchBoxExtension::DispatchFocusChange(
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          render_view()->GetWebView()->mainFrame());
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SearchBox::OnSetInputInProgress(bool is_input_in_progress) {
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (is_input_in_progress_ != is_input_in_progress) {
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    is_input_in_progress_ = is_input_in_progress;
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DVLOG(1) << render_view() << " OnSetInputInProgress";
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (render_view()->GetWebView() &&
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (is_input_in_progress_) {
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions_v8::SearchBoxExtension::DispatchInputStart(
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            render_view()->GetWebView()->mainFrame());
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else {
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions_v8::SearchBoxExtension::DispatchInputCancel(
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            render_view()->GetWebView()->mainFrame());
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_instant_results_ = display_instant_results;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) {
476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Do not send duplicate notifications.
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (theme_info_ == theme_info)
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = theme_info;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchThemeChange(
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnFontInformationReceived(const string16& omnibox_font,
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          size_t omnibox_font_size) {
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  omnibox_font_ = omnibox_font;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  omnibox_font_size_ = omnibox_font_size;
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::OnPromoInformationReceived(bool is_app_launcher_enabled) {
494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  app_launcher_enabled_ = is_app_launcher_enabled;
495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double SearchBox::GetZoom() const {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebView* web_view = render_view()->GetWebView();
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (web_view) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel());
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (zoom != 0)
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return zoom;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 1.0;
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_.clear();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verbatim_ = false;
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = false;
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_start_ = 0;
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_end_ = 0;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_ = gfx::Rect();
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_margin_ = 0;
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_focused_ = false;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_key_capture_enabled_ = false;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = ThemeBackgroundInfo();
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't reset display_instant_results_ to prevent clearing it on committed
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // results pages in extended mode. Otherwise resetting it is a no-op because
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a new loader is created when it changes; see crbug.com/164662.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also don't reset omnibox_font_ or omnibox_font_size_ since it never
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changes.
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::SetQuery(const string16& query, bool verbatim) {
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_ = query;
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  verbatim_ = verbatim;
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = false;
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMostVisitedChanged(
532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<InstantMostVisitedItem>& items) {
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<InstantMostVisitedItemIDPair> last_known_items;
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetMostVisitedItems(&last_known_items);
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (AreMostVisitedItemsEqual(last_known_items, items))
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;  // Do not send duplicate onmostvisitedchange events.
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  most_visited_items_cache_.AddItems(items);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged(
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetMostVisitedItems(
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<InstantMostVisitedItemIDPair>* items) const {
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return most_visited_items_cache_.GetCurrentItems(items);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetMostVisitedItemWithID(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id,
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantMostVisitedItem* item) const {
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id,
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           item);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const {
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantMostVisitedItem item;
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL();
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnToggleVoiceSearch() {
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch(
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
569