Add NavigationTest.PopupNavigateAfterCreation to verify that navigation of popup windows does not assert (issue #1392).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1980 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2015-01-21 17:26:42 +00:00
parent 0d084af123
commit f0bba98523
1 changed files with 48 additions and 11 deletions

View File

@ -1762,15 +1762,22 @@ TEST(NavigationTest, CrossOrigin) {
namespace { namespace {
const char kPopupNavPageUrl[] = "http://tests-popup/page.html"; const char kPopupNavPageUrl[] = "http://tests-popup.com/page.html";
const char kPopupNavPopupUrl[] = "http://tests-popup/popup.html"; const char kPopupNavPopupUrl[] = "http://tests-popup.com/popup.html";
const char kPopupNavPopupUrl2[] = "http://tests-popup2.com/popup.html";
const char kPopupNavPopupName[] = "my_popup"; const char kPopupNavPopupName[] = "my_popup";
// Browser side. // Browser side.
class PopupNavTestHandler : public TestHandler { class PopupNavTestHandler : public TestHandler {
public: public:
explicit PopupNavTestHandler(bool allow) enum Mode {
: allow_(allow) {} ALLOW,
DENY,
NAVIGATE_AFTER_CREATION,
};
PopupNavTestHandler(Mode mode)
: mode_(mode) {}
void RunTest() override { void RunTest() override {
// Add the resources that we will navigate to/from. // Add the resources that we will navigate to/from.
@ -1780,6 +1787,8 @@ class PopupNavTestHandler : public TestHandler {
"'); }</script>Page</html>"; "'); }</script>Page</html>";
AddResource(kPopupNavPageUrl, page, "text/html"); AddResource(kPopupNavPageUrl, page, "text/html");
AddResource(kPopupNavPopupUrl, "<html>Popup</html>", "text/html"); AddResource(kPopupNavPopupUrl, "<html>Popup</html>", "text/html");
if (mode_ == NAVIGATE_AFTER_CREATION)
AddResource(kPopupNavPopupUrl2, "<html>Popup2</html>", "text/html");
// Create the browser. // Create the browser.
CreateBrowser(kPopupNavPageUrl); CreateBrowser(kPopupNavPageUrl);
@ -1806,7 +1815,14 @@ class PopupNavTestHandler : public TestHandler {
EXPECT_STREQ(kPopupNavPopupName, target_frame_name.ToString().c_str()); EXPECT_STREQ(kPopupNavPopupName, target_frame_name.ToString().c_str());
EXPECT_FALSE(*no_javascript_access); EXPECT_FALSE(*no_javascript_access);
return !allow_; return (mode_ == DENY); // Return true to cancel the popup.
}
void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
TestHandler::OnAfterCreated(browser);
if (mode_ == NAVIGATE_AFTER_CREATION && browser->IsPopup())
browser->GetMainFrame()->LoadURL(kPopupNavPopupUrl2);
} }
void OnLoadEnd(CefRefPtr<CefBrowser> browser, void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -1816,13 +1832,23 @@ class PopupNavTestHandler : public TestHandler {
if (url == kPopupNavPageUrl) { if (url == kPopupNavPageUrl) {
frame->ExecuteJavaScript("doPopup()", kPopupNavPageUrl, 0); frame->ExecuteJavaScript("doPopup()", kPopupNavPageUrl, 0);
if (!allow_) { if (mode_ == DENY) {
// Wait a bit to make sure the popup window isn't created. // Wait a bit to make sure the popup window isn't created.
CefPostDelayedTask(TID_UI, CefPostDelayedTask(TID_UI,
base::Bind(&PopupNavTestHandler::DestroyTest, this), 200); base::Bind(&PopupNavTestHandler::DestroyTest, this), 200);
} }
} else if (url == kPopupNavPopupUrl) { } else if (url == kPopupNavPopupUrl) {
if (allow_) { if (mode_ != NAVIGATE_AFTER_CREATION) {
if (mode_ != DENY) {
got_popup_load_end_.yes();
browser->GetHost()->CloseBrowser(false);
DestroyTest();
} else {
EXPECT_FALSE(true); // Not reached.
}
}
} else if (url == kPopupNavPopupUrl2) {
if (mode_ == NAVIGATE_AFTER_CREATION) {
got_popup_load_end_.yes(); got_popup_load_end_.yes();
browser->GetHost()->CloseBrowser(false); browser->GetHost()->CloseBrowser(false);
DestroyTest(); DestroyTest();
@ -1837,7 +1863,7 @@ class PopupNavTestHandler : public TestHandler {
private: private:
void DestroyTest() override { void DestroyTest() override {
EXPECT_TRUE(got_on_before_popup_); EXPECT_TRUE(got_on_before_popup_);
if (allow_) if (mode_ != DENY)
EXPECT_TRUE(got_popup_load_end_); EXPECT_TRUE(got_popup_load_end_);
else else
EXPECT_FALSE(got_popup_load_end_); EXPECT_FALSE(got_popup_load_end_);
@ -1845,7 +1871,7 @@ class PopupNavTestHandler : public TestHandler {
TestHandler::DestroyTest(); TestHandler::DestroyTest();
} }
bool allow_; const Mode mode_;
TrackCallback got_on_before_popup_; TrackCallback got_on_before_popup_;
TrackCallback got_popup_load_end_; TrackCallback got_popup_load_end_;
@ -1855,14 +1881,25 @@ class PopupNavTestHandler : public TestHandler {
// Test allowing popups. // Test allowing popups.
TEST(NavigationTest, PopupAllow) { TEST(NavigationTest, PopupAllow) {
CefRefPtr<PopupNavTestHandler> handler = new PopupNavTestHandler(true); CefRefPtr<PopupNavTestHandler> handler =
new PopupNavTestHandler(PopupNavTestHandler::ALLOW);
handler->ExecuteTest(); handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler); ReleaseAndWaitForDestructor(handler);
} }
// Test denying popups. // Test denying popups.
TEST(NavigationTest, PopupDeny) { TEST(NavigationTest, PopupDeny) {
CefRefPtr<PopupNavTestHandler> handler = new PopupNavTestHandler(false); CefRefPtr<PopupNavTestHandler> handler =
new PopupNavTestHandler(PopupNavTestHandler::DENY);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test navigation to a different origin after popup creation to verify that
// internal objects are tracked correctly (see issue #1392).
TEST(NavigationTest, PopupNavigateAfterCreation) {
CefRefPtr<PopupNavTestHandler> handler =
new PopupNavTestHandler(PopupNavTestHandler::NAVIGATE_AFTER_CREATION);
handler->ExecuteTest(); handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler); ReleaseAndWaitForDestructor(handler);
} }