Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / blocked_content / popup_blocker_browsertest.cc
index ecf15dd..bc21ac4 100644 (file)
@@ -6,6 +6,7 @@
 #include "base/files/file_path.h"
 #include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
+#include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/autocomplete/autocomplete_match.h"
 #include "chrome/browser/autocomplete/autocomplete_result.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_service.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_view.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -69,6 +72,25 @@ class CountRenderViewHosts : public content::NotificationObserver {
   DISALLOW_COPY_AND_ASSIGN(CountRenderViewHosts);
 };
 
+class CloseObserver : public content::WebContentsObserver {
+ public:
+  explicit CloseObserver(WebContents* contents)
+      : content::WebContentsObserver(contents) {}
+
+  void Wait() {
+    close_loop_.Run();
+  }
+
+  virtual void WebContentsDestroyed() OVERRIDE {
+    close_loop_.Quit();
+  }
+
+ private:
+  base::RunLoop close_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(CloseObserver);
+};
+
 class PopupBlockerBrowserTest : public InProcessBrowserTest {
  public:
   PopupBlockerBrowserTest() {}
@@ -104,19 +126,29 @@ class PopupBlockerBrowserTest : public InProcessBrowserTest {
     ASSERT_EQ(0, GetBlockedContentsCount());
   }
 
+  enum WhatToExpect {
+    ExpectPopup,
+    ExpectTab
+  };
+
+  enum ShouldCheckTitle {
+    CheckTitle,
+    DontCheckTitle
+  };
+
   // Navigates to the test indicated by |test_name| using |browser| which is
   // expected to try to open a popup. Verifies that the popup was blocked and
   // then opens the blocked popup. Once the popup stopped loading, verifies
-  // that the title of the page is "PASS" if |check_title| is true.
+  // that the title of the page is "PASS" if |check_title| is set.
   //
-  // If |expect_new_browser| is true, the popup is expected to open a new
+  // If |what_to_expect| is ExpectPopup, the popup is expected to open a new
   // window, or a background tab if it is false.
   //
   // Returns the WebContents of the launched popup.
   WebContents* RunCheckTest(Browser* browser,
                             const std::string& test_name,
-                            bool expect_new_browser,
-                            bool check_title) {
+                            WhatToExpect what_to_expect,
+                            ShouldCheckTitle check_title) {
     GURL url(embedded_test_server()->GetURL(test_name));
 
     CountRenderViewHosts counter;
@@ -157,7 +189,7 @@ class PopupBlockerBrowserTest : public InProcessBrowserTest {
 
     observer.Wait();
     Browser* new_browser;
-    if (expect_new_browser) {
+    if (what_to_expect == ExpectPopup) {
       new_browser = browser_observer.WaitForSingleNewBrowser();
       web_contents = new_browser->tab_strip_model()->GetActiveWebContents();
     } else {
@@ -166,7 +198,7 @@ class PopupBlockerBrowserTest : public InProcessBrowserTest {
       web_contents = browser->tab_strip_model()->GetWebContentsAt(1);
     }
 
-    if (check_title) {
+    if (check_title == CheckTitle) {
       // Check that the check passed.
       base::string16 expected_title(base::ASCIIToUTF16("PASS"));
       content::TitleWatcher title_watcher(web_contents, expected_title);
@@ -191,8 +223,8 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
   RunCheckTest(
       browser(),
       "/popup_blocker/popup-blocked-to-post-blank.html",
-      true,
-      false);
+      ExpectPopup,
+      DontCheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
@@ -206,8 +238,8 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
   RunCheckTest(
       CreateIncognitoBrowser(),
       "/popup_blocker/popup-blocked-to-post-blank.html",
-      true,
-      false);
+      ExpectPopup,
+      DontCheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
@@ -221,8 +253,8 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
   RunCheckTest(
       browser(),
       "/popup_blocker/popup-fake-click-on-anchor.html",
-      false,
-      false);
+      ExpectTab,
+      DontCheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
@@ -236,8 +268,8 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest,
   RunCheckTest(
       browser(),
       "/popup_blocker/popup-fake-click-on-anchor2.html",
-      false,
-      false);
+      ExpectTab,
+      DontCheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, MultiplePopups) {
@@ -351,11 +383,11 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, MAYBE_WindowFeatures) {
   WebContents* popup =
       RunCheckTest(browser(),
                    "/popup_blocker/popup-window-open.html",
-                   true,
-                   false);
+                   ExpectPopup,
+                   DontCheckTitle);
 
   // Check that the new popup has (roughly) the requested size.
-  gfx::Size window_size = popup->GetView()->GetContainerSize();
+  gfx::Size window_size = popup->GetContainerBounds().size();
   EXPECT_TRUE(349 <= window_size.width() && window_size.width() <= 351);
   EXPECT_TRUE(249 <= window_size.height() && window_size.height() <= 251);
 }
@@ -363,52 +395,75 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, MAYBE_WindowFeatures) {
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, CorrectReferrer) {
   RunCheckTest(browser(),
                "/popup_blocker/popup-referrer.html",
-               true,
-               true);
+               ExpectPopup,
+               CheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, WindowFeaturesBarProps) {
   RunCheckTest(browser(),
                "/popup_blocker/popup-windowfeatures.html",
-               true,
-               true);
+               ExpectPopup,
+               CheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, SessionStorage) {
   RunCheckTest(browser(),
                "/popup_blocker/popup-sessionstorage.html",
-               true,
-               true);
+               ExpectPopup,
+               CheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, Opener) {
   RunCheckTest(browser(),
                "/popup_blocker/popup-opener.html",
-               true,
-               true);
+               ExpectPopup,
+               CheckTitle);
+}
+
+// Tests that the popup can still close itself after navigating. This tests that
+// the openedByDOM bit is preserved across blocked popups.
+IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, ClosableAfterNavigation) {
+  // Open a popup.
+  WebContents* popup =
+      RunCheckTest(browser(),
+                   "/popup_blocker/popup-opener.html",
+                   ExpectPopup,
+                   CheckTitle);
+
+  // Navigate it elsewhere.
+  content::TestNavigationObserver nav_observer(popup);
+  popup->GetMainFrame()->ExecuteJavaScript(
+      base::UTF8ToUTF16("location.href = '/empty.html'"));
+  nav_observer.Wait();
+
+  // Have it close itself.
+  CloseObserver close_observer(popup);
+  popup->GetMainFrame()->ExecuteJavaScript(
+      base::UTF8ToUTF16("window.close()"));
+  close_observer.Wait();
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, OpenerSuppressed) {
   RunCheckTest(browser(),
                "/popup_blocker/popup-openersuppressed.html",
-               false,
-               true);
+               ExpectTab,
+               CheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, ShiftClick) {
   RunCheckTest(
       browser(),
       "/popup_blocker/popup-fake-click-on-anchor3.html",
-      true,
-      true);
+      ExpectPopup,
+      CheckTitle);
 }
 
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, WebUI) {
   WebContents* popup =
       RunCheckTest(browser(),
                    "/popup_blocker/popup-webui.html",
-                   true,
-                   false);
+                   ExpectPopup,
+                   DontCheckTitle);
 
   // Check that the new popup displays about:blank.
   EXPECT_EQ(GURL(content::kAboutBlankURL), popup->GetURL());