Index: chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc |
diff --git a/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc b/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc |
index f69e939ba006b7126e20406a9d0ff0e744df5a3d..795e682edc63fcfaa5baa2fe904378cfdf278bbf 100644 |
--- a/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc |
+++ b/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc |
@@ -4,14 +4,25 @@ |
#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(); |
@@ -26,9 +37,100 @@ base::string16 ChromeToolbarModelDelegate::FormattedStringWithEquivalentMeaning( |
url, formatted_url, ChromeAutocompleteSchemeClassifier(GetProfile())); |
} |
-ChromeToolbarModelDelegate::ChromeToolbarModelDelegate() {} |
+bool ChromeToolbarModelDelegate::GetURL(GURL* url) const { |
+ DCHECK(url); |
+ content::NavigationEntry* entry = GetNavigationEntry(); |
+ if (!entry) |
+ return false; |
-ChromeToolbarModelDelegate::~ChromeToolbarModelDelegate() {} |
+ *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<net::X509Certificate> ChromeToolbarModelDelegate::GetCertificate() |
+ const { |
+ scoped_refptr<net::X509Certificate> cert; |
+ content::NavigationEntry* entry = GetNavigationEntry(); |
+ if (entry) { |
+ content::CertStore::GetInstance()->RetrieveCert(entry->GetSSL().cert_id, |
+ &cert); |
+ } |
+ return cert; |
+} |
content::NavigationController* |
ChromeToolbarModelDelegate::GetNavigationController() const { |
@@ -39,10 +141,15 @@ ChromeToolbarModelDelegate::GetNavigationController() const { |
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* navigation_controller = |
- GetNavigationController(); |
- return navigation_controller ? Profile::FromBrowserContext( |
- navigation_controller->GetBrowserContext()) |
- : nullptr; |
+ content::NavigationController* controller = GetNavigationController(); |
+ return controller |
+ ? Profile::FromBrowserContext(controller->GetBrowserContext()) |
+ : nullptr; |
} |