// 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. #ifndef CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_BOOKMARKS_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_BOOKMARKS_HANDLER_H_ #include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "base/values.h" #include "chrome/browser/android/bookmarks/managed_bookmarks_shim.h" #include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h" #include "chrome/browser/bookmarks/base_bookmark_model_observer.h" #include "chrome/browser/favicon/favicon_service.h" #include "content/public/browser/web_ui_message_handler.h" // The handler for Javascript messages related to the bookmarks. // // In Javascript if getBookmarks() is called without any parameter, the 'Other // Bookmark' folder and bookmark bar's bookmarks and folders are returned. // If getBookmarks() is called with a valid bookmark folder id, the given // folder's bookmarks and sub folders of it are returned. // // All bookmarks and subfolder is returned by bookmarks() javascript callback // function. // The returned field 'folder' indicates whether the data is a folder. The // returned field 'root' indicates whether or not the bookmark list that was // returned is the root list or not. Besides these fields, a folder has id // and title fields; A bookmark has url and title fields. // // A sample result looks like: // { // title: 'Bookmark Bar', // id: '1', // root: true, // bookmarks: [ // { // title: 'Cake', // url: 'http://www.google.com', // folder: false // }, // { // title: 'Puppies', // folder: true, // id: '2' // } // ] // } class BookmarksHandler : public content::WebUIMessageHandler, public BaseBookmarkModelObserver, public PartnerBookmarksShim::Observer, public ManagedBookmarksShim::Observer { public: BookmarksHandler(); virtual ~BookmarksHandler(); // WebUIMessageHandler override and implementation. virtual void RegisterMessages() OVERRIDE; // Callback for the "getBookmarks" message. void HandleGetBookmarks(const base::ListValue* args); // Callback for the "deleteBookmark" message. void HandleDeleteBookmark(const base::ListValue* args); // Callback for the "editBookmark" message. void HandleEditBookmark(const base::ListValue* args); // Callback for the "createHomeScreenBookmarkShortcut" message. Used when // creating a shortcut on the home screen that should open the bookmark // specified in |args|. void HandleCreateHomeScreenBookmarkShortcut(const base::ListValue* args); // Override the methods of BookmarkModelObserver virtual void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE; virtual void BookmarkModelChanged() OVERRIDE; virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE; virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE; virtual void BookmarkNodeRemoved(BookmarkModel* model, const BookmarkNode* parent, int old_index, const BookmarkNode* node) OVERRIDE; virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE; virtual void BookmarkNodeAdded( BookmarkModel* model, const BookmarkNode* parent, int index) OVERRIDE; virtual void BookmarkNodeChanged(BookmarkModel* model, const BookmarkNode* node) OVERRIDE; // Override the methods of PartnerBookmarksShim::Observer virtual void PartnerShimChanged(PartnerBookmarksShim* shim) OVERRIDE; virtual void PartnerShimLoaded(PartnerBookmarksShim* shim) OVERRIDE; virtual void ShimBeingDeleted(PartnerBookmarksShim* shim) OVERRIDE; // Override the methods of ManagedBookmarksShim::Observer virtual void OnManagedBookmarksChanged() OVERRIDE; private: // The bookmark model being observed (if it has been attached). BookmarkModel* bookmark_model_; // Information about the Partner bookmarks (must check for IsLoaded()) PartnerBookmarksShim* partner_bookmarks_shim_; // Contains the bookmarks managed via enterprise policy. scoped_ptr<ManagedBookmarksShim> managed_bookmarks_shim_; // Whether the bookmark data has been requested by the UI yet. bool bookmark_data_requested_; // Indicates that extensive changes to the BookmarkModel is on-going. bool extensive_changes_; // Used for loading bookmark node. base::CancelableTaskTracker cancelable_task_tracker_; // Returns true iff bookmark model and partner bookmarks shim are loaded. bool AreModelsLoaded() const; // Notify the UI that a change occurred to the bookmark model. void NotifyModelChanged(const base::DictionaryValue& status); // Generates the string encoded ID to be used by the NTP. std::string GetBookmarkIdForNtp(const BookmarkNode* node); // Sets the necessary parent information in the response object to be sent // to the UI renderer. void SetParentInBookmarksResult(const BookmarkNode* parent, base::DictionaryValue* result); // Convert the given bookmark |node| into a dictionary format to be returned // to JavaScript. void PopulateBookmark(const BookmarkNode* node, base::ListValue* result); // Given a bookmark folder node, |folder|, populate the |result| with the // structured JavaScript-formatted data regarding the folder. void PopulateBookmarksInFolder(const BookmarkNode* folder, base::DictionaryValue* result); // Sends all bookmarks and sub folders in the given folder back to the NTP. void QueryBookmarkFolder(const BookmarkNode* node); // Sends bookmark bar's bookmarks and sub folders and other folders back to // NTP. void QueryInitialBookmarks(); // Sends the result back to Javascript void SendResult(const base::DictionaryValue& result); // Called once the favicon is loaded during creation of the bookmark shortcuts // and is available for use. void OnShortcutFaviconDataAvailable( const BookmarkNode* node, const chrome::FaviconBitmapResult& bitmap_result); // Looks at an optional bookmark ID in |args| and returns the corresponding // node if found, otherwise returns NULL. const BookmarkNode* GetNodeByID(const base::ListValue* args) const; // Returns the parent of |node|, or NULL if it's the root node. const BookmarkNode* GetParentOf(const BookmarkNode* node) const; // Returns the title of |node|, possibly remapped (if a partner bookmark). base::string16 GetTitle(const BookmarkNode* node) const; // Returns true if the node is reachable. bool IsReachable(const BookmarkNode* node) const; // Returns true if |node| can be modified by the user. bool IsEditable(const BookmarkNode* node) const; // Returns true if |node| is the real root node (not the root node of the // partner bookmarks shim nor the managed bookmark shim root). bool IsRoot(const BookmarkNode* node) const; DISALLOW_COPY_AND_ASSIGN(BookmarksHandler); }; #endif // CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_BOOKMARKS_HANDLER_H_