| 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 87405be98d69e2db96a66b58d0b3d79602077b4c..eccc0640c1fd30864f28044fb1d0c2b6e0cd1908 100644
|
| --- a/content/browser/frame_host/navigation_entry_impl.cc
|
| +++ b/content/browser/frame_host/navigation_entry_impl.cc
|
| @@ -39,7 +39,7 @@ int GetUniqueIDInConstructor() {
|
| void RecursivelyGenerateFrameEntries(const ExplodedFrameState& state,
|
| NavigationEntryImpl::TreeNode* node) {
|
| node->frame_entry = new FrameNavigationEntry(
|
| - -1, UTF16ToUTF8(state.target.string()), state.item_sequence_number,
|
| + UTF16ToUTF8(state.target.string()), state.item_sequence_number,
|
| state.document_sequence_number, nullptr, GURL(state.url_string.string()),
|
| Referrer(GURL(state.referrer.string()), state.referrer_policy), "GET",
|
| -1);
|
| @@ -100,22 +100,23 @@ NavigationEntryImpl::TreeNode::TreeNode(FrameNavigationEntry* frame_entry)
|
| NavigationEntryImpl::TreeNode::~TreeNode() {
|
| }
|
|
|
| -bool NavigationEntryImpl::TreeNode::MatchesFrame(
|
| - FrameTreeNode* frame_tree_node) const {
|
| - if (frame_tree_node->frame_tree_node_id() ==
|
| - frame_entry->frame_tree_node_id())
|
| - return true;
|
| +bool NavigationEntryImpl::TreeNode::MatchesFrame(FrameTreeNode* frame_tree_node,
|
| + bool is_root_tree_node) const {
|
| + // The root node is for the main frame whether the unique name matches or not.
|
| + if (is_root_tree_node)
|
| + return frame_tree_node->IsMainFrame();
|
|
|
| - // For now, we set the root FNE's FrameTreeNode ID to -1.
|
| - return frame_tree_node->IsMainFrame() &&
|
| - frame_entry->frame_tree_node_id() == -1;
|
| + // Otherwise check the unique name for subframes.
|
| + return !frame_tree_node->IsMainFrame() &&
|
| + frame_tree_node->unique_name() == frame_entry->frame_unique_name();
|
| }
|
|
|
| std::unique_ptr<NavigationEntryImpl::TreeNode>
|
| NavigationEntryImpl::TreeNode::CloneAndReplace(
|
| FrameTreeNode* frame_tree_node,
|
| - FrameNavigationEntry* frame_navigation_entry) const {
|
| - if (frame_tree_node && MatchesFrame(frame_tree_node)) {
|
| + FrameNavigationEntry* frame_navigation_entry,
|
| + bool is_root_tree_node) const {
|
| + if (frame_tree_node && MatchesFrame(frame_tree_node, is_root_tree_node)) {
|
| // Replace this node in the cloned tree and prune its children.
|
| return base::WrapUnique(
|
| new NavigationEntryImpl::TreeNode(frame_navigation_entry));
|
| @@ -129,7 +130,7 @@ NavigationEntryImpl::TreeNode::CloneAndReplace(
|
| // Recursively clone the children.
|
| for (auto& child : children) {
|
| copy->children.push_back(
|
| - child->CloneAndReplace(frame_tree_node, frame_navigation_entry));
|
| + child->CloneAndReplace(frame_tree_node, frame_navigation_entry, false));
|
| }
|
|
|
| return copy;
|
| @@ -167,8 +168,7 @@ NavigationEntryImpl::NavigationEntryImpl(
|
| const base::string16& title,
|
| ui::PageTransition transition_type,
|
| bool is_renderer_initiated)
|
| - : frame_tree_(new TreeNode(new FrameNavigationEntry(-1,
|
| - "",
|
| + : frame_tree_(new TreeNode(new FrameNavigationEntry("",
|
| -1,
|
| -1,
|
| std::move(instance),
|
| @@ -531,8 +531,8 @@ std::unique_ptr<NavigationEntryImpl> NavigationEntryImpl::CloneAndReplace(
|
|
|
| // TODO(creis): Only share the same FrameNavigationEntries if cloning within
|
| // the same tab.
|
| - copy->frame_tree_ =
|
| - frame_tree_->CloneAndReplace(frame_tree_node, frame_navigation_entry);
|
| + copy->frame_tree_ = frame_tree_->CloneAndReplace(
|
| + frame_tree_node, frame_navigation_entry, true);
|
|
|
| // Copy most state over, unless cleared in ResetForCommit.
|
| // Don't copy unique_id_, otherwise it won't be unique.
|
| @@ -686,7 +686,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,12 +706,12 @@ 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->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_unique_name() == unique_name) {
|
| // Update the existing FrameNavigationEntry (e.g., for replaceState).
|
| child->frame_entry->UpdateEntry(
|
| - frame_unique_name, item_sequence_number, document_sequence_number,
|
| + unique_name, item_sequence_number, document_sequence_number,
|
| site_instance, url, referrer, page_state, method, post_id);
|
| return;
|
| }
|
| @@ -722,8 +721,8 @@ 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,
|
| - document_sequence_number, site_instance, url, referrer, method, post_id);
|
| + unique_name, item_sequence_number, document_sequence_number,
|
| + site_instance, url, referrer, method, post_id);
|
| frame_entry->set_page_state(page_state);
|
| parent_node->children.push_back(
|
| new NavigationEntryImpl::TreeNode(frame_entry));
|
| @@ -735,24 +734,6 @@ FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry(
|
| 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;
|
| @@ -772,12 +753,9 @@ NavigationEntryImpl::TreeNode* NavigationEntryImpl::FindFrameEntry(
|
| while (!work_queue.empty()) {
|
| node = work_queue.front();
|
| work_queue.pop();
|
| - if (node->MatchesFrame(frame_tree_node)) {
|
| - // Only the root TreeNode should have a FTN ID of -1.
|
| - DCHECK(node->frame_entry->frame_tree_node_id() != -1 ||
|
| - node == root_node());
|
| + if (node->MatchesFrame(frame_tree_node, node == root_node()))
|
| return node;
|
| - }
|
| +
|
| // Enqueue any children and keep looking.
|
| for (auto& child : node->children)
|
| work_queue.push(child);
|
|
|