searchbox.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string_number_conversions.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/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" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/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) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal { // for testing 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Parses |url| and fills in |id| with the InstantRestrictedID obtained from the 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// |url|. |render_view_id| is the ID of the associated RenderView. 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Valid |url| forms: 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://favicon/<view_id>/<restricted_id> 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// chrome-search://thumb/<view_id>/<restricted_id> 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If the |url| is valid, returns true and fills in |id| with restricted_id 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// value. If the |url| is invalid, returns false and |id| is not set. 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetInstantRestrictedIDFromURL(int render_view_id, 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL& url, 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantRestrictedID* id) { 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Strip leading path. 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string path = url.path().substr(1); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check that the path is of Most visited item ID form. 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<std::string> tokens; 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (Tokenize(path, "/", &tokens) != 2) 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int view_id = 0; 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(tokens[0], &view_id) || view_id != render_view_id) 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return base::StringToInt(tokens[1], id); 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace internal 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::SearchBox(content::RenderView* render_view) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::RenderViewObserver(render_view), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewObserverTracker<SearchBox>(render_view), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verbatim_(false), 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_(false), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_(0), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_end_(0), 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_margin_(0), 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_(false), 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_key_capture_enabled_(false), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_instant_results_(false), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_size_(0), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_(kMaxInstantAutocompleteResultItemCacheSize), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) most_visited_items_cache_(kMaxInstantMostVisitedItemCacheSize) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchBox::~SearchBox() { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::SetSuggestions( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<InstantSuggestion>& suggestions) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suggestions.empty() && 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suggestions[0].behavior == INSTANT_COMPLETE_REPLACE) { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(suggestions[0].text, true); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly allow empty vector to be sent to the browser. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SetSuggestions( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), suggestions)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::MarkQueryAsRestricted() { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = true; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) query_.clear(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowInstantOverlay(int height, InstantSizeUnits units) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_ShowInstantOverlay( 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), height, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) units)); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::FocusOmnibox() { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_VISIBLE)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StartCapturingKeyStrokes() { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_INVISIBLE)); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::StopCapturingKeyStrokes() { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_FocusOmnibox( 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OMNIBOX_FOCUS_NONE)); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::NavigateToURL(const GURL& url, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PageTransition transition, 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WindowOpenDisposition disposition, 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool is_search_type) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxNavigate( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) url, transition, disposition, is_search_type)); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::DeleteMostVisitedItem( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetURLForMostVisitedItem(most_visited_item_id))); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoMostVisitedDeletion( 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetURLForMostVisitedItem(most_visited_item_id))); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::UndoAllMostVisitedDeletions() { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::ShowBars() { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " ShowBars"; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxShowBars( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::HideBars() { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " HideBars"; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_SearchBoxHideBars( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId())); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int SearchBox::GetStartMargin() const { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<int>(start_margin_ / GetZoom()); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect SearchBox::GetPopupBounds() const { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double zoom = GetZoom(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Rect(static_cast<int>(popup_bounds_.x() / zoom), 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.y() / zoom), 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.width() / zoom), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(popup_bounds_.height() / zoom)); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetAutocompleteResults( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstantAutocompleteResultIDPair>* results) const { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_.GetCurrentItems(results); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetAutocompleteResultWithID( 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID autocomplete_result_id, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantAutocompleteResult* result) const { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return autocomplete_results_cache_.GetItemWithRestrictedID( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_result_id, result); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ThemeBackgroundInfo& SearchBox::GetThemeBackgroundInfo() { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme_info_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateThumbnailURLFromTransientURL(const GURL& transient_url, 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL* url) const { 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantRestrictedID rid = 0; 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(), 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transient_url, &rid)) { 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL most_visited_item_url(GetURLForMostVisitedItem(rid)); 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (most_visited_item_url.is_empty()) 202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *url = GURL(base::StringPrintf("chrome-search://thumb/%s", 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_item_url.spec().c_str())); 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SearchBox::GenerateFaviconURLFromTransientURL(const GURL& transient_url, 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL* url) const { 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantRestrictedID rid = 0; 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!internal::GetInstantRestrictedIDFromURL(render_view()->GetRoutingID(), 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transient_url, &rid)) { 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL most_visited_item_url(GetURLForMostVisitedItem(rid)); 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (most_visited_item_url.is_empty()) 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *url = GURL(base::StringPrintf("chrome-search://favicon/%s", 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_item_url.spec().c_str())); 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBox::OnMessageReceived(const IPC::Message& message) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(SearchBox, message) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxChange, OnChange) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSubmit, OnSubmit) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancel, OnCancel) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxPopupResize, OnPopupResize) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMarginChange, OnMarginChange) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxBarsHidden, OnBarsHidden) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_DetermineIfPageSupportsInstant, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDetermineIfPageSupportsInstant) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxAutocompleteResults, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAutocompleteResults) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxUpOrDownKeyPressed, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpOrDownKeyPressed) 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxEscKeyPressed, OnEscKeyPressed) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxCancelSelection, 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnCancelSelection) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxSetDisplayInstantResults, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetDisplayInstantResults) 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFocusChanged, OnFocusChanged) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxThemeChanged, 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnThemeChanged) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxFontInformation, 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFontInformationReceived) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxMostVisitedItemsChanged, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnMostVisitedChanged) 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewMsg_SearchBoxToggleVoiceSearch, 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnToggleVoiceSearch) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnChange(const string16& query, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool verbatim, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t selection_start, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t selection_end) { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, verbatim); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_start; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_end_ = selection_end; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |query| is empty, this is due to the user backspacing away all the text 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // in the omnibox, or hitting Escape to restore the "permanent URL", or 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // switching tabs, etc. In all these cases, there will be no corresponding 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnAutocompleteResults(), so clear the autocomplete results ourselves, by 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // adding an empty set. Don't notify the page using an "onnativesuggestions" 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // event, though. 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (query.empty()) { 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autocomplete_results_cache_.AddItems( 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<InstantAutocompleteResult>()); 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnChange"; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchChange( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnSubmit(const string16& query) { 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit() is called when the user hits Enter to commit the omnibox text. 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |query| is non-blank, the user committed a search. If it's blank, the 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // omnibox text was a URL, and the user is navigating to it, in which case 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we shouldn't update the |query_| or associated state. 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!query.empty()) { 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, true); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnSubmit"; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchSubmit( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!query.empty()) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnCancel(const string16& query) { 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, true); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_start_ = selection_end_ = query_.size(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnCancel"; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchCancel( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnPopupResize(const gfx::Rect& bounds) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_ = bounds; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnPopupResize"; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchResize( 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMarginChange(int margin, int width) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_margin_ = margin; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Override only the width parameter of the popup bounds. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_.set_width(width); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchMarginChange( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnBarsHidden() { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchBarsHidden( 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnDetermineIfPageSupportsInstant() { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = extensions_v8::SearchBoxExtension::PageSupportsInstant( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " PageSupportsInstant: " << result; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->Send(new ChromeViewHostMsg_InstantSupportDetermined( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetRoutingID(), render_view()->GetPageId(), result)); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnAutocompleteResults( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<InstantAutocompleteResult>& results) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocomplete_results_cache_.AddItems(results); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnAutocompleteResults"; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchAutocompleteResults( 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::OnUpOrDownKeyPressed(int count) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnKeyPress: " << count; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchUpOrDownKeyPress( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame(), count); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SearchBox::OnEscKeyPressed() { 372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DVLOG(1) << render_view() << " OnEscKeyPressed "; 374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchEscKeyPress( 375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::OnCancelSelection(const string16& query, 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool verbatim, 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t selection_start, 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t selection_end) { 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetQuery(query, verbatim); 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_start_ = selection_start; 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selection_end_ = selection_end; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << render_view() << " OnKeyPress ESC"; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchEscKeyPress( 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnFocusChanged(OmniboxFocusState new_focus_state, 394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OmniboxFocusChangeReason reason) { 395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool key_capture_enabled = new_focus_state == OMNIBOX_FOCUS_INVISIBLE; 396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (key_capture_enabled != is_key_capture_enabled_) { 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Tell the page if the key capture mode changed unless the focus state 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changed because of TYPING. This is because in that case, the browser 399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hasn't really stopped capturing key strokes. 400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // (More practically, if we don't do this check, the page would receive 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onkeycapturechange before the corresponding onchange, and the page would 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // have no way of telling whether the keycapturechange happened because of 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // some actual user action or just because they started typing.) 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (reason != OMNIBOX_FOCUS_CHANGE_TYPING && 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView() && 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()) { 408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_key_capture_enabled_ = key_capture_enabled; 409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnKeyCaptureChange"; 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchKeyCaptureChange( 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_focused = new_focus_state == OMNIBOX_FOCUS_VISIBLE; 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_focused != is_focused_) { 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_focused_ = is_focused; 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << render_view() << " OnFocusChange"; 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchFocusChange( 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnSetDisplayInstantResults(bool display_instant_results) { 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_instant_results_ = display_instant_results; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnThemeChanged(const ThemeBackgroundInfo& theme_info) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_info_ = theme_info; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchThemeChange( 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnFontInformationReceived(const string16& omnibox_font, 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t omnibox_font_size) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_ = omnibox_font; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_font_size_ = omnibox_font_size; 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double SearchBox::GetZoom() const { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebView* web_view = render_view()->GetWebView(); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_view) { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double zoom = WebKit::WebView::zoomLevelToZoomFactor(web_view->zoomLevel()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (zoom != 0) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return zoom; 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1.0; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBox::Reset() { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query_.clear(); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verbatim_ = false; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = false; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_start_ = 0; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_end_ = 0; 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_bounds_ = gfx::Rect(); 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(); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't reset display_instant_results_ to prevent clearing it on committed 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // results pages in extended mode. Otherwise resetting it is a no-op because 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a new loader is created when it changes; see crbug.com/164662. 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also don't reset omnibox_font_ or omnibox_font_size_ since it never 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changes. 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBox::SetQuery(const string16& query, bool verbatim) { 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_ = query; 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbatim_ = verbatim; 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) query_is_restricted_ = false; 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::OnMostVisitedChanged( 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<InstantMostVisitedItem>& items) { 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) most_visited_items_cache_.AddItems(items); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchMostVisitedChanged( 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view()->GetWebView()->mainFrame()); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBox::GetMostVisitedItems( 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstantMostVisitedItemIDPair>* items) const { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return most_visited_items_cache_.GetCurrentItems(items); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SearchBox::GetMostVisitedItemWithID( 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantRestrictedID most_visited_item_id, 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantMostVisitedItem* item) const { 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return most_visited_items_cache_.GetItemWithRestrictedID(most_visited_item_id, 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GURL SearchBox::GetURLForMostVisitedItem(InstantRestrictedID item_id) const { 497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantMostVisitedItem item; 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return GetMostVisitedItemWithID(item_id, &item) ? item.url : GURL(); 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SearchBox::OnToggleVoiceSearch() { 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions_v8::SearchBoxExtension::DispatchToggleVoiceSearch( 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view()->GetWebView()->mainFrame()); 505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 507