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>