Index: chrome/browser/search/search.cc |
diff --git a/chrome/browser/search/search.cc b/chrome/browser/search/search.cc |
index d4e8b1a604de280ee73b5b4f9694cd45f76b35c1..1562d527433f530e9a6c3cfc56476a7ca89db780 100644 |
--- a/chrome/browser/search/search.cc |
+++ b/chrome/browser/search/search.cc |
@@ -6,6 +6,7 @@ |
#include "base/command_line.h" |
#include "base/metrics/field_trial.h" |
+#include "base/metrics/histogram.h" |
#include "base/prefs/pref_service.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_split.h" |
@@ -86,6 +87,33 @@ const char kEmbeddedSearchFieldTrialName[] = "EmbeddedSearch"; |
// be ignored and Instant Extended will not be enabled by default. |
const char kDisablingSuffix[] = "DISABLED"; |
+// Status of the New Tab URL for the default Search provider. NOTE: Used in a |
+// UMA histogram so values should only be added at the end and not reordered. |
+enum NewTabURLState { |
+ // Valid URL that should be used. |
+ NEW_TAB_URL_VALID = 0, |
+ |
+ // Corrupt state (e.g. no profile or template url). |
+ NEW_TAB_URL_BAD = 1, |
+ |
+ // URL should not be used because in incognito window. |
+ NEW_TAB_URL_INCOGNITO = 2, |
+ |
+ // No New Tab URL set for provider. |
+ NEW_TAB_URL_NOT_SET = 3, |
+ |
+ // URL is not secure. |
+ NEW_TAB_URL_INSECURE = 4, |
+ |
+ // URL should not be used because Suggest is disabled. |
+ NEW_TAB_URL_SUGGEST_OFF = 5, |
+ |
+ // URL should not be used because it is blocked for a supervised user. |
+ NEW_TAB_URL_BLOCKED = 6, |
+ |
+ NEW_TAB_URL_MAX |
+}; |
+ |
// Used to set the Instant support state of the Navigation entry. |
const char kInstantSupportStateKey[] = "instant_support_state"; |
@@ -115,10 +143,12 @@ base::string16 InstantSupportStateToString(InstantSupportState state) { |
} |
TemplateURL* GetDefaultSearchProviderTemplateURL(Profile* profile) { |
- TemplateURLService* template_url_service = |
- TemplateURLServiceFactory::GetForProfile(profile); |
- if (template_url_service) |
- return template_url_service->GetDefaultSearchProvider(); |
+ if (profile) { |
+ TemplateURLService* template_url_service = |
+ TemplateURLServiceFactory::GetForProfile(profile); |
+ if (template_url_service) |
+ return template_url_service->GetDefaultSearchProvider(); |
+ } |
return NULL; |
} |
@@ -259,6 +289,54 @@ bool IsURLAllowedForSupervisedUser(const GURL& url, Profile* profile) { |
return true; |
} |
+// Returns whether |new_tab_url| can be used as a URL for the New Tab page. |
+// NEW_TAB_URL_VALID means a valid URL; other enum values imply an invalid URL. |
+NewTabURLState IsValidNewTabURL(Profile* profile, const GURL& new_tab_url) { |
+ if (profile->IsOffTheRecord()) |
+ return NEW_TAB_URL_INCOGNITO; |
+ if (!new_tab_url.is_valid()) |
+ return NEW_TAB_URL_NOT_SET; |
+ if (!new_tab_url.SchemeIsSecure()) |
+ return NEW_TAB_URL_INSECURE; |
+ if (!IsSuggestPrefEnabled(profile)) |
+ return NEW_TAB_URL_SUGGEST_OFF; |
+ if (!IsURLAllowedForSupervisedUser(new_tab_url, profile)) |
+ return NEW_TAB_URL_BLOCKED; |
+ return NEW_TAB_URL_VALID; |
+} |
+ |
+// Used to look up the URL to use for the New Tab page. Also tracks how we |
+// arrived at that URL so it can be logged with UMA. |
+struct NewTabURLDetails { |
+ NewTabURLDetails(const GURL& url, NewTabURLState state) |
+ : url(url), state(state) {} |
+ |
+ static NewTabURLDetails ForProfile(Profile* profile) { |
+ const GURL local_url(chrome::kChromeSearchLocalNtpUrl); |
+ TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); |
+ if (!profile || !template_url) |
+ return NewTabURLDetails(local_url, NEW_TAB_URL_BAD); |
+ |
+ GURL search_provider_url = TemplateURLRefToGURL( |
+ template_url->new_tab_url_ref(), kDisableStartMargin, false, false); |
+ NewTabURLState state = IsValidNewTabURL(profile, search_provider_url); |
+ switch (state) { |
+ case NEW_TAB_URL_VALID: |
+ // We can use the search provider's page. |
+ return NewTabURLDetails(search_provider_url, state); |
+ case NEW_TAB_URL_INCOGNITO: |
+ // Incognito has its own New Tab. |
+ return NewTabURLDetails(GURL(), state); |
+ default: |
+ // Use the local New Tab otherwise. |
+ return NewTabURLDetails(local_url, state); |
+ }; |
+ } |
+ |
+ GURL url; |
+ NewTabURLState state; |
+}; |
+ |
} // namespace |
// Negative start-margin values prevent the "es_sm" parameter from being used. |
@@ -451,25 +529,7 @@ std::vector<GURL> GetSearchURLs(Profile* profile) { |
} |
GURL GetNewTabPageURL(Profile* profile) { |
- if (!profile || profile->IsOffTheRecord()) |
- return GURL(); |
- |
- if (!IsSuggestPrefEnabled(profile)) |
- return GURL(chrome::kChromeSearchLocalNtpUrl); |
- |
- TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); |
- if (!template_url) |
- return GURL(chrome::kChromeSearchLocalNtpUrl); |
- |
- GURL url(TemplateURLRefToGURL(template_url->new_tab_url_ref(), |
- kDisableStartMargin, false, false)); |
- if (!url.is_valid() || !url.SchemeIsSecure()) |
- return GURL(chrome::kChromeSearchLocalNtpUrl); |
- |
- if (!IsURLAllowedForSupervisedUser(url, profile)) |
- return GURL(chrome::kChromeSearchLocalNtpUrl); |
- |
- return url; |
+ return NewTabURLDetails::ForProfile(profile).url; |
} |
GURL GetSearchResultPrefetchBaseURL(Profile* profile) { |
@@ -594,12 +654,14 @@ bool HandleNewTabURLRewrite(GURL* url, |
return false; |
Profile* profile = Profile::FromBrowserContext(browser_context); |
- GURL new_tab_url(GetNewTabPageURL(profile)); |
- if (!new_tab_url.is_valid()) |
- return false; |
- |
- *url = new_tab_url; |
- return true; |
+ NewTabURLDetails details(NewTabURLDetails::ForProfile(profile)); |
+ UMA_HISTOGRAM_ENUMERATION("NewTabPage.URLState", |
+ details.state, NEW_TAB_URL_MAX); |
+ if (details.url.is_valid()) { |
+ *url = details.url; |
+ return true; |
+ } |
+ return false; |
} |
bool HandleNewTabURLReverseRewrite(GURL* url, |
@@ -607,14 +669,25 @@ bool HandleNewTabURLReverseRewrite(GURL* url, |
if (!IsInstantExtendedAPIEnabled()) |
return false; |
+ // Do nothing in incognito. |
Profile* profile = Profile::FromBrowserContext(browser_context); |
- GURL new_tab_url(GetNewTabPageURL(profile)); |
- if (!new_tab_url.is_valid() || |
- !search::MatchesOriginAndPath(new_tab_url, *url)) |
+ if (profile && profile->IsOffTheRecord()) |
return false; |
- *url = GURL(chrome::kChromeUINewTabURL); |
- return true; |
+ if (search::MatchesOriginAndPath( |
+ GURL(chrome::kChromeSearchLocalNtpUrl), *url)) { |
+ *url = GURL(chrome::kChromeUINewTabURL); |
+ return true; |
+ } |
+ |
+ GURL new_tab_url(GetNewTabPageURL(profile)); |
+ if (new_tab_url.is_valid() && |
+ search::MatchesOriginAndPath(new_tab_url, *url)) { |
+ *url = GURL(chrome::kChromeUINewTabURL); |
+ return true; |
+ } |
+ |
+ return false; |
} |
void SetInstantSupportStateInNavigationEntry(InstantSupportState state, |