| Index: content/renderer/history_entry.h | 
| diff --git a/content/renderer/history_entry.h b/content/renderer/history_entry.h | 
| index 62da86a4692b8c244aba3696cf4dfbf3b4e5f01d..627419b6678152738138c6ba3af87f45bee2163f 100644 | 
| --- a/content/renderer/history_entry.h | 
| +++ b/content/renderer/history_entry.h | 
| @@ -38,6 +38,7 @@ | 
| #include "base/containers/hash_tables.h" | 
| #include "base/memory/scoped_ptr.h" | 
| #include "base/memory/scoped_vector.h" | 
| +#include "base/memory/weak_ptr.h" | 
| #include "content/common/content_export.h" | 
| #include "third_party/WebKit/public/platform/WebURLRequest.h" | 
| #include "third_party/WebKit/public/web/WebHistoryItem.h" | 
| @@ -56,14 +57,13 @@ class CONTENT_EXPORT HistoryEntry { | 
| public: | 
| class HistoryNode { | 
| public: | 
| -    HistoryNode(HistoryEntry* entry, | 
| -                const blink::WebHistoryItem& item, | 
| -                int64_t frame_id); | 
| +    HistoryNode(const base::WeakPtr<HistoryEntry>& entry, | 
| +                const blink::WebHistoryItem& item); | 
| ~HistoryNode(); | 
|  | 
| -    HistoryNode* AddChild(const blink::WebHistoryItem& item, int64_t frame_id); | 
| +    HistoryNode* AddChild(const blink::WebHistoryItem& item); | 
| HistoryNode* AddChild(); | 
| -    HistoryNode* CloneAndReplace(HistoryEntry* new_entry, | 
| +    HistoryNode* CloneAndReplace(const base::WeakPtr<HistoryEntry>& new_entry, | 
| const blink::WebHistoryItem& new_item, | 
| bool clone_children_of_target, | 
| RenderFrameImpl* target_frame, | 
| @@ -74,12 +74,20 @@ class CONTENT_EXPORT HistoryEntry { | 
| void RemoveChildren(); | 
|  | 
| private: | 
| -    HistoryEntry* entry_; | 
| +    // When a HistoryEntry is destroyed, it takes all its HistoryNodes with it. | 
| +    // Use a WeakPtr to ensure that HistoryNodes don't try to illegally access | 
| +    // a dying HistoryEntry, or do unnecessary work when the whole entry is | 
| +    // being destroyed. | 
| +    base::WeakPtr<HistoryEntry> entry_; | 
| scoped_ptr<ScopedVector<HistoryNode> > children_; | 
| blink::WebHistoryItem item_; | 
| +    // We need to track multiple names because the name of a frame can change | 
| +    // over its lifetime. This allows us to clean up all of the names this node | 
| +    // has ever known by when it is destroyed. | 
| +    std::vector<std::string> unique_names_; | 
| }; | 
|  | 
| -  HistoryEntry(const blink::WebHistoryItem& root, int64_t frame_id); | 
| +  HistoryEntry(const blink::WebHistoryItem& root); | 
| HistoryEntry(); | 
| ~HistoryEntry(); | 
|  | 
| @@ -94,14 +102,12 @@ class CONTENT_EXPORT HistoryEntry { | 
| HistoryNode* root_history_node() const { return root_.get(); } | 
|  | 
| private: | 
| - | 
| scoped_ptr<HistoryNode> root_; | 
|  | 
| -  typedef base::hash_map<uint64_t, HistoryNode*> FramesToItems; | 
| -  FramesToItems frames_to_items_; | 
| - | 
| typedef base::hash_map<std::string, HistoryNode*> UniqueNamesToItems; | 
| UniqueNamesToItems unique_names_to_items_; | 
| + | 
| +  base::WeakPtrFactory<HistoryEntry> weak_ptr_factory_; | 
| }; | 
|  | 
| }  // namespace content | 
|  |