// Copyright (c) 2011 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_EXTENSIONS_EXTENSION_BOOKMARKS_MODULE_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_BOOKMARKS_MODULE_H_ #pragma once #include <list> #include <set> #include <string> #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/singleton.h" #include "chrome/browser/bookmarks/bookmark_model_observer.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/ui/shell_dialogs.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" class FilePath; // Observes BookmarkModel and then routes the notifications as events to // the extension system. class ExtensionBookmarkEventRouter : public BookmarkModelObserver { public: static ExtensionBookmarkEventRouter* GetInstance(); virtual ~ExtensionBookmarkEventRouter(); // Call this for each model to observe. Safe to call multiple times per // model. void Observe(BookmarkModel* model); // BookmarkModelObserver: virtual void Loaded(BookmarkModel* model) OVERRIDE; virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE {} virtual void BookmarkNodeMoved(BookmarkModel* model, const BookmarkNode* old_parent, int old_index, const BookmarkNode* new_parent, int new_index) OVERRIDE; virtual void BookmarkNodeAdded(BookmarkModel* model, const BookmarkNode* parent, int index) OVERRIDE; virtual void BookmarkNodeRemoved(BookmarkModel* model, const BookmarkNode* parent, int old_index, const BookmarkNode* node) OVERRIDE; virtual void BookmarkNodeChanged(BookmarkModel* model, const BookmarkNode* node) OVERRIDE; virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model, const BookmarkNode* node) OVERRIDE; virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, const BookmarkNode* node) OVERRIDE; virtual void BookmarkImportBeginning(BookmarkModel* model) OVERRIDE; virtual void BookmarkImportEnding(BookmarkModel* model) OVERRIDE; private: ExtensionBookmarkEventRouter(); friend struct DefaultSingletonTraits<ExtensionBookmarkEventRouter>; // Helper to actually dispatch an event to extension listeners. void DispatchEvent(Profile* profile, const char* event_name, const std::string& json_args); // These are stored so that Observe can be called multiple times safely. // This way the caller doesn't have to know whether it's already observing // a particular model or not. The pointers are not owned by this object. std::set<BookmarkModel*> models_; DISALLOW_COPY_AND_ASSIGN(ExtensionBookmarkEventRouter); }; class BookmarksFunction : public AsyncExtensionFunction, public NotificationObserver { public: // AsyncExtensionFunction: virtual void Run() OVERRIDE; virtual bool RunImpl() = 0; protected: // Helper to get the bookmark id as int64 from the given string id. // Sets error_ to an error string if the given id string can't be parsed // as an int64. In case of error, doesn't change id and returns false. bool GetBookmarkIdAsInt64(const std::string& id_string, int64* id); // Helper that checks if bookmark editing is enabled. If it's not, this sets // error_ to the appropriate error string. bool EditBookmarksEnabled(); private: // NotificationObserver: virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) OVERRIDE; NotificationRegistrar registrar_; }; class GetBookmarksFunction : public BookmarksFunction { public: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.get") }; class GetBookmarkChildrenFunction : public BookmarksFunction { public: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.getChildren") }; class GetBookmarkRecentFunction : public BookmarksFunction { public: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.getRecent") }; class GetBookmarkTreeFunction : public BookmarksFunction { public: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.getTree") }; class SearchBookmarksFunction : public BookmarksFunction { public: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.search") }; class RemoveBookmarkFunction : public BookmarksFunction { public: // Returns true on successful parse and sets invalid_id to true if conversion // from id string to int64 failed. static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); // BookmarksFunction: virtual bool RunImpl() OVERRIDE; virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.remove") }; class RemoveTreeBookmarkFunction : public RemoveBookmarkFunction { DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.removeTree") }; class CreateBookmarkFunction : public BookmarksFunction { public: virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; // BookmarksFunction: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.create") }; class MoveBookmarkFunction : public BookmarksFunction { public: static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; // BookmarksFunction: virtual bool RunImpl() OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.move") }; class UpdateBookmarkFunction : public BookmarksFunction { public: static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; virtual bool RunImpl(); private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.update") }; class BookmarksIOFunction : public BookmarksFunction, public SelectFileDialog::Listener { public: BookmarksIOFunction(); virtual ~BookmarksIOFunction(); virtual void FileSelected(const FilePath& path, int index, void* params) = 0; // SelectFileDialog::Listener: virtual void MultiFilesSelected(const std::vector<FilePath>& files, void* params) OVERRIDE; virtual void FileSelectionCanceled(void* params) OVERRIDE; void SelectFile(SelectFileDialog::Type type); private: void ShowSelectFileDialog(SelectFileDialog::Type type, FilePath default_path); protected: scoped_refptr<SelectFileDialog> select_file_dialog_; }; class ImportBookmarksFunction : public BookmarksIOFunction { public: // BookmarkManagerIOFunction: virtual bool RunImpl() OVERRIDE; virtual void FileSelected(const FilePath& path, int index, void* params) OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.import"); }; class ExportBookmarksFunction : public BookmarksIOFunction { public: // BookmarkManagerIOFunction: virtual bool RunImpl() OVERRIDE; virtual void FileSelected(const FilePath& path, int index, void* params) OVERRIDE; private: DECLARE_EXTENSION_FUNCTION_NAME("bookmarks.export"); }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_BOOKMARKS_MODULE_H_