| 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..a1dfddd73955b4a0545d37700473d66619bc9840
|
| --- /dev/null
|
| +++ b/chrome/browser/android/partner_bookmarks_shim.cc
|
| @@ -0,0 +1,142 @@
|
| +// 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;
|
| +}
|
| +
|
| +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) {
|
| + const BookmarkNode* result = GetNodeByID(parent->GetChild(i), id);
|
| + if (result)
|
| + return result;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +bool PartnerBookmarksShim::IsLoaded() const {
|
| + return loaded_;
|
| +}
|
| +
|
| +bool PartnerBookmarksShim::HasPartnerBookmarks() const {
|
| + if (partner_bookmarks_root_.get() != NULL)
|
| + return true;
|
| + 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));
|
| +}
|
|
|