searchbox.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "googleurl/src/gurl.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/renderer_resources.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/escape.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size of the results cache. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxInstantAutocompleteResultItemCacheSize = 100; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 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), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verbatim_(false), 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_(false), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_(0), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_end_(0), 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_margin_(0), 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_(false), 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_key_capture_enabled_(false), 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) is_input_in_progress_(false), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_instant_results_(false), 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_size_(0), 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch app_launcher_enabled_(false), 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_(kMaxInstantAutocompleteResultItemCacheSize), 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::SetSuggestions( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<InstantSuggestion>& suggestions) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suggestions.empty() && 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suggestions[0].behavior == INSTANT_COMPLETE_REPLACE) { 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(suggestions[0].text, true); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly allow empty vector to be sent to the browser. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SetSuggestions( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), suggestions)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::SetVoiceSearchSupported(bool supported) { 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch render_view()->Send(new ChromeViewHostMsg_SetVoiceSearchSupported( 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch render_view()->GetRoutingID(), render_view()->GetPageId(), supported)); 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::MarkQueryAsRestricted() { 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = true; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) query_.clear(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowInstantOverlay(int height, InstantSizeUnits units) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_ShowInstantOverlay( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), height, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) units)); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::FocusOmnibox() { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_VISIBLE)); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StartCapturingKeyStrokes() { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_INVISIBLE)); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StopCapturingKeyStrokes() { 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_NONE)); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PageTransition transition, 149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WindowOpenDisposition disposition, 150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool is_search_type) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) url, transition, disposition, is_search_type)); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::DeleteMostVisitedItem( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetURLForMostVisitedItem(most_visited_item_id))); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoMostVisitedDeletion( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetURLForMostVisitedItem(most_visited_item_id))); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send( 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowBars() { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " ShowBars"; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxShowBars( 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::HideBars() { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " HideBars"; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxHideBars( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int SearchBox::GetStartMargin() const { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<int>(start_margin_ / GetZoom()); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect SearchBox::GetPopupBounds() const { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double zoom = GetZoom(); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Rect(static_cast<int>(popup_bounds_.x() / zoom), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.y() / zoom), 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.width() / zoom), 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.height() / zoom)); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetAutocompleteResults( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstantAutocompleteResultIDPair>* results) const { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_.GetCurrentItems(results); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetAutocompleteResultWithID( 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID autocomplete_result_id, 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantAutocompleteResult* result) const { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return autocomplete_results_cache_.GetItemWithRestrictedID( 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_result_id, result); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme_info_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url, 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL* url) const { 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantRestrictedID rid = 0; 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(), 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transient_url, &rid)) { 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL most_visited_item_url(GetURLForMostVisitedItem(rid)); 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (most_visited_item_url.is_empty()) 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *url = GURL(base::StringPrintf("chrome-search://thumb/%s", 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_item_url.spec().c_str())); 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url, 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL* url) const { 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantRestrictedID rid = 0; 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(), 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transient_url, &rid)) { 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL most_visited_item_url(GetURLForMostVisitedItem(rid)); 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (most_visited_item_url.is_empty()) 242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *url = GURL(base::StringPrintf("chrome-search://favicon/%s", 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_item_url.spec().c_str())); 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(SearchBox, message) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxChange, OnChange) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancel, OnCancel) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPopupResize, OnPopupResize) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxBarsHidden, OnBarsHidden) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDetermineIfPageSupportsInstant) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxAutocompleteResults, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAutocompleteResults) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxUpOrDownKeyPressed, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpOrDownKeyPressed) 263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxEscKeyPressed, OnEscKeyPressed) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancelSelection, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnCancelSelection) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetDisplayInstantResults) 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged) 2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetInputInProgress, 2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnSetInputInProgress) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnThemeChanged) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFontInformationReceived) 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPromoInformation, 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnPromoInformationReceived) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnMostVisitedChanged) 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch, 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnToggleVoiceSearch) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnChange(const string16& query, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool verbatim, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t selection_start, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t selection_end) { 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, verbatim); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_start; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_end_ = selection_end; 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |query| is empty, this is due to the user backspacing away all the text 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // in the omnibox, or hitting Escape to restore the "permanent URL", or 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // switching tabs, etc. In all these cases, there will be no corresponding 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnAutocompleteResults(), so clear the autocomplete results ourselves, by 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // adding an empty set. Don't notify the page using an "onnativesuggestions" 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // event, though. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (query.empty()) { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autocomplete_results_cache_.AddItems( 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<InstantAutocompleteResult>()); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnChange"; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchChange( 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnSubmit(const string16& query) { 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit() is called when the user hits Enter to commit the omnibox text. 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |query| is non-blank, the user committed a search. If it's blank, the 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // omnibox text was a URL, and the user is navigating to it, in which case 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we shouldn't update the |query_| or associated state. 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!query.empty()) { 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, true); 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnSubmit"; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchSubmit( 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!query.empty()) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnCancel(const string16& query) { 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, true); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnCancel"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchCancel( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnPopupResize(const gfx::Rect& bounds) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_ = bounds; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnPopupResize"; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchResize( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMarginChange(int margin, int width) { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_margin_ = margin; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Override only the width parameter of the popup bounds. 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_.set_width(width); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchMarginChange( 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnBarsHidden() { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchBarsHidden( 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant( 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " PageSupportsInstant: " << result; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), result)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnAutocompleteResults( 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<InstantAutocompleteResult>& results) { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_.AddItems(results); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnAutocompleteResults"; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchAutocompleteResults( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnUpOrDownKeyPressed(int count) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnKeyPress: " << count; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchUpOrDownKeyPress( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame(), count); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SearchBox::OnEscKeyPressed() { 400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DVLOG(1) << render_view() << " OnEscKeyPressed "; 402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchEscKeyPress( 403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnCancelSelection(const string16& query, 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool verbatim, 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t selection_start, 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t selection_end) { 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, verbatim); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_start_ = selection_start; 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_end_ = selection_end; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnKeyPress ESC"; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchEscKeyPress( 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state, 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OmniboxFocusChangeReason reason) { 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE; 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (key_capture_enabled != is_key_capture_enabled_) { 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Tell the page if the key capture mode changed unless the focus state 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changed because of TYPING. This is because in that case, the browser 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hasn't really stopped capturing key strokes. 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // (More practically, if we don't do this check, the page would receive 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onkeycapturechange before the corresponding onchange, and the page would 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // have no way of telling whether the keycapturechange happened because of 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // some actual user action or just because they started typing.) 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (reason != OMNIBOX_FOCUS_CHANGE_TYPING && 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView() && 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_key_capture_enabled_ = key_capture_enabled; 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnKeyCaptureChange"; 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange( 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE; 443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_focused != is_focused_) { 444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_ = is_focused; 445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnFocusChange"; 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (render_view()->GetWebView() && 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchFocusChange( 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SearchBox::OnSetInputInProgress(bool is_input_in_progress) { 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_input_in_progress_ != is_input_in_progress) { 4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) is_input_in_progress_ = is_input_in_progress; 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << render_view() << " OnSetInputInProgress"; 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (render_view()->GetWebView() && 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_input_in_progress_) { 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchInputStart( 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchInputCancel( 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_instant_results_ = display_instant_results; 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) { 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Do not send duplicate notifications. 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (theme_info_ == theme_info) 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_info_ = theme_info; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchThemeChange( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnFontInformationReceived(const string16& omnibox_font, 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t omnibox_font_size) { 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_ = omnibox_font; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_size_ = omnibox_font_size; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchBox::OnPromoInformationReceived(bool is_app_launcher_enabled) { 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch app_launcher_enabled_ = is_app_launcher_enabled; 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double SearchBox::GetZoom() const { 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebView* web_view = render_view()->GetWebView(); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_view) { 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel()); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (zoom != 0) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return zoom; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1.0; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query_.clear(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verbatim_ = false; 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = false; 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_start_ = 0; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_end_ = 0; 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_ = gfx::Rect(); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_margin_ = 0; 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_ = false; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_key_capture_enabled_ = false; 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_info_ = ThemeBackgroundInfo(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't reset display_instant_results_ to prevent clearing it on committed 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // results pages in extended mode. Otherwise resetting it is a no-op because 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a new loader is created when it changes; see crbug.com/164662. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also don't reset omnibox_font_ or omnibox_font_size_ since it never 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changes. 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::SetQuery(const string16& query, bool verbatim) { 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_ = query; 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbatim_ = verbatim; 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = false; 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMostVisitedChanged( 532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<InstantMostVisitedItem>& items) { 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<InstantMostVisitedItemIDPair> last_known_items; 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetMostVisitedItems(&last_known_items); 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (AreMostVisitedItemsEqual(last_known_items, items)) 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; // Do not send duplicate onmostvisitedchange events. 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_items_cache_.AddItems(items); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged( 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetMostVisitedItems( 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstantMostVisitedItemIDPair>* items) const { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return most_visited_items_cache_.GetCurrentItems(items); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetMostVisitedItemWithID( 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id, 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantMostVisitedItem* item) const { 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id, 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const { 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantMostVisitedItem item; 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL(); 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnToggleVoiceSearch() { 564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch( 566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 569