summaryrefslogtreecommitdiffstats
path: root/chrome/browser/unload_uitest.cc
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-25 01:15:11 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-25 01:15:11 +0000
commit829e761119a8b9380d072aac47cdf5b81a5db2b5 (patch)
tree2ff55d2d651691a58efecd0681f6798e75108321 /chrome/browser/unload_uitest.cc
parentcdddc17b8e74ddeac3621a4016c8dcbb453b8365 (diff)
downloadchromium_src-829e761119a8b9380d072aac47cdf5b81a5db2b5.zip
chromium_src-829e761119a8b9380d072aac47cdf5b81a5db2b5.tar.gz
chromium_src-829e761119a8b9380d072aac47cdf5b81a5db2b5.tar.bz2
Fix sudden termination after the latest WebKit merge.
BUG=10927 Review URL: http://codereview.chromium.org/93104 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14517 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/unload_uitest.cc')
-rw-r--r--chrome/browser/unload_uitest.cc46
1 files changed, 44 insertions, 2 deletions
diff --git a/chrome/browser/unload_uitest.cc b/chrome/browser/unload_uitest.cc
index 10a3a4a..71f1fd1 100644
--- a/chrome/browser/unload_uitest.cc
+++ b/chrome/browser/unload_uitest.cc
@@ -8,6 +8,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/message_box_flags.h"
#include "chrome/test/automation/browser_proxy.h"
+#include "chrome/test/automation/tab_proxy.h"
#include "chrome/test/ui/ui_test.h"
#include "net/url_request/url_request_unittest.h"
@@ -71,8 +72,25 @@ const std::string TWO_SECOND_BEFORE_UNLOAD_ALERT_HTML =
"alert('foo');"
"}</script></body></html>";
+const std::string CLOSE_TAB_WHEN_OTHER_TAB_HAS_LISTENER =
+ "<html><head><title>only_one_unload</title></head>"
+ "<body onload=\"window.open('data:text/html,<html><head><title>second_tab</title></head></body>')\" "
+ "onbeforeunload='return;'"
+ "</body></html>";
+
class UnloadTest : public UITest {
public:
+ virtual void SetUp() {
+ const testing::TestInfo* const test_info =
+ testing::UnitTest::GetInstance()->current_test_info();
+ if (strcmp(test_info->name(),
+ "BrowserCloseTabWhenOtherTabHasListener") == 0) {
+ launch_arguments_.AppendSwitch(switches::kDisablePopupBlocking);
+ }
+
+ UITest::SetUp();
+ }
+
void WaitForBrowserClosed() {
const int kCheckDelayMs = 100;
int max_wait_time = 5000;
@@ -226,7 +244,7 @@ TEST_F(UnloadTest, BrowserCloseUnload) {
// Tests closing the browser with a beforeunload handler and clicking
// OK in the beforeunload confirm dialog.
-TEST_F(UnloadTest, DISABLED_BrowserCloseBeforeUnloadOK) {
+TEST_F(UnloadTest, BrowserCloseBeforeUnloadOK) {
scoped_ptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
NavigateToDataURL(BEFORE_UNLOAD_HTML, L"beforeunload");
@@ -238,7 +256,7 @@ TEST_F(UnloadTest, DISABLED_BrowserCloseBeforeUnloadOK) {
// Tests closing the browser with a beforeunload handler and clicking
// CANCEL in the beforeunload confirm dialog.
-TEST_F(UnloadTest, DISABLED_BrowserCloseBeforeUnloadCancel) {
+TEST_F(UnloadTest, BrowserCloseBeforeUnloadCancel) {
scoped_ptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
NavigateToDataURL(BEFORE_UNLOAD_HTML, L"beforeunload");
@@ -313,5 +331,29 @@ TEST_F(UnloadTest, BrowserCloseTwoSecondBeforeUnloadAlert) {
L"twosecondbeforeunloadalert");
}
+// Tests that if there's a renderer process with two tabs, one of which has an
+// unload handler, and the other doesn't, the tab that doesn't have an unload
+// handler can be closed. If this test fails, the Close() call will hang.
+TEST_F(UnloadTest, BrowserCloseTabWhenOtherTabHasListener) {
+ NavigateToDataURL(CLOSE_TAB_WHEN_OTHER_TAB_HAS_LISTENER, L"second_tab");
+
+ scoped_ptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
+ EXPECT_TRUE(browser_proxy.get());
+
+ int tab_count;
+ EXPECT_TRUE(browser_proxy->GetTabCount(&tab_count));
+ EXPECT_EQ(tab_count, 2);
+
+ scoped_ptr<TabProxy> second_tab(browser_proxy->GetActiveTab());
+ EXPECT_TRUE(second_tab.get()!= NULL);
+ EXPECT_TRUE(second_tab->Close(true));
+
+ scoped_ptr<TabProxy> first_tab(browser_proxy->GetActiveTab());
+ std::wstring title;
+ EXPECT_TRUE(first_tab.get() != NULL);
+ EXPECT_TRUE(first_tab->GetTabTitle(&title));
+ EXPECT_EQ(title, L"only_one_unload");
+}
+
// TODO(ojan): Add tests for unload/beforeunload that have multiple tabs
// and multiple windows.