#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"
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() {}
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;
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 {
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);
RunCheckTest(
browser(),
"/popup_blocker/popup-blocked-to-post-blank.html",
- true,
- false);
+ ExpectPopup,
+ DontCheckTitle);
}
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,
RunCheckTest(
browser(),
"/popup_blocker/popup-fake-click-on-anchor.html",
- false,
- false);
+ ExpectTab,
+ DontCheckTitle);
}
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) {
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);
}
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());