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

Unified Diff: content/browser/frame_host/navigation_controller_impl_browsertest.cc

Issue 1250163002: Fix cross-process location.replace for main frames and subframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and remove some code Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
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 c9fa5bdc0db9d7ed2c65fe6bed4fbb383cfe99c2..b3f5fa830151fab9f205141c99cfb29f418e4bc9 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -209,6 +209,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, UniqueIDsOnFrames) {
// The main frame's nav_entry_id should match the last committed entry.
int unique_id = controller.GetLastCommittedEntry()->GetUniqueID();
EXPECT_EQ(unique_id, root->current_frame_host()->nav_entry_id());
+ EXPECT_EQ(1, controller.GetEntryCount());
// The about:blank iframe should have inherited the same nav_entry_id.
EXPECT_EQ(unique_id, root->child_at(0)->current_frame_host()->nav_entry_id());
@@ -218,25 +219,29 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, UniqueIDsOnFrames) {
"foo.com", "/navigation_controller/simple_page_1.html"));
NavigateFrameToURL(root->child_at(0), foo_url);
EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+ EXPECT_EQ(1, controller.GetEntryCount());
- // The unique ID should have stayed the same for the auto-subframe navigation,
- // since the new page replaces the initial about:blank page in the subframe.
- EXPECT_EQ(unique_id, controller.GetLastCommittedEntry()->GetUniqueID());
- EXPECT_EQ(unique_id, root->current_frame_host()->nav_entry_id());
- EXPECT_EQ(unique_id, root->child_at(0)->current_frame_host()->nav_entry_id());
+ // The unique ID should have updated for the new subframe navigation, even
+ // though new page replaces the initial about:blank page in the subframe.
+ int unique_id2 = controller.GetLastCommittedEntry()->GetUniqueID();
+ EXPECT_NE(unique_id, unique_id2);
+ EXPECT_EQ(unique_id2, root->current_frame_host()->nav_entry_id());
+ EXPECT_EQ(unique_id2,
+ root->child_at(0)->current_frame_host()->nav_entry_id());
// Navigating in the subframe again should create a new entry.
GURL foo_url2(embedded_test_server()->GetURL(
"foo.com", "/navigation_controller/simple_page_2.html"));
NavigateFrameToURL(root->child_at(0), foo_url2);
EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
- int unique_id2 = controller.GetLastCommittedEntry()->GetUniqueID();
- EXPECT_NE(unique_id, unique_id2);
+ EXPECT_EQ(2, controller.GetEntryCount());
+ int unique_id3 = controller.GetLastCommittedEntry()->GetUniqueID();
+ EXPECT_NE(unique_id2, unique_id3);
// The unique ID should have updated for the current RenderFrameHost in both
// frames, not just the subframe.
- EXPECT_EQ(unique_id2, root->current_frame_host()->nav_entry_id());
- EXPECT_EQ(unique_id2,
+ EXPECT_EQ(unique_id3, root->current_frame_host()->nav_entry_id());
+ EXPECT_EQ(unique_id3,
root->child_at(0)->current_frame_host()->nav_entry_id());
}
@@ -634,15 +639,16 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
}
// Navigate again to the page that fails to load. It must result in an error
- // page, the EXISTING_PAGE navigation type, and no addition to the history
- // list. We do not use SAME_PAGE here; that case only differs in that it
- // clears the pending entry, and there is no pending entry after a load
- // failure.
+ // page, the NEW_PAGE navigation type with did_replace_entry, and no addition
+ // to the history list. We do not use SAME_PAGE here; that case differs in
+ // that it clears the pending entry, and there is no pending entry after a
+ // load failure.
{
FrameNavigateParamsCapturer capturer(root);
NavigateFrameToURL(root, error_url);
capturer.Wait();
- EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, capturer.details().type);
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
NavigationEntry* entry = controller.GetLastCommittedEntry();
EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType());
EXPECT_EQ(2, controller.GetEntryCount());
@@ -652,15 +658,15 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
NavigateToURL(shell(), GURL(url::kAboutBlankURL));
EXPECT_EQ(3, controller.GetEntryCount());
- // ... and replace it with a failed load. (Note that when you set the
- // should_replace_current_entry flag, the navigation is classified as NEW_PAGE
- // because that is a classification of the renderer's behavior, and the flag
- // is a browser-side flag.)
+ // ... and replace it with a failed load. (Note that NavigateToURLAndReplace
+ // sets the should_replace_current_entry flag, which propagates from the
+ // browser to the renderer and back.)
{
FrameNavigateParamsCapturer capturer(root);
NavigateToURLAndReplace(shell(), error_url);
capturer.Wait();
EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
NavigationEntry* entry = controller.GetLastCommittedEntry();
EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType());
EXPECT_EQ(3, controller.GetEntryCount());
@@ -672,13 +678,13 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
NavigateToURL(shell(), web_ui_page);
EXPECT_EQ(4, controller.GetEntryCount());
- // ... and replace it with a failed load. (It is NEW_PAGE for the reason noted
- // above.)
+ // ... and replace it with a failed load.
{
FrameNavigateParamsCapturer capturer(root);
NavigateToURLAndReplace(shell(), error_url);
capturer.Wait();
EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
NavigationEntry* entry = controller.GetLastCommittedEntry();
EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType());
EXPECT_EQ(4, controller.GetEntryCount());
@@ -760,6 +766,53 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
EXPECT_TRUE(capturer.details().is_in_page);
}
+
+ // Now test NEW_PAGE with replacement. First, go back so that we can ensure
+ // location.replace leaves the forward history.
+ {
+ FrameNavigateParamsCapturer capturer(root);
+ shell()->web_contents()->GetController().GoBack();
+ capturer.Wait();
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
+ }
+
+ {
+ // location.replace().
+ FrameNavigateParamsCapturer capturer(root);
+ GURL frame_url(embedded_test_server()->GetURL(
+ "/navigation_controller/simple_page_1.html"));
+ std::string script = "location.replace('" + frame_url.spec() + "')";
+ EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
+ capturer.Wait();
+ EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
+ capturer.params().transition);
+ // Unlike replaceState, this replaces the existing entry with a new one.
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
+ EXPECT_FALSE(capturer.details().is_in_page);
+
+ // Make sure the forward history did not get pruned.
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
+ }
+
+ {
+ // Cross-site location.replace().
+ FrameNavigateParamsCapturer capturer(root);
+ GURL frame_url(embedded_test_server()->GetURL(
+ "foo.com", "/navigation_controller/simple_page_1.html"));
+ std::string script = "location.replace('" + frame_url.spec() + "')";
+ EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
+ capturer.Wait();
+ EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
+ capturer.params().transition);
+ // Unlike replaceState, this replaces the existing entry with a new one.
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
+ EXPECT_FALSE(capturer.details().is_in_page);
+
+ // Make sure the forward history did not get pruned.
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
+ }
}
// Verify that navigations for NAVIGATION_TYPE_EXISTING_PAGE are correctly
@@ -881,20 +934,6 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_FALSE(capturer.details().is_in_page);
}
- {
- // location.replace().
- FrameNavigateParamsCapturer capturer(root);
- GURL frame_url(embedded_test_server()->GetURL(
- "/navigation_controller/simple_page_1.html"));
- std::string script = "location.replace('" + frame_url.spec() + "')";
- EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
- capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
- capturer.params().transition);
- EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, capturer.details().type);
- EXPECT_FALSE(capturer.details().is_in_page);
- }
-
// Now, various in-page navigations.
{
@@ -906,7 +945,9 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
capturer.Wait();
EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
capturer.params().transition);
+ // Unlike location.replace, this updates the existing entry.
EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
EXPECT_TRUE(capturer.details().is_in_page);
}
@@ -1045,7 +1086,8 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
"/navigation_controller/simple_page_1.html"));
NavigateFrameToURL(root->child_at(0), frame_url);
capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+ // TODO(creis): This doesn't seem right.
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, capturer.transition_type());
}
{
@@ -1116,16 +1158,50 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type);
}
+ // Go back so that we can ensure location.replace leaves the forward history.
+ {
+ FrameNavigateParamsCapturer capturer(root->child_at(0));
+ shell()->web_contents()->GetController().GoBack();
+ capturer.Wait();
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
+ }
+
{
// location.replace().
- LoadCommittedCapturer capturer(root->child_at(0));
+ FrameNavigateParamsCapturer capturer(root->child_at(0));
GURL frame_url(embedded_test_server()->GetURL(
"/navigation_controller/simple_page_2.html"));
std::string script = "location.replace('" + frame_url.spec() + "')";
EXPECT_TRUE(content::ExecuteScript(root->child_at(0)->current_frame_host(),
script));
capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+ // Unlike replaceState, this replaces the existing entry with a new one.
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME,
+ capturer.params().transition);
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
+
+ // Make sure the forward history did not get pruned.
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
+ }
+
+ {
+ // Cross-site location.replace().
+ FrameNavigateParamsCapturer capturer(root->child_at(0));
+ GURL frame_url(embedded_test_server()->GetURL(
+ "foo.com", "/navigation_controller/simple_page_2.html"));
+ std::string script = "location.replace('" + frame_url.spec() + "')";
+ EXPECT_TRUE(content::ExecuteScript(root->child_at(0)->current_frame_host(),
+ script));
+ capturer.Wait();
+ // Unlike replaceState, this replaces the existing entry with a new one.
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME,
+ capturer.params().transition);
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type);
+ EXPECT_TRUE(capturer.details().did_replace_entry);
+
+ // Make sure the forward history did not get pruned.
+ EXPECT_TRUE(shell()->web_contents()->GetController().CanGoForward());
}
{
@@ -1149,6 +1225,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_TRUE(content::ExecuteScript(root->child_at(0)->current_frame_host(),
script));
capturer.Wait();
+ // Unlike location.replace, this updates the existing entry.
EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
}
@@ -1203,7 +1280,8 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, details[0].type);
EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
params[1].transition);
- EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, details[1].type);
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, details[1].type);
+ EXPECT_TRUE(details[1].did_replace_entry);
}
}
@@ -1386,7 +1464,8 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
}
EXPECT_FALSE(root->child_at(1)->has_committed_real_load());
- // 3. A real same-site navigation in the nested iframe should be AUTO.
+ // 3. A real same-site navigation in the nested iframe should be MANUAL with
+ // replacement.
GURL frame_url(embedded_test_server()->GetURL(
"/navigation_controller/simple_page_1.html"));
{
@@ -1396,30 +1475,32 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_TRUE(content::ExecuteScript(root->child_at(0)->current_frame_host(),
script));
capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, capturer.transition_type());
}
// Check last committed NavigationEntry. It should have replaced the previous
- // frame entry in the original NavigationEntry.
+ // NavigationEntry.
EXPECT_EQ(1, controller.GetEntryCount());
- EXPECT_EQ(entry, controller.GetLastCommittedEntry());
+ NavigationEntryImpl* entry2 = controller.GetLastCommittedEntry();
+ EXPECT_NE(entry, entry2);
// Verify subframe entries if they're enabled (e.g. in --site-per-process).
if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
// The entry should still have one nested subframe FrameNavigationEntry.
- ASSERT_EQ(1U, entry->root_node()->children[0]->children.size());
+ ASSERT_EQ(1U, entry2->root_node()->children[0]->children.size());
FrameNavigationEntry* frame_entry =
- entry->root_node()->children[0]->children[0]->frame_entry.get();
+ entry2->root_node()->children[0]->children[0]->frame_entry.get();
EXPECT_EQ(frame_url, frame_entry->url());
} else {
// There are no subframe FrameNavigationEntries by default.
- EXPECT_EQ(0U, entry->root_node()->children.size());
+ EXPECT_EQ(0U, entry2->root_node()->children.size());
}
EXPECT_FALSE(root->child_at(0)->has_committed_real_load());
EXPECT_TRUE(root->child_at(0)->child_at(0)->has_committed_real_load());
EXPECT_FALSE(root->child_at(1)->has_committed_real_load());
- // 4. A real cross-site navigation in the second iframe should be AUTO.
+ // 4. A real cross-site navigation in the second iframe should be MANUAL with
+ // replacement.
GURL foo_url(embedded_test_server()->GetURL(
"foo.com", "/navigation_controller/simple_page_2.html"));
{
@@ -1428,23 +1509,24 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
"frames[1].src = '" + foo_url.spec() + "';";
EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, capturer.transition_type());
}
// Check last committed NavigationEntry.
EXPECT_EQ(1, controller.GetEntryCount());
- EXPECT_EQ(entry, controller.GetLastCommittedEntry());
+ NavigationEntryImpl* entry3 = controller.GetLastCommittedEntry();
+ EXPECT_NE(entry2, entry3);
// Verify subframe entries if they're enabled (e.g. in --site-per-process).
if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
// The entry should still have two subframe FrameNavigationEntries.
- ASSERT_EQ(2U, entry->root_node()->children.size());
+ ASSERT_EQ(2U, entry3->root_node()->children.size());
FrameNavigationEntry* frame_entry =
- entry->root_node()->children[1]->frame_entry.get();
+ entry3->root_node()->children[1]->frame_entry.get();
EXPECT_EQ(foo_url, frame_entry->url());
} else {
// There are no subframe FrameNavigationEntries by default.
- EXPECT_EQ(0U, entry->root_node()->children.size());
+ EXPECT_EQ(0U, entry3->root_node()->children.size());
}
EXPECT_FALSE(root->child_at(0)->has_committed_real_load());
EXPECT_TRUE(root->child_at(0)->child_at(0)->has_committed_real_load());
@@ -1465,18 +1547,18 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
// This should have created a new NavigationEntry.
EXPECT_EQ(2, controller.GetEntryCount());
- EXPECT_NE(entry, controller.GetLastCommittedEntry());
- NavigationEntryImpl* entry2 = controller.GetLastCommittedEntry();
+ NavigationEntryImpl* entry4 = controller.GetLastCommittedEntry();
+ EXPECT_NE(entry3, entry4);
// Verify subframe entries if they're enabled (e.g. in --site-per-process).
if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
- ASSERT_EQ(2U, entry->root_node()->children.size());
+ ASSERT_EQ(2U, entry4->root_node()->children.size());
FrameNavigationEntry* frame_entry =
- entry2->root_node()->children[0]->children[0]->frame_entry.get();
+ entry4->root_node()->children[0]->children[0]->frame_entry.get();
EXPECT_EQ(about_blank_url, frame_entry->url());
} else {
// There are no subframe FrameNavigationEntries by default.
- EXPECT_EQ(0U, entry->root_node()->children.size());
+ EXPECT_EQ(0U, entry4->root_node()->children.size());
}
EXPECT_FALSE(root->child_at(0)->has_committed_real_load());
EXPECT_TRUE(root->child_at(0)->child_at(0)->has_committed_real_load());
@@ -1805,7 +1887,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
EXPECT_EQ(0U, entry3->root_node()->children.size());
}
- // 6. Navigate the second subframe cross-site, clearing its existing subtree.
+ // 5. Navigate the second subframe cross-site, clearing its existing subtree.
GURL baz_url(embedded_test_server()->GetURL(
"baz.com", "/navigation_controller/simple_page_1.html"));
{
@@ -1876,7 +1958,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
LoadCommittedCapturer capturer(root->child_at(0));
NavigateFrameToURL(root->child_at(0), subframe_url);
capturer.Wait();
- EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+ EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, capturer.transition_type());
}
// 2. In-page navigation in the main frame.
@@ -3146,6 +3228,16 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, ReloadOriginalRequest) {
RenderProcessKilledObserver kill_observer(shell()->web_contents());
// Redirect so that we can use ReloadOriginalRequest.
+ // TODO(creis): The test is failing because this replacement isn't preserving
+ // the redirect chain or original_request_url for a cross process transfer.
+ // I think it worked before because those values stuck around when we just
+ // updated the old NavEntry, but that's not a safe thing to do on a
+ // SiteInstance change. Instead, we should propagate them during the transfer
+ // so that they show up in the new commit.
+ // We appear to be trying to propagate the redirect chain, but the request in
+ // the network stack doesn't have the earlier items in the chain. Is this a
+ // bug or expected? Does it apply to all client redirects, or just this test?
+ // Does it apply to server redirects?
GURL redirect_url(embedded_test_server()->GetURL(
"foo.com", "/navigation_controller/simple_page_1.html"));
{
@@ -3155,7 +3247,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, ReloadOriginalRequest) {
capturer.Wait();
EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
capturer.params().transition);
- EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, capturer.details().type);
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.details().type);
}
// Modify an entry in the session history and reload the original request.
@@ -3183,6 +3275,7 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, ReloadOriginalRequest) {
capturer.set_navigations_remaining(2);
capturer.Wait();
EXPECT_EQ(2U, capturer.all_details().size());
+ // TODO(creis): This is failing in --site-per-process.
EXPECT_EQ(modified_url, capturer.all_params()[0].url);
EXPECT_EQ(original_url, capturer.all_params()[1].url);
EXPECT_EQ(original_url, shell()->web_contents()->GetLastCommittedURL());

Powered by Google App Engine
This is Rietveld 408576698