summaryrefslogtreecommitdiffstats
path: root/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/rlz/chrome_rlz_tracker_delegate.cc')
-rw-r--r--chrome/browser/rlz/chrome_rlz_tracker_delegate.cc236
1 files changed, 236 insertions, 0 deletions
diff --git a/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc b/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc
new file mode 100644
index 0000000..091bac1
--- /dev/null
+++ b/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc
@@ -0,0 +1,236 @@
+// Copyright 2015 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/rlz/chrome_rlz_tracker_delegate.h"
+
+#include "base/command_line.h"
+#include "base/prefs/pref_service.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/google/google_brand.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.h"
+#include "components/google/core/browser/google_util.h"
+#include "components/omnibox/browser/omnibox_log.h"
+#include "components/search_engines/template_url.h"
+#include "components/search_engines/template_url_service.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_details.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_source.h"
+
+#if defined(OS_WIN)
+#include "chrome/installer/util/google_update_settings.h"
+#endif
+
+#if !defined(OS_IOS)
+#include "chrome/browser/prefs/session_startup_pref.h"
+#include "chrome/browser/ui/startup/startup_browser_creator.h"
+#endif
+
+ChromeRLZTrackerDelegate::ChromeRLZTrackerDelegate() {
+}
+
+ChromeRLZTrackerDelegate::~ChromeRLZTrackerDelegate() {
+}
+
+// static
+bool ChromeRLZTrackerDelegate::IsGoogleDefaultSearch(Profile* profile) {
+ bool is_google_default_search = false;
+ TemplateURLService* template_url_service =
+ TemplateURLServiceFactory::GetForProfile(profile);
+ if (template_url_service) {
+ const TemplateURL* url_template =
+ template_url_service->GetDefaultSearchProvider();
+ is_google_default_search = url_template &&
+ url_template->url_ref().HasGoogleBaseURLs(
+ template_url_service->search_terms_data());
+ }
+ return is_google_default_search;
+}
+
+// static
+bool ChromeRLZTrackerDelegate::IsGoogleHomepage(Profile* profile) {
+ return google_util::IsGoogleHomePageUrl(
+ GURL(profile->GetPrefs()->GetString(prefs::kHomePage)));
+}
+
+// static
+bool ChromeRLZTrackerDelegate::IsGoogleInStartpages(Profile* profile) {
+#if !defined(OS_IOS)
+ bool is_google_in_startpages = false;
+ SessionStartupPref session_startup_prefs =
+ StartupBrowserCreator::GetSessionStartupPref(
+ *base::CommandLine::ForCurrentProcess(), profile);
+ if (session_startup_prefs.type == SessionStartupPref::URLS) {
+ is_google_in_startpages =
+ std::count_if(session_startup_prefs.urls.begin(),
+ session_startup_prefs.urls.end(),
+ google_util::IsGoogleHomePageUrl) > 0;
+ }
+ return is_google_in_startpages;
+#else
+ // iOS does not have a notion of startpages.
+ return false;
+#endif
+}
+
+void ChromeRLZTrackerDelegate::Cleanup() {
+ registrar_.RemoveAll();
+ on_omnibox_search_callback_.Reset();
+ on_homepage_search_callback_.Reset();
+}
+
+bool ChromeRLZTrackerDelegate::IsOnUIThread() {
+ return content::BrowserThread::CurrentlyOn(content::BrowserThread::UI);
+}
+
+base::SequencedWorkerPool* ChromeRLZTrackerDelegate::GetBlockingPool() {
+ return content::BrowserThread::GetBlockingPool();
+}
+
+net::URLRequestContextGetter* ChromeRLZTrackerDelegate::GetRequestContext() {
+ return g_browser_process->system_request_context();
+}
+
+bool ChromeRLZTrackerDelegate::GetBrand(std::string* brand) {
+ return google_brand::GetBrand(brand);
+}
+
+bool ChromeRLZTrackerDelegate::IsBrandOrganic(const std::string& brand) {
+ return brand.empty() || google_brand::IsOrganic(brand);
+}
+
+bool ChromeRLZTrackerDelegate::GetReactivationBrand(std::string* brand) {
+ return google_brand::GetReactivationBrand(brand);
+}
+
+bool ChromeRLZTrackerDelegate::ShouldEnableZeroDelayForTesting() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kTestType);
+}
+
+bool ChromeRLZTrackerDelegate::GetLanguage(base::string16* language) {
+#if defined(OS_WIN)
+ return GoogleUpdateSettings::GetLanguage(language);
+#else
+ // TODO(thakis): Implement.
+ NOTIMPLEMENTED();
+ return false;
+#endif
+}
+
+bool ChromeRLZTrackerDelegate::GetReferral(base::string16* referral) {
+#if defined(OS_WIN)
+ return GoogleUpdateSettings::GetReferral(referral);
+#else
+ // The referral program is defunct and not used. No need to implement this
+ // function on non-Win platforms.
+ return true;
+#endif
+}
+
+bool ChromeRLZTrackerDelegate::ClearReferral() {
+#if defined(OS_WIN)
+ return GoogleUpdateSettings::ClearReferral();
+#else
+ // The referral program is defunct and not used. No need to implement this
+ // function on non-Win platforms.
+ return true;
+#endif
+}
+
+void ChromeRLZTrackerDelegate::SetOmniboxSearchCallback(
+ const base::Closure& callback) {
+ DCHECK(!callback.is_null());
+ registrar_.Add(this, chrome::NOTIFICATION_OMNIBOX_OPENED_URL,
+ content::NotificationService::AllSources());
+ on_omnibox_search_callback_ = callback;
+}
+
+void ChromeRLZTrackerDelegate::SetHomepageSearchCallback(
+ const base::Closure& callback) {
+#if !defined(OS_IOS)
+ DCHECK(!callback.is_null());
+ registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
+ content::NotificationService::AllSources());
+ on_homepage_search_callback_ = callback;
+#endif
+}
+
+void ChromeRLZTrackerDelegate::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ using std::swap;
+ base::Closure callback_to_run;
+ switch (type) {
+ case chrome::NOTIFICATION_OMNIBOX_OPENED_URL:
+ // In M-36, we made NOTIFICATION_OMNIBOX_OPENED_URL fire more often than
+ // it did previously. The RLZ folks want RLZ's "first search" detection
+ // to remain as unaffected as possible by this change. This test is
+ // there to keep the old behavior.
+ if (!content::Details<OmniboxLog>(details).ptr()->is_popup_open)
+ break;
+ registrar_.Remove(this, chrome::NOTIFICATION_OMNIBOX_OPENED_URL,
+ content::NotificationService::AllSources());
+ swap(callback_to_run, on_omnibox_search_callback_);
+ break;
+
+#if !defined(OS_IOS)
+ case content::NOTIFICATION_NAV_ENTRY_COMMITTED: {
+ // Firstly check if it is a Google search.
+ content::LoadCommittedDetails* load_details =
+ content::Details<content::LoadCommittedDetails>(details).ptr();
+ if (load_details == nullptr)
+ break;
+
+ content::NavigationEntry* entry = load_details->entry;
+ if (entry == nullptr)
+ break;
+
+ if (google_util::IsGoogleSearchUrl(entry->GetURL())) {
+ // If it is a Google search, check if it originates from HOMEPAGE by
+ // getting the previous NavigationEntry.
+ content::NavigationController* controller =
+ content::Source<content::NavigationController>(source).ptr();
+ if (controller == nullptr)
+ break;
+
+ int entry_index = controller->GetLastCommittedEntryIndex();
+ if (entry_index < 1)
+ break;
+
+ const content::NavigationEntry* previous_entry =
+ controller->GetEntryAtIndex(entry_index - 1);
+
+ if (previous_entry == nullptr)
+ break;
+
+ // Make sure it is a Google web page originated from HOMEPAGE.
+ if (google_util::IsGoogleHomePageUrl(previous_entry->GetURL()) &&
+ ((previous_entry->GetTransitionType() &
+ ui::PAGE_TRANSITION_HOME_PAGE) != 0)) {
+ registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
+ content::NotificationService::AllSources());
+ swap(callback_to_run, on_homepage_search_callback_);
+ }
+ }
+ break;
+ }
+#endif // !defined(OS_IOS)
+
+ default:
+ NOTREACHED();
+ break;
+ }
+
+ if (!callback_to_run.is_null())
+ callback_to_run.Run();
+}