#include <map>
#include "base/memory/scoped_ptr.h"
-#include "components/web_modal/native_web_contents_modal_dialog_manager.h"
+#include "components/web_modal/single_web_contents_dialog_manager.h"
#include "components/web_modal/test_web_contents_modal_dialog_manager_delegate.h"
#include "content/public/test/test_renderer_host.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace web_modal {
-class TestNativeWebContentsModalDialogManager
- : public NativeWebContentsModalDialogManager {
+// Tracks persistent state changes of the native WC-modal dialog manager.
+class NativeManagerTracker {
public:
enum DialogState {
UNKNOWN,
CLOSED
};
- explicit TestNativeWebContentsModalDialogManager(
- NativeWebContentsModalDialogManagerDelegate* delegate)
- : delegate_(delegate) {}
- virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
- dialog_state_[dialog] = NOT_SHOWN;
+ NativeManagerTracker() : state_(UNKNOWN), was_shown_(false) {}
+
+ void SetState(DialogState state) {
+ state_ = state;
+ if (state_ == SHOWN)
+ was_shown_ = true;
+ }
+
+ DialogState state_;
+ bool was_shown_;
+};
+
+NativeManagerTracker unused_tracker;
+
+class TestNativeWebContentsModalDialogManager
+ : public SingleWebContentsDialogManager {
+ public:
+ TestNativeWebContentsModalDialogManager(
+ NativeWebContentsModalDialog dialog,
+ SingleWebContentsDialogManagerDelegate* delegate,
+ NativeManagerTracker* tracker)
+ : delegate_(delegate),
+ dialog_(dialog),
+ tracker_(tracker) {
+ if (tracker_)
+ tracker_->SetState(NativeManagerTracker::NOT_SHOWN);
}
- virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
- dialog_state_[dialog] = SHOWN;
+
+ virtual void Show() OVERRIDE {
+ if (tracker_)
+ tracker_->SetState(NativeManagerTracker::SHOWN);
}
- virtual void HideDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
- dialog_state_[dialog] = HIDDEN;
+ virtual void Hide() OVERRIDE {
+ if (tracker_)
+ tracker_->SetState(NativeManagerTracker::HIDDEN);
}
- virtual void CloseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
- delegate_->WillClose(dialog);
- dialog_state_[dialog] = CLOSED;
+ virtual void Close() OVERRIDE {
+ if (tracker_)
+ tracker_->SetState(NativeManagerTracker::CLOSED);
+ delegate_->WillClose(dialog_);
}
- virtual void FocusDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
+ virtual void Focus() OVERRIDE {
}
- virtual void PulseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
+ virtual void Pulse() OVERRIDE {
}
virtual void HostChanged(WebContentsModalDialogHost* new_host) OVERRIDE {
}
-
- int GetCloseCount() const {
- int count = 0;
- for (DialogStateMap::const_iterator it = dialog_state_.begin();
- it != dialog_state_.end(); ++it) {
- if (it->second == CLOSED)
- count++;
- }
- return count;
+ virtual NativeWebContentsModalDialog dialog() OVERRIDE {
+ return dialog_;
}
- DialogState GetDialogState(NativeWebContentsModalDialog dialog) const {
- DialogStateMap::const_iterator loc = dialog_state_.find(dialog);
- return loc == dialog_state_.end() ? UNKNOWN : loc->second;
+ void StopTracking() {
+ tracker_ = NULL;
}
private:
- typedef std::map<NativeWebContentsModalDialog, DialogState> DialogStateMap;
-
- NativeWebContentsModalDialogManagerDelegate* delegate_;
- DialogStateMap dialog_state_;
+ SingleWebContentsDialogManagerDelegate* delegate_;
+ NativeWebContentsModalDialog dialog_;
+ NativeManagerTracker* tracker_;
DISALLOW_COPY_AND_ASSIGN(TestNativeWebContentsModalDialogManager);
};
public:
WebContentsModalDialogManagerTest()
: next_dialog_id(1),
- manager(NULL),
- native_manager(NULL) {
+ manager(NULL) {
}
virtual void SetUp() {
manager = WebContentsModalDialogManager::FromWebContents(web_contents());
manager->SetDelegate(delegate.get());
test_api.reset(new WebContentsModalDialogManager::TestApi(manager));
- native_manager = new TestNativeWebContentsModalDialogManager(manager);
-
- // |manager| owns |native_manager| as a result.
- test_api->ResetNativeManager(native_manager);
}
virtual void TearDown() {
scoped_ptr<TestWebContentsModalDialogManagerDelegate> delegate;
WebContentsModalDialogManager* manager;
scoped_ptr<WebContentsModalDialogManager::TestApi> test_api;
- TestNativeWebContentsModalDialogManager* native_manager;
DISALLOW_COPY_AND_ASSIGN(WebContentsModalDialogManagerTest);
};
-NativeWebContentsModalDialogManager*
-WebContentsModalDialogManager::CreateNativeManager(
- NativeWebContentsModalDialogManagerDelegate* native_delegate) {
- return new TestNativeWebContentsModalDialogManager(native_delegate);
+SingleWebContentsDialogManager*
+WebContentsModalDialogManager::CreateNativeWebModalManager(
+ NativeWebContentsModalDialog dialog,
+ SingleWebContentsDialogManagerDelegate* native_delegate) {
+ NOTREACHED();
+ return new TestNativeWebContentsModalDialogManager(
+ dialog,
+ native_delegate,
+ &unused_tracker);
}
// Test that the dialog is shown immediately when the delegate indicates the web
// contents is visible.
TEST_F(WebContentsModalDialogManagerTest, WebContentsVisible) {
// Dialog should be shown while WebContents is visible.
- const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
+ const NativeWebContentsModalDialog dialog = MakeFakeDialog();
- manager->ShowDialog(dialog1);
+ NativeManagerTracker tracker;
+ TestNativeWebContentsModalDialogManager* native_manager =
+ new TestNativeWebContentsModalDialogManager(dialog, manager, &tracker);
+ manager->ShowDialogWithManager(dialog,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager).Pass());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog1));
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker.state_);
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
+ EXPECT_TRUE(tracker.was_shown_);
+
+ native_manager->StopTracking();
}
// Test that the dialog is not shown immediately when the delegate indicates the
// Dialog should not be shown while WebContents is not visible.
delegate->set_web_contents_visible(false);
- const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
+ const NativeWebContentsModalDialog dialog = MakeFakeDialog();
- manager->ShowDialog(dialog1);
+ NativeManagerTracker tracker;
+ TestNativeWebContentsModalDialogManager* native_manager =
+ new TestNativeWebContentsModalDialogManager(dialog, manager, &tracker);
+ manager->ShowDialogWithManager(dialog,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager).Pass());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog1));
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker.state_);
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
+ EXPECT_FALSE(tracker.was_shown_);
+
+ native_manager->StopTracking();
}
// Test that only the first of multiple dialogs is shown.
const NativeWebContentsModalDialog dialog2 = MakeFakeDialog();
const NativeWebContentsModalDialog dialog3 = MakeFakeDialog();
- manager->ShowDialog(dialog1);
- manager->ShowDialog(dialog2);
- manager->ShowDialog(dialog3);
+ NativeManagerTracker tracker1;
+ NativeManagerTracker tracker2;
+ NativeManagerTracker tracker3;
+ TestNativeWebContentsModalDialogManager* native_manager1 =
+ new TestNativeWebContentsModalDialogManager(dialog1, manager, &tracker1);
+ TestNativeWebContentsModalDialogManager* native_manager2 =
+ new TestNativeWebContentsModalDialogManager(dialog2, manager, &tracker2);
+ TestNativeWebContentsModalDialogManager* native_manager3 =
+ new TestNativeWebContentsModalDialogManager(dialog3, manager, &tracker3);
+ manager->ShowDialogWithManager(dialog1,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager1).Pass());
+ manager->ShowDialogWithManager(dialog2,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager2).Pass());
+ manager->ShowDialogWithManager(dialog3,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager3).Pass());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog1));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog2));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog3));
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker3.state_);
+
+ native_manager1->StopTracking();
+ native_manager2->StopTracking();
+ native_manager3->StopTracking();
}
// Test that the dialog is shown/hidden when the WebContents is shown/hidden.
TEST_F(WebContentsModalDialogManagerTest, VisibilityObservation) {
- const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
+ const NativeWebContentsModalDialog dialog = MakeFakeDialog();
- manager->ShowDialog(dialog1);
+ NativeManagerTracker tracker;
+ TestNativeWebContentsModalDialogManager* native_manager =
+ new TestNativeWebContentsModalDialogManager(dialog, manager, &tracker);
+ manager->ShowDialogWithManager(dialog,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager).Pass());
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog1));
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker.state_);
test_api->WebContentsWasHidden();
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::HIDDEN,
- native_manager->GetDialogState(dialog1));
+ EXPECT_EQ(NativeManagerTracker::HIDDEN, tracker.state_);
test_api->WebContentsWasShown();
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog1));
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker.state_);
+
+ native_manager->StopTracking();
}
// Test that attaching an interstitial page closes dialogs configured to close.
const NativeWebContentsModalDialog dialog2 = MakeFakeDialog();
const NativeWebContentsModalDialog dialog3 = MakeFakeDialog();
- manager->ShowDialog(dialog1);
- manager->ShowDialog(dialog2);
- manager->ShowDialog(dialog3);
+ NativeManagerTracker tracker1;
+ NativeManagerTracker tracker2;
+ NativeManagerTracker tracker3;
+ TestNativeWebContentsModalDialogManager* native_manager1 =
+ new TestNativeWebContentsModalDialogManager(dialog1, manager, &tracker1);
+ TestNativeWebContentsModalDialogManager* native_manager2 =
+ new TestNativeWebContentsModalDialogManager(dialog2, manager, &tracker2);
+ TestNativeWebContentsModalDialogManager* native_manager3 =
+ new TestNativeWebContentsModalDialogManager(dialog3, manager, &tracker3);
+ manager->ShowDialogWithManager(dialog1,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager1).Pass());
+ manager->ShowDialogWithManager(dialog2,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager2).Pass());
+ manager->ShowDialogWithManager(dialog3,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager3).Pass());
#if defined(OS_WIN) || defined(USE_AURA)
manager->SetCloseOnInterstitialPage(dialog2, false);
#endif
test_api->DidAttachInterstitialPage();
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog1));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog2));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog3));
+
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker3.state_);
+ EXPECT_TRUE(tracker1.was_shown_);
+ EXPECT_TRUE(tracker2.was_shown_);
+ EXPECT_FALSE(tracker3.was_shown_);
+
+ native_manager2->StopTracking();
}
const NativeWebContentsModalDialog dialog3 = MakeFakeDialog();
const NativeWebContentsModalDialog dialog4 = MakeFakeDialog();
- manager->ShowDialog(dialog1);
- manager->ShowDialog(dialog2);
- manager->ShowDialog(dialog3);
- manager->ShowDialog(dialog4);
-
- native_manager->CloseDialog(dialog1);
+ NativeManagerTracker tracker1;
+ NativeManagerTracker tracker2;
+ NativeManagerTracker tracker3;
+ NativeManagerTracker tracker4;
+ TestNativeWebContentsModalDialogManager* native_manager1 =
+ new TestNativeWebContentsModalDialogManager(dialog1, manager, &tracker1);
+ TestNativeWebContentsModalDialogManager* native_manager2 =
+ new TestNativeWebContentsModalDialogManager(dialog2, manager, &tracker2);
+ TestNativeWebContentsModalDialogManager* native_manager3 =
+ new TestNativeWebContentsModalDialogManager(dialog3, manager, &tracker3);
+ TestNativeWebContentsModalDialogManager* native_manager4 =
+ new TestNativeWebContentsModalDialogManager(dialog4, manager, &tracker4);
+ manager->ShowDialogWithManager(dialog1,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager1).Pass());
+ manager->ShowDialogWithManager(dialog2,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager2).Pass());
+ manager->ShowDialogWithManager(dialog3,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager3).Pass());
+ manager->ShowDialogWithManager(dialog4,
+ scoped_ptr<SingleWebContentsDialogManager>(native_manager4).Pass());
+
+ native_manager1->Close();
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog1));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog2));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog3));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog4));
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker3.state_);
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker4.state_);
- native_manager->CloseDialog(dialog3);
+ native_manager3->Close();
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog2));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog3));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
- native_manager->GetDialogState(dialog4));
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker3.state_);
+ EXPECT_EQ(NativeManagerTracker::NOT_SHOWN, tracker4.state_);
+ EXPECT_FALSE(tracker3.was_shown_);
- native_manager->CloseDialog(dialog2);
+ native_manager2->Close();
EXPECT_TRUE(manager->IsDialogActive());
EXPECT_TRUE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog2));
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
- native_manager->GetDialogState(dialog4));
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker3.state_);
+ EXPECT_EQ(NativeManagerTracker::SHOWN, tracker4.state_);
+ EXPECT_FALSE(tracker3.was_shown_);
- native_manager->CloseDialog(dialog4);
+ native_manager4->Close();
EXPECT_FALSE(manager->IsDialogActive());
EXPECT_FALSE(delegate->web_contents_blocked());
- EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
- native_manager->GetDialogState(dialog4));
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker1.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker2.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker3.state_);
+ EXPECT_EQ(NativeManagerTracker::CLOSED, tracker4.state_);
+ EXPECT_TRUE(tracker1.was_shown_);
+ EXPECT_TRUE(tracker2.was_shown_);
+ EXPECT_FALSE(tracker3.was_shown_);
+ EXPECT_TRUE(tracker4.was_shown_);
}
// Test that CloseAllDialogs does what it says.
TEST_F(WebContentsModalDialogManagerTest, CloseAllDialogs) {
const int kWindowCount = 4;
- for (int i = 0; i < kWindowCount; i++)
- manager->ShowDialog(MakeFakeDialog());
+ NativeManagerTracker trackers[kWindowCount];
+ TestNativeWebContentsModalDialogManager* native_managers[kWindowCount];
+ for (int i = 0; i < kWindowCount; i++) {
+ const NativeWebContentsModalDialog dialog = MakeFakeDialog();
+ native_managers[i] =
+ new TestNativeWebContentsModalDialogManager(
+ dialog, manager, &(trackers[i]));
+ manager->ShowDialogWithManager(dialog,
+ scoped_ptr<SingleWebContentsDialogManager>(
+ native_managers[i]).Pass());
+ }
- EXPECT_EQ(0, native_manager->GetCloseCount());
+ for (int i = 0; i < kWindowCount; i++)
+ EXPECT_NE(NativeManagerTracker::CLOSED, trackers[i].state_);
test_api->CloseAllDialogs();
+
EXPECT_FALSE(delegate->web_contents_blocked());
EXPECT_FALSE(manager->IsDialogActive());
- EXPECT_EQ(kWindowCount, native_manager->GetCloseCount());
+ for (int i = 0; i < kWindowCount; i++)
+ EXPECT_EQ(NativeManagerTracker::CLOSED, trackers[i].state_);
}
} // namespace web_modal