1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/google/chrome_google_url_tracker_client.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/command_line.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/google/google_url_tracker_navigation_helper_impl.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/notification_service.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/web_contents.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ChromeGoogleURLTrackerClient::ChromeGoogleURLTrackerClient(Profile* profile)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : profile_(profile) {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ChromeGoogleURLTrackerClient::~ChromeGoogleURLTrackerClient() {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeGoogleURLTrackerClient::SetListeningForNavigationStart(bool listen) {
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (listen) {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    registrar_.Add(
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        this,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_PENDING,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::NotificationService::AllBrowserContextsAndSources());
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    registrar_.Remove(
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        this,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_PENDING,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::NotificationService::AllBrowserContextsAndSources());
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ChromeGoogleURLTrackerClient::IsListeningForNavigationStart() {
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return registrar_.IsRegistered(
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      this,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_PENDING,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::NotificationService::AllBrowserContextsAndSources());
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool ChromeGoogleURLTrackerClient::IsBackgroundNetworkingEnabled() {
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      switches::kDisableBackgroundNetworking);
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)PrefService* ChromeGoogleURLTrackerClient::GetPrefs() {
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return profile_->GetPrefs();
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)net::URLRequestContextGetter*
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ChromeGoogleURLTrackerClient::GetRequestContext() {
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return profile_->GetRequestContext();
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeGoogleURLTrackerClient::Observe(
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int type,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const content::NotificationSource& source,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const content::NotificationDetails& details) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_PENDING, type);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::NavigationController* controller =
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::Source<content::NavigationController>(source).ptr();
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InfoBarService* infobar_service =
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      InfoBarService::FromWebContents(controller->GetWebContents());
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Because we're listening to all sources, there may be no InfoBarService for
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // some notifications, e.g. navigations in bubbles/balloons etc.
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (infobar_service) {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    google_url_tracker()->OnNavigationPending(
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        scoped_ptr<GoogleURLTrackerNavigationHelper>(
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            new GoogleURLTrackerNavigationHelperImpl(
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                controller->GetWebContents(), google_url_tracker())),
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        infobar_service,
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        controller->GetPendingEntry()->GetUniqueID());
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
81