Index: content/renderer/history_entry.cc |
diff --git a/content/renderer/history_entry.cc b/content/renderer/history_entry.cc |
index 61bcb3acf9f8470fb2980ab55b949af6489cc0e0..e74299a88f69bc19fa2d74475fe3737fd68eaa6e 100644 |
--- a/content/renderer/history_entry.cc |
+++ b/content/renderer/history_entry.cc |
@@ -35,6 +35,9 @@ |
#include "content/renderer/history_entry.h" |
+#include <algorithm> |
+ |
+#include "base/memory/ptr_util.h" |
#include "content/renderer/render_frame_impl.h" |
#include "content/renderer/render_view_impl.h" |
#include "third_party/WebKit/public/web/WebLocalFrame.h" |
@@ -46,15 +49,16 @@ namespace content { |
HistoryEntry::HistoryNode* HistoryEntry::HistoryNode::AddChild( |
const WebHistoryItem& item) { |
- children_->push_back(new HistoryNode(entry_, item)); |
- return children_->back(); |
+ children_.push_back(base::MakeUnique<HistoryNode>(entry_, item)); |
+ return children_.back().get(); |
} |
HistoryEntry::HistoryNode* HistoryEntry::HistoryNode::AddChild() { |
return AddChild(WebHistoryItem()); |
} |
-HistoryEntry::HistoryNode* HistoryEntry::HistoryNode::CloneAndReplace( |
+std::unique_ptr<HistoryEntry::HistoryNode> |
+HistoryEntry::HistoryNode::CloneAndReplace( |
const base::WeakPtr<HistoryEntry>& new_entry, |
const WebHistoryItem& new_item, |
bool clone_children_of_target, |
@@ -62,7 +66,8 @@ HistoryEntry::HistoryNode* HistoryEntry::HistoryNode::CloneAndReplace( |
RenderFrameImpl* current_frame) { |
bool is_target_frame = target_frame == current_frame; |
const WebHistoryItem& item_for_create = is_target_frame ? new_item : item_; |
- HistoryNode* new_history_node = new HistoryNode(new_entry, item_for_create); |
+ auto new_history_node = |
+ base::MakeUnique<HistoryNode>(new_entry, item_for_create); |
// Use the last committed history item for the frame rather than item_, since |
// the latter may not accurately reflect which URL is currently committed in |
@@ -92,13 +97,10 @@ HistoryEntry::HistoryNode* HistoryEntry::HistoryNode::CloneAndReplace( |
entry_->GetHistoryNodeForFrame(child_render_frame); |
if (!child_history_node) |
continue; |
- HistoryNode* new_child_node = |
- child_history_node->CloneAndReplace(new_entry, |
- new_item, |
- clone_children_of_target, |
- target_frame, |
- child_render_frame); |
- new_history_node->children_->push_back(new_child_node); |
+ |
+ new_history_node->children_.push_back(child_history_node->CloneAndReplace( |
+ new_entry, new_item, clone_children_of_target, target_frame, |
+ child_render_frame)); |
} |
} |
return new_history_node; |
@@ -116,7 +118,6 @@ HistoryEntry::HistoryNode::HistoryNode(const base::WeakPtr<HistoryEntry>& entry, |
: entry_(entry) { |
if (!item.isNull()) |
set_item(item); |
- children_.reset(new ScopedVector<HistoryNode>); |
} |
HistoryEntry::HistoryNode::~HistoryNode() { |
@@ -129,8 +130,19 @@ HistoryEntry::HistoryNode::~HistoryNode() { |
} |
} |
+std::vector<HistoryEntry::HistoryNode*> HistoryEntry::HistoryNode::children() |
+ const { |
+ std::vector<HistoryEntry::HistoryNode*> children(children_.size()); |
+ std::transform(children_.cbegin(), children_.cend(), children.begin(), |
+ [](const std::unique_ptr<HistoryEntry::HistoryNode>& item) { |
+ return item.get(); |
+ }); |
+ |
+ return children; |
+} |
+ |
void HistoryEntry::HistoryNode::RemoveChildren() { |
- children_.reset(new ScopedVector<HistoryNode>); |
+ children_.clear(); |
} |
HistoryEntry::HistoryEntry() : weak_ptr_factory_(this) { |
@@ -151,10 +163,10 @@ HistoryEntry* HistoryEntry::CloneAndReplace(const WebHistoryItem& new_item, |
RenderFrameImpl* target_frame, |
RenderViewImpl* render_view) { |
HistoryEntry* new_entry = new HistoryEntry(); |
- new_entry->root_.reset( |
+ new_entry->root_ = |
root_->CloneAndReplace(new_entry->weak_ptr_factory_.GetWeakPtr(), |
new_item, clone_children_of_target, target_frame, |
- render_view->GetMainRenderFrame())); |
+ render_view->GetMainRenderFrame()); |
return new_entry; |
} |