searchbox.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/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"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/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)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal {  // for testing
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Parses |url| and fills in |id| with the InstantRestrictedID obtained from the
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// |url|. |render_view_id| is the ID of the associated RenderView.
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Valid |url| forms:
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://favicon/<view_id>/<restricted_id>
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://thumb/<view_id>/<restricted_id>
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If the |url| is valid, returns true and fills in |id| with restricted_id
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// value. If the |url| is invalid, returns false and |id| is not set.
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetInstantRestrictedIDFromURL(int render_view_id,
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   const GURL& url,
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   InstantRestrictedID* id) {
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Strip leading path.
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string path = url.path().substr(1);
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check that the path is of Most visited item ID form.
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<std::string> tokens;
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (Tokenize(path, "/", &tokens) != 2)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int view_id = 0;
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(tokens[0], &view_id) || view_id != render_view_id)
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::StringToInt(tokens[1], id);
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace internal
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : content::RenderViewObserver(render_view),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewObserverTracker<SearchBox>(render_view),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      verbatim_(false),
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      query_is_restricted_(false),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_start_(0),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_end_(0),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_margin_(0),
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_focused_(false),
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_key_capture_enabled_(false),
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_instant_results_(false),
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      omnibox_font_size_(0),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      autocomplete_results_cache_(kMaxInstantAutocompleteResultItemCacheSize),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::SetSuggestions(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantSuggestion>& suggestions) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!suggestions.empty() &&
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggestions[0].behavior == INSTANT_COMPLETE_REPLACE) {
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetQuery(suggestions[0].text, true);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly allow empty vector to be sent to the browser.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SetSuggestions(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), suggestions));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::MarkQueryAsRestricted() {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = true;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  query_.clear();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowInstantOverlay(int height, InstantSizeUnits units) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_ShowInstantOverlay(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), height,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      units));
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::FocusOmnibox() {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_VISIBLE));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StartCapturingKeyStrokes() {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_INVISIBLE));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StopCapturingKeyStrokes() {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OMNIBOX_FOCUS_NONE));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              content::PageTransition transition,
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              WindowOpenDisposition disposition,
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              bool is_search_type) {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      url, transition, disposition, is_search_type));
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::DeleteMostVisitedItem(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem(
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetURLForMostVisitedItem(most_visited_item_id)));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoMostVisitedDeletion(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion(
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetURLForMostVisitedItem(most_visited_item_id)));
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions(
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowBars() {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << render_view() << " ShowBars";
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxShowBars(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::HideBars() {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << render_view() << " HideBars";
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxHideBars(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int SearchBox::GetStartMargin() const {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<int>(start_margin_ / GetZoom());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect SearchBox::GetPopupBounds() const {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double zoom = GetZoom();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Rect(static_cast<int>(popup_bounds_.x() / zoom),
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.y() / zoom),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.width() / zoom),
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.height() / zoom));
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetAutocompleteResults(
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<InstantAutocompleteResultIDPair>* results) const {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autocomplete_results_cache_.GetCurrentItems(results);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetAutocompleteResultWithID(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID autocomplete_result_id,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantAutocompleteResult* result) const {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return autocomplete_results_cache_.GetItemWithRestrictedID(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      autocomplete_result_id, result);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return theme_info_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url,
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     GURL* url) const {
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantRestrictedID rid = 0;
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               transient_url, &rid)) {
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (most_visited_item_url.is_empty())
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *url = GURL(base::StringPrintf("chrome-search://thumb/%s",
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 most_visited_item_url.spec().c_str()));
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url,
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                   GURL* url) const {
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantRestrictedID rid = 0;
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               transient_url, &rid)) {
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (most_visited_item_url.is_empty())
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *url = GURL(base::StringPrintf("chrome-search://favicon/%s",
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 most_visited_item_url.spec().c_str()));
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(SearchBox, message)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxChange, OnChange)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancel, OnCancel)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPopupResize, OnPopupResize)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxBarsHidden, OnBarsHidden)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDetermineIfPageSupportsInstant)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxAutocompleteResults,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnAutocompleteResults)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxUpOrDownKeyPressed,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnUpOrDownKeyPressed)
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxEscKeyPressed, OnEscKeyPressed)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancelSelection,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCancelSelection)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnSetDisplayInstantResults)
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnThemeChanged)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnFontInformationReceived)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnMostVisitedChanged)
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch,
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        OnToggleVoiceSearch)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnChange(const string16& query,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool verbatim,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t selection_start,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t selection_end) {
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, verbatim);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_start_ = selection_start;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_end_ = selection_end;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |query| is empty, this is due to the user backspacing away all the text
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // in the omnibox, or hitting Escape to restore the "permanent URL", or
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // switching tabs, etc. In all these cases, there will be no corresponding
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OnAutocompleteResults(), so clear the autocomplete results ourselves, by
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // adding an empty set. Don't notify the page using an "onnativesuggestions"
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // event, though.
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (query.empty()) {
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_results_cache_.AddItems(
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::vector<InstantAutocompleteResult>());
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnChange";
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchChange(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnSubmit(const string16& query) {
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Submit() is called when the user hits Enter to commit the omnibox text.
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |query| is non-blank, the user committed a search. If it's blank, the
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // omnibox text was a URL, and the user is navigating to it, in which case
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we shouldn't update the |query_| or associated state.
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!query.empty()) {
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetQuery(query, true);
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnSubmit";
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchSubmit(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!query.empty())
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Reset();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnCancel(const string16& query) {
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, true);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_start_ = selection_end_ = query_.size();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnCancel";
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchCancel(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnPopupResize(const gfx::Rect& bounds) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_ = bounds;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnPopupResize";
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchResize(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMarginChange(int margin, int width) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_margin_ = margin;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Override only the width parameter of the popup bounds.
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_.set_width(width);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMarginChange(
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnBarsHidden() {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchBarsHidden(
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " PageSupportsInstant: " << result;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined(
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetRoutingID(), render_view()->GetPageId(), result));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnAutocompleteResults(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantAutocompleteResult>& results) {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autocomplete_results_cache_.AddItems(results);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnAutocompleteResults";
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchAutocompleteResults(
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnUpOrDownKeyPressed(int count) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress: " << count;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchUpOrDownKeyPress(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame(), count);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SearchBox::OnEscKeyPressed() {
372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DVLOG(1) << render_view() << " OnEscKeyPressed ";
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchEscKeyPress(
375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnCancelSelection(const string16& query,
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  bool verbatim,
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_start,
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_end) {
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, verbatim);
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_start_ = selection_start;
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_end_ = selection_end;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress ESC";
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchEscKeyPress(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state,
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               OmniboxFocusChangeReason reason) {
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE;
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (key_capture_enabled != is_key_capture_enabled_) {
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Tell the page if the key capture mode changed unless the focus state
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // changed because of TYPING. This is because in that case, the browser
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // hasn't really stopped capturing key strokes.
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // (More practically, if we don't do this check, the page would receive
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // onkeycapturechange before the corresponding onchange, and the page would
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // have no way of telling whether the keycapturechange happened because of
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // some actual user action or just because they started typing.)
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (reason != OMNIBOX_FOCUS_CHANGE_TYPING &&
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView() &&
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_key_capture_enabled_ = key_capture_enabled;
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DVLOG(1) << render_view() << " OnKeyCaptureChange";
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange(
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          render_view()->GetWebView()->mainFrame());
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE;
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_focused != is_focused_) {
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    is_focused_ = is_focused;
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DVLOG(1) << render_view() << " OnFocusChange";
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchFocusChange(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_instant_results_ = display_instant_results;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = theme_info;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchThemeChange(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnFontInformationReceived(const string16& omnibox_font,
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          size_t omnibox_font_size) {
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  omnibox_font_ = omnibox_font;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  omnibox_font_size_ = omnibox_font_size;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double SearchBox::GetZoom() const {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebView* web_view = render_view()->GetWebView();
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (web_view) {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (zoom != 0)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return zoom;
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 1.0;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_.clear();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verbatim_ = false;
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = false;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_start_ = 0;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_end_ = 0;
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_bounds_ = gfx::Rect();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_margin_ = 0;
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_focused_ = false;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_key_capture_enabled_ = false;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = ThemeBackgroundInfo();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't reset display_instant_results_ to prevent clearing it on committed
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // results pages in extended mode. Otherwise resetting it is a no-op because
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a new loader is created when it changes; see crbug.com/164662.
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also don't reset omnibox_font_ or omnibox_font_size_ since it never
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changes.
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::SetQuery(const string16& query, bool verbatim) {
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_ = query;
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  verbatim_ = verbatim;
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  query_is_restricted_ = false;
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMostVisitedChanged(
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<InstantMostVisitedItem>& items) {
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  most_visited_items_cache_.AddItems(items);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged(
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetMostVisitedItems(
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<InstantMostVisitedItemIDPair>* items) const {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return most_visited_items_cache_.GetCurrentItems(items);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetMostVisitedItemWithID(
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantMostVisitedItem* item) const {
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id,
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           item);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const {
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InstantMostVisitedItem item;
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL();
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnToggleVoiceSearch() {
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch(
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
507