Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/search/instant_controller.h" | 5 #include "chrome/browser/ui/search/instant_controller.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 #include "chrome/common/content_settings_types.h" | 36 #include "chrome/common/content_settings_types.h" |
| 37 #include "chrome/common/pref_names.h" | 37 #include "chrome/common/pref_names.h" |
| 38 #include "chrome/common/url_constants.h" | 38 #include "chrome/common/url_constants.h" |
| 39 #include "components/sessions/serialized_navigation_entry.h" | 39 #include "components/sessions/serialized_navigation_entry.h" |
| 40 #include "content/public/browser/navigation_entry.h" | 40 #include "content/public/browser/navigation_entry.h" |
| 41 #include "content/public/browser/notification_service.h" | 41 #include "content/public/browser/notification_service.h" |
| 42 #include "content/public/browser/render_process_host.h" | 42 #include "content/public/browser/render_process_host.h" |
| 43 #include "content/public/browser/render_widget_host_view.h" | 43 #include "content/public/browser/render_widget_host_view.h" |
| 44 #include "content/public/browser/user_metrics.h" | 44 #include "content/public/browser/user_metrics.h" |
| 45 #include "content/public/browser/web_contents.h" | 45 #include "content/public/browser/web_contents.h" |
| 46 #include "content/public/browser/web_contents_user_data.h" | |
| 46 #include "content/public/browser/web_contents_view.h" | 47 #include "content/public/browser/web_contents_view.h" |
| 47 #include "net/base/escape.h" | 48 #include "net/base/escape.h" |
| 48 #include "net/base/network_change_notifier.h" | 49 #include "net/base/network_change_notifier.h" |
| 49 #include "third_party/icu/public/common/unicode/normalizer2.h" | 50 #include "third_party/icu/public/common/unicode/normalizer2.h" |
| 50 | 51 |
| 51 #if defined(TOOLKIT_VIEWS) | 52 #if defined(TOOLKIT_VIEWS) |
| 52 #include "ui/views/widget/widget.h" | 53 #include "ui/views/widget/widget.h" |
| 53 #endif | 54 #endif |
| 54 | 55 |
| 55 namespace { | 56 namespace { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 template <typename T> | 244 template <typename T> |
| 244 void DeletePageSoon(scoped_ptr<T> page) { | 245 void DeletePageSoon(scoped_ptr<T> page) { |
| 245 if (page->contents()) { | 246 if (page->contents()) { |
| 246 base::MessageLoop::current()->DeleteSoon( | 247 base::MessageLoop::current()->DeleteSoon( |
| 247 FROM_HERE, page->ReleaseContents().release()); | 248 FROM_HERE, page->ReleaseContents().release()); |
| 248 } | 249 } |
| 249 | 250 |
| 250 base::MessageLoop::current()->DeleteSoon(FROM_HERE, page.release()); | 251 base::MessageLoop::current()->DeleteSoon(FROM_HERE, page.release()); |
| 251 } | 252 } |
| 252 | 253 |
| 254 // Helper class for logging data from the NTP. Attached to each InstantNTP | |
| 255 // instance. | |
| 256 class NtpLoggingUserData | |
| 257 : public content::WebContentsUserData<NtpLoggingUserData> { | |
| 258 public: | |
| 259 virtual ~NtpLoggingUserData() {} | |
| 260 | |
| 261 // Called each time the mouse hovers over an iframe or title. | |
| 262 void increment_number_of_mouseovers() { | |
| 263 number_of_mouseovers++; | |
| 264 } | |
| 265 | |
| 266 // Logs total number of mouseovers per NTP session to UMA histogram. | |
| 267 // Called when a tab is about to be deactivated. | |
| 268 void log_number_of_mouseovers() { | |
| 269 if (number_of_mouseovers > 0) { | |
| 270 UMA_HISTOGRAM_COUNTS("NewTabPage.NumberOfMouseOvers", | |
|
Mark P
2013/06/25 19:04:32
Why do you only log if the number is greater than
annark1
2013/06/25 21:04:11
As per our offline discussion, I've addressed this
| |
| 271 number_of_mouseovers); | |
| 272 number_of_mouseovers = 0; | |
| 273 } | |
| 274 } | |
| 275 | |
| 276 private: | |
| 277 explicit NtpLoggingUserData(content::WebContents* contents) | |
| 278 : number_of_mouseovers(0) {} | |
| 279 friend class content::WebContentsUserData<NtpLoggingUserData>; | |
| 280 | |
| 281 int number_of_mouseovers; | |
| 282 }; | |
|
Alexei Svitkine (slow)
2013/06/25 17:21:20
Should this have DISALLOW_COPY_AND_ASSIGN(NtpLoggi
annark1
2013/06/25 21:04:11
Done.
| |
| 283 | |
| 253 } // namespace | 284 } // namespace |
| 254 | 285 |
| 286 DEFINE_WEB_CONTENTS_USER_DATA_KEY(NtpLoggingUserData); | |
| 287 | |
| 255 InstantController::InstantController(BrowserInstantController* browser, | 288 InstantController::InstantController(BrowserInstantController* browser, |
| 256 bool extended_enabled) | 289 bool extended_enabled) |
| 257 : browser_(browser), | 290 : browser_(browser), |
| 258 extended_enabled_(extended_enabled), | 291 extended_enabled_(extended_enabled), |
| 259 instant_enabled_(false), | 292 instant_enabled_(false), |
| 260 use_local_page_only_(true), | 293 use_local_page_only_(true), |
| 261 preload_ntp_(true), | 294 preload_ntp_(true), |
| 262 model_(this), | 295 model_(this), |
| 263 use_tab_for_suggestions_(false), | 296 use_tab_for_suggestions_(false), |
| 264 last_omnibox_text_has_inline_autocompletion_(false), | 297 last_omnibox_text_has_inline_autocompletion_(false), |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1055 ResetInstantTab(); | 1088 ResetInstantTab(); |
| 1056 } | 1089 } |
| 1057 | 1090 |
| 1058 void InstantController::TabDeactivated(content::WebContents* contents) { | 1091 void InstantController::TabDeactivated(content::WebContents* contents) { |
| 1059 LOG_INSTANT_DEBUG_EVENT(this, "TabDeactivated"); | 1092 LOG_INSTANT_DEBUG_EVENT(this, "TabDeactivated"); |
| 1060 if (extended_enabled() && !contents->IsBeingDestroyed()) | 1093 if (extended_enabled() && !contents->IsBeingDestroyed()) |
| 1061 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); | 1094 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); |
| 1062 | 1095 |
| 1063 if (GetOverlayContents()) | 1096 if (GetOverlayContents()) |
| 1064 HideOverlay(); | 1097 HideOverlay(); |
| 1098 | |
| 1099 NtpLoggingUserData* data = | |
| 1100 NtpLoggingUserData::FromWebContents(contents); | |
| 1101 if (data) | |
| 1102 data->log_number_of_mouseovers(); | |
| 1065 } | 1103 } |
| 1066 | 1104 |
| 1067 void InstantController::SetInstantEnabled(bool instant_enabled, | 1105 void InstantController::SetInstantEnabled(bool instant_enabled, |
| 1068 bool use_local_page_only) { | 1106 bool use_local_page_only) { |
| 1069 LOG_INSTANT_DEBUG_EVENT(this, base::StringPrintf( | 1107 LOG_INSTANT_DEBUG_EVENT(this, base::StringPrintf( |
| 1070 "SetInstantEnabled: instant_enabled=%d, use_local_page_only=%d", | 1108 "SetInstantEnabled: instant_enabled=%d, use_local_page_only=%d", |
| 1071 instant_enabled, use_local_page_only)); | 1109 instant_enabled, use_local_page_only)); |
| 1072 | 1110 |
| 1073 // Non extended mode does not care about |use_local_page_only|. | 1111 // Non extended mode does not care about |use_local_page_only|. |
| 1074 if (instant_enabled == instant_enabled_ && | 1112 if (instant_enabled == instant_enabled_ && |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1595 return; | 1633 return; |
| 1596 | 1634 |
| 1597 // Instant NTP is only used in extended mode so we should always have a | 1635 // Instant NTP is only used in extended mode so we should always have a |
| 1598 // non-empty URL to use. | 1636 // non-empty URL to use. |
| 1599 DCHECK(!instant_url.empty()); | 1637 DCHECK(!instant_url.empty()); |
| 1600 ntp_.reset(new InstantNTP(this, instant_url, | 1638 ntp_.reset(new InstantNTP(this, instant_url, |
| 1601 browser_->profile()->IsOffTheRecord())); | 1639 browser_->profile()->IsOffTheRecord())); |
| 1602 ntp_->InitContents(profile(), browser_->GetActiveWebContents(), | 1640 ntp_->InitContents(profile(), browser_->GetActiveWebContents(), |
| 1603 base::Bind(&InstantController::ReloadStaleNTP, | 1641 base::Bind(&InstantController::ReloadStaleNTP, |
| 1604 base::Unretained(this))); | 1642 base::Unretained(this))); |
| 1643 | |
| 1644 if (ntp_->contents()) | |
| 1645 NtpLoggingUserData::CreateForWebContents(ntp_->contents()); | |
| 1646 | |
| 1605 LOG_INSTANT_DEBUG_EVENT(this, base::StringPrintf( | 1647 LOG_INSTANT_DEBUG_EVENT(this, base::StringPrintf( |
| 1606 "ResetNTP: instant_url='%s'", instant_url.c_str())); | 1648 "ResetNTP: instant_url='%s'", instant_url.c_str())); |
| 1607 } | 1649 } |
| 1608 | 1650 |
| 1609 void InstantController::ReloadStaleNTP() { | 1651 void InstantController::ReloadStaleNTP() { |
| 1610 ResetNTP(GetInstantURL()); | 1652 ResetNTP(GetInstantURL()); |
| 1611 } | 1653 } |
| 1612 | 1654 |
| 1613 bool InstantController::ShouldSwitchToLocalNTP() const { | 1655 bool InstantController::ShouldSwitchToLocalNTP() const { |
| 1614 if (!ntp()) | 1656 if (!ntp()) |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1893 result->relevance = match.relevance; | 1935 result->relevance = match.relevance; |
| 1894 result->autocomplete_match_index = autocomplete_match_index; | 1936 result->autocomplete_match_index = autocomplete_match_index; |
| 1895 | 1937 |
| 1896 DVLOG(1) << " " << result->relevance << " " | 1938 DVLOG(1) << " " << result->relevance << " " |
| 1897 << UTF8ToUTF16(AutocompleteMatchType::ToString(result->type)) << " " | 1939 << UTF8ToUTF16(AutocompleteMatchType::ToString(result->type)) << " " |
| 1898 << result->provider << " " << result->destination_url << " '" | 1940 << result->provider << " " << result->destination_url << " '" |
| 1899 << result->description << "' '" << result->search_query << "' " | 1941 << result->description << "' '" << result->search_query << "' " |
| 1900 << result->transition << " " << result->autocomplete_match_index; | 1942 << result->transition << " " << result->autocomplete_match_index; |
| 1901 } | 1943 } |
| 1902 | 1944 |
| 1945 void InstantController::LogIframeHover() { | |
| 1946 if (!browser_ || !browser_->GetActiveWebContents()) | |
| 1947 return; | |
| 1948 | |
| 1949 NtpLoggingUserData* data = | |
| 1950 NtpLoggingUserData::FromWebContents(browser_->GetActiveWebContents()); | |
| 1951 if (data) | |
| 1952 data->increment_number_of_mouseovers(); | |
| 1953 } | |
| 1954 | |
| 1903 bool InstantController::IsJavascriptEnabled() const { | 1955 bool InstantController::IsJavascriptEnabled() const { |
| 1904 GURL instant_url(GetInstantURL()); | 1956 GURL instant_url(GetInstantURL()); |
| 1905 GURL origin(instant_url.GetOrigin()); | 1957 GURL origin(instant_url.GetOrigin()); |
| 1906 ContentSetting js_setting = profile()->GetHostContentSettingsMap()-> | 1958 ContentSetting js_setting = profile()->GetHostContentSettingsMap()-> |
| 1907 GetContentSetting(origin, origin, CONTENT_SETTINGS_TYPE_JAVASCRIPT, | 1959 GetContentSetting(origin, origin, CONTENT_SETTINGS_TYPE_JAVASCRIPT, |
| 1908 NO_RESOURCE_IDENTIFIER); | 1960 NO_RESOURCE_IDENTIFIER); |
| 1909 // Javascript can be disabled either in content settings or via a WebKit | 1961 // Javascript can be disabled either in content settings or via a WebKit |
| 1910 // preference, so check both. Disabling it through the Settings page affects | 1962 // preference, so check both. Disabling it through the Settings page affects |
| 1911 // content settings. I'm not sure how to disable the WebKit preference, but | 1963 // content settings. I'm not sure how to disable the WebKit preference, but |
| 1912 // it's theoretically possible some users have it off. | 1964 // it's theoretically possible some users have it off. |
| 1913 bool js_content_enabled = | 1965 bool js_content_enabled = |
| 1914 js_setting == CONTENT_SETTING_DEFAULT || | 1966 js_setting == CONTENT_SETTING_DEFAULT || |
| 1915 js_setting == CONTENT_SETTING_ALLOW; | 1967 js_setting == CONTENT_SETTING_ALLOW; |
| 1916 bool js_webkit_enabled = profile()->GetPrefs()->GetBoolean( | 1968 bool js_webkit_enabled = profile()->GetPrefs()->GetBoolean( |
| 1917 prefs::kWebKitJavascriptEnabled); | 1969 prefs::kWebKitJavascriptEnabled); |
| 1918 return js_content_enabled && js_webkit_enabled; | 1970 return js_content_enabled && js_webkit_enabled; |
| 1919 } | 1971 } |
| 1920 | 1972 |
| 1921 bool InstantController::InStartup() const { | 1973 bool InstantController::InStartup() const { |
| 1922 // TODO(shishir): This is not completely reliable. Find a better way to detect | 1974 // TODO(shishir): This is not completely reliable. Find a better way to detect |
| 1923 // startup time. | 1975 // startup time. |
| 1924 return !browser_->GetActiveWebContents(); | 1976 return !browser_->GetActiveWebContents(); |
| 1925 } | 1977 } |
| 1926 | 1978 |
| 1927 InstantService* InstantController::GetInstantService() const { | 1979 InstantService* InstantController::GetInstantService() const { |
| 1928 return InstantServiceFactory::GetForProfile(profile()); | 1980 return InstantServiceFactory::GetForProfile(profile()); |
| 1929 } | 1981 } |
| OLD | NEW |