searchbox.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (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)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/string_number_conversions.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/utf_string_conversions.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_switches.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/omnibox_focus_state.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/render_messages.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/url_constants.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/searchbox/searchbox_extension.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/renderer_resources.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/escape.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Size of the results cache.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMaxInstantAutocompleteResultItemCacheSize = 100;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool IsThemeInfoEqual(const ThemeBackgroundInfo& new_theme_info,
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const ThemeBackgroundInfo& old_theme_info) {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return old_theme_info.color_r == new_theme_info.color_r &&
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_theme_info.color_g == new_theme_info.color_g &&
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_theme_info.color_b == new_theme_info.color_b &&
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_theme_info.color_a == new_theme_info.color_a &&
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      old_theme_info.theme_id == new_theme_info.theme_id &&
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      old_theme_info.image_horizontal_alignment ==
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new_theme_info.image_horizontal_alignment &&
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      old_theme_info.image_vertical_alignment ==
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          new_theme_info.image_vertical_alignment &&
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      old_theme_info.image_tiling == new_theme_info.image_tiling &&
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      old_theme_info.image_height == new_theme_info.image_height &&
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      old_theme_info.has_attribution == new_theme_info.has_attribution;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AreMostVisitedItemsEqual(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantMostVisitedItemIDPair>& new_items,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<InstantMostVisitedItemIDPair>& old_items) {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (old_items.size() != new_items.size())
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (size_t i = 0; i < new_items.size(); i++) {
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const InstantMostVisitedItem& old_item = old_items[i].second;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const InstantMostVisitedItem& new_item = new_items[i].second;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (new_item.url != old_item.url || new_item.title != old_item.title)
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return false;
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return true;
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : content::RenderViewObserver(render_view),
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::RenderViewObserverTracker<SearchBox>(render_view),
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      verbatim_(false),
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      query_is_restricted_(false),
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      selection_start_(0),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_end_(0),
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      start_margin_(0),
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      is_key_capture_enabled_(false),
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      display_instant_results_(false),
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      omnibox_font_size_(0),
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      autocomplete_results_cache_(kMaxInstantAutocompleteResultItemCacheSize),
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize) {
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)SearchBox::~SearchBox() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SearchBox::SetSuggestions(
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<InstantSuggestion>& suggestions) {
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!suggestions.empty() &&
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      suggestions[0].behavior == INSTANT_COMPLETE_REPLACE) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetQuery(suggestions[0].text, true);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly allow empty vector to be sent to the browser.
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_SetSuggestions(
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), suggestions));
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SearchBox::MarkQueryAsRestricted() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_is_restricted_ = true;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_.clear();
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowInstantOverlay(int height, InstantSizeUnits units) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_ShowInstantOverlay(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(), height,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      units));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SearchBox::FocusOmnibox() {
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      OMNIBOX_FOCUS_VISIBLE));
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SearchBox::StartCapturingKeyStrokes() {
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OMNIBOX_FOCUS_INVISIBLE));
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SearchBox::StopCapturingKeyStrokes() {
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId(),
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      OMNIBOX_FOCUS_NONE));
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url,
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              content::PageTransition transition,
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              WindowOpenDisposition disposition) {
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate(
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      url, transition, disposition));
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SearchBox::DeleteMostVisitedItem(
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem(
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view()->GetRoutingID(), most_visited_item_id));
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::UndoMostVisitedDeletion(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstantRestrictedID most_visited_item_id) {
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion(
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view()->GetRoutingID(), most_visited_item_id));
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SearchBox::UndoAllMostVisitedDeletions() {
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_view()->Send(
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions(
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      render_view()->GetRoutingID()));
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SearchBox::ShowBars() {
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DVLOG(1) << render_view() << " ShowBars";
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxShowBars(
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SearchBox::HideBars() {
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DVLOG(1) << render_view() << " HideBars";
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxHideBars(
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)int SearchBox::GetStartMargin() const {
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return static_cast<int>(start_margin_ / GetZoom());
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect SearchBox::GetPopupBounds() const {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double zoom = GetZoom();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(static_cast<int>(popup_bounds_.x() / zoom),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.y() / zoom),
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<int>(popup_bounds_.width() / zoom),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   static_cast<int>(popup_bounds_.height() / zoom));
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SearchBox::GetAutocompleteResults(
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<InstantAutocompleteResultIDPair>* results) const {
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  autocomplete_results_cache_.GetCurrentItems(results);
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool SearchBox::GetAutocompleteResultWithID(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstantRestrictedID autocomplete_result_id,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstantAutocompleteResult* result) const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return autocomplete_results_cache_.GetItemWithRestrictedID(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      autocomplete_result_id, result);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return theme_info_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(SearchBox, message)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxChange, OnChange)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancel, OnCancel)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPopupResize, OnPopupResize)
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange)
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxBarsHidden, OnBarsHidden)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDetermineIfPageSupportsInstant)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxAutocompleteResults,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnAutocompleteResults)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxUpOrDownKeyPressed,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnUpOrDownKeyPressed)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancelSelection,
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnCancelSelection)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults,
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        OnSetDisplayInstantResults)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxKeyCaptureChanged,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnKeyCaptureChange)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged,
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        OnThemeChanged)
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation,
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        OnFontInformationReceived)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnMostVisitedChanged)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return handled;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::DidClearWindowObject(WebKit::WebFrame* frame) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions_v8::SearchBoxExtension::DispatchOnWindowReady(frame);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SearchBox::OnChange(const string16& query,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         bool verbatim,
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         size_t selection_start,
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         size_t selection_end) {
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetQuery(query, verbatim);
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  selection_start_ = selection_start;
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  selection_end_ = selection_end;
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If |query| is empty, this is due to the user backspacing away all the text
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // in the omnibox, or hitting Escape to restore the "permanent URL", or
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // switching tabs, etc. In all these cases, there will be no corresponding
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // OnAutocompleteResults(), so clear the autocomplete results ourselves, by
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // adding an empty set. Don't notify the page using an "onnativesuggestions"
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // event, though.
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (query.empty()) {
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    autocomplete_results_cache_.AddItems(
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        std::vector<InstantAutocompleteResult>());
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DVLOG(1) << render_view() << " OnChange";
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchChange(
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SearchBox::OnSubmit(const string16& query) {
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Submit() is called when the user hits Enter to commit the omnibox text.
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If |query| is non-blank, the user committed a search. If it's blank, the
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // omnibox text was a URL, and the user is navigating to it, in which case
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // we shouldn't update the |query_| or associated state.
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!query.empty()) {
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetQuery(query, true);
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    selection_start_ = selection_end_ = query_.size();
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DVLOG(1) << render_view() << " OnSubmit";
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchSubmit(
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!query.empty())
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Reset();
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SearchBox::OnCancel(const string16& query) {
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetQuery(query, true);
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  selection_start_ = selection_end_ = query_.size();
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DVLOG(1) << render_view() << " OnCancel";
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchCancel(
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnPopupResize(const gfx::Rect& bounds) {
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  popup_bounds_ = bounds;
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DVLOG(1) << render_view() << " OnPopupResize";
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchResize(
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::OnMarginChange(int margin, int width) {
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  start_margin_ = margin;
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Override only the width parameter of the popup bounds.
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  popup_bounds_.set_width(width);
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMarginChange(
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnBarsHidden() {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchBarsHidden(
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() {
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant(
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DVLOG(1) << render_view() << " PageSupportsInstant: " << result;
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined(
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetRoutingID(), render_view()->GetPageId(), result));
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnAutocompleteResults(
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<InstantAutocompleteResult>& results) {
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autocomplete_results_cache_.AddItems(results);
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DVLOG(1) << render_view() << " OnAutocompleteResults";
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchAutocompleteResults(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnUpOrDownKeyPressed(int count) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress: " << count;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchUpOrDownKeyPress(
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame(), count);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnCancelSelection(const string16& query,
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  bool verbatim,
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_start,
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size_t selection_end) {
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetQuery(query, verbatim);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_start_ = selection_start;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_end_ = selection_end;
3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyPress ESC";
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchEscKeyPress(
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnKeyCaptureChange(bool is_key_capture_enabled) {
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (is_key_capture_enabled != is_key_capture_enabled_ &&
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_key_capture_enabled_ = is_key_capture_enabled;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " OnKeyCaptureChange";
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) {
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_instant_results_ = display_instant_results;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) {
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (IsThemeInfoEqual(theme_info, theme_info_))
3631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  theme_info_ = theme_info;
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    extensions_v8::SearchBoxExtension::DispatchThemeChange(
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        render_view()->GetWebView()->mainFrame());
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SearchBox::OnFontInformationReceived(const string16& omnibox_font,
372ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                          size_t omnibox_font_size) {
373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  omnibox_font_ = omnibox_font;
374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  omnibox_font_size_ = omnibox_font_size;
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdouble SearchBox::GetZoom() const {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebView* web_view = render_view()->GetWebView();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_view) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (zoom != 0)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return zoom;
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return 1.0;
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::Reset() {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_.clear();
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  verbatim_ = false;
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  query_is_restricted_ = false;
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  selection_start_ = 0;
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  selection_end_ = 0;
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  popup_bounds_ = gfx::Rect();
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  start_margin_ = 0;
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  is_key_capture_enabled_ = false;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = ThemeBackgroundInfo();
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Don't reset display_instant_results_ to prevent clearing it on committed
3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // results pages in extended mode. Otherwise resetting it is a no-op because
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // a new loader is created when it changes; see crbug.com/164662.
400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Also don't reset omnibox_font_ or omnibox_font_size_ since it never
401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // changes.
402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::SetQuery(const string16& query, bool verbatim) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_ = query;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  verbatim_ = verbatim;
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  query_is_restricted_ = false;
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SearchBox::OnMostVisitedChanged(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<InstantMostVisitedItemIDPair>& items) {
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<InstantMostVisitedItemIDPair> old_items;
413ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  most_visited_items_cache_.GetCurrentItems(&old_items);
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (AreMostVisitedItemsEqual(items, old_items))
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  most_visited_items_cache_.AddItemsWithRestrictedID(items);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged(
421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        render_view()->GetWebView()->mainFrame());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::GetMostVisitedItems(
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<InstantMostVisitedItemIDPair>* items) const {
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return most_visited_items_cache_.GetCurrentItems(items);
428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool SearchBox::GetMostVisitedItemWithID(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstantRestrictedID most_visited_item_id,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstantMostVisitedItem* item) const {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           item);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)