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