Home | History | Annotate | Download | only in omnibox
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/omnibox/omnibox_current_page_delegate_impl.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
      9 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
     10 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
     11 #include "chrome/browser/profiles/profile.h"
     12 #include "chrome/browser/search/search.h"
     13 #include "chrome/browser/search_engines/template_url_service_factory.h"
     14 #include "chrome/browser/sessions/session_tab_helper.h"
     15 #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
     16 #include "chrome/browser/ui/search/instant_search_prerenderer.h"
     17 #include "chrome/browser/ui/search/search_tab_helper.h"
     18 #include "components/omnibox/autocomplete_match.h"
     19 #include "components/search/search.h"
     20 #include "components/search_engines/template_url_service.h"
     21 #include "content/public/browser/navigation_controller.h"
     22 #include "content/public/browser/web_contents.h"
     23 #include "ui/base/window_open_disposition.h"
     24 #include "url/gurl.h"
     25 
     26 OmniboxCurrentPageDelegateImpl::OmniboxCurrentPageDelegateImpl(
     27     OmniboxEditController* controller,
     28     Profile* profile)
     29     : controller_(controller),
     30       profile_(profile) {}
     31 
     32 OmniboxCurrentPageDelegateImpl::~OmniboxCurrentPageDelegateImpl() {}
     33 
     34 bool OmniboxCurrentPageDelegateImpl::CurrentPageExists() const {
     35   return (controller_->GetWebContents() != NULL);
     36 }
     37 
     38 const GURL& OmniboxCurrentPageDelegateImpl::GetURL() const {
     39   return controller_->GetWebContents()->GetURL();
     40 }
     41 
     42 bool OmniboxCurrentPageDelegateImpl::IsInstantNTP() const {
     43   return chrome::IsInstantNTP(controller_->GetWebContents());
     44 }
     45 
     46 bool OmniboxCurrentPageDelegateImpl::IsSearchResultsPage() const {
     47   Profile* profile = Profile::FromBrowserContext(
     48       controller_->GetWebContents()->GetBrowserContext());
     49   return TemplateURLServiceFactory::GetForProfile(profile)->
     50       IsSearchResultsPageFromDefaultSearchProvider(GetURL());
     51 }
     52 
     53 bool OmniboxCurrentPageDelegateImpl::IsLoading() const {
     54   return controller_->GetWebContents()->IsLoading();
     55 }
     56 
     57 content::NavigationController&
     58     OmniboxCurrentPageDelegateImpl::GetNavigationController() const {
     59   return controller_->GetWebContents()->GetController();
     60 }
     61 
     62 const SessionID& OmniboxCurrentPageDelegateImpl::GetSessionID() const {
     63   return SessionTabHelper::FromWebContents(
     64       controller_->GetWebContents())->session_id();
     65 }
     66 
     67 bool OmniboxCurrentPageDelegateImpl::ProcessExtensionKeyword(
     68     TemplateURL* template_url,
     69     const AutocompleteMatch& match,
     70     WindowOpenDisposition disposition) {
     71   if (template_url->GetType() != TemplateURL::OMNIBOX_API_EXTENSION)
     72     return false;
     73 
     74   // Strip the keyword + leading space off the input.
     75   size_t prefix_length = match.keyword.length() + 1;
     76   extensions::ExtensionOmniboxEventRouter::OnInputEntered(
     77       controller_->GetWebContents(),
     78       template_url->GetExtensionId(),
     79       base::UTF16ToUTF8(match.fill_into_edit.substr(prefix_length)),
     80       disposition);
     81 
     82   return true;
     83 }
     84 
     85 void OmniboxCurrentPageDelegateImpl::OnInputStateChanged() {
     86   if (!controller_->GetWebContents())
     87     return;
     88   SearchTabHelper::FromWebContents(
     89       controller_->GetWebContents())->OmniboxInputStateChanged();
     90 }
     91 
     92 void OmniboxCurrentPageDelegateImpl::OnFocusChanged(
     93     OmniboxFocusState state,
     94     OmniboxFocusChangeReason reason) {
     95   if (!controller_->GetWebContents())
     96     return;
     97   SearchTabHelper::FromWebContents(
     98       controller_->GetWebContents())->OmniboxFocusChanged(state, reason);
     99 }
    100 
    101 void OmniboxCurrentPageDelegateImpl::DoPrerender(
    102     const AutocompleteMatch& match) {
    103   content::WebContents* web_contents = controller_->GetWebContents();
    104   gfx::Rect container_bounds = web_contents->GetContainerBounds();
    105 
    106   InstantSearchPrerenderer* prerenderer =
    107       InstantSearchPrerenderer::GetForProfile(profile_);
    108   if (prerenderer && prerenderer->IsAllowed(match, web_contents)) {
    109     prerenderer->Init(
    110         web_contents->GetController().GetSessionStorageNamespaceMap(),
    111         container_bounds.size());
    112     return;
    113   }
    114 
    115   predictors::AutocompleteActionPredictorFactory::GetForProfile(profile_)->
    116       StartPrerendering(
    117           match.destination_url,
    118           web_contents->GetController().GetSessionStorageNamespaceMap(),
    119           container_bounds.size());
    120 }
    121 
    122 void OmniboxCurrentPageDelegateImpl::SetSuggestionToPrefetch(
    123       const InstantSuggestion& suggestion) {
    124   DCHECK(chrome::IsInstantExtendedAPIEnabled());
    125   content::WebContents* web_contents = controller_->GetWebContents();
    126   if (web_contents &&
    127       SearchTabHelper::FromWebContents(web_contents)->IsSearchResultsPage()) {
    128     if (chrome::ShouldPrefetchSearchResultsOnSRP()) {
    129       SearchTabHelper::FromWebContents(web_contents)->
    130           SetSuggestionToPrefetch(suggestion);
    131     }
    132   } else {
    133     InstantSearchPrerenderer* prerenderer =
    134         InstantSearchPrerenderer::GetForProfile(profile_);
    135     if (prerenderer)
    136       prerenderer->Prerender(suggestion);
    137   }
    138 }
    139