Index: chrome/browser/ui/web_contents_modal_dialog_manager_unittest.cc |
diff --git a/chrome/browser/ui/web_contents_modal_dialog_manager_unittest.cc b/chrome/browser/ui/web_contents_modal_dialog_manager_unittest.cc |
index 9fa84044b0b95ff1d7fcee2ba6fb1e268087e048..25736304d6dde054d57b22482f2eb6dd9cec57f7 100644 |
--- a/chrome/browser/ui/web_contents_modal_dialog_manager_unittest.cc |
+++ b/chrome/browser/ui/web_contents_modal_dialog_manager_unittest.cc |
@@ -2,37 +2,22 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/memory/scoped_ptr.h" |
#include "chrome/browser/ui/native_web_contents_modal_dialog_manager.h" |
#include "chrome/browser/ui/web_contents_modal_dialog_manager.h" |
+#include "chrome/common/render_messages.h" |
#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
+#include "content/public/test/mock_render_process_host.h" |
#include "content/public/test/test_browser_thread.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using content::BrowserThread; |
-class WebContentsModalDialogManagerTest |
- : public ChromeRenderViewHostTestHarness { |
+class StubNativeManager : public NativeWebContentsModalDialogManager { |
public: |
- WebContentsModalDialogManagerTest() |
- : ChromeRenderViewHostTestHarness(), |
- ui_thread_(BrowserThread::UI, &message_loop_) { |
- } |
- |
- virtual void SetUp() { |
- ChromeRenderViewHostTestHarness::SetUp(); |
- WebContentsModalDialogManager::CreateForWebContents(web_contents()); |
- } |
- |
- private: |
- content::TestBrowserThread ui_thread_; |
-}; |
- |
-class NativeWebContentsModalDialogManagerCloseTest |
- : public NativeWebContentsModalDialogManager { |
- public: |
- NativeWebContentsModalDialogManagerCloseTest( |
+ StubNativeManager( |
NativeWebContentsModalDialogManagerDelegate* delegate) |
- : delegate_(delegate) {} |
+ : close_count(0), delegate_(delegate) {} |
virtual void ManageDialog(NativeWebContentsModalDialog dialog) OVERRIDE { |
} |
virtual void ShowDialog(NativeWebContentsModalDialog dialog) OVERRIDE { |
@@ -49,31 +34,122 @@ class NativeWebContentsModalDialogManagerCloseTest |
} |
int close_count; |
+ |
+ private: |
NativeWebContentsModalDialogManagerDelegate* delegate_; |
}; |
-TEST_F(WebContentsModalDialogManagerTest, WebContentsModalDialogs) { |
- WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
- WebContentsModalDialogManager::FromWebContents(web_contents()); |
- WebContentsModalDialogManager::TestApi test_api( |
- web_contents_modal_dialog_manager); |
+class WebContentsModalDialogManagerTest |
+ : public ChromeRenderViewHostTestHarness { |
+ public: |
+ WebContentsModalDialogManagerTest() |
+ : ChromeRenderViewHostTestHarness(), |
+ manager_(NULL), |
+ test_api_(NULL), |
+ native_manager_(NULL), |
+ ui_thread_(BrowserThread::UI, &message_loop_) { |
+ } |
+ |
+ virtual void SetUp() { |
+ ChromeRenderViewHostTestHarness::SetUp(); |
+ WebContentsModalDialogManager::CreateForWebContents(web_contents()); |
- NativeWebContentsModalDialogManagerCloseTest* native_manager = |
- new NativeWebContentsModalDialogManagerCloseTest( |
- web_contents_modal_dialog_manager); |
- native_manager->close_count = 0; |
+ manager_ = WebContentsModalDialogManager::FromWebContents(web_contents()); |
+ test_api_.reset(new WebContentsModalDialogManager::TestApi(manager_)); |
+ native_manager_ = new StubNativeManager(manager_); |
+ test_api_->ResetNativeManager(native_manager_); |
+ } |
- test_api.ResetNativeManager(native_manager); |
+ virtual void TearDown() { |
+ manager_ = NULL; |
+ test_api_.reset(); |
+ native_manager_ = NULL; |
+ |
+ ChromeRenderViewHostTestHarness::TearDown(); |
+ } |
+ |
+ protected: |
+ static NativeWebContentsModalDialog GenerateFakeDialog() { |
+ static int current_id = 0; |
- 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(native_manager->close_count, 0); |
+ return reinterpret_cast<NativeWebContentsModalDialog>(current_id++); |
+ } |
+ |
+ void ExpectShieldingChanged(bool expected_shielded) { |
+ typedef ChromeViewMsg_SetVisuallyDeemphasized MsgType; |
+ |
+ const IPC::Message* message = |
+ process()->sink().GetUniqueMessageMatching(MsgType::ID); |
+ ASSERT_TRUE(message != NULL); |
+ MsgType::Param params; |
+ MsgType::Read(message, ¶ms); |
+ EXPECT_EQ(expected_shielded, params.a); // shielded |
+ } |
+ |
+ void ExpectShieldingUnchanged(bool currently_shielded) { |
+ typedef ChromeViewMsg_SetVisuallyDeemphasized MsgType; |
+ |
+ const IPC::Message* message = |
+ process()->sink().GetUniqueMessageMatching(MsgType::ID); |
+ if (message == NULL) |
+ return; |
+ |
+ MsgType::Param params; |
+ MsgType::Read(message, ¶ms); |
+ EXPECT_EQ(currently_shielded, params.a); // shielded |
+ } |
+ |
+ WebContentsModalDialogManager* manager_; |
+ scoped_ptr<WebContentsModalDialogManager::TestApi> test_api_; |
+ StubNativeManager* native_manager_; |
+ |
+ private: |
+ content::TestBrowserThread ui_thread_; |
+}; |
+ |
+TEST_F(WebContentsModalDialogManagerTest, WebContentsModalDialogs) { |
+ const int kWindowCount = 4; |
+ for (int i = 0; i < kWindowCount; i++) |
+ manager_->ShowDialog(GenerateFakeDialog()); |
+ EXPECT_EQ(0, native_manager_->close_count); |
+ |
+ test_api_->CloseAllDialogs(); |
+ EXPECT_EQ(kWindowCount, native_manager_->close_count); |
+} |
+ |
+// Validate the shielding activation and deactivation in the presence of |
+// multiple shielded dialogs. |
+TEST_F(WebContentsModalDialogManagerTest, ShowDialogsWithShield) { |
+ IPC::TestSink& sink = process()->sink(); |
+ |
+ NativeWebContentsModalDialog shieldedDialog1 = GenerateFakeDialog(); |
+ manager_->ShowDialogWithShield(shieldedDialog1); |
+ ExpectShieldingChanged(true); |
+ sink.ClearMessages(); |
+ |
+ NativeWebContentsModalDialog unshieldedDialog = GenerateFakeDialog(); |
+ manager_->ShowDialog(unshieldedDialog); |
+ ExpectShieldingUnchanged(true); |
+ sink.ClearMessages(); |
+ |
+ NativeWebContentsModalDialog shieldedDialog2 = GenerateFakeDialog(); |
+ manager_->ShowDialogWithShield(shieldedDialog2); |
+ ExpectShieldingUnchanged(true); |
+ sink.ClearMessages(); |
+ |
+ // Close dialogs in an order different from the reverse that they were opened. |
+ manager_->WillClose(shieldedDialog1); |
+ ExpectShieldingUnchanged(true); |
+ sink.ClearMessages(); |
+ |
+ manager_->WillClose(shieldedDialog2); |
+ ExpectShieldingChanged(false); |
+ sink.ClearMessages(); |
- test_api.CloseAllDialogs(); |
- EXPECT_EQ(native_manager->close_count, kWindowCount); |
+ manager_->WillClose(unshieldedDialog); |
+ ExpectShieldingUnchanged(false); |
+ sink.ClearMessages(); |
} |