Index: chrome/browser/geolocation/geolocation_permission_context_unittest.cc |
=================================================================== |
--- chrome/browser/geolocation/geolocation_permission_context_unittest.cc (revision 87725) |
+++ chrome/browser/geolocation/geolocation_permission_context_unittest.cc (working copy) |
@@ -2,6 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <set> |
+ |
#include "base/memory/scoped_vector.h" |
#include "chrome/browser/content_settings/tab_specific_content_settings.h" |
#include "chrome/browser/geolocation/geolocation_content_settings_map.h" |
@@ -18,59 +20,61 @@ |
#include "content/browser/renderer_host/mock_render_process_host.h" |
#include "content/browser/tab_contents/test_tab_contents.h" |
#include "content/common/geolocation_messages.h" |
-#include "content/common/notification_details.h" |
#include "content/common/notification_registrar.h" |
-#include "content/common/notification_source.h" |
-#include "content/common/notification_type.h" |
+#include "content/common/notification_service.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-// TestTabContentsWithPendingInfoBar ------------------------------------------ |
+// ClosedDelegateTracker ------------------------------------------------------ |
namespace { |
-// TestTabContents short-circuits TAB_CONTENTS_INFOBAR_REMOVED to call |
-// InfoBarClosed() directly. We need to observe it and call InfoBarClosed() |
-// later. |
-class TestTabContentsWithPendingInfoBar : public TabContentsWrapper { |
+// We need to track which infobars were closed. |
+class ClosedDelegateTracker : public NotificationObserver { |
public: |
- TestTabContentsWithPendingInfoBar(Profile* profile, SiteInstance* instance); |
- virtual ~TestTabContentsWithPendingInfoBar(); |
+ ClosedDelegateTracker(); |
+ virtual ~ClosedDelegateTracker(); |
- // TabContentsWrapper: |
+ // NotificationObserver: |
virtual void Observe(NotificationType type, |
const NotificationSource& source, |
const NotificationDetails& details); |
- InfoBarDelegate* removed_infobar_delegate_; |
+ size_t size() const { |
+ return removed_infobar_delegates_.size(); |
+ } |
+ |
+ bool Contains(InfoBarDelegate* delegate) const; |
+ void Clear(); |
+ |
+ private: |
NotificationRegistrar registrar_; |
+ std::set<InfoBarDelegate*> removed_infobar_delegates_; |
}; |
-TestTabContentsWithPendingInfoBar::TestTabContentsWithPendingInfoBar( |
- Profile* profile, |
- SiteInstance* instance) |
- : TabContentsWrapper( |
- new TabContents(profile, instance, MSG_ROUTING_NONE, NULL, NULL)), |
- removed_infobar_delegate_(NULL) { |
- Source<TabContentsWrapper> source(this); |
+ClosedDelegateTracker::ClosedDelegateTracker() { |
registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, |
- source); |
+ NotificationService::AllSources()); |
} |
-TestTabContentsWithPendingInfoBar::~TestTabContentsWithPendingInfoBar() { |
+ClosedDelegateTracker::~ClosedDelegateTracker() { |
} |
-void TestTabContentsWithPendingInfoBar::Observe( |
- NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- if (type.value == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED) { |
- removed_infobar_delegate_ = |
- Details<std::pair<InfoBarDelegate*, bool> >(details)->first; |
- } else { |
- TabContentsWrapper::Observe(type, source, details); |
- } |
+void ClosedDelegateTracker::Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ DCHECK(type.value == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED); |
+ removed_infobar_delegates_.insert( |
+ Details<std::pair<InfoBarDelegate*, bool> >(details)->first); |
} |
+bool ClosedDelegateTracker::Contains(InfoBarDelegate* delegate) const { |
+ return removed_infobar_delegates_.count(delegate) != 0; |
+} |
+ |
+void ClosedDelegateTracker::Clear() { |
+ removed_infobar_delegates_.clear(); |
+} |
+ |
} // namespace |
@@ -86,11 +90,12 @@ |
int process_id() { return contents()->render_view_host()->process()->id(); } |
int process_id_for_tab(int tab) { |
- return extra_tabs_[tab]->render_view_host()->process()->id(); |
+ return extra_tabs_[tab]->tab_contents()->render_view_host()->process()-> |
+ id(); |
} |
int render_id() { return contents()->render_view_host()->routing_id(); } |
int render_id_for_tab(int tab) { |
- return extra_tabs_[tab]->render_view_host()->routing_id(); |
+ return extra_tabs_[tab]->tab_contents()->render_view_host()->routing_id(); |
} |
int bridge_id() const { return 42; } // Not relevant at this level. |
@@ -103,9 +108,9 @@ |
void CheckTabContentsState(const GURL& requesting_frame, |
ContentSetting expected_content_setting); |
- TestTabContentsWithPendingInfoBar* tab_contents_with_pending_infobar_; |
scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_; |
- ScopedVector<TestTabContentsWithPendingInfoBar> extra_tabs_; |
+ ClosedDelegateTracker closed_delegate_tracker_; |
+ ScopedVector<TabContentsWrapper> extra_tabs_; |
private: |
// TabContentsWrapperTestHarness: |
@@ -117,7 +122,7 @@ |
}; |
GeolocationPermissionContextTests::GeolocationPermissionContextTests() |
- : tab_contents_with_pending_infobar_(NULL), |
+ : TabContentsWrapperTestHarness(), |
ui_thread_(BrowserThread::UI, MessageLoop::current()), |
dependency_factory_( |
new GeolocationArbitratorDependencyFactoryWithLocationProvider( |
@@ -138,7 +143,8 @@ |
int bridge_id, |
bool allowed) { |
CheckPermissionMessageSentInternal(static_cast<MockRenderProcessHost*>( |
- extra_tabs_[tab]->render_view_host()->process()), bridge_id, allowed); |
+ extra_tabs_[tab]->tab_contents()->render_view_host()->process()), |
+ bridge_id, allowed); |
} |
void GeolocationPermissionContextTests::CheckPermissionMessageSentInternal( |
@@ -158,12 +164,12 @@ |
} |
void GeolocationPermissionContextTests::AddNewTab(const GURL& url) { |
- TestTabContentsWithPendingInfoBar* new_tab = |
- new TestTabContentsWithPendingInfoBar(profile(), NULL); |
+ TabContents* new_tab = |
+ new TabContents(profile(), NULL, MSG_ROUTING_NONE, NULL, NULL); |
new_tab->controller().LoadURL(url, GURL(), PageTransition::TYPED); |
- static_cast<TestRenderViewHost*>(new_tab->tab_contents()->render_manager()-> |
- current_host())->SendNavigate(extra_tabs_.size() + 1, url); |
- extra_tabs_.push_back(new_tab); |
+ static_cast<TestRenderViewHost*>(new_tab->render_manager()->current_host())-> |
+ SendNavigate(extra_tabs_.size() + 1, url); |
+ extra_tabs_.push_back(new TabContentsWrapper(new_tab)); |
} |
void GeolocationPermissionContextTests::CheckTabContentsState( |
@@ -186,10 +192,6 @@ |
TabContentsWrapperTestHarness::SetUp(); |
GeolocationArbitrator::SetDependencyFactoryForTest( |
dependency_factory_.get()); |
- SiteInstance* site_instance = contents()->GetSiteInstance(); |
- tab_contents_with_pending_infobar_ = |
- new TestTabContentsWithPendingInfoBar(profile_.get(), site_instance); |
- SetContentsWrapper(tab_contents_with_pending_infobar_); |
geolocation_permission_context_ = |
new GeolocationPermissionContext(profile()); |
} |
@@ -241,8 +243,9 @@ |
CheckPermissionMessageSent(bridge_id(), true); |
contents_wrapper()->RemoveInfoBar(infobar_0); |
- EXPECT_EQ(infobar_0, |
- tab_contents_with_pending_infobar_->removed_infobar_delegate_); |
+ EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
+ closed_delegate_tracker_.Clear(); |
infobar_0->InfoBarClosed(); |
// Now we should have a new infobar for the second frame. |
EXPECT_EQ(1U, contents_wrapper()->infobar_count()); |
@@ -258,8 +261,8 @@ |
CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK); |
CheckPermissionMessageSent(bridge_id() + 1, false); |
contents_wrapper()->RemoveInfoBar(infobar_1); |
- EXPECT_EQ(infobar_1, |
- tab_contents_with_pending_infobar_->removed_infobar_delegate_); |
+ EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
infobar_1->InfoBarClosed(); |
EXPECT_EQ(0U, contents_wrapper()->infobar_count()); |
// Ensure the persisted permissions are ok. |
@@ -299,8 +302,9 @@ |
// is removed and the next pending infobar is created. |
geolocation_permission_context_->CancelGeolocationPermissionRequest( |
process_id(), render_id(), bridge_id(), requesting_frame_0); |
- EXPECT_EQ(infobar_0, |
- tab_contents_with_pending_infobar_->removed_infobar_delegate_); |
+ EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
+ closed_delegate_tracker_.Clear(); |
infobar_0->InfoBarClosed(); |
EXPECT_EQ(1U, contents_wrapper()->infobar_count()); |
@@ -315,8 +319,8 @@ |
CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); |
CheckPermissionMessageSent(bridge_id() + 1, true); |
contents_wrapper()->RemoveInfoBar(infobar_1); |
- EXPECT_EQ(infobar_1, |
- tab_contents_with_pending_infobar_->removed_infobar_delegate_); |
+ EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
infobar_1->InfoBarClosed(); |
EXPECT_EQ(0U, contents_wrapper()->infobar_count()); |
// Ensure the persisted permissions are ok. |
@@ -369,12 +373,13 @@ |
infobar_0->Accept(); |
CheckPermissionMessageSent(bridge_id(), true); |
contents_wrapper()->RemoveInfoBar(infobar_0); |
- EXPECT_EQ(infobar_0, |
- tab_contents_with_pending_infobar_->removed_infobar_delegate_); |
+ EXPECT_EQ(2U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
infobar_0->InfoBarClosed(); |
// Now the infobar for the tab with the same origin should have gone. |
EXPECT_EQ(0U, extra_tabs_[1]->infobar_count()); |
CheckPermissionMessageSentForTab(1, bridge_id(), true); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); |
// Destroy the infobar that has just been removed. |
removed_infobar->InfoBarClosed(); |
@@ -412,12 +417,14 @@ |
infobar_0->Accept(); |
CheckPermissionMessageSentForTab(0, bridge_id(), true); |
extra_tabs_[0]->RemoveInfoBar(infobar_0); |
- EXPECT_EQ(infobar_0, |
- extra_tabs_[0]->removed_infobar_delegate_); |
+ EXPECT_EQ(2U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
infobar_0->InfoBarClosed(); |
// Now the infobar for the tab with the same origin should have gone. |
EXPECT_EQ(0U, contents_wrapper()->infobar_count()); |
CheckPermissionMessageSent(bridge_id(), true); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); |
+ closed_delegate_tracker_.Clear(); |
// Destroy the infobar that has just been removed. |
removed_infobar->InfoBarClosed(); |
@@ -431,8 +438,8 @@ |
infobar_1->Accept(); |
CheckPermissionMessageSentForTab(0, bridge_id() + 1, true); |
extra_tabs_[0]->RemoveInfoBar(infobar_1); |
- EXPECT_EQ(infobar_1, |
- extra_tabs_[0]->removed_infobar_delegate_); |
+ EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
+ EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
infobar_1->InfoBarClosed(); |
extra_tabs_.reset(); |