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

Unified Diff: content/browser/frame_host/navigation_entry_impl.cc

Issue 1816763002: OOPIF: Fix subframe back/forward after recreating FTNs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix review comments Created 4 years, 8 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/frame_host/navigation_entry_impl.h ('k') | content/browser/frame_host/navigator_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/frame_host/navigation_entry_impl.cc
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc
index dad94ba030d853b86ddf2e99d377b63661dc054e..fc3a57c9a94290261b27f899796b93777015186d 100644
--- a/content/browser/frame_host/navigation_entry_impl.cc
+++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -100,11 +100,19 @@ NavigationEntryImpl::TreeNode::~TreeNode() {
}
bool NavigationEntryImpl::TreeNode::MatchesFrame(
- FrameTreeNode* frame_tree_node) const {
+ FrameTreeNode* frame_tree_node) {
if (frame_tree_node->frame_tree_node_id() ==
frame_entry->frame_tree_node_id())
return true;
+ if (frame_tree_node->current_replication_state().unique_name ==
+ frame_entry->frame_unique_name()) {
+ // If we find a match by unique name but not FrameTreeNode ID, then the
+ // FrameTreeNode ID on the entry is stale and should be updated.
+ frame_entry->set_frame_tree_node_id(frame_tree_node->frame_tree_node_id());
+ return true;
+ }
+
// For now, we set the root FNE's FrameTreeNode ID to -1.
return frame_tree_node->IsMainFrame() &&
frame_entry->frame_tree_node_id() == -1;
@@ -113,7 +121,7 @@ bool NavigationEntryImpl::TreeNode::MatchesFrame(
std::unique_ptr<NavigationEntryImpl::TreeNode>
NavigationEntryImpl::TreeNode::CloneAndReplace(
FrameTreeNode* frame_tree_node,
- FrameNavigationEntry* frame_navigation_entry) const {
+ FrameNavigationEntry* frame_navigation_entry) {
if (frame_tree_node && MatchesFrame(frame_tree_node)) {
// Replace this node in the cloned tree and prune its children.
return base::WrapUnique(
@@ -687,7 +695,6 @@ void NavigationEntryImpl::ResetForCommit() {
void NavigationEntryImpl::AddOrUpdateFrameEntry(
FrameTreeNode* frame_tree_node,
- const std::string& frame_unique_name,
int64_t item_sequence_number,
int64_t document_sequence_number,
SiteInstanceImpl* site_instance,
@@ -707,10 +714,13 @@ void NavigationEntryImpl::AddOrUpdateFrameEntry(
// Now check whether we have a TreeNode for the node itself.
int frame_tree_node_id = frame_tree_node->frame_tree_node_id();
+ const std::string& unique_name =
+ frame_tree_node->current_replication_state().unique_name;
for (TreeNode* child : parent_node->children) {
- if (child->frame_entry->frame_tree_node_id() == frame_tree_node_id) {
+ if (child->frame_entry->frame_tree_node_id() == frame_tree_node_id ||
+ child->frame_entry->frame_unique_name() == unique_name) {
// Update the existing FrameNavigationEntry (e.g., for replaceState).
- child->frame_entry->UpdateEntry(frame_unique_name, item_sequence_number,
+ child->frame_entry->UpdateEntry(unique_name, item_sequence_number,
document_sequence_number, site_instance,
url, referrer, page_state);
return;
@@ -721,7 +731,7 @@ void NavigationEntryImpl::AddOrUpdateFrameEntry(
// Unordered list, since we expect to look up entries by frame sequence number
// or unique name.
FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
- frame_tree_node_id, frame_unique_name, item_sequence_number,
+ frame_tree_node_id, unique_name, item_sequence_number,
document_sequence_number, site_instance, url, referrer);
frame_entry->set_page_state(page_state);
parent_node->children.push_back(
@@ -729,29 +739,11 @@ void NavigationEntryImpl::AddOrUpdateFrameEntry(
}
FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry(
- FrameTreeNode* frame_tree_node) const {
+ FrameTreeNode* frame_tree_node) {
NavigationEntryImpl::TreeNode* tree_node = FindFrameEntry(frame_tree_node);
return tree_node ? tree_node->frame_entry.get() : nullptr;
}
-FrameNavigationEntry* NavigationEntryImpl::GetFrameEntryByUniqueName(
- const std::string& unique_name) const {
- NavigationEntryImpl::TreeNode* node = nullptr;
- std::queue<NavigationEntryImpl::TreeNode*> work_queue;
- work_queue.push(root_node());
- while (!work_queue.empty()) {
- node = work_queue.front();
- work_queue.pop();
- if (node->frame_entry->frame_unique_name() == unique_name)
- return node->frame_entry.get();
-
- // Enqueue any children and keep looking.
- for (auto& child : node->children)
- work_queue.push(child);
- }
- return nullptr;
-}
-
void NavigationEntryImpl::SetScreenshotPNGData(
scoped_refptr<base::RefCountedBytes> png_data) {
screenshot_ = png_data;
@@ -764,7 +756,7 @@ GURL NavigationEntryImpl::GetHistoryURLForDataURL() const {
}
NavigationEntryImpl::TreeNode* NavigationEntryImpl::FindFrameEntry(
- FrameTreeNode* frame_tree_node) const {
+ FrameTreeNode* frame_tree_node) {
NavigationEntryImpl::TreeNode* node = nullptr;
std::queue<NavigationEntryImpl::TreeNode*> work_queue;
work_queue.push(root_node());
« no previous file with comments | « content/browser/frame_host/navigation_entry_impl.h ('k') | content/browser/frame_host/navigator_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698