Store the committed origin for navigation in FrameNavigationEntry.

Bug: 882053
Change-Id: I36960aa5fbab5ef8d3ba89158f31d408950da34b
Reviewed-on: https://chromium-review.googlesource.com/c/1344876
Reviewed-by: Alex Moshchuk <[email protected]>
Commit-Queue: Nasko Oskov <[email protected]>
Cr-Commit-Position: refs/heads/master@{#614247}
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 4716f8f..e3f3d59 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -1222,8 +1222,9 @@
     FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
         rfh->frame_tree_node()->unique_name(), params.item_sequence_number,
         params.document_sequence_number, rfh->GetSiteInstance(), nullptr,
-        params.url, params.referrer, params.redirects, params.page_state,
-        params.method, params.post_id, nullptr /* blob_url_loader_factory */);
+        params.url, &params.origin, params.referrer, params.redirects,
+        params.page_state, params.method, params.post_id,
+        nullptr /* blob_url_loader_factory */);
 
     new_entry = GetLastCommittedEntry()->CloneAndReplace(
         frame_entry, true, rfh->frame_tree_node(),
@@ -1334,6 +1335,7 @@
   frame_entry->SetPageState(params.page_state);
   frame_entry->set_method(params.method);
   frame_entry->set_post_id(params.post_id);
+  frame_entry->set_origin(params.origin);
 
   // history.pushState() is classified as a navigation to a new page, but sets
   // is_same_document to true. In this case, we already have the title and
@@ -1511,8 +1513,9 @@
   entry->AddOrUpdateFrameEntry(
       rfh->frame_tree_node(), params.item_sequence_number,
       params.document_sequence_number, rfh->GetSiteInstance(), nullptr,
-      params.url, params.referrer, params.redirects, params.page_state,
-      params.method, params.post_id, nullptr /* blob_url_loader_factory */);
+      params.url, params.origin, params.referrer, params.redirects,
+      params.page_state, params.method, params.post_id,
+      nullptr /* blob_url_loader_factory */);
 
   // The redirected to page should not inherit the favicon from the previous
   // page.
@@ -1584,8 +1587,9 @@
   existing_entry->AddOrUpdateFrameEntry(
       rfh->frame_tree_node(), params.item_sequence_number,
       params.document_sequence_number, rfh->GetSiteInstance(), nullptr,
-      params.url, params.referrer, params.redirects, params.page_state,
-      params.method, params.post_id, nullptr /* blob_url_loader_factory */);
+      params.url, params.origin, params.referrer, params.redirects,
+      params.page_state, params.method, params.post_id,
+      nullptr /* blob_url_loader_factory */);
 
   DiscardNonCommittedEntries();
 }
@@ -1615,8 +1619,9 @@
   scoped_refptr<FrameNavigationEntry> frame_entry(new FrameNavigationEntry(
       rfh->frame_tree_node()->unique_name(), params.item_sequence_number,
       params.document_sequence_number, rfh->GetSiteInstance(), nullptr,
-      params.url, params.referrer, params.redirects, params.page_state,
-      params.method, params.post_id, nullptr /* blob_url_loader_factory */));
+      params.url, &params.origin, params.referrer, params.redirects,
+      params.page_state, params.method, params.post_id,
+      nullptr /* blob_url_loader_factory */));
 
   std::unique_ptr<NavigationEntryImpl> new_entry =
       GetLastCommittedEntry()->CloneAndReplace(
@@ -1685,8 +1690,9 @@
   last_committed->AddOrUpdateFrameEntry(
       rfh->frame_tree_node(), params.item_sequence_number,
       params.document_sequence_number, rfh->GetSiteInstance(), nullptr,
-      params.url, params.referrer, params.redirects, params.page_state,
-      params.method, params.post_id, nullptr /* blob_url_loader_factory */);
+      params.url, params.origin, params.referrer, params.redirects,
+      params.page_state, params.method, params.post_id,
+      nullptr /* blob_url_loader_factory */);
 
   return send_commit_notification;
 }
@@ -2011,6 +2017,11 @@
     const std::string& extra_headers,
     scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory) {
   FrameTreeNode* node = render_frame_host->frame_tree_node();
+
+  // TODO(nasko): Plumb through the real initiator origin and use it to
+  // compute the origin to use.
+  url::Origin origin_to_use;
+
   // Create a NavigationEntry for the transfer, without making it the pending
   // entry. Subframe transfers should have a clone of the last committed entry
   // with a FrameNavigationEntry for the target frame. Main frame transfers
@@ -2039,8 +2050,9 @@
     }
     entry->AddOrUpdateFrameEntry(
         node, -1, -1, nullptr,
-        static_cast<SiteInstanceImpl*>(source_site_instance), url, referrer,
-        std::vector<GURL>(), PageState(), method, -1, blob_url_loader_factory);
+        static_cast<SiteInstanceImpl*>(source_site_instance), url,
+        origin_to_use, referrer, std::vector<GURL>(), PageState(), method, -1,
+        blob_url_loader_factory);
   } else {
     // Main frame case.
     entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry(
@@ -2073,8 +2085,9 @@
   if (!frame_entry) {
     frame_entry = new FrameNavigationEntry(
         node->unique_name(), -1, -1, nullptr,
-        static_cast<SiteInstanceImpl*>(source_site_instance), url, referrer,
-        std::vector<GURL>(), PageState(), method, -1, blob_url_loader_factory);
+        static_cast<SiteInstanceImpl*>(source_site_instance), url,
+        &origin_to_use, referrer, std::vector<GURL>(), PageState(), method, -1,
+        blob_url_loader_factory);
   }
 
   LoadURLParams params(url);
@@ -2654,11 +2667,16 @@
     // Create an identical NavigationEntry with a new FrameNavigationEntry for
     // the target subframe.
     entry = GetLastCommittedEntry()->Clone();
+
+    // TODO(nasko): Investigate what is the proper origin to supply here
+    // or whether a valid one is required.
+    url::Origin origin;
+
     entry->AddOrUpdateFrameEntry(
         node, -1, -1, nullptr,
         static_cast<SiteInstanceImpl*>(params.source_site_instance.get()),
-        params.url, params.referrer, params.redirect_chain, PageState(), "GET",
-        -1, blob_url_loader_factory);
+        params.url, origin, params.referrer, params.redirect_chain, PageState(),
+        "GET", -1, blob_url_loader_factory);
   } else {
     // Otherwise, create a pending entry for the main frame.