Chromium Code Reviews| 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)); |
| +} |