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