12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_current_page_delegate_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/omnibox/omnibox_api.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/search/search.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/search_engines/template_url_service_factory.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_controller.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/search/search_tab_helper.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/search/search.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OmniboxCurrentPageDelegateImpl::OmniboxCurrentPageDelegateImpl( 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OmniboxEditController* controller, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : controller_(controller), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_(profile) {} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OmniboxCurrentPageDelegateImpl::~OmniboxCurrentPageDelegateImpl() {} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OmniboxCurrentPageDelegateImpl::CurrentPageExists() const { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (controller_->GetWebContents() != NULL); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& OmniboxCurrentPageDelegateImpl::GetURL() const { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return controller_->GetWebContents()->GetURL(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool OmniboxCurrentPageDelegateImpl::IsInstantNTP() const { 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return chrome::IsInstantNTP(controller_->GetWebContents()); 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool OmniboxCurrentPageDelegateImpl::IsSearchResultsPage() const { 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Profile* profile = Profile::FromBrowserContext( 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller_->GetWebContents()->GetBrowserContext()); 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return TemplateURLServiceFactory::GetForProfile(profile)-> 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IsSearchResultsPageFromDefaultSearchProvider(GetURL()); 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OmniboxCurrentPageDelegateImpl::IsLoading() const { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return controller_->GetWebContents()->IsLoading(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::NavigationController& 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OmniboxCurrentPageDelegateImpl::GetNavigationController() const { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return controller_->GetWebContents()->GetController(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SessionID& OmniboxCurrentPageDelegateImpl::GetSessionID() const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SessionTabHelper::FromWebContents( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->GetWebContents())->session_id(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OmniboxCurrentPageDelegateImpl::ProcessExtensionKeyword( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURL* template_url, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AutocompleteMatch& match, 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WindowOpenDisposition disposition) { 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (template_url->GetType() != TemplateURL::OMNIBOX_API_EXTENSION) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Strip the keyword + leading space off the input. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t prefix_length = match.keyword.length() + 1; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionOmniboxEventRouter::OnInputEntered( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->GetWebContents(), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url->GetExtensionId(), 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(match.fill_into_edit.substr(prefix_length)), 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disposition); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OmniboxCurrentPageDelegateImpl::OnInputStateChanged() { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!controller_->GetWebContents()) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SearchTabHelper::FromWebContents( 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_->GetWebContents())->OmniboxInputStateChanged(); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OmniboxCurrentPageDelegateImpl::OnFocusChanged( 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OmniboxFocusState state, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OmniboxFocusChangeReason reason) { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!controller_->GetWebContents()) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SearchTabHelper::FromWebContents( 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_->GetWebContents())->OmniboxFocusChanged(state, reason); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OmniboxCurrentPageDelegateImpl::DoPrerender( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AutocompleteMatch& match) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents = controller_->GetWebContents(); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::Rect container_bounds = web_contents->GetContainerBounds(); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstantSearchPrerenderer* prerenderer = 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstantSearchPrerenderer::GetForProfile(profile_); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (prerenderer && prerenderer->IsAllowed(match, web_contents)) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenderer->Init( 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents->GetController().GetSessionStorageNamespaceMap(), 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) container_bounds.size()); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) predictors::AutocompleteActionPredictorFactory::GetForProfile(profile_)-> 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPrerendering( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match.destination_url, 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->GetController().GetSessionStorageNamespaceMap(), 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_bounds.size()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxCurrentPageDelegateImpl::SetSuggestionToPrefetch( 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const InstantSuggestion& suggestion) { 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(chrome::IsInstantExtendedAPIEnabled()); 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents* web_contents = controller_->GetWebContents(); 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (web_contents && 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SearchTabHelper::FromWebContents(web_contents)->IsSearchResultsPage()) { 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (chrome::ShouldPrefetchSearchResultsOnSRP()) { 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SearchTabHelper::FromWebContents(web_contents)-> 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetSuggestionToPrefetch(suggestion); 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstantSearchPrerenderer* prerenderer = 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstantSearchPrerenderer::GetForProfile(profile_); 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (prerenderer) 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prerenderer->Prerender(suggestion); 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 139