Commit e1c395fe authored by wittman@chromium.org's avatar wittman@chromium.org

Add WebContentsModalDialogManager unit tests

Implement additional tests covering most of the functionality of
WebContentsModalDialogManager. Refactor common setup into the test
fixture.

BUG=157161
R=sky@chromium.org

Review URL: https://codereview.chromium.org/23475022

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221483 0039d316-1c4b-4281-b951-d872f2087c98
parent 79b2a386
...@@ -38,7 +38,9 @@ class WebContentsModalDialogManager ...@@ -38,7 +38,9 @@ class WebContentsModalDialogManager
// WillClose() when it is being destroyed. // WillClose() when it is being destroyed.
void ShowDialog(NativeWebContentsModalDialog dialog); void ShowDialog(NativeWebContentsModalDialog dialog);
// Returns true if a dialog is currently being shown. // Returns true if any dialogs are active and not closed.
// TODO(wittman): Give this a better name, since it can return true if no
// dialogs are displayed.
bool IsShowingDialog() const; bool IsShowingDialog() const;
// Focus the topmost modal dialog. IsShowingDialog() must be true when // Focus the topmost modal dialog. IsShowingDialog() must be true when
......
...@@ -2,37 +2,47 @@ ...@@ -2,37 +2,47 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // 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/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.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 "content/public/test/test_renderer_host.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace web_modal { namespace web_modal {
class WebContentsModalDialogManagerTest class TestNativeWebContentsModalDialogManager
: public content::RenderViewHostTestHarness {
public:
virtual void SetUp() {
content::RenderViewHostTestHarness::SetUp();
WebContentsModalDialogManager::CreateForWebContents(web_contents());
}
};
class NativeWebContentsModalDialogManagerCloseTest
: public NativeWebContentsModalDialogManager { : public NativeWebContentsModalDialogManager {
public: public:
explicit NativeWebContentsModalDialogManagerCloseTest( enum DialogState {
UNKNOWN,
NOT_SHOWN,
SHOWN,
HIDDEN,
CLOSED
};
explicit TestNativeWebContentsModalDialogManager(
NativeWebContentsModalDialogManagerDelegate* delegate) NativeWebContentsModalDialogManagerDelegate* delegate)
: close_count_(0), delegate_(delegate) {} : delegate_(delegate) {}
virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE { virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
dialog_state_[dialog] = NOT_SHOWN;
} }
virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE { virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
dialog_state_[dialog] = SHOWN;
} }
virtual void HideDialog(NativeWebContentsModalDialog dialog) OVERRIDE { virtual void HideDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
dialog_state_[dialog] = HIDDEN;
} }
virtual void CloseDialog(NativeWebContentsModalDialog dialog) OVERRIDE { virtual void CloseDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
delegate_->WillClose(dialog); delegate_->WillClose(dialog);
++close_count_; dialog_state_[dialog] = CLOSED;
} }
virtual void FocusDialog(NativeWebContentsModalDialog dialog) OVERRIDE { virtual void FocusDialog(NativeWebContentsModalDialog dialog) OVERRIDE {
} }
...@@ -41,46 +51,267 @@ class NativeWebContentsModalDialogManagerCloseTest ...@@ -41,46 +51,267 @@ class NativeWebContentsModalDialogManagerCloseTest
virtual void HostChanged(WebContentsModalDialogHost* new_host) OVERRIDE { 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: private:
int close_count_; typedef std::map<NativeWebContentsModalDialog, DialogState> DialogStateMap;
NativeWebContentsModalDialogManagerDelegate* delegate_; 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;
}
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);
DISALLOW_COPY_AND_ASSIGN(NativeWebContentsModalDialogManagerCloseTest); // |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* NativeWebContentsModalDialogManager*
WebContentsModalDialogManager::CreateNativeManager( WebContentsModalDialogManager::CreateNativeManager(
NativeWebContentsModalDialogManagerDelegate* native_delegate) { 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) { // Test that the dialog is shown/hidden on
WebContentsModalDialogManager* web_contents_modal_dialog_manager = // NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED.
WebContentsModalDialogManager::FromWebContents(web_contents()); TEST_F(WebContentsModalDialogManagerTest, VisibilityObservation) {
WebContentsModalDialogManager::TestApi test_api( const NativeWebContentsModalDialog dialog1 = MakeFakeDialog();
web_contents_modal_dialog_manager); bool web_contents_visible = true;
manager->ShowDialog(dialog1);
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);
NativeWebContentsModalDialogManagerCloseTest* native_manager = EXPECT_TRUE(manager->IsShowingDialog());
new NativeWebContentsModalDialogManagerCloseTest( EXPECT_TRUE(delegate->web_contents_blocked());
web_contents_modal_dialog_manager); 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));
// |web_contents_modal_dialog_manager| owns |native_manager| as a result. native_manager->CloseDialog(dialog3);
test_api.ResetNativeManager(native_manager);
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; const int kWindowCount = 4;
for (int i = 0; i < kWindowCount; i++) { for (int i = 0; i < kWindowCount; i++)
// WebContentsModalDialogManager treats the NativeWebContentsModalDialog as manager->ShowDialog(MakeFakeDialog());
// an opaque type, so creating fake NativeWebContentsModalDialogs using
// reinterpret_cast is valid. EXPECT_EQ(0, native_manager->GetCloseCount());
web_contents_modal_dialog_manager->ShowDialog(
reinterpret_cast<NativeWebContentsModalDialog>(i));
}
EXPECT_EQ(0, native_manager->close_count());
test_api.CloseAllDialogs(); test_api->CloseAllDialogs();
EXPECT_EQ(kWindowCount, native_manager->close_count()); EXPECT_FALSE(delegate->web_contents_blocked());
EXPECT_FALSE(manager->IsShowingDialog());
EXPECT_EQ(kWindowCount, native_manager->GetCloseCount());
} }
} // namespace web_modal } // namespace web_modal
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment