OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/android/partner_bookmarks_shim.h" | |
6 | |
7 #include "base/lazy_instance.h" | |
8 #include "chrome/browser/bookmarks/bookmark_model.h" | |
9 #include "content/public/browser/browser_thread.h" | |
10 | |
11 using base::LazyInstance; | |
12 using content::BrowserThread; | |
13 | |
14 namespace { | |
15 | |
16 static LazyInstance<PartnerBookmarksShim> g_partner_bookmarks_shim_instance = | |
17 LAZY_INSTANCE_INITIALIZER; | |
18 | |
19 } // namespace | |
20 | |
21 const int64 PartnerBookmarksShim::kPartnerBookmarkIdBits = 0x7FFF0000; | |
22 | |
23 PartnerBookmarksShim* PartnerBookmarksShim::GetInstance() { | |
24 return g_partner_bookmarks_shim_instance.Pointer(); | |
25 } | |
26 | |
27 PartnerBookmarksShim::PartnerBookmarksShim() | |
28 : bookmark_model_(NULL), | |
29 attach_point_(NULL), | |
30 loaded_(false), | |
31 observers_( | |
32 ObserverList<PartnerBookmarksShim::Observer>::NOTIFY_EXISTING_ONLY) { | |
33 } | |
34 | |
35 PartnerBookmarksShim::~PartnerBookmarksShim() { | |
36 FOR_EACH_OBSERVER(PartnerBookmarksShim::Observer, observers_, | |
37 ShimBeingDeleted(this)); | |
38 } | |
39 | |
40 void PartnerBookmarksShim::Reset() { | |
41 partner_bookmarks_root_.reset(); | |
42 bookmark_model_ = NULL; | |
43 attach_point_ = NULL; | |
44 loaded_ = false; | |
45 observers_.Clear(); | |
46 } | |
47 | |
48 void PartnerBookmarksShim::AddObserver( | |
49 PartnerBookmarksShim::Observer* observer) { | |
50 observers_.AddObserver(observer); | |
51 } | |
52 | |
53 void PartnerBookmarksShim::RemoveObserver( | |
54 PartnerBookmarksShim::Observer* observer) { | |
55 observers_.RemoveObserver(observer); | |
56 } | |
57 | |
58 bool PartnerBookmarksShim::IsPartnerBookmarkId(int64 id) { | |
59 return (id & kPartnerBookmarkIdBits) == kPartnerBookmarkIdBits; | |
60 } | |
61 | |
62 bool PartnerBookmarksShim::IsBookmarkEditable(const BookmarkNode* node) { | |
63 return !IsPartnerBookmarkId(node->id()) && | |
64 (node->type() == BookmarkNode::FOLDER || | |
65 node->type() == BookmarkNode::URL); | |
66 } | |
67 | |
68 void PartnerBookmarksShim::AttachTo( | |
69 BookmarkModel* bookmark_model, | |
70 const BookmarkNode* attach_point) { | |
71 if (bookmark_model_ == bookmark_model && attach_point_ == attach_point) | |
72 return; | |
73 DCHECK(!bookmark_model_ || !bookmark_model); | |
74 DCHECK(!attach_point_ || !attach_point); | |
75 bookmark_model_ = bookmark_model; | |
76 attach_point_ = attach_point; | |
sky
2012/08/09 15:48:19
Is it possible for someone to delete this bookmark
Ted C
2012/08/09 16:47:01
Really the only use case we should support is to a
| |
77 } | |
78 | |
79 const BookmarkNode* PartnerBookmarksShim::GetParentOf( | |
80 const BookmarkNode* node) const { | |
81 DCHECK(IsLoaded()); | |
82 DCHECK(node != NULL); | |
83 const BookmarkNode* parent = node->parent(); | |
84 if (HasPartnerBookmarks() && GetPartnerBookmarksRoot()->id() == node->id()) | |
85 parent = GetAttachPoint(); | |
86 return parent; | |
87 } | |
88 | |
89 bool PartnerBookmarksShim::IsRootNode(const BookmarkNode* node) const { | |
90 DCHECK(node != NULL); | |
91 return node->is_root() && !IsPartnerBookmarkId(node->id()); | |
92 } | |
93 | |
94 const BookmarkNode* PartnerBookmarksShim::GetNodeByID(int64 id) const { | |
95 DCHECK(IsLoaded()); | |
96 if (HasPartnerBookmarks() && IsPartnerBookmarkId(id)) | |
97 return GetNodeByID(GetPartnerBookmarksRoot(), id); | |
98 if (bookmark_model_) | |
99 return bookmark_model_->GetNodeByID(id); | |
100 return NULL; | |
101 } | |
102 | |
103 const BookmarkNode* PartnerBookmarksShim::GetNodeByID( | |
104 const BookmarkNode* parent, int64 id) const { | |
105 if (parent->id() == id) | |
106 return parent; | |
107 if (IsLoaded() && HasPartnerBookmarks() && | |
108 IsPartnerBookmarkId(id) && !IsPartnerBookmarkId(parent->id())) { | |
109 DCHECK(parent == attach_point_); | |
110 parent = GetPartnerBookmarksRoot(); | |
111 } | |
112 for (int i= 0, child_count = parent->child_count(); i < child_count; ++i) { | |
sky
2012/08/09 15:48:19
'i=' -> 'i ='
Ted C
2012/08/09 16:47:01
Done.
| |
113 const BookmarkNode* result = GetNodeByID(parent->GetChild(i), id); | |
114 if (result) | |
115 return result; | |
116 } | |
117 return NULL; | |
118 } | |
119 | |
120 bool PartnerBookmarksShim::IsLoaded() const { | |
121 return loaded_; | |
122 } | |
123 | |
124 bool PartnerBookmarksShim::HasPartnerBookmarks() const { | |
125 DCHECK(IsLoaded()); | |
126 return partner_bookmarks_root_.get() != NULL; | |
127 } | |
128 | |
129 const BookmarkNode* PartnerBookmarksShim::GetPartnerBookmarksRoot() const { | |
130 DCHECK(HasPartnerBookmarks()); | |
131 return partner_bookmarks_root_.get(); | |
132 } | |
133 | |
134 void PartnerBookmarksShim::SetPartnerBookmarksRoot(BookmarkNode* root_node) { | |
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
136 partner_bookmarks_root_.reset(root_node); | |
137 loaded_ = true; | |
138 FOR_EACH_OBSERVER(PartnerBookmarksShim::Observer, observers_, | |
139 PartnerShimLoaded(this)); | |
140 } | |
OLD | NEW |