| Index: chrome/browser/rlz/chrome_rlz_tracker_delegate.cc
|
| 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 0000000000000000000000000000000000000000..d14f8e3253386aee5d6219ab8994368afee233dd
|
| --- /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/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();
|
| +}
|
|
|