Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / google / google_url_tracker_unittest.cc
index 1ebe613..06bb385 100644 (file)
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 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/google/google_url_tracker.h"
+#include "components/google/core/browser/google_url_tracker.h"
 
 #include <set>
 #include <string>
 
+#include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/prefs/pref_service.h"
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/google/google_url_tracker_factory.h"
-#include "chrome/browser/google/google_url_tracker_infobar_delegate.h"
-#include "chrome/browser/google/google_url_tracker_navigation_helper.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/google/core/browser/google_pref_names.h"
+#include "components/google/core/browser/google_url_tracker_client.h"
+#include "components/google/core/browser/google_url_tracker_infobar_delegate.h"
+#include "components/google/core/browser/google_url_tracker_navigation_helper.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_delegate.h"
-#include "content/public/browser/notification_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_fetcher.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-class GoogleURLTrackerTest;
-
 namespace {
 
-// TestInfoBarDelegate --------------------------------------------------------
+// TestCallbackListener ---------------------------------------------------
 
-class TestInfoBarDelegate : public GoogleURLTrackerInfoBarDelegate {
+class TestCallbackListener {
  public:
-  // Creates a test infobar and delegate and returns the infobar.  Unlike the
-  // parent class, this does not add the infobar to |infobar_service|, since
-  // that "pointer" is really just a magic number.  Thus there is no
-  // InfoBarService ownership of the returned object; and since the caller
-  // doesn't own the returned object, we rely on |test_harness| cleaning this up
-  // eventually in GoogleURLTrackerTest::OnInfoBarClosed() to avoid leaks.
-  static infobars::InfoBar* Create(GoogleURLTrackerTest* test_harness,
-                                   InfoBarService* infobar_service,
-                                   GoogleURLTracker* google_url_tracker,
-                                   const GURL& search_url);
+  TestCallbackListener();
+  virtual ~TestCallbackListener();
 
- private:
-  TestInfoBarDelegate(GoogleURLTrackerTest* test_harness,
-                      InfoBarService* infobar_service,
-                      GoogleURLTracker* google_url_tracker,
-                      const GURL& search_url);
-  virtual ~TestInfoBarDelegate();
+  bool HasRegisteredCallback();
+  void RegisterCallback(GoogleURLTracker* google_url_tracker);
 
-  // GoogleURLTrackerInfoBarDelegate:
-  virtual void Update(const GURL& search_url) OVERRIDE;
-  virtual void Close(bool redo_search) OVERRIDE;
+  bool notified() const { return notified_; }
+  void clear_notified() { notified_ = false; }
 
-  GoogleURLTrackerTest* test_harness_;
-  InfoBarService* infobar_service_;
+ private:
+  void OnGoogleURLUpdated();
 
-  DISALLOW_COPY_AND_ASSIGN(TestInfoBarDelegate);
+  bool notified_;
+  scoped_ptr<GoogleURLTracker::Subscription> google_url_updated_subscription_;
 };
 
-// The member function definitions come after the declaration of
-// GoogleURLTrackerTest, so they can call members on it.
+TestCallbackListener::TestCallbackListener() : notified_(false) {
+}
+
+TestCallbackListener::~TestCallbackListener() {
+}
 
+void TestCallbackListener::OnGoogleURLUpdated() {
+  notified_ = true;
+}
 
-// TestNotificationObserver ---------------------------------------------------
+bool TestCallbackListener::HasRegisteredCallback() {
+  return google_url_updated_subscription_.get();
+}
 
-class TestNotificationObserver : public content::NotificationObserver {
+void TestCallbackListener::RegisterCallback(
+    GoogleURLTracker* google_url_tracker) {
+  google_url_updated_subscription_ =
+      google_url_tracker->RegisterCallback(base::Bind(
+          &TestCallbackListener::OnGoogleURLUpdated, base::Unretained(this)));
+}
+
+
+// TestGoogleURLTrackerClient -------------------------------------------------
+
+class TestGoogleURLTrackerClient : public GoogleURLTrackerClient {
  public:
-  TestNotificationObserver();
-  virtual ~TestNotificationObserver();
+  explicit TestGoogleURLTrackerClient(Profile* profile_);
+  virtual ~TestGoogleURLTrackerClient();
 
-  virtual void Observe(int type,
-                       const content::NotificationSource& source,
-                       const content::NotificationDetails& details) OVERRIDE;
-  bool notified() const { return notified_; }
-  void clear_notified() { notified_ = false; }
+  virtual void SetListeningForNavigationStart(bool listen) OVERRIDE;
+  virtual bool IsListeningForNavigationStart() OVERRIDE;
+  virtual bool IsBackgroundNetworkingEnabled() OVERRIDE;
+  virtual PrefService* GetPrefs() OVERRIDE;
+  virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE;
 
  private:
-  bool notified_;
+  Profile* profile_;
+  bool observe_nav_start_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestGoogleURLTrackerClient);
 };
 
-TestNotificationObserver::TestNotificationObserver() : notified_(false) {
+TestGoogleURLTrackerClient::TestGoogleURLTrackerClient(Profile* profile)
+    : profile_(profile),
+      observe_nav_start_(false) {
 }
 
-TestNotificationObserver::~TestNotificationObserver() {
+TestGoogleURLTrackerClient::~TestGoogleURLTrackerClient() {
 }
 
-void TestNotificationObserver::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  notified_ = true;
+void TestGoogleURLTrackerClient::SetListeningForNavigationStart(bool listen) {
+  observe_nav_start_ = listen;
+}
+
+bool TestGoogleURLTrackerClient::IsListeningForNavigationStart() {
+  return observe_nav_start_;
+}
+
+bool TestGoogleURLTrackerClient::IsBackgroundNetworkingEnabled() {
+  return true;
+}
+
+PrefService* TestGoogleURLTrackerClient::GetPrefs() {
+  return profile_->GetPrefs();
+}
+
+net::URLRequestContextGetter* TestGoogleURLTrackerClient::GetRequestContext() {
+  return profile_->GetRequestContext();
 }
 
 
-// TestGoogleURLTrackerNavigationHelper -------------------------------------
+// TestGoogleURLTrackerNavigationHelper ---------------------------------------
 
 class TestGoogleURLTrackerNavigationHelper
     : public GoogleURLTrackerNavigationHelper {
  public:
-  TestGoogleURLTrackerNavigationHelper();
+  explicit TestGoogleURLTrackerNavigationHelper(GoogleURLTracker* tracker);
   virtual ~TestGoogleURLTrackerNavigationHelper();
 
-  virtual void SetGoogleURLTracker(GoogleURLTracker* tracker) OVERRIDE;
-  virtual void SetListeningForNavigationStart(bool listen) OVERRIDE;
-  virtual bool IsListeningForNavigationStart() OVERRIDE;
-  virtual void SetListeningForNavigationCommit(
-      const content::NavigationController* nav_controller,
-      bool listen) OVERRIDE;
-  virtual bool IsListeningForNavigationCommit(
-      const content::NavigationController* nav_controller) OVERRIDE;
-  virtual void SetListeningForTabDestruction(
-      const content::NavigationController* nav_controller,
-      bool listen) OVERRIDE;
-  virtual bool IsListeningForTabDestruction(
-      const content::NavigationController* nav_controller) OVERRIDE;
+  virtual void SetListeningForNavigationCommit(bool listen) OVERRIDE;
+  virtual bool IsListeningForNavigationCommit() OVERRIDE;
+  virtual void SetListeningForTabDestruction(bool listen) OVERRIDE;
+  virtual bool IsListeningForTabDestruction() OVERRIDE;
+  virtual void OpenURL(GURL url,
+                       WindowOpenDisposition disposition,
+                       bool user_clicked_on_link) OVERRIDE;
 
  private:
-  GoogleURLTracker* tracker_;
-  bool observe_nav_start_;
-  std::set<const content::NavigationController*>
-      nav_controller_commit_listeners_;
-  std::set<const content::NavigationController*>
-      nav_controller_tab_close_listeners_;
+  bool listening_for_nav_commit_;
+  bool listening_for_tab_destruction_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestGoogleURLTrackerNavigationHelper);
 };
 
-TestGoogleURLTrackerNavigationHelper::TestGoogleURLTrackerNavigationHelper()
-    : tracker_(NULL),
-      observe_nav_start_(false) {
+TestGoogleURLTrackerNavigationHelper::TestGoogleURLTrackerNavigationHelper(
+    GoogleURLTracker* tracker)
+    : GoogleURLTrackerNavigationHelper(tracker),
+      listening_for_nav_commit_(false),
+      listening_for_tab_destruction_(false) {
 }
 
-TestGoogleURLTrackerNavigationHelper::
-    ~TestGoogleURLTrackerNavigationHelper() {
+TestGoogleURLTrackerNavigationHelper::~TestGoogleURLTrackerNavigationHelper() {
 }
 
-void TestGoogleURLTrackerNavigationHelper::SetGoogleURLTracker(
-    GoogleURLTracker* tracker) {
-  tracker_ = tracker;
+void TestGoogleURLTrackerNavigationHelper::SetListeningForNavigationCommit(
+    bool listen) {
+  listening_for_nav_commit_ = listen;
+}
+
+bool TestGoogleURLTrackerNavigationHelper::IsListeningForNavigationCommit() {
+  return listening_for_nav_commit_;
 }
 
-void TestGoogleURLTrackerNavigationHelper::SetListeningForNavigationStart(
+void TestGoogleURLTrackerNavigationHelper::SetListeningForTabDestruction(
     bool listen) {
-  observe_nav_start_ = listen;
+  listening_for_tab_destruction_ = listen;
 }
 
-bool TestGoogleURLTrackerNavigationHelper::IsListeningForNavigationStart() {
-  return observe_nav_start_;
+bool TestGoogleURLTrackerNavigationHelper::IsListeningForTabDestruction() {
+  return listening_for_tab_destruction_;
 }
 
-void TestGoogleURLTrackerNavigationHelper::SetListeningForNavigationCommit(
-    const content::NavigationController* nav_controller,
-    bool listen) {
-  if (listen)
-    nav_controller_commit_listeners_.insert(nav_controller);
-  else
-    nav_controller_commit_listeners_.erase(nav_controller);
+void TestGoogleURLTrackerNavigationHelper::OpenURL(
+    GURL url,
+    WindowOpenDisposition disposition,
+    bool user_clicked_on_link) {
 }
 
-bool TestGoogleURLTrackerNavigationHelper::IsListeningForNavigationCommit(
-    const content::NavigationController* nav_controller) {
-  return nav_controller_commit_listeners_.count(nav_controller) > 0;
+// TestInfoBarManager ---------------------------------------------------------
+
+class TestInfoBarManager : public infobars::InfoBarManager {
+ public:
+  explicit TestInfoBarManager(int unique_id);
+  virtual ~TestInfoBarManager();
+  virtual int GetActiveEntryID() OVERRIDE;
+
+ private:
+  int unique_id_;
+  DISALLOW_COPY_AND_ASSIGN(TestInfoBarManager);
+};
+
+TestInfoBarManager::TestInfoBarManager(int unique_id) : unique_id_(unique_id) {
 }
 
-void TestGoogleURLTrackerNavigationHelper::SetListeningForTabDestruction(
-    const content::NavigationController* nav_controller,
-    bool listen) {
-  if (listen)
-    nav_controller_tab_close_listeners_.insert(nav_controller);
-  else
-    nav_controller_tab_close_listeners_.erase(nav_controller);
+TestInfoBarManager::~TestInfoBarManager() {
+  ShutDown();
 }
 
-bool TestGoogleURLTrackerNavigationHelper::IsListeningForTabDestruction(
-    const content::NavigationController* nav_controller) {
-  return nav_controller_tab_close_listeners_.count(nav_controller) > 0;
+int TestInfoBarManager::GetActiveEntryID() {
+  return unique_id_;
 }
 
 }  // namespace
 
-
 // GoogleURLTrackerTest -------------------------------------------------------
 
-// Ths class exercises GoogleURLTracker.  In order to avoid instantiating more
-// of the Chrome infrastructure than necessary, the GoogleURLTracker functions
-// are carefully written so that many of the functions which take
-// NavigationController* or InfoBarService* do not actually dereference the
-// objects, merely use them for comparisons and lookups, e.g. in |entry_map_|.
-// This then allows the test code here to not create any of these objects, and
-// instead supply "pointers" that are actually reinterpret_cast<>()ed magic
-// numbers.  Then we write the necessary stubs/hooks, here and in
-// TestInfoBarDelegate above, to make everything continue to work.
-//
-// Technically, the C++98 spec defines the result of casting
-// T* -> intptr_t -> T* to be an identity, but intptr_t -> T* -> intptr_t (what
-// we use here) is "implementation-defined".  Since I've never seen a compiler
-// break this, though, and the result would simply be a failing test rather than
-// a bug in Chrome, we'll use it anyway.
 class GoogleURLTrackerTest : public testing::Test {
- public:
-  // Called by TestInfoBarDelegate::Close().
-  void OnInfoBarClosed(scoped_ptr<infobars::InfoBar> infobar,
-                       InfoBarService* infobar_service);
-
  protected:
   GoogleURLTrackerTest();
   virtual ~GoogleURLTrackerTest();
@@ -224,62 +224,42 @@ class GoogleURLTrackerTest : public testing::Test {
   GURL google_url() const { return google_url_tracker_->google_url(); }
   void SetLastPromptedGoogleURL(const GURL& url);
   GURL GetLastPromptedGoogleURL();
-  void SetNavigationPending(intptr_t unique_id, bool is_search);
-  void CommitNonSearch(intptr_t unique_id);
-  void CommitSearch(intptr_t unique_id, const GURL& search_url);
-  void CloseTab(intptr_t unique_id);
-  GoogleURLTrackerMapEntry* GetMapEntry(intptr_t unique_id);
-  GoogleURLTrackerInfoBarDelegate* GetInfoBarDelegate(intptr_t unique_id);
+  void SetNavigationPending(infobars::InfoBarManager* infobar_manager,
+                            bool is_search);
+  void CommitNonSearch(infobars::InfoBarManager* infobar_manager);
+  void CommitSearch(infobars::InfoBarManager* infobar_manager,
+                    const GURL& search_url);
+  void CloseTab(infobars::InfoBarManager* infobar_manager);
+  GoogleURLTrackerMapEntry* GetMapEntry(
+      infobars::InfoBarManager* infobar_manager);
+  GoogleURLTrackerInfoBarDelegate* GetInfoBarDelegate(
+      infobars::InfoBarManager* infobar_manager);
+  GoogleURLTrackerNavigationHelper* GetNavigationHelper(
+      infobars::InfoBarManager* infobar_manager);
   void ExpectDefaultURLs() const;
-  void ExpectListeningForCommit(intptr_t unique_id, bool listening);
-  bool observer_notified() const { return observer_.notified(); }
-  void clear_observer_notified() { observer_.clear_notified(); }
+  void ExpectListeningForCommit(infobars::InfoBarManager* infobar_manager,
+                                bool listening);
+  bool listener_notified() const { return listener_.notified(); }
+  void clear_listener_notified() { listener_.clear_notified(); }
 
  private:
-  // Since |infobar_service| is really a magic number rather than an actual
-  // object, we don't add the created infobar to it.  Instead we will simulate
-  // any helper<->infobar interaction necessary.  The returned object will be
-  // cleaned up in OnInfoBarClosed().
-  infobars::InfoBar* CreateTestInfoBar(InfoBarService* infobar_service,
-                                       GoogleURLTracker* google_url_tracker,
-                                       const GURL& search_url);
-
   // These are required by the TestURLFetchers GoogleURLTracker will create (see
   // test_url_fetcher_factory.h).
   content::TestBrowserThreadBundle thread_bundle_;
+
   // Creating this allows us to call
   // net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests().
   scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
   net::TestURLFetcherFactory fetcher_factory_;
-  content::NotificationRegistrar registrar_;
-  TestNotificationObserver observer_;
-  GoogleURLTrackerNavigationHelper* nav_helper_;
+  GoogleURLTrackerClient* client_;
   TestingProfile profile_;
   scoped_ptr<GoogleURLTracker> google_url_tracker_;
+  TestCallbackListener listener_;
   // This tracks the different "tabs" a test has "opened", so we can close them
   // properly before shutting down |google_url_tracker_|, which expects that.
-  std::set<int> unique_ids_seen_;
+  std::set<infobars::InfoBarManager*> infobar_managers_seen_;
 };
 
-void GoogleURLTrackerTest::OnInfoBarClosed(
-    scoped_ptr<infobars::InfoBar> infobar,
-    InfoBarService* infobar_service) {
-  // First, simulate the InfoBarService firing INFOBAR_REMOVED.
-  infobars::InfoBar::RemovedDetails removed_details(infobar.get(), false);
-  GoogleURLTracker::EntryMap::const_iterator i =
-      google_url_tracker_->entry_map_.find(infobar_service);
-  ASSERT_FALSE(i == google_url_tracker_->entry_map_.end());
-  GoogleURLTrackerMapEntry* map_entry = i->second;
-  ASSERT_EQ(infobar->delegate(), map_entry->infobar_delegate());
-  map_entry->Observe(
-      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
-      content::Source<InfoBarService>(infobar_service),
-      content::Details<infobars::InfoBar::RemovedDetails>(&removed_details));
-
-  // Second, simulate the infobar container closing the infobar in response.
-  // This happens automatically as |infobar| goes out of scope.
-}
-
 GoogleURLTrackerTest::GoogleURLTrackerTest()
     : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
   GoogleURLTrackerFactory::GetInstance()->
@@ -292,23 +272,17 @@ GoogleURLTrackerTest::~GoogleURLTrackerTest() {
 void GoogleURLTrackerTest::SetUp() {
   network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock());
   // Ownership is passed to google_url_tracker_, but a weak pointer is kept;
-  // this is safe since GoogleURLTracker keeps the observer for its lifetime.
-  nav_helper_ = new TestGoogleURLTrackerNavigationHelper();
-  scoped_ptr<GoogleURLTrackerNavigationHelper> nav_helper(nav_helper_);
-  google_url_tracker_.reset(
-      new GoogleURLTracker(&profile_, nav_helper.Pass(),
-                           GoogleURLTracker::UNIT_TEST_MODE));
-  google_url_tracker_->infobar_creator_ = base::Bind(
-      &GoogleURLTrackerTest::CreateTestInfoBar, base::Unretained(this));
+  // this is safe since GoogleURLTracker keeps the client for its lifetime.
+  client_ = new TestGoogleURLTrackerClient(&profile_);
+  scoped_ptr<GoogleURLTrackerClient> client(client_);
+  google_url_tracker_.reset(new GoogleURLTracker(
+      client.Pass(), GoogleURLTracker::UNIT_TEST_MODE));
 }
 
 void GoogleURLTrackerTest::TearDown() {
-  while (!unique_ids_seen_.empty())
-    CloseTab(*unique_ids_seen_.begin());
-
-  nav_helper_ = NULL;
-  google_url_tracker_.reset();
-  network_change_notifier_.reset();
+  while (!infobar_managers_seen_.empty())
+    CloseTab(*infobar_managers_seen_.begin());
+  google_url_tracker_->Shutdown();
 }
 
 net::TestURLFetcher* GoogleURLTrackerTest::GetFetcher() {
@@ -331,12 +305,8 @@ void GoogleURLTrackerTest::MockSearchDomainCheckResponse(
 }
 
 void GoogleURLTrackerTest::RequestServerCheck() {
-  if (!registrar_.IsRegistered(&observer_,
-                               chrome::NOTIFICATION_GOOGLE_URL_UPDATED,
-                               content::Source<Profile>(&profile_))) {
-    registrar_.Add(&observer_, chrome::NOTIFICATION_GOOGLE_URL_UPDATED,
-                   content::Source<Profile>(&profile_));
-  }
+  if (!listener_.HasRegisteredCallback())
+    listener_.RegisterCallback(google_url_tracker_.get());
   google_url_tracker_->SetNeedToFetch();
 }
 
@@ -359,27 +329,32 @@ GURL GoogleURLTrackerTest::GetLastPromptedGoogleURL() {
   return GURL(profile_.GetPrefs()->GetString(prefs::kLastPromptedGoogleURL));
 }
 
-void GoogleURLTrackerTest::SetNavigationPending(intptr_t unique_id,
-                                                bool is_search) {
+void GoogleURLTrackerTest::SetNavigationPending(
+    infobars::InfoBarManager* infobar_manager,
+    bool is_search) {
   if (is_search) {
     google_url_tracker_->SearchCommitted();
     // Note that the call above might not have actually registered a listener
     // for navigation starts if the searchdomaincheck response was bogus.
   }
-  unique_ids_seen_.insert(unique_id);
-  if (nav_helper_->IsListeningForNavigationStart()) {
+  infobar_managers_seen_.insert(infobar_manager);
+  if (client_->IsListeningForNavigationStart()) {
     google_url_tracker_->OnNavigationPending(
-        reinterpret_cast<content::NavigationController*>(unique_id),
-        reinterpret_cast<InfoBarService*>(unique_id), unique_id);
+        scoped_ptr<GoogleURLTrackerNavigationHelper>(
+            new TestGoogleURLTrackerNavigationHelper(
+                google_url_tracker_.get())),
+        infobar_manager,
+        infobar_manager->GetActiveEntryID());
   }
 }
 
-void GoogleURLTrackerTest::CommitNonSearch(intptr_t unique_id) {
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(unique_id);
+void GoogleURLTrackerTest::CommitNonSearch(
+    infobars::InfoBarManager* infobar_manager) {
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(infobar_manager);
   if (!map_entry)
     return;
 
-  ExpectListeningForCommit(unique_id, false);
+  ExpectListeningForCommit(infobar_manager, false);
 
   // The infobar should be showing; otherwise the pending non-search should
   // have closed it.
@@ -393,111 +368,68 @@ void GoogleURLTrackerTest::CommitNonSearch(intptr_t unique_id) {
   map_entry->infobar_delegate()->Close(false);
 }
 
-void GoogleURLTrackerTest::CommitSearch(intptr_t unique_id,
-                                        const GURL& search_url) {
+void GoogleURLTrackerTest::CommitSearch(
+    infobars::InfoBarManager* infobar_manager,
+    const GURL& search_url) {
   DCHECK(search_url.is_valid());
-  if (nav_helper_->IsListeningForNavigationCommit(
-      reinterpret_cast<content::NavigationController*>(unique_id))) {
-    google_url_tracker_->OnNavigationCommitted(
-        reinterpret_cast<InfoBarService*>(unique_id), search_url);
+  GoogleURLTrackerNavigationHelper* nav_helper =
+      GetNavigationHelper(infobar_manager);
+  if (nav_helper && nav_helper->IsListeningForNavigationCommit()) {
+    google_url_tracker_->OnNavigationCommitted(infobar_manager, search_url);
   }
 }
 
-void GoogleURLTrackerTest::CloseTab(intptr_t unique_id) {
-  unique_ids_seen_.erase(unique_id);
-  content::NavigationController* nav_controller =
-      reinterpret_cast<content::NavigationController*>(unique_id);
-  if (nav_helper_->IsListeningForTabDestruction(nav_controller)) {
-    google_url_tracker_->OnTabClosed(nav_controller);
+void GoogleURLTrackerTest::CloseTab(infobars::InfoBarManager* infobar_manager) {
+  infobar_managers_seen_.erase(infobar_manager);
+  GoogleURLTrackerNavigationHelper* nav_helper =
+      GetNavigationHelper(infobar_manager);
+  if (nav_helper && nav_helper->IsListeningForTabDestruction()) {
+    google_url_tracker_->OnTabClosed(nav_helper);
   } else {
     // Closing a tab with an infobar showing would close the infobar.
-    GoogleURLTrackerInfoBarDelegate* delegate = GetInfoBarDelegate(unique_id);
+    GoogleURLTrackerInfoBarDelegate* delegate =
+        GetInfoBarDelegate(infobar_manager);
     if (delegate)
       delegate->Close(false);
   }
 }
 
 GoogleURLTrackerMapEntry* GoogleURLTrackerTest::GetMapEntry(
-    intptr_t unique_id) {
+    infobars::InfoBarManager* infobar_manager) {
   GoogleURLTracker::EntryMap::const_iterator i =
-      google_url_tracker_->entry_map_.find(
-          reinterpret_cast<InfoBarService*>(unique_id));
+      google_url_tracker_->entry_map_.find(infobar_manager);
   return (i == google_url_tracker_->entry_map_.end()) ? NULL : i->second;
 }
 
 GoogleURLTrackerInfoBarDelegate* GoogleURLTrackerTest::GetInfoBarDelegate(
-    intptr_t unique_id) {
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(unique_id);
+    infobars::InfoBarManager* infobar_manager) {
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(infobar_manager);
   return map_entry ? map_entry->infobar_delegate() : NULL;
 }
 
+GoogleURLTrackerNavigationHelper* GoogleURLTrackerTest::GetNavigationHelper(
+    infobars::InfoBarManager* infobar_manager) {
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(infobar_manager);
+  return map_entry ? map_entry->navigation_helper() : NULL;
+}
+
 void GoogleURLTrackerTest::ExpectDefaultURLs() const {
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL(), fetched_google_url());
 }
 
-void GoogleURLTrackerTest::ExpectListeningForCommit(intptr_t unique_id,
-                                                    bool listening) {
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(unique_id);
+void GoogleURLTrackerTest::ExpectListeningForCommit(
+    infobars::InfoBarManager* infobar_manager,
+    bool listening) {
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(infobar_manager);
   if (map_entry) {
-    EXPECT_EQ(listening, nav_helper_->IsListeningForNavigationCommit(
-        map_entry->navigation_controller()));
+    EXPECT_EQ(listening,
+              map_entry->navigation_helper()->IsListeningForNavigationCommit());
   } else {
     EXPECT_FALSE(listening);
   }
 }
 
-infobars::InfoBar* GoogleURLTrackerTest::CreateTestInfoBar(
-    InfoBarService* infobar_service,
-    GoogleURLTracker* google_url_tracker,
-    const GURL& search_url) {
-  return TestInfoBarDelegate::Create(this, infobar_service, google_url_tracker,
-                                     search_url);
-}
-
-
-// TestInfoBarDelegate --------------------------------------------------------
-
-namespace {
-
-// static
-infobars::InfoBar* TestInfoBarDelegate::Create(
-    GoogleURLTrackerTest* test_harness,
-    InfoBarService* infobar_service,
-    GoogleURLTracker* google_url_tracker,
-    const GURL& search_url) {
-  return ConfirmInfoBarDelegate::CreateInfoBar(
-      scoped_ptr<ConfirmInfoBarDelegate>(new TestInfoBarDelegate(
-          test_harness, infobar_service, google_url_tracker,
-          search_url))).release();
-}
-
-TestInfoBarDelegate::TestInfoBarDelegate(GoogleURLTrackerTest* test_harness,
-                                         InfoBarService* infobar_service,
-                                         GoogleURLTracker* google_url_tracker,
-                                         const GURL& search_url)
-  : GoogleURLTrackerInfoBarDelegate(google_url_tracker, search_url),
-    test_harness_(test_harness),
-    infobar_service_(infobar_service) {
-}
-
-TestInfoBarDelegate::~TestInfoBarDelegate() {
-}
-
-void TestInfoBarDelegate::Update(const GURL& search_url) {
-  set_search_url(search_url);
-  set_pending_id(0);
-}
-
-void TestInfoBarDelegate::Close(bool redo_search) {
-  test_harness_->OnInfoBarClosed(scoped_ptr<infobars::InfoBar>(infobar()),
-                                 infobar_service_);
-  // WARNING: At this point |this| has been deleted!
-}
-
-}  // namespace
-
-
 // Tests ----------------------------------------------------------------------
 
 TEST_F(GoogleURLTrackerTest, DontFetchWhenNoOneRequestsCheck) {
@@ -507,21 +439,21 @@ TEST_F(GoogleURLTrackerTest, DontFetchWhenNoOneRequestsCheck) {
   EXPECT_FALSE(GetFetcher());
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   ExpectDefaultURLs();
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, UpdateOnFirstRun) {
   RequestServerCheck();
   EXPECT_FALSE(GetFetcher());
   ExpectDefaultURLs();
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   // GoogleURL should be updated, becase there was no last prompted URL.
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, DontUpdateWhenUnchanged) {
@@ -530,7 +462,7 @@ TEST_F(GoogleURLTrackerTest, DontUpdateWhenUnchanged) {
   RequestServerCheck();
   EXPECT_FALSE(GetFetcher());
   ExpectDefaultURLs();
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
@@ -538,76 +470,77 @@ TEST_F(GoogleURLTrackerTest, DontUpdateWhenUnchanged) {
   // GoogleURL should not be updated, because the fetched and prompted URLs
   // match.
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, DontPromptOnBadReplies) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
 
   RequestServerCheck();
   EXPECT_FALSE(GetFetcher());
   ExpectDefaultURLs();
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 
   // Old-style domain string.
   FinishSleep();
   MockSearchDomainCheckResponse(".google.co.in");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // Bad subdomain.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://mail.google.com/");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // Non-empty path.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.com/search");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // Non-empty query.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.com/?q=foo");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // Non-empty ref.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.com/#anchor");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // Complete garbage.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("HJ)*qF)_*&@f1");
   EXPECT_EQ(GURL(), fetched_google_url());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
-  EXPECT_FALSE(observer_notified());
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_FALSE(listener_notified());
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 }
 
 TEST_F(GoogleURLTrackerTest, UpdatePromptedURLOnReturnToPreviousLocation) {
@@ -619,7 +552,7 @@ TEST_F(GoogleURLTrackerTest, UpdatePromptedURLOnReturnToPreviousLocation) {
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, SilentlyAcceptSchemeChange) {
@@ -633,14 +566,14 @@ TEST_F(GoogleURLTrackerTest, SilentlyAcceptSchemeChange) {
   EXPECT_EQ(GURL("https://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("https://www.google.co.uk/"), google_url());
   EXPECT_EQ(GURL("https://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, RefetchOnIPAddressChange) {
@@ -649,15 +582,15 @@ TEST_F(GoogleURLTrackerTest, RefetchOnIPAddressChange) {
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_TRUE(observer_notified());
-  clear_observer_notified();
+  EXPECT_TRUE(listener_notified());
+  clear_listener_notified();
 
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.in/");
   EXPECT_EQ(GURL("http://www.google.co.in/"), fetched_google_url());
   // Just fetching a new URL shouldn't reset things without a prompt.
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, DontRefetchWhenNoOneRequestsCheck) {
@@ -667,7 +600,7 @@ TEST_F(GoogleURLTrackerTest, DontRefetchWhenNoOneRequestsCheck) {
   EXPECT_FALSE(GetFetcher());
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   ExpectDefaultURLs();
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, FetchOnLateRequest) {
@@ -681,7 +614,7 @@ TEST_F(GoogleURLTrackerTest, FetchOnLateRequest) {
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, DontFetchTwiceOnLateRequests) {
@@ -695,8 +628,8 @@ TEST_F(GoogleURLTrackerTest, DontFetchTwiceOnLateRequests) {
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_TRUE(observer_notified());
-  clear_observer_notified();
+  EXPECT_TRUE(listener_notified());
+  clear_listener_notified();
 
   RequestServerCheck();
   // The second request should be ignored.
@@ -704,29 +637,31 @@ TEST_F(GoogleURLTrackerTest, DontFetchTwiceOnLateRequests) {
   MockSearchDomainCheckResponse("http://www.google.co.in/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, SearchingDoesNothingIfNoNeedToPrompt) {
+  TestInfoBarManager infobar_manager(1);
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(observer_notified());
-  clear_observer_notified();
+  EXPECT_TRUE(listener_notified());
+  clear_listener_notified();
 
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, TabClosedOnPendingSearch) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
@@ -734,95 +669,103 @@ TEST_F(GoogleURLTrackerTest, TabClosedOnPendingSearch) {
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.jp/"), fetched_google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 
-  SetNavigationPending(1, true);
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(1);
+  SetNavigationPending(&infobar_manager, true);
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(&infobar_manager);
   ASSERT_FALSE(map_entry == NULL);
   EXPECT_FALSE(map_entry->has_infobar_delegate());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 
-  CloseTab(1);
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  CloseTab(&infobar_manager);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, TabClosedOnCommittedSearch) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
 
-  CloseTab(1);
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  CloseTab(&infobar_manager);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, InfoBarClosed) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  GoogleURLTrackerInfoBarDelegate* infobar = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  GoogleURLTrackerInfoBarDelegate* infobar =
+      GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(infobar == NULL);
 
   infobar->Close(false);
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, InfoBarRefused) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  GoogleURLTrackerInfoBarDelegate* infobar = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  GoogleURLTrackerInfoBarDelegate* infobar =
+      GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(infobar == NULL);
 
   infobar->Cancel();
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, InfoBarAccepted) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  GoogleURLTrackerInfoBarDelegate* infobar = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  GoogleURLTrackerInfoBarDelegate* infobar =
+      GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(infobar == NULL);
 
   infobar->Accept();
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
   EXPECT_EQ(GURL("http://www.google.co.jp/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, FetchesCanAutomaticallyCloseInfoBars) {
+  TestInfoBarManager infobar_manager(1);
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse(google_url().spec());
@@ -831,20 +774,20 @@ TEST_F(GoogleURLTrackerTest, FetchesCanAutomaticallyCloseInfoBars) {
   // should close the infobar.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse(google_url().spec());
   EXPECT_EQ(google_url(), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // As should fetching a URL that differs from the accepted only by the scheme.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
   NotifyIPAddressChanged();
   url::Replacements<char> replacements;
   const std::string& scheme("https");
@@ -852,56 +795,58 @@ TEST_F(GoogleURLTrackerTest, FetchesCanAutomaticallyCloseInfoBars) {
   GURL new_google_url(google_url().ReplaceComponents(replacements));
   MockSearchDomainCheckResponse(new_google_url.spec());
   EXPECT_EQ(new_google_url, GetLastPromptedGoogleURL());
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // As should re-fetching the last prompted URL.
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
   EXPECT_EQ(new_google_url, google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // And one that differs from the last prompted URL only by the scheme.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("https://www.google.co.uk/");
   EXPECT_EQ(new_google_url, google_url());
   EXPECT_EQ(GURL("https://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // And fetching a different URL entirely.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("https://www.google.co.in/");
   EXPECT_EQ(new_google_url, google_url());
   EXPECT_EQ(GURL("https://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 }
 
 TEST_F(GoogleURLTrackerTest, ResetInfoBarGoogleURLs) {
+  TestInfoBarManager infobar_manager(1);
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse(google_url().spec());
 
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("http://www.google.co.uk/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.com/search?q=test"));
-  GoogleURLTrackerInfoBarDelegate* delegate = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.com/search?q=test"));
+  GoogleURLTrackerInfoBarDelegate* delegate =
+      GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(delegate == NULL);
   EXPECT_EQ(GURL("http://www.google.co.uk/"), fetched_google_url());
 
@@ -909,161 +854,176 @@ TEST_F(GoogleURLTrackerTest, ResetInfoBarGoogleURLs) {
   // infobar's only by scheme, the infobar should stay showing.
   NotifyIPAddressChanged();
   MockSearchDomainCheckResponse("https://www.google.co.uk/");
-  EXPECT_EQ(delegate, GetInfoBarDelegate(1));
+  EXPECT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(GURL("https://www.google.co.uk/"), fetched_google_url());
 }
 
 TEST_F(GoogleURLTrackerTest, NavigationsAfterPendingSearch) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
   // A pending non-search after a pending search should delete the map entry.
-  SetNavigationPending(1, true);
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(1);
+  SetNavigationPending(&infobar_manager, true);
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(&infobar_manager);
   ASSERT_FALSE(map_entry == NULL);
   EXPECT_FALSE(map_entry->has_infobar_delegate());
-  SetNavigationPending(1, false);
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  SetNavigationPending(&infobar_manager, false);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // A pending search after a pending search should leave the map entry alive.
-  SetNavigationPending(1, true);
-  map_entry = GetMapEntry(1);
+  SetNavigationPending(&infobar_manager, true);
+  map_entry = GetMapEntry(&infobar_manager);
   ASSERT_FALSE(map_entry == NULL);
   EXPECT_FALSE(map_entry->has_infobar_delegate());
-  SetNavigationPending(1, true);
-  ASSERT_EQ(map_entry, GetMapEntry(1));
+  SetNavigationPending(&infobar_manager, true);
+  ASSERT_EQ(map_entry, GetMapEntry(&infobar_manager));
   EXPECT_FALSE(map_entry->has_infobar_delegate());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, true));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, true));
 
   // Committing this search should show an infobar.
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test2"));
+  CommitSearch(&infobar_manager,
+               GURL("http://www.google.co.uk/search?q=test2"));
   EXPECT_TRUE(map_entry->has_infobar_delegate());
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  EXPECT_FALSE(listener_notified());
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 }
 
 TEST_F(GoogleURLTrackerTest, NavigationsAfterCommittedSearch) {
+  TestInfoBarManager infobar_manager(1);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  GoogleURLTrackerInfoBarDelegate* delegate = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  GoogleURLTrackerInfoBarDelegate* delegate =
+      GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(delegate == NULL);
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 
   // A pending non-search on a visible infobar should basically do nothing.
-  SetNavigationPending(1, false);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, false);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(0, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 
   // As should another pending non-search after the first.
-  SetNavigationPending(1, false);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, false);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(0, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 
   // Committing this non-search should close the infobar.  The control flow in
   // these tests is not really comparable to in the real browser, but at least a
   // few sanity-checks will be performed.
-  ASSERT_NO_FATAL_FAILURE(CommitNonSearch(1));
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
+  ASSERT_NO_FATAL_FAILURE(CommitNonSearch(&infobar_manager));
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
 
   // A pending search on a visible infobar should cause the infobar to listen
   // for the search to commit.
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  delegate = GetInfoBarDelegate(1);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  delegate = GetInfoBarDelegate(&infobar_manager);
   ASSERT_FALSE(delegate == NULL);
-  SetNavigationPending(1, true);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, true);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(1, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, true));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, true));
 
   // But a non-search after this should cancel that state.
-  SetNavigationPending(1, false);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, false);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(0, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 
   // Another pending search after the non-search should put us back into
   // "waiting for commit" mode.
-  SetNavigationPending(1, true);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, true);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(1, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, true));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, true));
 
   // A second pending search after the first should not really change anything.
-  SetNavigationPending(1, true);
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  SetNavigationPending(&infobar_manager, true);
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(1, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, true));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, true));
 
   // Committing this search should change the visible infobar's search_url.
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test2"));
-  ASSERT_EQ(delegate, GetInfoBarDelegate(1));
+  CommitSearch(&infobar_manager,
+               GURL("http://www.google.co.uk/search?q=test2"));
+  ASSERT_EQ(delegate, GetInfoBarDelegate(&infobar_manager));
   EXPECT_EQ(GURL("http://www.google.co.uk/search?q=test2"),
             delegate->search_url());
   EXPECT_EQ(0, delegate->pending_id());
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
   EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage), google_url());
   EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
-  EXPECT_FALSE(observer_notified());
+  EXPECT_FALSE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, MultipleMapEntries) {
+  TestInfoBarManager infobar_manager(1);
+  TestInfoBarManager infobar_manager2(2);
+  TestInfoBarManager infobar_manager3(3);
+  TestInfoBarManager infobar_manager4(4);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
   MockSearchDomainCheckResponse("http://www.google.co.jp/");
 
-  SetNavigationPending(1, true);
-  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(1);
+  SetNavigationPending(&infobar_manager, true);
+  GoogleURLTrackerMapEntry* map_entry = GetMapEntry(&infobar_manager);
   ASSERT_FALSE(map_entry == NULL);
   EXPECT_FALSE(map_entry->has_infobar_delegate());
 
-  SetNavigationPending(2, true);
-  CommitSearch(2, GURL("http://www.google.co.uk/search?q=test2"));
-  GoogleURLTrackerInfoBarDelegate* delegate2 = GetInfoBarDelegate(2);
+  SetNavigationPending(&infobar_manager2, true);
+  CommitSearch(&infobar_manager2,
+               GURL("http://www.google.co.uk/search?q=test2"));
+  GoogleURLTrackerInfoBarDelegate* delegate2 =
+      GetInfoBarDelegate(&infobar_manager2);
   ASSERT_FALSE(delegate2 == NULL);
   EXPECT_EQ(GURL("http://www.google.co.uk/search?q=test2"),
             delegate2->search_url());
 
-  SetNavigationPending(3, true);
-  GoogleURLTrackerMapEntry* map_entry3 = GetMapEntry(3);
+  SetNavigationPending(&infobar_manager3, true);
+  GoogleURLTrackerMapEntry* map_entry3 = GetMapEntry(&infobar_manager3);
   ASSERT_FALSE(map_entry3 == NULL);
   EXPECT_FALSE(map_entry3->has_infobar_delegate());
 
-  SetNavigationPending(4, true);
-  CommitSearch(4, GURL("http://www.google.co.uk/search?q=test4"));
-  GoogleURLTrackerInfoBarDelegate* delegate4 = GetInfoBarDelegate(4);
+  SetNavigationPending(&infobar_manager4, true);
+  CommitSearch(&infobar_manager4,
+               GURL("http://www.google.co.uk/search?q=test4"));
+  GoogleURLTrackerInfoBarDelegate* delegate4 =
+      GetInfoBarDelegate(&infobar_manager4);
   ASSERT_FALSE(delegate4 == NULL);
   EXPECT_EQ(GURL("http://www.google.co.uk/search?q=test4"),
             delegate4->search_url());
 
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
   EXPECT_TRUE(map_entry->has_infobar_delegate());
 
   delegate2->Close(false);
-  EXPECT_TRUE(GetMapEntry(2) == NULL);
-  EXPECT_FALSE(observer_notified());
+  EXPECT_TRUE(GetMapEntry(&infobar_manager2) == NULL);
+  EXPECT_FALSE(listener_notified());
 
   delegate4->Accept();
-  EXPECT_TRUE(GetMapEntry(1) == NULL);
-  EXPECT_TRUE(GetMapEntry(3) == NULL);
-  EXPECT_TRUE(GetMapEntry(4) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager3) == NULL);
+  EXPECT_TRUE(GetMapEntry(&infobar_manager4) == NULL);
   EXPECT_EQ(GURL("http://www.google.co.jp/"), google_url());
   EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
-  EXPECT_TRUE(observer_notified());
+  EXPECT_TRUE(listener_notified());
 }
 
 TEST_F(GoogleURLTrackerTest, IgnoreIrrelevantNavigation) {
+  TestInfoBarManager infobar_manager(1);
+  TestInfoBarManager infobar_manager2(2);
   SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
   RequestServerCheck();
   FinishSleep();
@@ -1071,16 +1031,18 @@ TEST_F(GoogleURLTrackerTest, IgnoreIrrelevantNavigation) {
 
   // This tests a particularly gnarly sequence of events that used to cause us
   // to erroneously listen for a non-search navigation to commit.
-  SetNavigationPending(1, true);
-  CommitSearch(1, GURL("http://www.google.co.uk/search?q=test"));
-  SetNavigationPending(2, true);
-  CommitSearch(2, GURL("http://www.google.co.uk/search?q=test2"));
-  EXPECT_FALSE(GetInfoBarDelegate(1) == NULL);
-  GoogleURLTrackerInfoBarDelegate* delegate2 = GetInfoBarDelegate(2);
+  SetNavigationPending(&infobar_manager, true);
+  CommitSearch(&infobar_manager, GURL("http://www.google.co.uk/search?q=test"));
+  SetNavigationPending(&infobar_manager2, true);
+  CommitSearch(&infobar_manager2,
+               GURL("http://www.google.co.uk/search?q=test2"));
+  EXPECT_FALSE(GetInfoBarDelegate(&infobar_manager) == NULL);
+  GoogleURLTrackerInfoBarDelegate* delegate2 =
+      GetInfoBarDelegate(&infobar_manager2);
   ASSERT_FALSE(delegate2 == NULL);
-  SetNavigationPending(1, true);
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, true));
+  SetNavigationPending(&infobar_manager, true);
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, true));
   delegate2->Close(false);
-  SetNavigationPending(1, false);
-  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(1, false));
+  SetNavigationPending(&infobar_manager, false);
+  ASSERT_NO_FATAL_FAILURE(ExpectListeningForCommit(&infobar_manager, false));
 }