blob: fe7cbea577fa997d90531922044720d0fd5a1aa6 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// 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
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
5#include "base/file_util.h"
6#include "base/win_util.h"
7#include "chrome/common/l10n_util.h"
8#include "chrome/test/automation/tab_proxy.h"
9#include "chrome/test/automation/browser_proxy.h"
10#include "chrome/test/ui/ui_test.h"
[email protected]34ac8f32009-02-22 23:03:2711#include "grit/generated_resources.h"
initial.commit09911bf2008-07-26 23:55:2912#include "net/base/net_util.h"
13#include "net/url_request/url_request_unittest.h"
14
initial.commit09911bf2008-07-26 23:55:2915using std::wstring;
16
17namespace {
18
19const wchar_t kDocRoot[] = L"chrome/test/data";
20
21class SessionHistoryTest : public UITest {
22 protected:
23 SessionHistoryTest() : UITest() {
[email protected]ceeb87e2008-12-04 20:46:0624 FilePath path = FilePath::FromWStringHack(test_data_directory_);
[email protected]0e292232009-01-22 15:23:3425 path = path.AppendASCII("session_history")
[email protected]ceeb87e2008-12-04 20:46:0626 .Append(FilePath::StringType(&FilePath::kSeparators[0], 1));
initial.commit09911bf2008-07-26 23:55:2927
[email protected]ceeb87e2008-12-04 20:46:0628 url_prefix_ = UTF8ToWide(net::FilePathToFileURL(path).spec());
initial.commit09911bf2008-07-26 23:55:2929 }
30
31 virtual void SetUp() {
32 UITest::SetUp();
33
34 window_.reset(automation()->GetBrowserWindow(0));
35 ASSERT_TRUE(window_.get());
36
37 int active_tab_index = -1;
38 ASSERT_TRUE(window_->GetActiveTabIndex(&active_tab_index));
39 tab_.reset(window_->GetTab(active_tab_index));
40 ASSERT_TRUE(tab_.get());
41 }
42
43 // Simulate clicking a link. Only works on the frames.html testserver page.
44 void ClickLink(std::wstring node_id) {
45 GURL url(L"javascript:clickLink('" + node_id + L"')");
46 ASSERT_TRUE(tab_->NavigateToURL(url));
47 }
48
49 // Simulate filling in form data. Only works on the frames.html page with
50 // subframe = form.html, and on form.html itself.
51 void FillForm(std::wstring node_id, std::wstring value) {
52 GURL url(L"javascript:fillForm('" + node_id +
53 L"', '" + value + L"')");
54 // This will return immediately, but since the JS executes synchronously
55 // on the renderer, it will complete before the next navigate message is
56 // processed.
57 ASSERT_TRUE(tab_->NavigateToURLAsync(url));
58 }
59
60 // Simulate submitting a form. Only works on the frames.html page with
61 // subframe = form.html, and on form.html itself.
62 void SubmitForm(std::wstring node_id) {
63 GURL url(L"javascript:submitForm('" + node_id + L"')");
64 ASSERT_TRUE(tab_->NavigateToURL(url));
65 }
66
67 // Navigate session history using history.go(distance).
68 void JavascriptGo(std::string distance) {
69 GURL url("javascript:history.go('" + distance + "')");
70 ASSERT_TRUE(tab_->NavigateToURL(url));
71 }
72
73 wstring GetTabTitle() {
74 wstring title;
75 EXPECT_TRUE(tab_->GetTabTitle(&title));
76 return title;
77 }
78
79 // Try 10 times to get the right tab title.
80 wstring TestTabTitle(const wstring& value) {
81 // Error pages load separately, but the UI automation system does not wait
82 // for error pages to load before returning after a navigation request.
83 // So, we need to sleep a little.
84 DWORD kWaitForErrorPageMsec = 200;
85
86 for (int i = 0; i < 10; ++i) {
87 if (value.compare(GetTabTitle()) == 0)
88 return value;
89 Sleep(kWaitForErrorPageMsec);
90 }
91 return GetTabTitle();
92 }
93
94 GURL GetTabURL() {
95 GURL url;
96 EXPECT_TRUE(tab_->GetCurrentURL(&url));
97 return url;
98 }
99
100 protected:
101 wstring url_prefix_;
102 scoped_ptr<BrowserProxy> window_;
103 scoped_ptr<TabProxy> tab_;
104};
105
106} // namespace
107
108TEST_F(SessionHistoryTest, BasicBackForward) {
[email protected]dd265012009-01-08 20:45:27109 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55110 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27111 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29112
113 // about:blank should be loaded first.
114 ASSERT_FALSE(tab_->GoBack());
115 EXPECT_EQ(L"", GetTabTitle());
116
117 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27118 server->TestServerPage("files/session_history/bot1.html")));
initial.commit09911bf2008-07-26 23:55:29119 EXPECT_EQ(L"bot1", GetTabTitle());
120
121 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27122 server->TestServerPage("files/session_history/bot2.html")));
initial.commit09911bf2008-07-26 23:55:29123 EXPECT_EQ(L"bot2", GetTabTitle());
124
125 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27126 server->TestServerPage("files/session_history/bot3.html")));
initial.commit09911bf2008-07-26 23:55:29127 EXPECT_EQ(L"bot3", GetTabTitle());
128
129 // history is [blank, bot1, bot2, *bot3]
130
131 ASSERT_TRUE(tab_->GoBack());
132 EXPECT_EQ(L"bot2", GetTabTitle());
133
134 ASSERT_TRUE(tab_->GoBack());
135 EXPECT_EQ(L"bot1", GetTabTitle());
136
137 ASSERT_TRUE(tab_->GoForward());
138 EXPECT_EQ(L"bot2", GetTabTitle());
139
140 ASSERT_TRUE(tab_->GoBack());
141 EXPECT_EQ(L"bot1", GetTabTitle());
142
143 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27144 server->TestServerPage("files/session_history/bot3.html")));
initial.commit09911bf2008-07-26 23:55:29145 EXPECT_EQ(L"bot3", GetTabTitle());
146
147 // history is [blank, bot1, *bot3]
148
149 ASSERT_FALSE(tab_->GoForward());
150 EXPECT_EQ(L"bot3", GetTabTitle());
151
152 ASSERT_TRUE(tab_->GoBack());
153 EXPECT_EQ(L"bot1", GetTabTitle());
154
155 ASSERT_TRUE(tab_->GoBack());
156 EXPECT_EQ(L"", GetTabTitle());
157
158 ASSERT_FALSE(tab_->GoBack());
159 EXPECT_EQ(L"", GetTabTitle());
160
161 ASSERT_TRUE(tab_->GoForward());
162 EXPECT_EQ(L"bot1", GetTabTitle());
163
164 ASSERT_TRUE(tab_->GoForward());
165 EXPECT_EQ(L"bot3", GetTabTitle());
166}
167
168// Test that back/forward works when navigating in subframes.
169TEST_F(SessionHistoryTest, FrameBackForward) {
170 // Bug: http://b/1175763, skip this test on Windows 2000 until
171 // flakiness is investigated and fixed.
172 if (win_util::GetWinVersion() <= win_util::WINVERSION_2000)
173 return;
174
[email protected]dd265012009-01-08 20:45:27175 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55176 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27177 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29178
179 // about:blank should be loaded first.
180 GURL home(homepage_);
181 ASSERT_FALSE(tab_->GoBack());
182 EXPECT_EQ(L"", GetTabTitle());
183 EXPECT_EQ(home, GetTabURL());
184
[email protected]dd265012009-01-08 20:45:27185 GURL frames(server->TestServerPage("files/session_history/frames.html"));
initial.commit09911bf2008-07-26 23:55:29186 ASSERT_TRUE(tab_->NavigateToURL(frames));
187 EXPECT_EQ(L"bot1", GetTabTitle());
188 EXPECT_EQ(frames, GetTabURL());
189
190 ClickLink(L"abot2");
191 EXPECT_EQ(L"bot2", GetTabTitle());
192 EXPECT_EQ(frames, GetTabURL());
193
194 ClickLink(L"abot3");
195 EXPECT_EQ(L"bot3", GetTabTitle());
196 EXPECT_EQ(frames, GetTabURL());
197
198 // history is [blank, bot1, bot2, *bot3]
199
200 ASSERT_TRUE(tab_->GoBack());
201 EXPECT_EQ(L"bot2", GetTabTitle());
202 EXPECT_EQ(frames, GetTabURL());
203
204 ASSERT_TRUE(tab_->GoBack());
205 EXPECT_EQ(L"bot1", GetTabTitle());
206 EXPECT_EQ(frames, GetTabURL());
207
208 ASSERT_TRUE(tab_->GoBack());
209 EXPECT_EQ(L"", GetTabTitle());
210 EXPECT_EQ(home, GetTabURL());
211
212 ASSERT_TRUE(tab_->GoForward());
213 EXPECT_EQ(L"bot1", GetTabTitle());
214 EXPECT_EQ(frames, GetTabURL());
215
216 ASSERT_TRUE(tab_->GoForward());
217 EXPECT_EQ(L"bot2", GetTabTitle());
218 EXPECT_EQ(frames, GetTabURL());
219
220 ClickLink(L"abot1");
221 EXPECT_EQ(L"bot1", GetTabTitle());
222 EXPECT_EQ(frames, GetTabURL());
223
224 // history is [blank, bot1, bot2, *bot1]
225
226 ASSERT_FALSE(tab_->GoForward());
227 EXPECT_EQ(L"bot1", GetTabTitle());
228 EXPECT_EQ(frames, GetTabURL());
229
230 ASSERT_TRUE(tab_->GoBack());
231 EXPECT_EQ(L"bot2", GetTabTitle());
232 EXPECT_EQ(frames, GetTabURL());
233
234 ASSERT_TRUE(tab_->GoBack());
235 EXPECT_EQ(L"bot1", GetTabTitle());
236 EXPECT_EQ(frames, GetTabURL());
237}
238
239// Test that back/forward preserves POST data and document state in subframes.
240TEST_F(SessionHistoryTest, FrameFormBackForward) {
[email protected]dd265012009-01-08 20:45:27241 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55242 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27243 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29244
245 // about:blank should be loaded first.
246 ASSERT_FALSE(tab_->GoBack());
247 EXPECT_EQ(L"", GetTabTitle());
248
[email protected]dd265012009-01-08 20:45:27249 GURL frames(server->TestServerPage("files/session_history/frames.html"));
initial.commit09911bf2008-07-26 23:55:29250 ASSERT_TRUE(tab_->NavigateToURL(frames));
251 EXPECT_EQ(L"bot1", GetTabTitle());
252
253 ClickLink(L"aform");
254 EXPECT_EQ(L"form", GetTabTitle());
255 EXPECT_EQ(frames, GetTabURL());
256
257 SubmitForm(L"isubmit");
258 EXPECT_EQ(L"text=&select=a", GetTabTitle());
259 EXPECT_EQ(frames, GetTabURL());
260
261 ASSERT_TRUE(tab_->GoBack());
262 EXPECT_EQ(L"form", GetTabTitle());
263 EXPECT_EQ(frames, GetTabURL());
264
265 // history is [blank, bot1, *form, post]
266
267 ClickLink(L"abot2");
268 EXPECT_EQ(L"bot2", GetTabTitle());
269 EXPECT_EQ(frames, GetTabURL());
270
271 // history is [blank, bot1, form, *bot2]
272
273 ASSERT_TRUE(tab_->GoBack());
274 EXPECT_EQ(L"form", GetTabTitle());
275 EXPECT_EQ(frames, GetTabURL());
276
277 SubmitForm(L"isubmit");
278 EXPECT_EQ(L"text=&select=a", GetTabTitle());
279 EXPECT_EQ(frames, GetTabURL());
280
281 // history is [blank, bot1, form, *post]
282
283// TODO(mpcomplete): reenable this when WebKit bug 10199 is fixed:
284// "returning to a POST result within a frame does a GET instead of a POST"
285#if 0
286 ClickLink(L"abot2");
287 EXPECT_EQ(L"bot2", GetTabTitle());
288 EXPECT_EQ(frames, GetTabURL());
289
290 ASSERT_TRUE(tab_->GoBack());
291 EXPECT_EQ(L"text=&select=a", GetTabTitle());
292 EXPECT_EQ(frames, GetTabURL());
293#endif
294}
295
296// TODO(mpcomplete): enable this when Bug 734372 is fixed:
297// "Doing a session history navigation does not restore newly-created subframe
298// document state"
299#if 0
300// Test that back/forward preserves POST data and document state when navigating
301// across frames (ie, from frame -> nonframe).
302TEST_F(SessionHistoryTest, CrossFrameFormBackForward) {
[email protected]dd265012009-01-08 20:45:27303 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55304 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27305 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29306
307 // about:blank should be loaded first.
308 ASSERT_FALSE(tab_->GoBack());
309 EXPECT_EQ(L"", GetTabTitle());
310
[email protected]dd265012009-01-08 20:45:27311 GURL frames(server->TestServerPage("files/session_history/frames.html"));
initial.commit09911bf2008-07-26 23:55:29312 ASSERT_TRUE(tab_->NavigateToURL(frames));
313 EXPECT_EQ(L"bot1", GetTabTitle());
314
315 ClickLink(L"aform");
316 EXPECT_EQ(L"form", GetTabTitle());
317 EXPECT_EQ(frames, GetTabURL());
318
319 SubmitForm(L"isubmit");
320 EXPECT_EQ(L"text=&select=a", GetTabTitle());
321 EXPECT_EQ(frames, GetTabURL());
322
323 ASSERT_TRUE(tab_->GoBack());
324 EXPECT_EQ(L"form", GetTabTitle());
325 EXPECT_EQ(frames, GetTabURL());
326
327 // history is [blank, bot1, *form, post]
328
329 //ClickLink(L"abot2");
330 GURL bot2("files/session_history/bot2.html");
331 ASSERT_TRUE(tab_->NavigateToURL(bot2));
332 EXPECT_EQ(L"bot2", GetTabTitle());
333 EXPECT_EQ(bot2, GetTabURL());
334
335 // history is [blank, bot1, form, *bot2]
336
337 ASSERT_TRUE(tab_->GoBack());
338 EXPECT_EQ(L"form", GetTabTitle());
339 EXPECT_EQ(frames, GetTabURL());
340
341 SubmitForm(L"isubmit");
342 EXPECT_EQ(L"text=&select=a", GetTabTitle());
343 EXPECT_EQ(frames, GetTabURL());
344}
345#endif
346
[email protected]dd265012009-01-08 20:45:27347// Test that back/forward entries are created for reference fragment
348// navigations. Bug 730379.
initial.commit09911bf2008-07-26 23:55:29349TEST_F(SessionHistoryTest, FragmentBackForward) {
[email protected]dd265012009-01-08 20:45:27350 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55351 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27352 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29353
354 // about:blank should be loaded first.
355 ASSERT_FALSE(tab_->GoBack());
356 EXPECT_EQ(L"", GetTabTitle());
357
[email protected]dd265012009-01-08 20:45:27358 GURL fragment(server->TestServerPage("files/session_history/fragment.html"));
initial.commit09911bf2008-07-26 23:55:29359 ASSERT_TRUE(tab_->NavigateToURL(fragment));
360 EXPECT_EQ(L"fragment", GetTabTitle());
361 EXPECT_EQ(fragment, GetTabURL());
362
363 GURL::Replacements ref_params;
364
365 ref_params.SetRef("a", url_parse::Component(0, 1));
366 GURL fragment_a(fragment.ReplaceComponents(ref_params));
367 ASSERT_TRUE(tab_->NavigateToURL(fragment_a));
368 EXPECT_EQ(L"fragment", GetTabTitle());
369 EXPECT_EQ(fragment_a, GetTabURL());
370
371 ref_params.SetRef("b", url_parse::Component(0, 1));
372 GURL fragment_b(fragment.ReplaceComponents(ref_params));
373 ASSERT_TRUE(tab_->NavigateToURL(fragment_b));
374 EXPECT_EQ(L"fragment", GetTabTitle());
375 EXPECT_EQ(fragment_b, GetTabURL());
376
377 ref_params.SetRef("c", url_parse::Component(0, 1));
378 GURL fragment_c(fragment.ReplaceComponents(ref_params));
379 ASSERT_TRUE(tab_->NavigateToURL(fragment_c));
380 EXPECT_EQ(L"fragment", GetTabTitle());
381 EXPECT_EQ(fragment_c, GetTabURL());
382
383 // history is [blank, fragment, fragment#a, fragment#b, *fragment#c]
384
385 ASSERT_TRUE(tab_->GoBack());
386 EXPECT_EQ(fragment_b, GetTabURL());
387
388 ASSERT_TRUE(tab_->GoBack());
389 EXPECT_EQ(fragment_a, GetTabURL());
390
391 ASSERT_TRUE(tab_->GoBack());
392 EXPECT_EQ(fragment, GetTabURL());
393
394 ASSERT_TRUE(tab_->GoForward());
395 EXPECT_EQ(fragment_a, GetTabURL());
396
[email protected]dd265012009-01-08 20:45:27397 GURL bot3(server->TestServerPage("files/session_history/bot3.html"));
initial.commit09911bf2008-07-26 23:55:29398 ASSERT_TRUE(tab_->NavigateToURL(bot3));
399 EXPECT_EQ(L"bot3", GetTabTitle());
400 EXPECT_EQ(bot3, GetTabURL());
401
402 // history is [blank, fragment, fragment#a, bot3]
403
404 ASSERT_FALSE(tab_->GoForward());
405 EXPECT_EQ(bot3, GetTabURL());
406
407 ASSERT_TRUE(tab_->GoBack());
408 EXPECT_EQ(fragment_a, GetTabURL());
409
410 ASSERT_TRUE(tab_->GoBack());
411 EXPECT_EQ(fragment, GetTabURL());
412}
413
414// Test that the javascript window.history object works.
415// NOTE: history.go(N) does not do anything if N is outside the bounds of the
416// back/forward list (such as trigger our start/stop loading events). This
417// means the test will hang if it attempts to navigate too far forward or back,
418// since we'll be waiting forever for a load stop event.
419TEST_F(SessionHistoryTest, JavascriptHistory) {
[email protected]dd265012009-01-08 20:45:27420 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55421 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27422 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29423
424 // about:blank should be loaded first.
425 ASSERT_FALSE(tab_->GoBack());
426 EXPECT_EQ(L"", GetTabTitle());
427
428 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27429 server->TestServerPage("files/session_history/bot1.html")));
initial.commit09911bf2008-07-26 23:55:29430 EXPECT_EQ(L"bot1", GetTabTitle());
431
432 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27433 server->TestServerPage("files/session_history/bot2.html")));
initial.commit09911bf2008-07-26 23:55:29434 EXPECT_EQ(L"bot2", GetTabTitle());
435
436 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27437 server->TestServerPage("files/session_history/bot3.html")));
initial.commit09911bf2008-07-26 23:55:29438 EXPECT_EQ(L"bot3", GetTabTitle());
439
440 // history is [blank, bot1, bot2, *bot3]
441
442 JavascriptGo("-1");
443 EXPECT_EQ(L"bot2", GetTabTitle());
444
445 JavascriptGo("-1");
446 EXPECT_EQ(L"bot1", GetTabTitle());
447
448 JavascriptGo("1");
449 EXPECT_EQ(L"bot2", GetTabTitle());
450
451 JavascriptGo("-1");
452 EXPECT_EQ(L"bot1", GetTabTitle());
453
454 JavascriptGo("2");
455 EXPECT_EQ(L"bot3", GetTabTitle());
456
457 // history is [blank, bot1, bot2, *bot3]
458
459 JavascriptGo("-3");
460 EXPECT_EQ(L"", GetTabTitle());
461
462 ASSERT_FALSE(tab_->GoBack());
463 EXPECT_EQ(L"", GetTabTitle());
464
465 JavascriptGo("1");
466 EXPECT_EQ(L"bot1", GetTabTitle());
467
468 ASSERT_TRUE(tab_->NavigateToURL(
[email protected]dd265012009-01-08 20:45:27469 server->TestServerPage("files/session_history/bot3.html")));
initial.commit09911bf2008-07-26 23:55:29470 EXPECT_EQ(L"bot3", GetTabTitle());
471
472 // history is [blank, bot1, *bot3]
473
474 ASSERT_FALSE(tab_->GoForward());
475 EXPECT_EQ(L"bot3", GetTabTitle());
476
477 JavascriptGo("-1");
478 EXPECT_EQ(L"bot1", GetTabTitle());
479
480 JavascriptGo("-1");
481 EXPECT_EQ(L"", GetTabTitle());
482
483 ASSERT_FALSE(tab_->GoBack());
484 EXPECT_EQ(L"", GetTabTitle());
485
486 JavascriptGo("1");
487 EXPECT_EQ(L"bot1", GetTabTitle());
488
489 JavascriptGo("1");
490 EXPECT_EQ(L"bot3", GetTabTitle());
491
492 // TODO(creis): Test that JavaScript history navigations work across tab
493 // types. For example, load about:network in a tab, then a real page, then
494 // try to go back and forward with JavaScript. Bug 1136715.
495 // (Hard to test right now, because pages like about:network cause the
496 // TabProxy to hang. This is because they do not appear to use the
497 // NotificationService.)
498}
499
500TEST_F(SessionHistoryTest, LocationReplace) {
501 // Test that using location.replace doesn't leave the title of the old page
502 // visible.
[email protected]dd265012009-01-08 20:45:27503 scoped_refptr<HTTPTestServer> server =
[email protected]cad014312009-01-29 21:59:55504 HTTPTestServer::CreateServer(kDocRoot, NULL);
[email protected]dd265012009-01-08 20:45:27505 ASSERT_TRUE(NULL != server.get());
initial.commit09911bf2008-07-26 23:55:29506
[email protected]dd265012009-01-08 20:45:27507 ASSERT_TRUE(tab_->NavigateToURL(server->TestServerPage(
508 "files/session_history/replace.html?no-title.html")));
initial.commit09911bf2008-07-26 23:55:29509 EXPECT_EQ(L"", GetTabTitle());
510}
license.botbf09a502008-08-24 00:55:55511