Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / components / web_modal / web_contents_modal_dialog_manager_unittest.cc
index 1353f10..b73d617 100644 (file)
@@ -7,15 +7,15 @@
 #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,
@@ -25,49 +25,65 @@ class TestNativeWebContentsModalDialogManager
     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);
 };
@@ -77,8 +93,7 @@ class WebContentsModalDialogManagerTest
  public:
   WebContentsModalDialogManagerTest()
       : next_dialog_id(1),
-        manager(NULL),
-        native_manager(NULL) {
+        manager(NULL) {
   }
 
   virtual void SetUp() {
@@ -89,10 +104,6 @@ class WebContentsModalDialogManagerTest
     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() {
@@ -112,29 +123,39 @@ class WebContentsModalDialogManagerTest
   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
@@ -143,14 +164,20 @@ TEST_F(WebContentsModalDialogManagerTest, WebContentsNotVisible) {
   // 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.
@@ -159,43 +186,59 @@ TEST_F(WebContentsModalDialogManagerTest, ShowDialogs) {
   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.
@@ -204,9 +247,21 @@ TEST_F(WebContentsModalDialogManagerTest, InterstitialPage) {
   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);
@@ -218,12 +273,15 @@ TEST_F(WebContentsModalDialogManagerTest, InterstitialPage) {
 #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();
 }
 
 
@@ -236,64 +294,94 @@ TEST_F(WebContentsModalDialogManagerTest, CloseDialogs) {
   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