Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: chrome/browser/unload_uitest.cc

Issue 99008: Port unload_uitest.cc and enable some of the tests on linux.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/process_util_posix.cc ('k') | chrome/chrome.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/file_util.h" 5 #include "base/file_util.h"
6 6 #include "base/platform_thread.h"
7 #include "chrome/browser/automation/url_request_mock_http_job.h" 7 #include "chrome/browser/automation/url_request_mock_http_job.h"
8 #include "chrome/common/chrome_switches.h" 8 #include "chrome/common/chrome_switches.h"
9 #include "chrome/common/message_box_flags.h"
9 #include "chrome/test/automation/browser_proxy.h" 10 #include "chrome/test/automation/browser_proxy.h"
10 #include "chrome/test/ui/ui_test.h" 11 #include "chrome/test/ui/ui_test.h"
11 #include "chrome/views/window/dialog_delegate.h"
12 #include "net/url_request/url_request_unittest.h" 12 #include "net/url_request/url_request_unittest.h"
13 13
14 const std::string NOLISTENERS_HTML = 14 const std::string NOLISTENERS_HTML =
15 "<html><head><title>nolisteners</title></head><body></body></html>"; 15 "<html><head><title>nolisteners</title></head><body></body></html>";
16 16
17 const std::string UNLOAD_HTML = 17 const std::string UNLOAD_HTML =
18 "<html><head><title>unload</title></head><body>" 18 "<html><head><title>unload</title></head><body>"
19 "<script>window.onunload=function(e){}</script></body></html>"; 19 "<script>window.onunload=function(e){}</script></body></html>";
20 20
21 const std::string BEFORE_UNLOAD_HTML = 21 const std::string BEFORE_UNLOAD_HTML =
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 "alert('foo');" 71 "alert('foo');"
72 "}</script></body></html>"; 72 "}</script></body></html>";
73 73
74 class UnloadTest : public UITest { 74 class UnloadTest : public UITest {
75 public: 75 public:
76 void WaitForBrowserClosed() { 76 void WaitForBrowserClosed() {
77 const int kCheckDelayMs = 100; 77 const int kCheckDelayMs = 100;
78 int max_wait_time = 5000; 78 int max_wait_time = 5000;
79 while (max_wait_time > 0) { 79 while (max_wait_time > 0) {
80 max_wait_time -= kCheckDelayMs; 80 max_wait_time -= kCheckDelayMs;
81 Sleep(kCheckDelayMs); 81 PlatformThread::Sleep(kCheckDelayMs);
82 if (!IsBrowserRunning()) 82 if (!IsBrowserRunning())
83 break; 83 break;
84 } 84 }
85 } 85 }
86 86
87 void CheckTitle(const std::wstring& expected_title) { 87 void CheckTitle(const std::wstring& expected_title) {
88 const int kCheckDelayMs = 100; 88 const int kCheckDelayMs = 100;
89 int max_wait_time = 5000; 89 int max_wait_time = 5000;
90 while (max_wait_time > 0) { 90 while (max_wait_time > 0) {
91 max_wait_time -= kCheckDelayMs; 91 max_wait_time -= kCheckDelayMs;
92 Sleep(kCheckDelayMs); 92 PlatformThread::Sleep(kCheckDelayMs);
93 if (expected_title == GetActiveTabTitle()) 93 if (expected_title == GetActiveTabTitle())
94 break; 94 break;
95 } 95 }
96 96
97 EXPECT_EQ(expected_title, GetActiveTabTitle()); 97 EXPECT_EQ(expected_title, GetActiveTabTitle());
98 } 98 }
99 99
100 void NavigateToDataURL(const std::string& html_content, 100 void NavigateToDataURL(const std::string& html_content,
101 const std::wstring& expected_title) { 101 const std::wstring& expected_title) {
102 NavigateToURL(GURL("data:text/html," + html_content)); 102 NavigateToURL(GURL("data:text/html," + html_content));
103 CheckTitle(expected_title); 103 CheckTitle(expected_title);
104 } 104 }
105 105
106 void NavigateToNolistenersFileTwice() { 106 void NavigateToNolistenersFileTwice() {
107 NavigateToURL( 107 NavigateToURL(
108 URLRequestMockHTTPJob::GetMockUrl(L"title2.html")); 108 URLRequestMockHTTPJob::GetMockUrl(L"title2.html"));
109 CheckTitle(L"Title Of Awesomeness"); 109 CheckTitle(L"Title Of Awesomeness");
110 NavigateToURL( 110 NavigateToURL(
111 URLRequestMockHTTPJob::GetMockUrl(L"title2.html")); 111 URLRequestMockHTTPJob::GetMockUrl(L"title2.html"));
112 CheckTitle(L"Title Of Awesomeness"); 112 CheckTitle(L"Title Of Awesomeness");
113 } 113 }
114 114
115 // Navigates to a URL asynchronously, then again synchronously. The first 115 // Navigates to a URL asynchronously, then again synchronously. The first
116 // load is purposely async to test the case where the user loads another 116 // load is purposely async to test the case where the user loads another
117 // page without waiting for the first load to complete. 117 // page without waiting for the first load to complete.
118 void NavigateToNolistenersFileTwiceAsync() { 118 void NavigateToNolistenersFileTwiceAsync() {
119 // TODO(ojan): We hit a DCHECK in RenderViewHost::OnMsgShouldCloseACK 119 // TODO(ojan): We hit a DCHECK in RenderViewHost::OnMsgShouldCloseACK
120 // if we don't sleep here. 120 // if we don't sleep here.
121 Sleep(400); 121 PlatformThread::Sleep(400);
122 NavigateToURLAsync( 122 NavigateToURLAsync(
123 URLRequestMockHTTPJob::GetMockUrl(L"title2.html")); 123 URLRequestMockHTTPJob::GetMockUrl(L"title2.html"));
124 Sleep(400); 124 PlatformThread::Sleep(400);
125 NavigateToURL( 125 NavigateToURL(
126 URLRequestMockHTTPJob::GetMockUrl(L"title2.html")); 126 URLRequestMockHTTPJob::GetMockUrl(L"title2.html"));
127 127
128 CheckTitle(L"Title Of Awesomeness"); 128 CheckTitle(L"Title Of Awesomeness");
129 } 129 }
130 130
131 void LoadUrlAndQuitBrowser(const std::string& html_content, 131 void LoadUrlAndQuitBrowser(const std::string& html_content,
132 const std::wstring& expected_title = L"") { 132 const std::wstring& expected_title = L"") {
133 scoped_ptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); 133 scoped_ptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
134 NavigateToDataURL(html_content, expected_title); 134 NavigateToDataURL(html_content, expected_title);
135 bool application_closed = false; 135 bool application_closed = false;
136 EXPECT_TRUE(CloseBrowser(browser.get(), &application_closed)); 136 EXPECT_TRUE(CloseBrowser(browser.get(), &application_closed));
137 } 137 }
138 138
139 void ClickModalDialogButton(MessageBoxFlags::DialogButton button) { 139 void ClickModalDialogButton(MessageBoxFlags::DialogButton button) {
140 #if defined(OS_WIN)
140 bool modal_dialog_showing = false; 141 bool modal_dialog_showing = false;
141 MessageBoxFlags::DialogButton available_buttons; 142 MessageBoxFlags::DialogButton available_buttons;
142 EXPECT_TRUE(automation()->WaitForAppModalDialog(3000)); 143 EXPECT_TRUE(automation()->WaitForAppModalDialog(3000));
143 EXPECT_TRUE(automation()->GetShowingAppModalDialog(&modal_dialog_showing, 144 EXPECT_TRUE(automation()->GetShowingAppModalDialog(&modal_dialog_showing,
144 &available_buttons)); 145 &available_buttons));
145 ASSERT_TRUE(modal_dialog_showing); 146 ASSERT_TRUE(modal_dialog_showing);
146 EXPECT_TRUE((button & available_buttons) != NULL); 147 EXPECT_TRUE((button & available_buttons) != 0);
147 EXPECT_TRUE(automation()->ClickAppModalDialogButton(button)); 148 EXPECT_TRUE(automation()->ClickAppModalDialogButton(button));
149 #else
150 // TODO(port): port this function if and when the tests that use it are
151 // enabled (currently they are not being run even on windows).
152 NOTIMPLEMENTED();
153 #endif
148 } 154 }
149 }; 155 };
150 156
157 // TODO(port): these tests fail on linux because they leave a renderer process
158 // lying around which holds onto the user data directory.
159 #if defined(OS_WIN)
151 // Navigate to a page with an infinite unload handler. 160 // Navigate to a page with an infinite unload handler.
152 // Then two two async crosssite requests to ensure 161 // Then two two async crosssite requests to ensure
153 // we don't get confused and think we're closing the tab. 162 // we don't get confused and think we're closing the tab.
154 TEST_F(UnloadTest, CrossSiteInfiniteUnloadAsync) { 163 TEST_F(UnloadTest, CrossSiteInfiniteUnloadAsync) {
155 // Tests makes no sense in single-process mode since the renderer is hung. 164 // Tests makes no sense in single-process mode since the renderer is hung.
156 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) 165 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess))
157 return; 166 return;
158 167
159 NavigateToDataURL(INFINITE_UNLOAD_HTML, L"infiniteunload"); 168 NavigateToDataURL(INFINITE_UNLOAD_HTML, L"infiniteunload");
160 // Must navigate to a non-data URL to trigger cross-site codepath. 169 // Must navigate to a non-data URL to trigger cross-site codepath.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadSync) { 205 TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadSync) {
197 // Tests makes no sense in single-process mode since the renderer is hung. 206 // Tests makes no sense in single-process mode since the renderer is hung.
198 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) 207 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess))
199 return; 208 return;
200 209
201 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, L"infinitebeforeunload"); 210 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, L"infinitebeforeunload");
202 // Must navigate to a non-data URL to trigger cross-site codepath. 211 // Must navigate to a non-data URL to trigger cross-site codepath.
203 NavigateToNolistenersFileTwice(); 212 NavigateToNolistenersFileTwice();
204 ASSERT_TRUE(IsBrowserRunning()); 213 ASSERT_TRUE(IsBrowserRunning());
205 } 214 }
215 #endif
206 216
207 // Tests closing the browser on a page with no unload listeners registered. 217 // Tests closing the browser on a page with no unload listeners registered.
208 TEST_F(UnloadTest, BrowserCloseNoUnloadListeners) { 218 TEST_F(UnloadTest, BrowserCloseNoUnloadListeners) {
209 LoadUrlAndQuitBrowser(NOLISTENERS_HTML, L"nolisteners"); 219 LoadUrlAndQuitBrowser(NOLISTENERS_HTML, L"nolisteners");
210 } 220 }
211 221
212 // Tests closing the browser on a page with an unload listener registered. 222 // Tests closing the browser on a page with an unload listener registered.
213 TEST_F(UnloadTest, BrowserCloseUnload) { 223 TEST_F(UnloadTest, BrowserCloseUnload) {
214 LoadUrlAndQuitBrowser(UNLOAD_HTML, L"unload"); 224 LoadUrlAndQuitBrowser(UNLOAD_HTML, L"unload");
215 } 225 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 308
299 // Tests closing the browser with a beforeunload handler that takes 309 // Tests closing the browser with a beforeunload handler that takes
300 // two seconds to run then pops up an alert. 310 // two seconds to run then pops up an alert.
301 TEST_F(UnloadTest, BrowserCloseTwoSecondBeforeUnloadAlert) { 311 TEST_F(UnloadTest, BrowserCloseTwoSecondBeforeUnloadAlert) {
302 LoadUrlAndQuitBrowser(TWO_SECOND_BEFORE_UNLOAD_ALERT_HTML, 312 LoadUrlAndQuitBrowser(TWO_SECOND_BEFORE_UNLOAD_ALERT_HTML,
303 L"twosecondbeforeunloadalert"); 313 L"twosecondbeforeunloadalert");
304 } 314 }
305 315
306 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs 316 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs
307 // and multiple windows. 317 // and multiple windows.
OLDNEW
« no previous file with comments | « base/process_util_posix.cc ('k') | chrome/chrome.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698