searchbox.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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" 1358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "chrome/common/favicon/favicon_types.h" 1458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "chrome/common/favicon/favicon_url_parser.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/omnibox_focus_state.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/searchbox/searchbox_extension.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/renderer_resources.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/escape.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The size of the InstantMostVisitedItem cache. 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst size_t kMaxInstantMostVisitedItemCacheSize = 100; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if items stored in |old_item_id_pairs| and |new_items| are 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// equal. 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AreMostVisitedItemsEqual( 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<InstantMostVisitedItemIDPair>& old_item_id_pairs, 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<InstantMostVisitedItem>& new_items) { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (old_item_id_pairs.size() != new_items.size()) 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < new_items.size(); ++i) { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (new_items[i].url != old_item_id_pairs[i].second.url || 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new_items[i].title != old_item_id_pairs[i].second.title) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal { // for testing 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Parses |path| and fills in |id| with the InstantRestrictedID obtained from 5558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// the |path|. |render_view_id| is the ID of the associated RenderView. 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 5758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// |path| is a pair of |render_view_id| and |restricted_id|, and it is 5858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// contained in Instant Extended URLs. A valid |path| is in the form: 5958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// <render_view_id>/<restricted_id> 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 6158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// If the |path| is valid, returns true and fills in |id| with restricted_id 6258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// value. If the |path| is invalid, returns false and |id| is not set. 6358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool GetInstantRestrictedIDFromPath(int render_view_id, 6458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string& path, 6558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantRestrictedID* id) { 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check that the path is of Most visited item ID form. 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<std::string> tokens; 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (Tokenize(path, "/", &tokens) != 2) 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int view_id = 0; 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(tokens[0], &view_id) || view_id != render_view_id) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return base::StringToInt(tokens[1], id); 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool GetRestrictedIDFromFaviconUrl(int render_view_id, 7858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const GURL& url, 7958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string* favicon_params, 8058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantRestrictedID* rid) { 8158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Strip leading slash. 8258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string raw_path = url.path(); 8358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch DCHECK_GT(raw_path.length(), (size_t) 0); 8458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch DCHECK_EQ(raw_path[0], '/'); 8558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch raw_path = raw_path.substr(1); 8658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 8758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch chrome::ParsedFaviconPath parsed; 8858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!chrome::ParseFaviconPath(raw_path, chrome::FAVICON, &parsed)) 8958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 9058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 9158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // The part of the URL which details the favicon parameters should be returned 9258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // so the favicon URL can be reconstructed, by replacing the restricted_id 9358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // with the actual URL from which the favicon is being requested. 9458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch *favicon_params = raw_path.substr(0, parsed.path_index); 9558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 9658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // The part of the favicon URL which is supposed to contain the URL from 9758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // which the favicon is being requested (i.e., the page's URL) actually 9858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // contains a pair in the format "<view_id>/<restricted_id>". If the page's 9958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // URL is not in the expected format then the execution must be stopped, 10058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // returning |true|, indicating that the favicon URL should be translated 10158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // without the page's URL part, to prevent search providers from spoofing 10258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // the user's browsing history. For example, the following favicon URL 10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // "chrome-search://favicon/http://www.secretsite.com" it is not in the 10458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // expected format "chrome-search://favicon/<view_id>/<restricted_id>" so 10558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // the pages's URL part ("http://www.secretsite.com") should be removed 10658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // entirely from the translated URL otherwise the search engine would know 10758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // if the user has visited that page (by verifying whether the favicon URL 10858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // returns an image for a particular page's URL); the translated URL in this 10958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // case would be "chrome-search://favicon/" which would simply return the 11058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // default favicon. 11158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string id_part = raw_path.substr(parsed.path_index); 11258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantRestrictedID id; 11358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!GetInstantRestrictedIDFromPath(render_view_id, id_part, &id)) 11458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return true; 11558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 11658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch *rid = id; 11758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return true; 11858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 11958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 12058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Parses a thumbnail |url| and fills in |id| with the InstantRestrictedID 12158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// obtained from the |url|. |render_view_id| is the ID of the associated 12258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// RenderView. 12358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// 12458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Valid |url| forms: 12558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// chrome-search://thumb/<view_id>/<restricted_id> 12658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// 12758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// If the |url| is valid, returns true and fills in |id| with restricted_id 12858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// value. If the |url| is invalid, returns false and |id| is not set. 12958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool GetRestrictedIDFromThumbnailUrl(int render_view_id, 13058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const GURL& url, 13158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantRestrictedID* id) { 13258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Strip leading slash. 13358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string path = url.path(); 13458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch DCHECK_GT(path.length(), (size_t) 0); 13558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch DCHECK_EQ(path[0], '/'); 13658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch path = path.substr(1); 13758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 13858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return GetInstantRestrictedIDFromPath(render_view_id, path, id); 13958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 14058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace internal 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::RenderViewObserver(render_view), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewObserverTracker<SearchBox>(render_view), 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch app_launcher_enabled_(false), 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_focused_(false), 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_input_in_progress_(false), 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_key_capture_enabled_(false), 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) display_instant_results_(false), 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize), 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch query_(), 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_margin_(0) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SearchBox::LogEvent(NTPLoggingEventType event) { 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_LogEvent( 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), event)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SearchBox::LogImpression(int position, const base::string16& provider) { 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_LogImpression( 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), position, 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider)); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SearchBox::CheckIsUserSignedInToChromeAs(const base::string16& identity) { 1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_ChromeIdentityCheck( 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), identity)); 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::DeleteMostVisitedItem( 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantRestrictedID most_visited_item_id) { 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetRoutingID(), render_view()->GetPageId(), 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetURLForMostVisitedItem(most_visited_item_id))); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url, 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL* url) const { 18458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string favicon_params; 18558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantRestrictedID rid = -1; 18658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool success = internal::GetRestrictedIDFromFaviconUrl( 18758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch render_view()->GetRoutingID(), transient_url, &favicon_params, &rid); 18858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!success) 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 19158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch InstantMostVisitedItem item; 19258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch std::string item_url; 19358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (rid != -1 && GetMostVisitedItemWithID(rid, &item)) 19458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch item_url = item.url.spec(); 19558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 19658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch *url = GURL(base::StringPrintf("chrome-search://favicon/%s%s", 19758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch favicon_params.c_str(), 19858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch item_url.c_str())); 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url, 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL* url) const { 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantRestrictedID rid = 0; 20558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!internal::GetRestrictedIDFromThumbnailUrl(render_view()->GetRoutingID(), 20658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch transient_url, &rid)) { 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL most_visited_item_url(GetURLForMostVisitedItem(rid)); 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (most_visited_item_url.is_empty()) 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *url = GURL(base::StringPrintf("chrome-search://thumb/%s", 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch most_visited_item_url.spec().c_str())); 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::GetMostVisitedItems( 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<InstantMostVisitedItemIDPair>* items) const { 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return most_visited_items_cache_.GetCurrentItems(items); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SearchBox::GetMostVisitedItemWithID( 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantRestrictedID most_visited_item_id, 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantMostVisitedItem* item) const { 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id, 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch item); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() { 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return theme_info_; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void SearchBox::Focus() { 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) OMNIBOX_FOCUS_VISIBLE)); 238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url, 241a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WindowOpenDisposition disposition, 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_most_visited_item_url) { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate( 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), url, 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) disposition, is_most_visited_item_url)); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SearchBox::Paste(const base::string16& text) { 249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch render_view()->Send(new ChromeViewHostMsg_PasteAndOpenDropdown( 250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch render_view()->GetRoutingID(), render_view()->GetPageId(), text)); 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::SetVoiceSearchSupported(bool supported) { 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->Send(new ChromeViewHostMsg_SetVoiceSearchSupported( 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetRoutingID(), render_view()->GetPageId(), supported)); 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::StartCapturingKeyStrokes() { 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OMNIBOX_FOCUS_INVISIBLE)); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::StopCapturingKeyStrokes() { 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OMNIBOX_FOCUS_NONE)); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::UndoMostVisitedDeletion( 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantRestrictedID most_visited_item_id) { 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetRoutingID(), render_view()->GetPageId(), 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetURLForMostVisitedItem(most_visited_item_id))); 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(SearchBox, message) 2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_ChromeIdentityCheckResult, 2870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnChromeIdentityCheckResult) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDetermineIfPageSupportsInstant) 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged) 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnMostVisitedChanged) 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPromoInformation, 2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnPromoInformationReceived) 296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults, 297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) OnSetDisplayInstantResults) 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetInputInProgress, 2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnSetInputInProgress) 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetSuggestionToPrefetch, 301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) OnSetSuggestionToPrefetch) 3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit) 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged, 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnThemeChanged) 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch, 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnToggleVoiceSearch) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SearchBox::OnChromeIdentityCheckResult(const base::string16& identity, 3130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool identity_match) { 3140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchChromeIdentityCheckResult( 3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_view()->GetWebView()->mainFrame(), identity, identity_match); 3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " PageSupportsInstant: " << result; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), result)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state, 331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OmniboxFocusChangeReason reason) { 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE; 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (key_capture_enabled != is_key_capture_enabled_) { 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Tell the page if the key capture mode changed unless the focus state 335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changed because of TYPING. This is because in that case, the browser 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hasn't really stopped capturing key strokes. 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // (More practically, if we don't do this check, the page would receive 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onkeycapturechange before the corresponding onchange, and the page would 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // have no way of telling whether the keycapturechange happened because of 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // some actual user action or just because they started typing.) 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (reason != OMNIBOX_FOCUS_CHANGE_TYPING && 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView() && 344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_key_capture_enabled_ = key_capture_enabled; 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnKeyCaptureChange"; 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange( 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE; 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_focused != is_focused_) { 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_ = is_focused; 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnFocusChange"; 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (render_view()->GetWebView() && 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchFocusChange( 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SearchBox::OnMarginChange(int margin) { 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch start_margin_ = margin; 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions_v8::SearchBoxExtension::DispatchMarginChange( 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetWebView()->mainFrame()); 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnMostVisitedChanged( 3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::vector<InstantMostVisitedItem>& items) { 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<InstantMostVisitedItemIDPair> last_known_items; 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetMostVisitedItems(&last_known_items); 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (AreMostVisitedItemsEqual(last_known_items, items)) 3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; // Do not send duplicate onmostvisitedchange events. 3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch most_visited_items_cache_.AddItems(items); 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged( 3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetWebView()->mainFrame()); 3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnPromoInformationReceived(bool is_app_launcher_enabled) { 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch app_launcher_enabled_ = is_app_launcher_enabled; 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) { 391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) display_instant_results_ = display_instant_results; 392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SearchBox::OnSetInputInProgress(bool is_input_in_progress) { 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_input_in_progress_ != is_input_in_progress) { 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) is_input_in_progress_ = is_input_in_progress; 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << render_view() << " OnSetInputInProgress"; 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (render_view()->GetWebView() && 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_input_in_progress_) { 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchInputStart( 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchInputCancel( 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 411424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void SearchBox::OnSetSuggestionToPrefetch(const InstantSuggestion& suggestion) { 412424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) suggestion_ = suggestion; 413424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 414424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DVLOG(1) << render_view() << " OnSetSuggestionToPrefetch"; 415424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchSuggestionChange( 416424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 417424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 418424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SearchBox::OnSubmit(const base::string16& query) { 4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch query_ = query; 4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << render_view() << " OnSubmit"; 4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions_v8::SearchBoxExtension::DispatchSubmit( 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetWebView()->mainFrame()); 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!query.empty()) 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Reset(); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) { 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Do not send duplicate notifications. 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (theme_info_ == theme_info) 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_info_ = theme_info; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchThemeChange( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SearchBox::OnToggleVoiceSearch() { 4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch( 4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_view()->GetWebView()->mainFrame()); 4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const { 4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstantMostVisitedItem item; 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL(); 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query_.clear(); 457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) suggestion_ = InstantSuggestion(); 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(); 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 463