Index: content/browser/web_contents/navigation_controller_impl_unittest.cc |
diff --git a/content/browser/web_contents/navigation_controller_impl_unittest.cc b/content/browser/web_contents/navigation_controller_impl_unittest.cc |
index 5e69b6f8636e88de0d0bd35e1b482368e8b29117..7ca848f7874185aa9d001bff1cf8b55154392bac 100644 |
--- a/content/browser/web_contents/navigation_controller_impl_unittest.cc |
+++ b/content/browser/web_contents/navigation_controller_impl_unittest.cc |
@@ -300,6 +300,8 @@ TEST_F(NavigationControllerTest, LoadURL) { |
EXPECT_FALSE(controller.CanGoBack()); |
EXPECT_FALSE(controller.CanGoForward()); |
EXPECT_EQ(contents()->GetMaxPageID(), 0); |
+ EXPECT_EQ(0, NavigationEntryImpl::FromNavigationEntry( |
+ controller.GetLastCommittedEntry())->bindings()); |
// The timestamp should have been set. |
EXPECT_FALSE(controller.GetActiveEntry()->GetTimestamp().is_null()); |
@@ -865,6 +867,54 @@ TEST_F(NavigationControllerTest, LoadURL_RedirectAbortDoesntShowPendingURL) { |
contents()->SetDelegate(NULL); |
} |
+// Ensure that NavigationEntries track which bindings their RenderViewHost had |
+// at the time they committed. http://crbug.com/173672. |
+TEST_F(NavigationControllerTest, LoadURL_WithBindings) { |
+ NavigationControllerImpl& controller = controller_impl(); |
+ TestNotificationTracker notifications; |
+ RegisterForAllNavNotifications(¬ifications, &controller); |
+ |
+ const GURL url1("http://foo1"); |
+ const GURL url2("http://foo2"); |
+ |
+ // Navigate to a first, unprivileged URL. |
+ controller.LoadURL(url1, Referrer(), PAGE_TRANSITION_TYPED, std::string()); |
+ EXPECT_EQ(NavigationEntryImpl::kInvalidBindings, |
+ NavigationEntryImpl::FromNavigationEntry( |
+ controller.GetPendingEntry())->bindings()); |
+ |
+ // Commit. |
+ TestRenderViewHost* orig_rvh = static_cast<TestRenderViewHost*>(test_rvh()); |
+ orig_rvh->SendNavigate(0, url1); |
+ EXPECT_EQ(controller.GetEntryCount(), 1); |
+ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(0, NavigationEntryImpl::FromNavigationEntry( |
+ controller.GetLastCommittedEntry())->bindings()); |
+ |
+ // Navigate to a second URL, simulate the beforeunload ack for the cross-site |
+ // transition, and set bindings on the pending RenderViewHost to simulate a |
+ // privileged url. |
+ controller.LoadURL(url2, Referrer(), PAGE_TRANSITION_TYPED, std::string()); |
+ orig_rvh->SendShouldCloseACK(true); |
+ contents()->GetPendingRenderViewHost()->AllowBindings(1); |
+ static_cast<TestRenderViewHost*>( |
+ contents()->GetPendingRenderViewHost())->SendNavigate(1, url2); |
+ |
+ // The second load should be committed, and bindings should be remembered. |
+ EXPECT_EQ(controller.GetEntryCount(), 2); |
+ EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_TRUE(controller.CanGoBack()); |
+ EXPECT_EQ(1, NavigationEntryImpl::FromNavigationEntry( |
+ controller.GetLastCommittedEntry())->bindings()); |
+ |
+ // Going back, the first entry should still appear unprivileged. |
+ controller.GoBack(); |
+ orig_rvh->SendNavigate(0, url1); |
+ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(0, NavigationEntryImpl::FromNavigationEntry( |
+ controller.GetLastCommittedEntry())->bindings()); |
+} |
+ |
TEST_F(NavigationControllerTest, Reload) { |
NavigationControllerImpl& controller = controller_impl(); |
TestNotificationTracker notifications; |