1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback_list.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker_client.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker_map_entry.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GoogleURLTrackerNavigationHelper;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace infobars {
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass InfoBar;
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is responsible for checking the Google URL once per network
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change, and if necessary prompting the user to see if they want to change to
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using it.  The current and last prompted values are saved to prefs.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Most consumers should only call google_url().  Consumers who need to be
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// notified when things change should register a callback that provides the
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// original and updated values via RegisterCallback().
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To protect users' privacy and reduce server load, no updates will be
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// performed (ever) unless at least one consumer registers interest by calling
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RequestServerCheck().
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GoogleURLTracker
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public net::URLFetcherDelegate,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public net::NetworkChangeNotifier::NetworkChangeObserver,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public KeyedService {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback that is called when the Google URL is updated. The arguments are
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the old and new URLs.
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef base::Callback<void()> OnGoogleURLUpdatedCallback;
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef base::CallbackList<void()> CallbackList;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef CallbackList::Subscription Subscription;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The constructor does different things depending on which of these values
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you pass it.  Hopefully these are self-explanatory.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Mode {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NORMAL_MODE,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNIT_TEST_MODE,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kDefaultGoogleHomepage[];
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Only the GoogleURLTrackerFactory and tests should call this.
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GoogleURLTracker(scoped_ptr<GoogleURLTrackerClient> client, Mode mode);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GoogleURLTracker();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Returns the current Google homepage URL.
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const GURL& google_url() const { return google_url_; }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests that the tracker perform a server check to update the Google URL
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // as necessary.  If |force| is false, this will happen at most once per
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // network change, not sooner than five seconds after startup (checks
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // requested before that time will occur then; checks requested afterwards
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // will occur immediately, if no other checks have been made during this run).
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // If |force| is true, and the tracker has already performed any requested
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // check, it will check again.
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void RequestServerCheck(bool force);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the tracker that the user has started a Google search.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If prompting is necessary, we then listen for the subsequent pending
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // navigation to get the appropriate NavigationHelper. When the load
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // commits, we'll show the infobar.
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SearchCommitted();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No one but GoogleURLTrackerInfoBarDelegate or test code should call these.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcceptGoogleURL(bool redo_searches);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelGoogleURL();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& fetched_google_url() const { return fetched_google_url_; }
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GoogleURLTrackerClient* client() { return client_.get(); }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No one but GoogleURLTrackerMapEntry should call this.
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DeleteMapEntryForManager(
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const infobars::InfoBarManager* infobar_manager);
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Called by the client after SearchCommitted() registers listeners,
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // to indicate that we've received the "load now pending" notification.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |nav_helper| is the GoogleURLTrackerNavigationHelper associated with this
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // navigation; |infobar_manager| is the InfoBarManager of the associated tab;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and |pending_id| is the unique ID of the newly pending NavigationEntry.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is already a visible GoogleURLTracker infobar for this tab, this
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function resets its associated pending entry ID to the new ID.  Otherwise
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // this function creates a map entry for the associated tab.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnNavigationPending(
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_ptr<GoogleURLTrackerNavigationHelper> nav_helper,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      infobars::InfoBarManager* infobar_manager,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int pending_id);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by the navigation observer once a load we're watching commits.
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |infobar_manager| is the same as for OnNavigationPending();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |search_url| is guaranteed to be valid.
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnNavigationCommitted(infobars::InfoBarManager* infobar_manager,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const GURL& search_url);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by the navigation observer when a tab closes.
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnTabClosed(GoogleURLTrackerNavigationHelper* nav_helper);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Subscription> RegisterCallback(
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const OnGoogleURLUpdatedCallback& cb);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class GoogleURLTrackerTest;
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  friend class SyncTest;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::map<const infobars::InfoBarManager*, GoogleURLTrackerMapEntry*>
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EntryMap;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static const char kSearchDomainCheckURL[];
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::URLFetcherDelegate:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NetworkChangeNotifier::IPAddressObserver:
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnNetworkChanged(
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedService:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Shutdown() OVERRIDE;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers consumer interest in getting an updated URL from the server.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observe chrome::NOTIFICATION_GOOGLE_URL_UPDATED to be notified when the URL
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changes.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetNeedToFetch();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the five second startup sleep has finished.  Runs any pending
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fetch.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishSleep();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the fetch of the up-to-date Google URL if we actually want to fetch
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it and can currently do so.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFetchIfDesirable();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes all map entries.  If |redo_searches| is true, this also triggers
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // each tab with an infobar to re-perform the user's search, but on the new
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Google TLD.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseAllEntries(bool redo_searches);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Unregisters any listeners for the navigation helper in |map_entry|.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This sanity-DCHECKs that these are registered (or not) in the specific
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cases we expect.  (|must_be_listening_for_commit| is used purely for this
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sanity-checking.)  This also unregisters the global navigation pending
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // listener if there are no remaining listeners for navigation commits, as we
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // no longer need them until another search is committed.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnregisterForEntrySpecificNotifications(
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GoogleURLTrackerMapEntry* map_entry,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool must_be_listening_for_commit);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void NotifyGoogleURLUpdated();
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallbackList callback_list_;
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<GoogleURLTrackerClient> client_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google_url_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL fetched_google_url_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> fetcher_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fetcher_id_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool in_startup_sleep_;  // True if we're in the five-second "no fetching"
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // period that begins at browser start.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool already_fetched_;   // True if we've already fetched a URL once this run;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // we won't fetch again until after a restart.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool need_to_fetch_;     // True if a consumer actually wants us to fetch an
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // updated URL.  If this is never set, we won't
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // bother to fetch anything.
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           // Consumers should register a callback via
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           // RegisterCallback().
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool need_to_prompt_;    // True if the last fetched Google URL is not
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // matched with current user's default Google URL
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // nor the last prompted Google URL.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool search_committed_;  // True when we're expecting a notification of a new
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // pending search navigation.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EntryMap entry_map_;
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::WeakPtrFactory<GoogleURLTracker> weak_ptr_factory_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GoogleURLTracker);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_H_
199