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

Side by Side Diff: content/browser/frame_host/navigation_entry_impl.cc

Issue 2482873002: Add is_srcdoc to FrameNavigationEntry and restore about::srcdoc URL. (Closed)
Patch Set: Addressed comments (@nasko) Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/navigation_entry_impl.h" 5 #include "content/browser/frame_host/navigation_entry_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <queue> 9 #include <queue>
10 #include <utility> 10 #include <utility>
(...skipping 27 matching lines...) Expand all
38 // The returned ID is guaranteed to be nonzero (which is the "no ID" indicator). 38 // The returned ID is guaranteed to be nonzero (which is the "no ID" indicator).
39 int GetUniqueIDInConstructor() { 39 int GetUniqueIDInConstructor() {
40 static int unique_id_counter = 0; 40 static int unique_id_counter = 0;
41 return ++unique_id_counter; 41 return ++unique_id_counter;
42 } 42 }
43 43
44 void RecursivelyGenerateFrameEntries( 44 void RecursivelyGenerateFrameEntries(
45 const ExplodedFrameState& state, 45 const ExplodedFrameState& state,
46 const std::vector<base::NullableString16>& referenced_files, 46 const std::vector<base::NullableString16>& referenced_files,
47 NavigationEntryImpl::TreeNode* node) { 47 NavigationEntryImpl::TreeNode* node) {
48 GURL renderer_url(state.url_string.string());
49 bool is_srcdoc = (renderer_url == GURL(content::kAboutSrcDocURL));
50 GURL browser_url = is_srcdoc ? GURL(url::kAboutBlankURL) : renderer_url;
51
48 node->frame_entry = new FrameNavigationEntry( 52 node->frame_entry = new FrameNavigationEntry(
49 UTF16ToUTF8(state.target.string()), state.item_sequence_number, 53 UTF16ToUTF8(state.target.string()), state.item_sequence_number,
50 state.document_sequence_number, nullptr, nullptr, 54 state.document_sequence_number, nullptr, nullptr, browser_url,
51 GURL(state.url_string.string()), 55 Referrer(GURL(state.referrer.string()), state.referrer_policy), "GET", -1,
52 Referrer(GURL(state.referrer.string()), state.referrer_policy), "GET", 56 is_srcdoc);
53 -1);
54 57
55 // Set a single-frame PageState on the entry. 58 // Set a single-frame PageState on the entry.
56 ExplodedPageState page_state; 59 ExplodedPageState page_state;
57 60
58 // Copy the incoming PageState's list of referenced files into the main 61 // Copy the incoming PageState's list of referenced files into the main
59 // frame's PageState. (We don't pass the list to subframes below.) 62 // frame's PageState. (We don't pass the list to subframes below.)
60 // TODO(creis): Grant access to this list for each process that renders 63 // TODO(creis): Grant access to this list for each process that renders
61 // this page, even for OOPIFs. Eventually keep track of a verified list of 64 // this page, even for OOPIFs. Eventually keep track of a verified list of
62 // files per frame, so that we only grant access to processes that need it. 65 // files per frame, so that we only grant access to processes that need it.
63 if (referenced_files.size() > 0) 66 if (referenced_files.size() > 0)
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 bool is_renderer_initiated) 256 bool is_renderer_initiated)
254 : frame_tree_(new TreeNode(nullptr, 257 : frame_tree_(new TreeNode(nullptr,
255 new FrameNavigationEntry("", 258 new FrameNavigationEntry("",
256 -1, 259 -1,
257 -1, 260 -1,
258 std::move(instance), 261 std::move(instance),
259 nullptr, 262 nullptr,
260 url, 263 url,
261 referrer, 264 referrer,
262 "GET", 265 "GET",
263 -1))), 266 -1,
267 false))),
264 unique_id_(GetUniqueIDInConstructor()), 268 unique_id_(GetUniqueIDInConstructor()),
265 bindings_(kInvalidBindings), 269 bindings_(kInvalidBindings),
266 page_type_(PAGE_TYPE_NORMAL), 270 page_type_(PAGE_TYPE_NORMAL),
267 update_virtual_url_with_url_(false), 271 update_virtual_url_with_url_(false),
268 title_(title), 272 title_(title),
269 transition_type_(transition_type), 273 transition_type_(transition_type),
270 restore_type_(RestoreType::NONE), 274 restore_type_(RestoreType::NONE),
271 is_overriding_user_agent_(false), 275 is_overriding_user_agent_(false),
272 http_status_code_(0), 276 http_status_code_(0),
273 is_renderer_initiated_(is_renderer_initiated), 277 is_renderer_initiated_(is_renderer_initiated),
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 FrameTreeNode* frame_tree_node, 795 FrameTreeNode* frame_tree_node,
792 int64_t item_sequence_number, 796 int64_t item_sequence_number,
793 int64_t document_sequence_number, 797 int64_t document_sequence_number,
794 SiteInstanceImpl* site_instance, 798 SiteInstanceImpl* site_instance,
795 scoped_refptr<SiteInstanceImpl> source_site_instance, 799 scoped_refptr<SiteInstanceImpl> source_site_instance,
796 const GURL& url, 800 const GURL& url,
797 const Referrer& referrer, 801 const Referrer& referrer,
798 const std::vector<GURL>& redirect_chain, 802 const std::vector<GURL>& redirect_chain,
799 const PageState& page_state, 803 const PageState& page_state,
800 const std::string& method, 804 const std::string& method,
801 int64_t post_id) { 805 int64_t post_id,
806 bool is_srcdoc) {
802 // If this is called for the main frame, the FrameNavigationEntry is 807 // If this is called for the main frame, the FrameNavigationEntry is
803 // guaranteed to exist, so just update it directly and return. 808 // guaranteed to exist, so just update it directly and return.
804 if (frame_tree_node->IsMainFrame()) { 809 if (frame_tree_node->IsMainFrame()) {
805 // If the document of the FrameNavigationEntry is changing, we must clear 810 // If the document of the FrameNavigationEntry is changing, we must clear
806 // any child FrameNavigationEntries. 811 // any child FrameNavigationEntries.
807 if (root_node()->frame_entry->document_sequence_number() != 812 if (root_node()->frame_entry->document_sequence_number() !=
808 document_sequence_number) 813 document_sequence_number)
809 root_node()->children.clear(); 814 root_node()->children.clear();
810 815
811 root_node()->frame_entry->UpdateEntry( 816 root_node()->frame_entry->UpdateEntry(
812 frame_tree_node->unique_name(), item_sequence_number, 817 frame_tree_node->unique_name(), item_sequence_number,
813 document_sequence_number, site_instance, 818 document_sequence_number, site_instance,
814 std::move(source_site_instance), url, referrer, redirect_chain, 819 std::move(source_site_instance), url, referrer, redirect_chain,
815 page_state, method, post_id); 820 page_state, method, post_id, is_srcdoc);
816 return; 821 return;
817 } 822 }
818 823
819 // We should already have a TreeNode for the parent node by the time this node 824 // We should already have a TreeNode for the parent node by the time this node
820 // commits. Find it first. 825 // commits. Find it first.
821 NavigationEntryImpl::TreeNode* parent_node = 826 NavigationEntryImpl::TreeNode* parent_node =
822 FindFrameEntry(frame_tree_node->parent()); 827 FindFrameEntry(frame_tree_node->parent());
823 if (!parent_node) { 828 if (!parent_node) {
824 // The renderer should not send a commit for a subframe before its parent. 829 // The renderer should not send a commit for a subframe before its parent.
825 // TODO(creis): Kill the renderer if we get here. 830 // TODO(creis): Kill the renderer if we get here.
826 return; 831 return;
827 } 832 }
828 833
829 // Now check whether we have a TreeNode for the node itself. 834 // Now check whether we have a TreeNode for the node itself.
830 const std::string& unique_name = frame_tree_node->unique_name(); 835 const std::string& unique_name = frame_tree_node->unique_name();
831 for (TreeNode* child : parent_node->children) { 836 for (TreeNode* child : parent_node->children) {
832 if (child->frame_entry->frame_unique_name() == unique_name) { 837 if (child->frame_entry->frame_unique_name() == unique_name) {
833 // If the document of the FrameNavigationEntry is changing, we must clear 838 // If the document of the FrameNavigationEntry is changing, we must clear
834 // any child FrameNavigationEntries. 839 // any child FrameNavigationEntries.
835 if (child->frame_entry->document_sequence_number() != 840 if (child->frame_entry->document_sequence_number() !=
836 document_sequence_number) 841 document_sequence_number)
837 child->children.clear(); 842 child->children.clear();
838 843
839 // Update the existing FrameNavigationEntry (e.g., for replaceState). 844 // Update the existing FrameNavigationEntry (e.g., for replaceState).
840 child->frame_entry->UpdateEntry( 845 child->frame_entry->UpdateEntry(
841 unique_name, item_sequence_number, document_sequence_number, 846 unique_name, item_sequence_number, document_sequence_number,
842 site_instance, std::move(source_site_instance), url, referrer, 847 site_instance, std::move(source_site_instance), url, referrer,
843 redirect_chain, page_state, method, post_id); 848 redirect_chain, page_state, method, post_id, is_srcdoc);
844 return; 849 return;
845 } 850 }
846 } 851 }
847 852
848 // No entry exists yet, so create a new one. 853 // No entry exists yet, so create a new one.
849 // Unordered list, since we expect to look up entries by frame sequence number 854 // Unordered list, since we expect to look up entries by frame sequence number
850 // or unique name. 855 // or unique name.
851 FrameNavigationEntry* frame_entry = new FrameNavigationEntry( 856 FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
852 unique_name, item_sequence_number, document_sequence_number, 857 unique_name, item_sequence_number, document_sequence_number,
853 site_instance, std::move(source_site_instance), url, referrer, method, 858 site_instance, std::move(source_site_instance), url, referrer, method,
854 post_id); 859 post_id, is_srcdoc);
855 frame_entry->SetPageState(page_state); 860 frame_entry->SetPageState(page_state);
856 frame_entry->set_redirect_chain(redirect_chain); 861 frame_entry->set_redirect_chain(redirect_chain);
857 parent_node->children.push_back( 862 parent_node->children.push_back(
858 new NavigationEntryImpl::TreeNode(parent_node, frame_entry)); 863 new NavigationEntryImpl::TreeNode(parent_node, frame_entry));
859 } 864 }
860 865
861 FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry( 866 FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry(
862 FrameTreeNode* frame_tree_node) const { 867 FrameTreeNode* frame_tree_node) const {
863 NavigationEntryImpl::TreeNode* tree_node = FindFrameEntry(frame_tree_node); 868 NavigationEntryImpl::TreeNode* tree_node = FindFrameEntry(frame_tree_node);
864 return tree_node ? tree_node->frame_entry.get() : nullptr; 869 return tree_node ? tree_node->frame_entry.get() : nullptr;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 return node; 961 return node;
957 962
958 // Enqueue any children and keep looking. 963 // Enqueue any children and keep looking.
959 for (auto* child : node->children) 964 for (auto* child : node->children)
960 work_queue.push(child); 965 work_queue.push(child);
961 } 966 }
962 return nullptr; 967 return nullptr;
963 } 968 }
964 969
965 } // namespace content 970 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_entry_impl.h ('k') | content/browser/frame_host/navigation_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698