Always use the referrer used to load the document on same-document navigations
DidCommitProvisionalLoadParams has the `referrer` param that is used
to save the `referrer` attribute in FrameNavigationEntry after commit.
Currently, most same-document navigations will use the initial referrer
that's used to load the document, even after several navigations. An
exception to this is if the navigation is classified as a client-side
redirect, in which case the previous URL is used. This seems to be
accidental, as the `referrer_` that's tracked in the DocumentLoader is
never actually updated for these navigations, so future same-document
navigations will still use the initial referrer that's used to load the
document.
This CL removes the special behavior for client-side redirect same-doc
navigations, to make the behavior more predictable, making it easier
to calculate the `referrer` param in the browser in the future, and also
allows us to remove the redirect chain in the renderer completely in
crrev.com/c/2933038.
Bug: 1171210, 1131832
Change-Id: If460d5fe08ab5795b3dd4d69b0188289d8253839
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2938762
Commit-Queue: Rakina Zata Amni <rakina@chromium.org>
Reviewed-by: David Van Cleve <davidvc@chromium.org>
Reviewed-by: Arthur Sonzogni <arthursonzogni@chromium.org>
Reviewed-by: Antonio Sartori <antoniosartori@chromium.org>
Cr-Commit-Position: refs/heads/master@{#892950}
diff --git a/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent-then-fragment.html b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent-then-fragment.html
new file mode 100644
index 0000000..d01ef4c
--- /dev/null
+++ b/html/browsers/browsing-the-web/navigating-across-documents/source/navigate-child-function-parent-then-fragment.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>
+ Set location from a parent, then do a fragment navigation from within the
+ frame.
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe></iframe>
+<script>
+ promise_test(async test => {
+ // Wait for the DOM to be ready before inserting an <iframe> into it.
+ await new Promise(resolve => { onload = resolve });
+ // Insert an <iframe> and wait for a dummy document to be loaded into it.
+ let iframe = document.createElement("iframe");
+ iframe.src = "support/dummy.html";
+ let iframe_loaded = new Promise(resolve => { iframe.onload = resolve });
+ document.body.appendChild(iframe);
+ await iframe_loaded;
+ // The referrer is the main frame's URL since it initiated the iframe
+ // creation.
+ assert_equals(iframe.contentDocument.referrer, document.URL);
+ // Do a fragment navigation from the frame, which will fire the
+ // 'hashchange' function.
+ let hash_changed = new Promise(resolve => {
+ iframe.contentWindow.onhashchange = resolve
+ });
+ let navigateScript = iframe.contentDocument.createElement("script");
+ navigateScript.innerHTML = "location.href = '#foo'";
+ iframe.contentDocument.body.appendChild(navigateScript);
+ await hash_changed;
+ // The referrer stays the same, even when the last navigation was
+ // initiated by the iframe (instead of the main frame document).
+ assert_equals(iframe.contentDocument.referrer, document.URL);
+ });
+</script>