// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.h" #include "base/logging.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/search.h" #include "chrome/browser/ssl/chrome_security_state_model_client.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/google/core/browser/google_util.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/prefs/pref_service.h" #include "content/public/browser/cert_store.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "content/public/common/ssl_status.h" ChromeToolbarModelDelegate::ChromeToolbarModelDelegate() {} ChromeToolbarModelDelegate::~ChromeToolbarModelDelegate() {} std::string ChromeToolbarModelDelegate::GetAcceptLanguages() const { Profile* profile = GetProfile(); return profile ? profile->GetPrefs()->GetString(prefs::kAcceptLanguages) : std::string(); } base::string16 ChromeToolbarModelDelegate::FormattedStringWithEquivalentMeaning( const GURL& url, const base::string16& formatted_url) const { return AutocompleteInput::FormattedStringWithEquivalentMeaning( url, formatted_url, ChromeAutocompleteSchemeClassifier(GetProfile())); } bool ChromeToolbarModelDelegate::GetURL(GURL* url) const { DCHECK(url); content::NavigationEntry* entry = GetNavigationEntry(); if (!entry) return false; *url = ShouldDisplayURL() ? entry->GetVirtualURL() : GURL(); return true; } bool ChromeToolbarModelDelegate::ShouldDisplayURL() const { // Note: The order here is important. // - The WebUI test must come before the extension scheme test because there // can be WebUIs that have extension schemes (e.g. the bookmark manager). In // that case, we should prefer what the WebUI instance says. // - The view-source test must come before the NTP test because of the case // of view-source:chrome://newtab, which should display its URL despite what // chrome://newtab says. content::NavigationEntry* entry = GetNavigationEntry(); if (entry) { if (entry->IsViewSourceMode() || entry->GetPageType() == content::PAGE_TYPE_INTERSTITIAL) { return true; } GURL url = entry->GetURL(); GURL virtual_url = entry->GetVirtualURL(); if (url.SchemeIs(content::kChromeUIScheme) || virtual_url.SchemeIs(content::kChromeUIScheme)) { if (!url.SchemeIs(content::kChromeUIScheme)) url = virtual_url; return url.host() != chrome::kChromeUINewTabHost; } } return !search::IsInstantNTP(GetActiveWebContents()); } security_state::SecurityStateModel::SecurityLevel ChromeToolbarModelDelegate::GetSecurityLevel() const { content::WebContents* web_contents = GetActiveWebContents(); // If there is no active WebContents (which can happen during toolbar // initialization), assume no security style. if (!web_contents) return security_state::SecurityStateModel::NONE; auto* client = ChromeSecurityStateModelClient::FromWebContents(web_contents); return client->GetSecurityInfo().security_level; } base::string16 ChromeToolbarModelDelegate::GetSearchTerms( security_state::SecurityStateModel::SecurityLevel security_level) const { content::WebContents* web_contents = GetActiveWebContents(); base::string16 search_terms(search::GetSearchTerms(web_contents)); if (search_terms.empty()) { // We mainly do this to enforce the subsequent DCHECK. return base::string16(); } // If the page is still loading and the security style is unknown, consider // the page secure. Without this, after the user hit enter on some search // terms, the omnibox would change to displaying the loading URL before // changing back to the search terms once they could be extracted, thus // causing annoying flicker. DCHECK(web_contents); content::NavigationController& nav_controller = web_contents->GetController(); content::NavigationEntry* entry = nav_controller.GetVisibleEntry(); if ((entry != nav_controller.GetLastCommittedEntry()) && (entry->GetSSL().security_style == content::SECURITY_STYLE_UNKNOWN)) return search_terms; // If the URL is using a Google base URL specified via the command line, we // bypass the security check below. if (entry && google_util::StartsWithCommandLineGoogleBaseURL(entry->GetVirtualURL())) return search_terms; // Otherwise, extract search terms for HTTPS pages that do not have a security // error. bool extract_search_terms = (security_level != security_state::SecurityStateModel::NONE) && (security_level != security_state::SecurityStateModel::SECURITY_ERROR); return extract_search_terms ? search_terms : base::string16(); } scoped_refptr ChromeToolbarModelDelegate::GetCertificate() const { scoped_refptr cert; content::NavigationEntry* entry = GetNavigationEntry(); if (entry) { content::CertStore::GetInstance()->RetrieveCert(entry->GetSSL().cert_id, &cert); } return cert; } content::NavigationController* ChromeToolbarModelDelegate::GetNavigationController() const { // This |current_tab| can be null during the initialization of the toolbar // during window creation (i.e. before any tabs have been added to the // window). content::WebContents* current_tab = GetActiveWebContents(); return current_tab ? ¤t_tab->GetController() : nullptr; } content::NavigationEntry* ChromeToolbarModelDelegate::GetNavigationEntry() const { content::NavigationController* controller = GetNavigationController(); return controller ? controller->GetVisibleEntry() : nullptr; } Profile* ChromeToolbarModelDelegate::GetProfile() const { content::NavigationController* controller = GetNavigationController(); return controller ? Profile::FromBrowserContext(controller->GetBrowserContext()) : nullptr; }