Index: chrome/browser/android/partner_bookmarks_shim.cc |
diff --git a/chrome/browser/android/partner_bookmarks_shim.cc b/chrome/browser/android/partner_bookmarks_shim.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f2a12e93012bcab44c17f011ea709e915fad3afc |
--- /dev/null |
+++ b/chrome/browser/android/partner_bookmarks_shim.cc |
@@ -0,0 +1,140 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/android/partner_bookmarks_shim.h" |
+ |
+#include "base/lazy_instance.h" |
+#include "chrome/browser/bookmarks/bookmark_model.h" |
+#include "content/public/browser/browser_thread.h" |
+ |
+using base::LazyInstance; |
+using content::BrowserThread; |
+ |
+namespace { |
+ |
+static LazyInstance<PartnerBookmarksShim> g_partner_bookmarks_shim_instance = |
+ LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
+const int64 PartnerBookmarksShim::kPartnerBookmarkIdBits = 0x7FFF0000; |
+ |
+PartnerBookmarksShim* PartnerBookmarksShim::GetInstance() { |
+ return g_partner_bookmarks_shim_instance.Pointer(); |
+} |
+ |
+PartnerBookmarksShim::PartnerBookmarksShim() |
+ : bookmark_model_(NULL), |
+ attach_point_(NULL), |
+ loaded_(false), |
+ observers_( |
+ ObserverList<PartnerBookmarksShim::Observer>::NOTIFY_EXISTING_ONLY) { |
+} |
+ |
+PartnerBookmarksShim::~PartnerBookmarksShim() { |
+ FOR_EACH_OBSERVER(PartnerBookmarksShim::Observer, observers_, |
+ ShimBeingDeleted(this)); |
+} |
+ |
+void PartnerBookmarksShim::Reset() { |
+ partner_bookmarks_root_.reset(); |
+ bookmark_model_ = NULL; |
+ attach_point_ = NULL; |
+ loaded_ = false; |
+ observers_.Clear(); |
+} |
+ |
+void PartnerBookmarksShim::AddObserver( |
+ PartnerBookmarksShim::Observer* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void PartnerBookmarksShim::RemoveObserver( |
+ PartnerBookmarksShim::Observer* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
+bool PartnerBookmarksShim::IsPartnerBookmarkId(int64 id) { |
+ return (id & kPartnerBookmarkIdBits) == kPartnerBookmarkIdBits; |
+} |
+ |
+bool PartnerBookmarksShim::IsBookmarkEditable(const BookmarkNode* node) { |
+ return !IsPartnerBookmarkId(node->id()) && |
+ (node->type() == BookmarkNode::FOLDER || |
+ node->type() == BookmarkNode::URL); |
+} |
+ |
+void PartnerBookmarksShim::AttachTo( |
+ BookmarkModel* bookmark_model, |
+ const BookmarkNode* attach_point) { |
+ if (bookmark_model_ == bookmark_model && attach_point_ == attach_point) |
+ return; |
+ DCHECK(!bookmark_model_ || !bookmark_model); |
+ DCHECK(!attach_point_ || !attach_point); |
+ bookmark_model_ = bookmark_model; |
+ 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
|
+} |
+ |
+const BookmarkNode* PartnerBookmarksShim::GetParentOf( |
+ const BookmarkNode* node) const { |
+ DCHECK(IsLoaded()); |
+ DCHECK(node != NULL); |
+ const BookmarkNode* parent = node->parent(); |
+ if (HasPartnerBookmarks() && GetPartnerBookmarksRoot()->id() == node->id()) |
+ parent = GetAttachPoint(); |
+ return parent; |
+} |
+ |
+bool PartnerBookmarksShim::IsRootNode(const BookmarkNode* node) const { |
+ DCHECK(node != NULL); |
+ return node->is_root() && !IsPartnerBookmarkId(node->id()); |
+} |
+ |
+const BookmarkNode* PartnerBookmarksShim::GetNodeByID(int64 id) const { |
+ DCHECK(IsLoaded()); |
+ if (HasPartnerBookmarks() && IsPartnerBookmarkId(id)) |
+ return GetNodeByID(GetPartnerBookmarksRoot(), id); |
+ if (bookmark_model_) |
+ return bookmark_model_->GetNodeByID(id); |
+ return NULL; |
+} |
+ |
+const BookmarkNode* PartnerBookmarksShim::GetNodeByID( |
+ const BookmarkNode* parent, int64 id) const { |
+ if (parent->id() == id) |
+ return parent; |
+ if (IsLoaded() && HasPartnerBookmarks() && |
+ IsPartnerBookmarkId(id) && !IsPartnerBookmarkId(parent->id())) { |
+ DCHECK(parent == attach_point_); |
+ parent = GetPartnerBookmarksRoot(); |
+ } |
+ 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.
|
+ const BookmarkNode* result = GetNodeByID(parent->GetChild(i), id); |
+ if (result) |
+ return result; |
+ } |
+ return NULL; |
+} |
+ |
+bool PartnerBookmarksShim::IsLoaded() const { |
+ return loaded_; |
+} |
+ |
+bool PartnerBookmarksShim::HasPartnerBookmarks() const { |
+ DCHECK(IsLoaded()); |
+ return partner_bookmarks_root_.get() != NULL; |
+} |
+ |
+const BookmarkNode* PartnerBookmarksShim::GetPartnerBookmarksRoot() const { |
+ DCHECK(HasPartnerBookmarks()); |
+ return partner_bookmarks_root_.get(); |
+} |
+ |
+void PartnerBookmarksShim::SetPartnerBookmarksRoot(BookmarkNode* root_node) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ partner_bookmarks_root_.reset(root_node); |
+ loaded_ = true; |
+ FOR_EACH_OBSERVER(PartnerBookmarksShim::Observer, observers_, |
+ PartnerShimLoaded(this)); |
+} |