session_history_browsertest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Use of this source code is governed by a BSD-style license that can be
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// found in the LICENSE file.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "base/strings/string_util.h"
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "base/strings/stringprintf.h"
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "base/strings/utf_string_conversions.h"
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/browser/navigation_controller.h"
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/browser/notification_service.h"
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/browser/notification_types.h"
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/browser/web_contents.h"
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/common/url_constants.h"
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/test/browser_test_utils.h"
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/test/content_browser_test.h"
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/test/content_browser_test_utils.h"
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/public/test/test_utils.h"
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "content/shell/browser/shell.h"
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "net/test/embedded_test_server/embedded_test_server.h"
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "net/test/embedded_test_server/http_request.h"
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "net/test/embedded_test_server/http_response.h"
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "testing/gtest/include/gtest/gtest.h"
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace content {
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace {
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Handles |request| by serving a response with title set to request contents.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverscoped_ptr<net::test_server::HttpResponse> HandleEchoTitleRequest(
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const std::string& echotitle_path,
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const net::test_server::HttpRequest& request) {
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (!StartsWithASCII(request.relative_url, echotitle_path, true))
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return scoped_ptr<net::test_server::HttpResponse>();
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  scoped_ptr<net::test_server::BasicHttpResponse> http_response(
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      new net::test_server::BasicHttpResponse);
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  http_response->set_code(net::HTTP_OK);
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  http_response->set_content(
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      base::StringPrintf(
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          "<html><head><title>%s</title></head></html>",
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          request.content.c_str()));
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  return http_response.PassAs<net::test_server::HttpResponse>();
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}  // namespace
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass SessionHistoryTest : public ContentBrowserTest {
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected:
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SessionHistoryTest() {}
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  virtual void SetUpOnMainThread() OVERRIDE {
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    embedded_test_server()->RegisterRequestHandler(
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        base::Bind(&HandleEchoTitleRequest, "/echotitle"));
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), GURL(url::kAboutBlankURL));
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Simulate clicking a link.  Only works on the frames.html testserver page.
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void ClickLink(std::string node_id) {
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GURL url("javascript:clickLink('" + node_id + "')");
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), url);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Simulate filling in form data.  Only works on the frames.html page with
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // subframe = form.html, and on form.html itself.
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void FillForm(std::string node_id, std::string value) {
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GURL url("javascript:fillForm('" + node_id + "', '" + value + "')");
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // This will return immediately, but since the JS executes synchronously
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // on the renderer, it will complete before the next navigate message is
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // processed.
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), url);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Simulate submitting a form.  Only works on the frames.html page with
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // subframe = form.html, and on form.html itself.
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void SubmitForm(std::string node_id) {
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GURL url("javascript:submitForm('" + node_id + "')");
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), url);
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Navigate session history using history.go(distance).
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void JavascriptGo(std::string distance) {
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GURL url("javascript:history.go('" + distance + "')");
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), url);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  std::string GetTabTitle() {
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return base::UTF16ToASCII(shell()->web_contents()->GetTitle());
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL GetTabURL() {
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return shell()->web_contents()->GetLastCommittedURL();
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL GetURL(const std::string file) {
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return embedded_test_server()->GetURL(
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        std::string("/session_history/") + file);
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void NavigateAndCheckTitle(const char* filename,
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                             const std::string& expected_title) {
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    base::string16 expected_title16(base::ASCIIToUTF16(expected_title));
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TitleWatcher title_watcher(shell()->web_contents(), expected_title16);
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NavigateToURL(shell(), GetURL(filename));
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ASSERT_EQ(expected_title16, title_watcher.WaitAndGetTitle());
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  bool CanGoBack() {
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return shell()->web_contents()->GetController().CanGoBack();
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  bool CanGoForward() {
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return shell()->web_contents()->GetController().CanGoForward();
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void GoBack() {
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WindowedNotificationObserver load_stop_observer(
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NOTIFICATION_LOAD_STOP,
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NotificationService::AllSources());
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    shell()->web_contents()->GetController().GoBack();
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load_stop_observer.Wait();
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void GoForward() {
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WindowedNotificationObserver load_stop_observer(
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NOTIFICATION_LOAD_STOP,
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NotificationService::AllSources());
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    shell()->web_contents()->GetController().GoForward();
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load_stop_observer.Wait();
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// If this flakes, use http://crbug.com/61619 on windows and
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://crbug.com/102094 on mac.
135324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, BasicBackForward) {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot1.html", "bot1"));
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot2.html", "bot2"));
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot3.html", "bot3"));
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, bot2, *bot3]
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot3.html", "bot3"));
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, *bot3]
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoForward());
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Test that back/forward works when navigating in subframes.
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// If this flakes, use http://crbug.com/48833
181324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, FrameBackForward) {
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("frames.html", "bot1"));
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("abot2");
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL frames(GetURL("frames.html"));
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("abot3");
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, bot2, *bot3]
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GURL(url::kAboutBlankURL), GetTabURL());
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("abot1");
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, bot2, *bot1]
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoForward());
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Test that back/forward preserves POST data and document state in subframes.
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// If this flakes use http://crbug.com/61619
238324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, FrameFormBackForward) {
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("frames.html", "bot1"));
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("aform");
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("form", GetTabTitle());
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL frames(GetURL("frames.html"));
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubmitForm("isubmit");
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("text=&select=a", GetTabTitle());
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("form", GetTabTitle());
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, *form, post]
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("abot2");
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, form, *bot2]
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("form", GetTabTitle());
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubmitForm("isubmit");
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("text=&select=a", GetTabTitle());
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, form, *post]
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // TODO(mpcomplete): reenable this when WebKit bug 10199 is fixed:
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // "returning to a POST result within a frame does a GET instead of a POST"
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("abot2");
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("text=&select=a", GetTabTitle());
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TODO(mpcomplete): enable this when Bug 734372 is fixed:
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// "Doing a session history navigation does not restore newly-created subframe
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// document state"
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Test that back/forward preserves POST data and document state when navigating
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// across frames (ie, from frame -> nonframe).
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Hangs, see http://crbug.com/45058.
291324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, CrossFrameFormBackForward) {
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL frames(GetURL("frames.html"));
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("frames.html", "bot1"));
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ClickLink("aform");
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("form", GetTabTitle());
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubmitForm("isubmit");
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("text=&select=a", GetTabTitle());
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("form", GetTabTitle());
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, *form, post]
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot2.html", "bot2"));
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, form, *bot2]
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubmitForm("isubmit");
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("text=&select=a", GetTabTitle());
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(frames, GetTabURL());
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Test that back/forward entries are created for reference fragment
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// navigations. Bug 730379.
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// If this flakes use http://crbug.com/61619.
327324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, FragmentBackForward) {
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  embedded_test_server()->RegisterRequestHandler(
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      base::Bind(&HandleEchoTitleRequest, "/echotitle"));
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GURL fragment(GetURL("fragment.html"));
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("fragment.html", "fragment"));
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("fragment.html#a", "fragment"));
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("fragment.html#b", "fragment"));
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("fragment.html#c", "fragment"));
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, fragment, fragment#a, fragment#b, *fragment#c]
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html#b"), GetTabURL());
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html#a"), GetTabURL());
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html"), GetTabURL());
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoForward();
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html#a"), GetTabURL());
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot3.html", "bot3"));
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, fragment, fragment#a, bot3]
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoForward());
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("bot3.html"), GetTabURL());
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html#a"), GetTabURL());
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(GetURL("fragment.html"), GetTabURL());
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Test that the javascript window.history object works.
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOTE: history.go(N) does not do anything if N is outside the bounds of the
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// back/forward list (such as trigger our start/stop loading events).  This
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// means the test will hang if it attempts to navigate too far forward or back,
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// since we'll be waiting forever for a load stop event.
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TODO(brettw) bug 50648: fix flakyness. This test seems like it was failing
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// about 1/4 of the time on Vista by failing to execute JavascriptGo (see bug).
376324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, JavascriptHistory) {
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot1.html", "bot1"));
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot2.html", "bot2"));
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot3.html", "bot3"));
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, bot2, *bot3]
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-1");
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-1");
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("1");
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot2", GetTabTitle());
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-1");
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("2");
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, bot2, *bot3]
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-3");
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("1");
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle("bot3.html", "bot3"));
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // history is [blank, bot1, *bot3]
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoForward());
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-1");
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("-1");
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_FALSE(CanGoBack());
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(std::string(url::kAboutBlankURL), GetTabTitle());
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("1");
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot1", GetTabTitle());
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  JavascriptGo("1");
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("bot3", GetTabTitle());
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // TODO(creis): Test that JavaScript history navigations work across tab
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // types.  For example, load about:network in a tab, then a real page, then
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // try to go back and forward with JavaScript.  Bug 1136715.
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // (Hard to test right now, because pages like about:network cause the
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // TabProxy to hang.  This is because they do not appear to use the
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // NotificationService.)
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This test is failing consistently. See http://crbug.com/22560
442324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, LocationReplace) {
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test that using location.replace doesn't leave the title of the old page
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // visible.
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle(
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "replace.html?bot1.html", "bot1"));
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, LocationChangeInSubframe) {
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_NO_FATAL_FAILURE(NavigateAndCheckTitle(
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "location_redirect.html", "Default Title"));
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NavigateToURL(shell(), GURL("javascript:void(frames[0].navigate())"));
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("foo", GetTabTitle());
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ("Default Title", GetTabTitle());
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://code.google.com/p/chromium/issues/detail?id=56267
461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN_PROC_BROWSER_TEST_F(SessionHistoryTest, HistoryLength) {
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  int length;
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_TRUE(ExecuteScriptAndExtractInt(
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      shell()->web_contents(),
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "domAutomationController.send(history.length)",
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      &length));
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(1, length);
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NavigateToURL(shell(), GetURL("title1.html"));
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_TRUE(ExecuteScriptAndExtractInt(
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      shell()->web_contents(),
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "domAutomationController.send(history.length)",
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      &length));
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(2, length);
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Now test that history.length is updated when the navigation is committed.
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NavigateToURL(shell(), GetURL("record_length.html"));
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_TRUE(ExecuteScriptAndExtractInt(
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      shell()->web_contents(),
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "domAutomationController.send(history.length)",
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      &length));
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(3, length);
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GoBack();
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Ensure history.length is properly truncated.
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NavigateToURL(shell(), GetURL("title2.html"));
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASSERT_TRUE(ExecuteScriptAndExtractInt(
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      shell()->web_contents(),
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "domAutomationController.send(history.length)",
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      &length));
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EXPECT_EQ(2, length);
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}  // namespace content
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver