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