Index: content/browser/frame_host/navigation_controller_impl_browsertest.cc |
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
index 20c00ee3edf6db7935e6a6736402a33b134708f7..3eca788f95720c819ad1e27b955f30f2d4c5b7fd 100644 |
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
@@ -3,9 +3,11 @@ |
// found in the LICENSE file. |
#include "base/bind.h" |
+#include "base/strings/stringprintf.h" |
#include "content/browser/frame_host/navigation_controller_impl.h" |
#include "content/browser/frame_host/navigation_entry_impl.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/test/browser_test_utils.h" |
#include "content/public/test/content_browser_test.h" |
#include "content/public/test/content_browser_test_utils.h" |
#include "content/shell/browser/shell.h" |
@@ -22,7 +24,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, LoadDataWithBaseURL) { |
const NavigationController& controller = |
shell()->web_contents()->GetController(); |
- // load data. Blocks until it is done. |
+ // Load data. Blocks until it is done. |
content::LoadDataWithBaseURL(shell(), history_url, data, base_url); |
// We should use history_url instead of the base_url as the original url of |
@@ -30,5 +32,49 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, LoadDataWithBaseURL) { |
// paths in the data, or enforcing same origin policy. |
EXPECT_EQ(controller.GetVisibleEntry()->GetOriginalRequestURL(), history_url); |
} |
+ |
+// The renderer uses the position in the history list as a clue to whether a |
+// navigation is stale. In the case where the entry limit is reached and the |
+// history list is pruned, make sure that there is no mismatch that would cause |
+// it to start incorrectly rejecting navigations as stale. See |
+// http://crbug.com/89798. |
+IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
+ DontIgnoreBackAfterNavEntryLimit) { |
+ NavigationController& controller = |
+ shell()->web_contents()->GetController(); |
+ |
+ const int kMaxEntryCount = |
+ static_cast<int>(NavigationControllerImpl::max_entry_count()); |
+ |
+ // Load up to the max count, all entries should be there. |
+ for (int url_index = 0; url_index < kMaxEntryCount; ++url_index) { |
+ GURL url(base::StringPrintf("data:text/html,page%d", url_index)); |
+ EXPECT_TRUE(NavigateToURL(shell(), url)); |
+ } |
+ |
+ EXPECT_EQ(controller.GetEntryCount(), kMaxEntryCount); |
+ |
+ // Navigate twice more more. |
+ for (int url_index = kMaxEntryCount; |
+ url_index < kMaxEntryCount + 2; ++url_index) { |
+ GURL url(base::StringPrintf("data:text/html,page%d", url_index)); |
+ EXPECT_TRUE(NavigateToURL(shell(), url)); |
+ } |
+ |
+ // We expect http://www.a.com/0 and /1 to be gone. |
+ EXPECT_EQ(kMaxEntryCount, controller.GetEntryCount()); |
+ EXPECT_EQ(GURL("data:text/html,page2"), |
+ controller.GetEntryAtIndex(0)->GetURL()); |
+ |
+ // Now try to go back. This should not hang. |
+ ASSERT_TRUE(controller.CanGoBack()); |
+ controller.GoBack(); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ |
+ // This should have successfully gone back. |
+ EXPECT_EQ(GURL(base::StringPrintf("data:text/html,page%d", kMaxEntryCount)), |
+ controller.GetLastCommittedEntry()->GetURL()); |
+} |
+ |
} // namespace content |