summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h')
-rw-r--r--chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h119
1 files changed, 81 insertions, 38 deletions
diff --git a/chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h b/chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h
index be6a7ed..f27d8cc 100644
--- a/chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h
+++ b/chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h
@@ -7,71 +7,114 @@
#include "base/android/jni_helper.h"
#include "base/memory/scoped_ptr.h"
+#include "base/strings/string16.h"
+#include "base/supports_user_data.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "url/gurl.h"
+
+class PrefService;
+
+namespace content {
+class WebContents;
+}
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
// A shim that lives on top of a BookmarkModel that allows the injection of
-// Partner bookmarks without submitting changes to the user configured bookmark
-// model.
-// Partner bookmarks folder is pseudo-injected as a subfolder to "attach node".
-// Because we cannot modify the BookmarkModel, the following needs to
-// be done on a client side:
-// 1. bookmark_node->is_root() -> shim->IsRootNode(bookmark_node)
-// 2. bookmark_node->parent() -> shim->GetParentOf(bookmark_node)
-// 3. bookmark_model->GetNodeByID(id) -> shim->GetNodeByID(id)
-class PartnerBookmarksShim {
+// partner bookmarks without submitting changes to the bookmark model.
+// The shim persists bookmark renames/deletions in a user profile and could be
+// queried via shim->GetTitle(node) and shim->IsReachable(node).
+// Note that node->GetTitle() returns an original (unmodified) title.
+class PartnerBookmarksShim : public base::SupportsUserData::Data {
public:
- // Constructor is public for LazyInstance; DON'T CALL; use ::GetInstance().
- PartnerBookmarksShim();
- // Destructor is public for LazyInstance;
- ~PartnerBookmarksShim();
-
- // Returns the active instance of the shim.
- static PartnerBookmarksShim* GetInstance();
-
- // Resets back to the initial state. Clears any attached observers, deletes
- // the partner bookmarks if any, and returns back to the unloaded state.
- void Reset();
-
- // Pseudo-injects partner bookmarks (if any) under the "attach_node".
- void AttachTo(BookmarkModel* bookmark_model,
- const BookmarkNode* attach_node);
- // Returns true if everything got loaded and attached
+ // Returns an instance of the shim for a given |browser_context|.
+ static PartnerBookmarksShim* BuildForBrowserContext(
+ content::BrowserContext* browser_context);
+
+ // Registers preferences.
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+ // Returns true if everything got loaded.
bool IsLoaded() const;
- // Returns true if there are partner bookmarks
+
+ // Returns true if there are partner bookmarks.
bool HasPartnerBookmarks() const;
- // For "Loaded" and "ShimBeingDeleted" notifications
+ // Returns true if a given bookmark is reachable (i.e. neither the bookmark,
+ // nor any of its parents were "removed").
+ bool IsReachable(const BookmarkNode* node) const;
+
+ // Removes a given bookmark.
+ // Makes the |node| (and, consequently, all its children) unreachable.
+ void RemoveBookmark(const BookmarkNode* node);
+
+ // Renames a given bookmark.
+ void RenameBookmark(const BookmarkNode* node, const base::string16& title);
+
+ // For Loaded/Changed/ShimBeingDeleted notifications
class Observer {
public:
- // Called when everything is loaded and attached
+ // Called when the set of bookmarks, or their values/visibility changes
+ virtual void PartnerShimChanged(PartnerBookmarksShim*) {}
+ // Called when everything is loaded
virtual void PartnerShimLoaded(PartnerBookmarksShim*) {}
// Called just before everything got destroyed
virtual void ShimBeingDeleted(PartnerBookmarksShim*) {}
protected:
virtual ~Observer() {}
};
+
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
- // Replacements for BookmarkModel/BookmarkNode methods
- bool IsBookmarkEditable(const BookmarkNode* node);
- bool IsRootNode(const BookmarkNode* node) const;
- const BookmarkNode* GetNodeByID(int64 id, bool is_partner) const;
- const BookmarkNode* GetParentOf(const BookmarkNode* node) const;
- const BookmarkNode* get_attach_point() const { return attach_point_; }
- bool IsPartnerBookmark(const BookmarkNode* node);
+ // PartnerBookmarksShim versions of BookmarkModel/BookmarkNode methods
+ const BookmarkNode* GetNodeByID(int64 id) const;
+ base::string16 GetTitle(const BookmarkNode* node) const;
+
+ bool IsPartnerBookmark(const BookmarkNode* node) const;
const BookmarkNode* GetPartnerBookmarksRoot() const;
+
// Sets the root node of the partner bookmarks and notifies any observers that
// the shim has now been loaded. Takes ownership of |root_node|.
void SetPartnerBookmarksRoot(BookmarkNode* root_node);
+ // Used as a "unique" identifier of the partner bookmark node for the purposes
+ // of node deletion and title editing. Two bookmarks with the same URLs and
+ // titles are considered indistinguishable.
+ class NodeRenamingMapKey {
+ public:
+ NodeRenamingMapKey(const GURL& url, const base::string16& provider_title);
+ ~NodeRenamingMapKey();
+ const GURL& url() const { return url_; }
+ const base::string16& provider_title() const { return provider_title_; }
+ friend bool operator<(const NodeRenamingMapKey& a,
+ const NodeRenamingMapKey& b);
+ private:
+ GURL url_;
+ base::string16 provider_title_;
+ };
+ typedef std::map<NodeRenamingMapKey, base::string16> NodeRenamingMap;
+
+ // For testing: clears an instance of the shim in a given |browser_context|.
+ static void ClearInBrowserContextForTesting(
+ content::BrowserContext* browser_context);
+
+ // For testing: clears partner bookmark model data.
+ static void ClearPartnerModelForTesting();
+
private:
+ explicit PartnerBookmarksShim(PrefService* prefs);
+ virtual ~PartnerBookmarksShim();
+
const BookmarkNode* GetNodeByID(const BookmarkNode* parent, int64 id) const;
+ void ReloadNodeMapping();
+ void SaveNodeMapping();
scoped_ptr<BookmarkNode> partner_bookmarks_root_;
- BookmarkModel* bookmark_model_;
- const BookmarkNode* attach_point_;
- bool loaded_; // Set only on UI thread
+ PrefService* prefs_;
+ NodeRenamingMap node_rename_remove_map_;
// The observers.
ObserverList<Observer> observers_;