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

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

Issue 1496483002: OOPIF: Support session restore by combining/splitting frame PageStates. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix remaining tests Created 5 years 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 <queue> 7 #include <queue>
8 8
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "components/url_formatter/url_formatter.h" 12 #include "components/url_formatter/url_formatter.h"
13 #include "content/common/navigation_params.h" 13 #include "content/common/navigation_params.h"
14 #include "content/common/page_state_serialization.h" 14 #include "content/common/page_state_serialization.h"
15 #include "content/common/site_isolation_policy.h" 15 #include "content/common/site_isolation_policy.h"
16 #include "content/public/common/content_constants.h" 16 #include "content/public/common/content_constants.h"
17 #include "content/public/common/url_constants.h" 17 #include "content/public/common/url_constants.h"
18 #include "ui/gfx/text_elider.h" 18 #include "ui/gfx/text_elider.h"
19 19
20 using base::UTF16ToUTF8;
21
22 namespace content {
23
24 namespace {
25
20 // Use this to get a new unique ID for a NavigationEntry during construction. 26 // Use this to get a new unique ID for a NavigationEntry during construction.
21 // The returned ID is guaranteed to be nonzero (which is the "no ID" indicator). 27 // The returned ID is guaranteed to be nonzero (which is the "no ID" indicator).
22 static int GetUniqueIDInConstructor() { 28 int GetUniqueIDInConstructor() {
23 static int unique_id_counter = 0; 29 static int unique_id_counter = 0;
24 return ++unique_id_counter; 30 return ++unique_id_counter;
25 } 31 }
26 32
27 namespace content { 33 void RecursivelyGenerateFrameEntries(const ExplodedFrameState& state,
34 NavigationEntryImpl::TreeNode* node) {
35 node->frame_entry = new FrameNavigationEntry(
36 -1, UTF16ToUTF8(state.target.string()), state.item_sequence_number,
37 state.document_sequence_number, nullptr, GURL(state.url_string.string()),
38 Referrer(GURL(state.referrer.string()), state.referrer_policy));
39
40 // Set a single-frame PageState on the entry.
41 ExplodedPageState page_state;
42 page_state.top = state;
43 std::string data;
44 if (EncodePageState(page_state, &data))
45 node->frame_entry->set_page_state(PageState::CreateFromEncodedData(data));
46
47 for (const ExplodedFrameState& child_state : state.children) {
48 NavigationEntryImpl::TreeNode* child_node =
49 new NavigationEntryImpl::TreeNode(nullptr);
50 node->children.push_back(child_node);
51 RecursivelyGenerateFrameEntries(child_state, child_node);
52 }
53 }
54
55 void RecursivelyGenerateFrameState(
56 NavigationEntryImpl::TreeNode* node,
57 ExplodedFrameState* state,
58 std::vector<base::NullableString16>* referenced_files) {
59 // The FrameNavigationEntry's PageState contains just the ExplodedFrameState
60 // for that particular frame.
61 ExplodedPageState exploded_page_state;
62 if (!DecodePageState(node->frame_entry->page_state().ToEncodedData(),
63 &exploded_page_state)) {
64 NOTREACHED();
65 return;
66 }
67 ExplodedFrameState frame_state = exploded_page_state.top;
68
69 // Copy the FrameNavigationEntry's frame state into the destination state.
70 *state = frame_state;
71
72 // Copy the frame's files into the PageState's |referenced_files|.
73 referenced_files->reserve(referenced_files->size() +
74 exploded_page_state.referenced_files.size());
75 for (auto& file : exploded_page_state.referenced_files)
76 referenced_files->push_back(file);
77
78 state->children.resize(node->children.size());
79 for (size_t i = 0; i < node->children.size(); ++i) {
80 RecursivelyGenerateFrameState(node->children[i], &state->children[i],
81 referenced_files);
82 }
83 }
84
85 } // namespace
28 86
29 int NavigationEntryImpl::kInvalidBindings = -1; 87 int NavigationEntryImpl::kInvalidBindings = -1;
30 88
31 NavigationEntryImpl::TreeNode::TreeNode(FrameNavigationEntry* frame_entry) 89 NavigationEntryImpl::TreeNode::TreeNode(FrameNavigationEntry* frame_entry)
32 : frame_entry(frame_entry) { 90 : frame_entry(frame_entry) {
33 } 91 }
34 92
35 NavigationEntryImpl::TreeNode::~TreeNode() { 93 NavigationEntryImpl::TreeNode::~TreeNode() {
36 } 94 }
37 95
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 void NavigationEntryImpl::SetTitle(const base::string16& title) { 231 void NavigationEntryImpl::SetTitle(const base::string16& title) {
174 title_ = title; 232 title_ = title;
175 cached_display_title_.clear(); 233 cached_display_title_.clear();
176 } 234 }
177 235
178 const base::string16& NavigationEntryImpl::GetTitle() const { 236 const base::string16& NavigationEntryImpl::GetTitle() const {
179 return title_; 237 return title_;
180 } 238 }
181 239
182 void NavigationEntryImpl::SetPageState(const PageState& state) { 240 void NavigationEntryImpl::SetPageState(const PageState& state) {
183 frame_tree_->frame_entry->set_page_state(state); 241 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
242 frame_tree_->frame_entry->set_page_state(state);
243 return;
244 }
184 245
185 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { 246 // This should only be called when restoring a NavigationEntry, so there
186 // Also get the root ISN and DSN out of the PageState. 247 // should be no subframe FrameNavigationEntries yet.
187 ExplodedPageState exploded_state; 248 DCHECK_EQ(0U, frame_tree_->children.size());
188 if (!DecodePageState(state.ToEncodedData(), &exploded_state)) 249
189 return; 250 // If the PageState can't be parsed or has no children, just store it on the
190 frame_tree_->frame_entry->set_item_sequence_number( 251 // main frame's FrameNavigationEntry without recursively creating subframe
191 exploded_state.top.item_sequence_number); 252 // entries.
192 frame_tree_->frame_entry->set_document_sequence_number( 253 ExplodedPageState exploded_state;
193 exploded_state.top.document_sequence_number); 254 if (!DecodePageState(state.ToEncodedData(), &exploded_state) ||
255 exploded_state.top.children.size() == 0U) {
256 frame_tree_->frame_entry->set_page_state(state);
257 return;
194 } 258 }
259
260 RecursivelyGenerateFrameEntries(exploded_state.top, frame_tree_.get());
195 } 261 }
196 262
197 const PageState& NavigationEntryImpl::GetPageState() const { 263 PageState NavigationEntryImpl::GetPageState() const {
198 return frame_tree_->frame_entry->page_state(); 264 // Just return the main frame's PageState in default Chrome, or if there are
265 // no subframe FrameNavigationEntries.
266 if (!SiteIsolationPolicy::UseSubframeNavigationEntries() ||
267 frame_tree_->children.size() == 0U)
268 return frame_tree_->frame_entry->page_state();
269
270 // When we're using subframe entries, each FrameNavigationEntry has a
271 // frame-specific PageState. We combine these into an ExplodedPageState tree
272 // and generate a full PageState from it.
273 ExplodedPageState exploded_state;
274 RecursivelyGenerateFrameState(frame_tree_.get(), &exploded_state.top,
275 &exploded_state.referenced_files);
276
277 std::string encoded_data;
278 if (!EncodePageState(exploded_state, &encoded_data))
279 return frame_tree_->frame_entry->page_state();
280
281 return PageState::CreateFromEncodedData(encoded_data);
199 } 282 }
200 283
201 void NavigationEntryImpl::SetPageID(int page_id) { 284 void NavigationEntryImpl::SetPageID(int page_id) {
202 page_id_ = page_id; 285 page_id_ = page_id;
203 } 286 }
204 287
205 int32 NavigationEntryImpl::GetPageID() const { 288 int32 NavigationEntryImpl::GetPageID() const {
206 return page_id_; 289 return page_id_;
207 } 290 }
208 291
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 return node; 723 return node;
641 } 724 }
642 // Enqueue any children and keep looking. 725 // Enqueue any children and keep looking.
643 for (auto& child : node->children) 726 for (auto& child : node->children)
644 work_queue.push(child); 727 work_queue.push(child);
645 } 728 }
646 return nullptr; 729 return nullptr;
647 } 730 }
648 731
649 } // namespace content 732 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_entry_impl.h ('k') | content/public/browser/navigation_entry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698