| 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 27236064583c85b4d99c2629ca639b5e3920b47c..7ba5cf307a643b7b3509c07bd024d2e66b72a867 100644
|
| --- a/content/browser/frame_host/navigation_entry_impl.cc
|
| +++ b/content/browser/frame_host/navigation_entry_impl.cc
|
| @@ -33,6 +33,17 @@ 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;
|
| +
|
| + // For now, we set the root FNE's FrameTreeNode ID to -1.
|
| + return frame_tree_node->IsMainFrame() &&
|
| + frame_entry->frame_tree_node_id() == -1;
|
| +}
|
| +
|
| NavigationEntryImpl::TreeNode* NavigationEntryImpl::TreeNode::Clone() const {
|
| // Clone the tree using a copy of the FrameNavigationEntry, without sharing.
|
| NavigationEntryImpl::TreeNode* copy =
|
| @@ -419,6 +430,7 @@ StartNavigationParams NavigationEntryImpl::ConstructStartNavigationParams()
|
|
|
| RequestNavigationParams NavigationEntryImpl::ConstructRequestNavigationParams(
|
| base::TimeTicks navigation_start,
|
| + bool has_committed_real_load,
|
| bool intended_as_new_entry,
|
| int pending_history_list_offset,
|
| int current_history_list_offset,
|
| @@ -444,9 +456,9 @@ RequestNavigationParams NavigationEntryImpl::ConstructRequestNavigationParams(
|
| return RequestNavigationParams(
|
| GetIsOverridingUserAgent(), navigation_start, redirects,
|
| GetCanLoadLocalResources(), base::Time::Now(), GetPageState(),
|
| - GetPageID(), GetUniqueID(), intended_as_new_entry, pending_offset_to_send,
|
| - current_offset_to_send, current_length_to_send,
|
| - should_clear_history_list());
|
| + GetPageID(), GetUniqueID(), has_committed_real_load,
|
| + intended_as_new_entry, pending_offset_to_send, current_offset_to_send,
|
| + current_length_to_send, should_clear_history_list());
|
| }
|
|
|
| void NavigationEntryImpl::ResetForCommit() {
|
| @@ -477,27 +489,9 @@ void NavigationEntryImpl::AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node,
|
| // We should already have a TreeNode for the parent node by the time this node
|
| // commits. Find it first.
|
| DCHECK(frame_tree_node->parent());
|
| - int parent_ftn_id = frame_tree_node->parent()->frame_tree_node_id();
|
| - bool found = false;
|
| - NavigationEntryImpl::TreeNode* parent_node = nullptr;
|
| - std::queue<NavigationEntryImpl::TreeNode*> work_queue;
|
| - work_queue.push(root_node());
|
| - while (!found && !work_queue.empty()) {
|
| - parent_node = work_queue.front();
|
| - work_queue.pop();
|
| - // The root FNE will have an ID of -1, so check for that as well.
|
| - if (parent_node->frame_entry->frame_tree_node_id() == parent_ftn_id ||
|
| - (parent_node->frame_entry->frame_tree_node_id() == -1 &&
|
| - parent_node == root_node() &&
|
| - frame_tree_node->parent()->IsMainFrame())) {
|
| - found = true;
|
| - break;
|
| - }
|
| - // Enqueue any children and keep looking.
|
| - for (auto& child : parent_node->children)
|
| - work_queue.push(child);
|
| - }
|
| - if (!found) {
|
| + NavigationEntryImpl::TreeNode* parent_node =
|
| + FindFrameEntry(frame_tree_node->parent());
|
| + if (!parent_node) {
|
| // The renderer should not send a commit for a subframe before its parent.
|
| // TODO(creis): This can currently happen because we don't yet clone the
|
| // FrameNavigationEntry tree on manual subframe navigations. Once that's
|
| @@ -515,14 +509,21 @@ void NavigationEntryImpl::AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node,
|
| }
|
| }
|
|
|
| - // No entry exists yet, so create a new one. Unordered list, since we expect
|
| - // to look up entries by frame sequence number or unique name.
|
| + // No entry exists yet, so create a new one unless it's for about:blank.
|
| + // Unordered list, since we expect to look up entries by frame sequence number
|
| + // or unique name.
|
| + if (url == GURL(url::kAboutBlankURL))
|
| + return;
|
| FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
|
| frame_tree_node_id, site_instance, url, referrer);
|
| parent_node->children.push_back(
|
| new NavigationEntryImpl::TreeNode(frame_entry));
|
| }
|
|
|
| +bool NavigationEntryImpl::HasFrameEntry(FrameTreeNode* frame_tree_node) const {
|
| + return FindFrameEntry(frame_tree_node) != nullptr;
|
| +}
|
| +
|
| void NavigationEntryImpl::SetScreenshotPNGData(
|
| scoped_refptr<base::RefCountedBytes> png_data) {
|
| screenshot_ = png_data;
|
| @@ -534,4 +535,25 @@ GURL NavigationEntryImpl::GetHistoryURLForDataURL() const {
|
| return GetBaseURLForDataURL().is_empty() ? GURL() : GetVirtualURL();
|
| }
|
|
|
| +NavigationEntryImpl::TreeNode* NavigationEntryImpl::FindFrameEntry(
|
| + FrameTreeNode* frame_tree_node) 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->MatchesFrame(frame_tree_node)) {
|
| + // Only the root TreeNode should have a FTN ID of -1.
|
| + DCHECK_IMPLIES(node->frame_entry->frame_tree_node_id() == -1,
|
| + node == root_node());
|
| + return node;
|
| + }
|
| + // Enqueue any children and keep looking.
|
| + for (auto& child : node->children)
|
| + work_queue.push(child);
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| } // namespace content
|
|
|