| Index: components/web_modal/web_contents_modal_dialog_manager_unittest.cc
|
| diff --git a/components/web_modal/web_contents_modal_dialog_manager_unittest.cc b/components/web_modal/web_contents_modal_dialog_manager_unittest.cc
|
| index 42c46bc85e963783b0ec1cf03c13a6a66abe37c1..837824e721c5c5a2441629b26cdb246719c10b90 100644
|
| --- a/components/web_modal/web_contents_modal_dialog_manager_unittest.cc
|
| +++ b/components/web_modal/web_contents_modal_dialog_manager_unittest.cc
|
| @@ -2,37 +2,47 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <map>
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "components/web_modal/native_web_contents_modal_dialog_manager.h"
|
| #include "components/web_modal/web_contents_modal_dialog_manager.h"
|
| +#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
|
| +#include "content/public/browser/notification_details.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "content/public/browser/notification_source.h"
|
| +#include "content/public/browser/notification_types.h"
|
| #include "content/public/test/test_renderer_host.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace web_modal {
|
|
|
| -class WebContentsModalDialogManagerTest
|
| - : public content::RenderViewHostTestHarness {
|
| - public:
|
| - virtual void SetUp() {
|
| - content::RenderViewHostTestHarness::SetUp();
|
| - WebContentsModalDialogManager::CreateForWebContents(web_contents());
|
| - }
|
| -};
|
| -
|
| -class NativeWebContentsModalDialogManagerCloseTest
|
| +class TestNativeWebContentsModalDialogManager
|
| : public NativeWebContentsModalDialogManager {
|
| public:
|
| - explicit NativeWebContentsModalDialogManagerCloseTest(
|
| + enum DialogState {
|
| + UNKNOWN,
|
| + NOT_SHOWN,
|
| + SHOWN,
|
| + HIDDEN,
|
| + CLOSED
|
| + };
|
| +
|
| + explicit TestNativeWebContentsModalDialogManager(
|
| NativeWebContentsModalDialogManagerDelegate* delegate)
|
| - : close_count_(0), delegate_(delegate) {}
|
| + : delegate_(delegate) {}
|
| virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
|
| + dialog_state_[dialog] = NOT_SHOWN;
|
| }
|
| virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
|
| + dialog_state_[dialog] = SHOWN;
|
| }
|
| virtual void HideDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
|
| + dialog_state_[dialog] = HIDDEN;
|
| }
|
| virtual void CloseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
|
| delegate_->WillClose(dialog);
|
| - ++close_count_;
|
| + dialog_state_[dialog] = CLOSED;
|
| }
|
| virtual void FocusDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
|
| }
|
| @@ -41,46 +51,267 @@ class NativeWebContentsModalDialogManagerCloseTest
|
| virtual void HostChanged(WebContentsModalDialogHost* new_host) OVERRIDE {
|
| }
|
|
|
| - int close_count() const { return close_count_; }
|
| + 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;
|
| + }
|
| +
|
| + DialogState GetDialogState(NativeWebContentsModalDialog dialog) const {
|
| + DialogStateMap::const_iterator loc = dialog_state_.find(dialog);
|
| + return loc == dialog_state_.end() ? UNKNOWN : loc->second;
|
| + }
|
|
|
| private:
|
| - int close_count_;
|
| + typedef std::map<NativeWebContentsModalDialog, DialogState> DialogStateMap;
|
| +
|
| NativeWebContentsModalDialogManagerDelegate* delegate_;
|
| + DialogStateMap dialog_state_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestNativeWebContentsModalDialogManager);
|
| +};
|
| +
|
| +class TestWebContentsModalDialogManagerDelegate
|
| + : public WebContentsModalDialogManagerDelegate {
|
| + public:
|
| + TestWebContentsModalDialogManagerDelegate()
|
| + : web_contents_visible_(true),
|
| + web_contents_blocked_(false) {
|
| + }
|
| +
|
| + // WebContentsModalDialogManagerDelegate overrides
|
| + virtual void SetWebContentsBlocked(content::WebContents* web_contents,
|
| + bool blocked) OVERRIDE {
|
| + web_contents_blocked_ = blocked;
|
| + }
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(NativeWebContentsModalDialogManagerCloseTest);
|
| + virtual WebContentsModalDialogHost* GetWebContentsModalDialogHost() OVERRIDE {
|
| + return NULL;
|
| + }
|
| +
|
| + virtual bool IsWebContentsVisible(
|
| + content::WebContents* web_contents) OVERRIDE {
|
| + return web_contents_visible_;
|
| + }
|
| +
|
| + void set_web_contents_visible(bool visible) {
|
| + web_contents_visible_ = visible;
|
| + }
|
| +
|
| + bool web_contents_blocked() const { return web_contents_blocked_; }
|
| +
|
| + private:
|
| + bool web_contents_visible_;
|
| + bool web_contents_blocked_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestWebContentsModalDialogManagerDelegate);
|
| +};
|
| +
|
| +class WebContentsModalDialogManagerTest
|
| + : public content::RenderViewHostTestHarness {
|
| + public:
|
| + WebContentsModalDialogManagerTest()
|
| + : next_dialog_id(1),
|
| + manager(NULL),
|
| + native_manager(NULL) {
|
| + }
|
| +
|
| + virtual void SetUp() {
|
| + content::RenderViewHostTestHarness::SetUp();
|
| +
|
| + delegate.reset(new TestWebContentsModalDialogManagerDelegate);
|
| + WebContentsModalDialogManager::CreateForWebContents(web_contents());
|
| + 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() {
|
| + test_api.reset();
|
| + content::RenderViewHostTestHarness::TearDown();
|
| + }
|
| +
|
| + protected:
|
| + NativeWebContentsModalDialog MakeFakeDialog() {
|
| + // WebContentsModalDialogManager treats the NativeWebContentsModalDialog as
|
| + // an opaque type, so creating fake NativeWebContentsModalDialogs using
|
| + // reinterpret_cast is valid.
|
| + return reinterpret_cast<NativeWebContentsModalDialog>(next_dialog_id++);
|
| + }
|
| +
|
| + int next_dialog_id;
|
| + 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 NativeWebContentsModalDialogManagerCloseTest(native_delegate);
|
| + return new TestNativeWebContentsModalDialogManager(native_delegate);
|
| +}
|
| +
|
| +// 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();
|
| +
|
| + manager->ShowDialog(dialog1);
|
| +
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
|
| + native_manager->GetDialogState(dialog1));
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| +}
|
| +
|
| +// Test that the dialog is not shown immediately when the delegate indicates the
|
| +// web contents is not visible.
|
| +TEST_F(WebContentsModalDialogManagerTest, WebContentsNotVisible) {
|
| + // Dialog should not be shown while WebContents is not visible.
|
| + delegate->set_web_contents_visible(false);
|
| +
|
| + const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
|
| +
|
| + manager->ShowDialog(dialog1);
|
| +
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::NOT_SHOWN,
|
| + native_manager->GetDialogState(dialog1));
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| +}
|
| +
|
| +// Test that only the first of multiple dialogs is shown.
|
| +TEST_F(WebContentsModalDialogManagerTest, ShowDialogs) {
|
| + const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
|
| + const NativeWebContentsModalDialog dialog2 = MakeFakeDialog();
|
| + const NativeWebContentsModalDialog dialog3 = MakeFakeDialog();
|
| +
|
| + manager->ShowDialog(dialog1);
|
| + manager->ShowDialog(dialog2);
|
| + manager->ShowDialog(dialog3);
|
| +
|
| + 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));
|
| }
|
|
|
| -TEST_F(WebContentsModalDialogManagerTest, WebContentsModalDialogs) {
|
| - WebContentsModalDialogManager* web_contents_modal_dialog_manager =
|
| - WebContentsModalDialogManager::FromWebContents(web_contents());
|
| - WebContentsModalDialogManager::TestApi test_api(
|
| - web_contents_modal_dialog_manager);
|
| +// Test that the dialog is shown/hidden on
|
| +// NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED.
|
| +TEST_F(WebContentsModalDialogManagerTest, VisibilityObservation) {
|
| + const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
|
| + bool web_contents_visible = true;
|
|
|
| - NativeWebContentsModalDialogManagerCloseTest* native_manager =
|
| - new NativeWebContentsModalDialogManagerCloseTest(
|
| - web_contents_modal_dialog_manager);
|
| + manager->ShowDialog(dialog1);
|
|
|
| - // |web_contents_modal_dialog_manager| owns |native_manager| as a result.
|
| - test_api.ResetNativeManager(native_manager);
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
|
| + native_manager->GetDialogState(dialog1));
|
|
|
| + web_contents_visible = false;
|
| + manager->Observe(content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::Details<bool>(&web_contents_visible));
|
| +
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::HIDDEN,
|
| + native_manager->GetDialogState(dialog1));
|
| +
|
| + web_contents_visible = true;
|
| + manager->Observe(content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::Details<bool>(&web_contents_visible));
|
| +
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
|
| + native_manager->GetDialogState(dialog1));
|
| +}
|
| +
|
| +// Test that the first dialog is always shown, regardless of the order in which
|
| +// dialogs are closed.
|
| +TEST_F(WebContentsModalDialogManagerTest, CloseDialogs) {
|
| + // The front dialog is always shown regardless of dialog close order.
|
| + const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
|
| + const NativeWebContentsModalDialog dialog2 = MakeFakeDialog();
|
| + const NativeWebContentsModalDialog dialog3 = MakeFakeDialog();
|
| + const NativeWebContentsModalDialog dialog4 = MakeFakeDialog();
|
| +
|
| + manager->ShowDialog(dialog1);
|
| + manager->ShowDialog(dialog2);
|
| + manager->ShowDialog(dialog3);
|
| + manager->ShowDialog(dialog4);
|
| +
|
| + native_manager->CloseDialog(dialog1);
|
| +
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + 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));
|
| +
|
| + native_manager->CloseDialog(dialog3);
|
| +
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + 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));
|
| +
|
| + native_manager->CloseDialog(dialog2);
|
| +
|
| + EXPECT_TRUE(manager->IsShowingDialog());
|
| + EXPECT_TRUE(delegate->web_contents_blocked());
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
|
| + native_manager->GetDialogState(dialog2));
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::SHOWN,
|
| + native_manager->GetDialogState(dialog4));
|
| +
|
| + native_manager->CloseDialog(dialog4);
|
| +
|
| + EXPECT_FALSE(manager->IsShowingDialog());
|
| + EXPECT_FALSE(delegate->web_contents_blocked());
|
| + EXPECT_EQ(TestNativeWebContentsModalDialogManager::CLOSED,
|
| + native_manager->GetDialogState(dialog4));
|
| +}
|
| +
|
| +// Test that CloseAllDialogs does what it says.
|
| +TEST_F(WebContentsModalDialogManagerTest, CloseAllDialogs) {
|
| const int kWindowCount = 4;
|
| - for (int i = 0; i < kWindowCount; i++) {
|
| - // WebContentsModalDialogManager treats the NativeWebContentsModalDialog as
|
| - // an opaque type, so creating fake NativeWebContentsModalDialogs using
|
| - // reinterpret_cast is valid.
|
| - web_contents_modal_dialog_manager->ShowDialog(
|
| - reinterpret_cast<NativeWebContentsModalDialog>(i));
|
| - }
|
| - EXPECT_EQ(0, native_manager->close_count());
|
| + for (int i = 0; i < kWindowCount; i++)
|
| + manager->ShowDialog(MakeFakeDialog());
|
| +
|
| + EXPECT_EQ(0, native_manager->GetCloseCount());
|
|
|
| - test_api.CloseAllDialogs();
|
| - EXPECT_EQ(kWindowCount, native_manager->close_count());
|
| + test_api->CloseAllDialogs();
|
| + EXPECT_FALSE(delegate->web_contents_blocked());
|
| + EXPECT_FALSE(manager->IsShowingDialog());
|
| + EXPECT_EQ(kWindowCount, native_manager->GetCloseCount());
|
| }
|
|
|
| } // namespace web_modal
|
|
|