searchbox.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/searchbox/searchbox.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <string>
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/omnibox_focus_state.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/searchbox/searchbox_extension.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/renderer_resources.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/escape.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The size of the InstantMostVisitedItem cache.
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst size_t kMaxInstantMostVisitedItemCacheSize = 100;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if items stored in |old_item_id_pairs| and |new_items| are
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// equal.
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AreMostVisitedItemsEqual(
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<InstantMostVisitedItemIDPair>& old_item_id_pairs,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<InstantMostVisitedItem>& new_items) {
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (old_item_id_pairs.size() != new_items.size())
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < new_items.size(); ++i) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (new_items[i].url != old_item_id_pairs[i].second.url ||
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new_items[i].title != old_item_id_pairs[i].second.title) {
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return false;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal {  // for testing
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Parses |url| and fills in |id| with the InstantRestrictedID obtained from the
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// |url|. |render_view_id| is the ID of the associated RenderView.
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Valid |url| forms:
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://favicon/<view_id>/<restricted_id>
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://thumb/<view_id>/<restricted_id>
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If the |url| is valid, returns true and fills in |id| with restricted_id
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// value. If the |url| is invalid, returns false and |id| is not set.
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetInstantRestrictedIDFromURL(int render_view_id,
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   const GURL& url,
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   InstantRestrictedID* id) {
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Strip leading path.
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string path = url.path().substr(1);
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check that the path is of Most visited item ID form.
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<std::string> tokens;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (Tokenize(path, "/", &tokens) != 2)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int view_id = 0;
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(tokens[0], &view_id) || view_id != render_view_id)
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::StringToInt(tokens[1], id);
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace internal
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : content::RenderViewObserver(render_view),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewObserverTracker<SearchBox>(render_view),
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    app_launcher_enabled_(false),
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    is_focused_(false),
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    is_input_in_progress_(false),
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    is_key_capture_enabled_(false),
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize),
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    omnibox_font_(),
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    omnibox_font_size_(12),
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    query_(),
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    start_margin_(0),
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    width_(0) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::CountMouseover() {
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_CountMouseover(
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId()));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::DeleteMostVisitedItem(
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    InstantRestrictedID most_visited_item_id) {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem(
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId(),
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetURLForMostVisitedItem(most_visited_item_id)));
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   GURL* url) const {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstantRestrictedID rid = 0;
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                               transient_url, &rid)) {
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (most_visited_item_url.is_empty())
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  *url = GURL(base::StringPrintf("chrome-search://favicon/%s",
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 most_visited_item_url.spec().c_str()));
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     GURL* url) const {
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstantRestrictedID rid = 0;
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(),
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                               transient_url, &rid)) {
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GURL most_visited_item_url(GetURLForMostVisitedItem(rid));
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (most_visited_item_url.is_empty())
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  *url = GURL(base::StringPrintf("chrome-search://thumb/%s",
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 most_visited_item_url.spec().c_str()));
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::GetMostVisitedItems(
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    std::vector<InstantMostVisitedItemIDPair>* items) const {
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return most_visited_items_cache_.GetCurrentItems(items);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GetMostVisitedItemWithID(
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    InstantRestrictedID most_visited_item_id,
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    InstantMostVisitedItem* item) const {
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id,
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                           item);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochint SearchBox::GetStartMargin() const {
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return static_cast<int>(start_margin_ / GetZoom());
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() {
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return theme_info_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              content::PageTransition transition,
164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              WindowOpenDisposition disposition,
165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              bool is_search_type) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate(
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      url, transition, disposition, is_search_type));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::SetVoiceSearchSupported(bool supported) {
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_SetVoiceSearchSupported(
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId(), supported));
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::StartCapturingKeyStrokes() {
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OMNIBOX_FOCUS_INVISIBLE));
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::StopCapturingKeyStrokes() {
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_FocusOmnibox(
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId(),
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OMNIBOX_FOCUS_NONE));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view()->Send(
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions(
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_view()->GetRoutingID(), render_view()->GetPageId()));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::UndoMostVisitedDeletion(
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    InstantRestrictedID most_visited_item_id) {
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion(
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      render_view()->GetRoutingID(), render_view()->GetPageId(),
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetURLForMostVisitedItem(most_visited_item_id)));
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(SearchBox, message)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDetermineIfPageSupportsInstant)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnFontInformationReceived)
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnMostVisitedChanged)
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPromoInformation,
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnPromoInformationReceived)
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetInputInProgress,
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnSetInputInProgress)
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit)
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged,
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnThemeChanged)
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch,
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        OnToggleVoiceSearch)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << render_view() << " PageSupportsInstant: " << result;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetRoutingID(), render_view()->GetPageId(), result));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state,
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               OmniboxFocusChangeReason reason) {
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE;
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (key_capture_enabled != is_key_capture_enabled_) {
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Tell the page if the key capture mode changed unless the focus state
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // changed because of TYPING. This is because in that case, the browser
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // hasn't really stopped capturing key strokes.
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // (More practically, if we don't do this check, the page would receive
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // onkeycapturechange before the corresponding onchange, and the page would
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // have no way of telling whether the keycapturechange happened because of
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // some actual user action or just because they started typing.)
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (reason != OMNIBOX_FOCUS_CHANGE_TYPING &&
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView() &&
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_key_capture_enabled_ = key_capture_enabled;
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DVLOG(1) << render_view() << " OnKeyCaptureChange";
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange(
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          render_view()->GetWebView()->mainFrame());
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE;
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_focused != is_focused_) {
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    is_focused_ = is_focused;
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DVLOG(1) << render_view() << " OnFocusChange";
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (render_view()->GetWebView() &&
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extensions_v8::SearchBoxExtension::DispatchFocusChange(
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          render_view()->GetWebView()->mainFrame());
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnFontInformationReceived(const string16& omnibox_font,
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          size_t omnibox_font_size) {
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  omnibox_font_ = omnibox_font;
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  omnibox_font_size_ = omnibox_font_size;
2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnMarginChange(int margin, int width) {
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  start_margin_ = margin;
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  width_ = width;
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    extensions_v8::SearchBoxExtension::DispatchMarginChange(
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_view()->GetWebView()->mainFrame());
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnMostVisitedChanged(
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::vector<InstantMostVisitedItem>& items) {
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<InstantMostVisitedItemIDPair> last_known_items;
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetMostVisitedItems(&last_known_items);
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (AreMostVisitedItemsEqual(last_known_items, items))
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;  // Do not send duplicate onmostvisitedchange events.
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  most_visited_items_cache_.AddItems(items);
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged(
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_view()->GetWebView()->mainFrame());
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnPromoInformationReceived(bool is_app_launcher_enabled) {
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  app_launcher_enabled_ = is_app_launcher_enabled;
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SearchBox::OnSetInputInProgress(bool is_input_in_progress) {
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (is_input_in_progress_ != is_input_in_progress) {
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    is_input_in_progress_ = is_input_in_progress;
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DVLOG(1) << render_view() << " OnSetInputInProgress";
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (render_view()->GetWebView() &&
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        render_view()->GetWebView()->mainFrame()) {
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (is_input_in_progress_) {
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions_v8::SearchBoxExtension::DispatchInputStart(
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            render_view()->GetWebView()->mainFrame());
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions_v8::SearchBoxExtension::DispatchInputCancel(
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            render_view()->GetWebView()->mainFrame());
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnSubmit(const string16& query) {
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  query_ = query;
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DVLOG(1) << render_view() << " OnSubmit";
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    extensions_v8::SearchBoxExtension::DispatchSubmit(
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_view()->GetWebView()->mainFrame());
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!query.empty())
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Reset();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) {
332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Do not send duplicate notifications.
333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (theme_info_ == theme_info)
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = theme_info;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions_v8::SearchBoxExtension::DispatchThemeChange(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view()->GetWebView()->mainFrame());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnToggleVoiceSearch() {
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) {
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch(
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_view()->GetWebView()->mainFrame());
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const {
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstantMostVisitedItem item;
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL();
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double SearchBox::GetZoom() const {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebView* web_view = render_view()->GetWebView();
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (web_view) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel());
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (zoom != 0)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return zoom;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 1.0;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_.clear();
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_margin_ = 0;
3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  width_ = 0;
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_focused_ = false;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_key_capture_enabled_ = false;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  theme_info_ = ThemeBackgroundInfo();
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
373