1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_H_ 7 8 #include <list> 9 #include <string> 10 #include <vector> 11 12 #include "base/compiler_specific.h" 13 #include "base/memory/ref_counted.h" 14 #include "chrome/browser/extensions/chrome_extension_function.h" 15 #include "components/bookmarks/browser/base_bookmark_model_observer.h" 16 #include "components/bookmarks/browser/bookmark_node.h" 17 #include "extensions/browser/browser_context_keyed_api_factory.h" 18 #include "extensions/browser/event_router.h" 19 #include "ui/shell_dialogs/select_file_dialog.h" 20 21 class ChromeBookmarkClient; 22 23 namespace base { 24 class FilePath; 25 class ListValue; 26 } 27 28 namespace content { 29 class BrowserContext; 30 } 31 32 namespace extensions { 33 34 namespace api { 35 namespace bookmarks { 36 struct CreateDetails; 37 } 38 } 39 40 // Observes BookmarkModel and then routes the notifications as events to 41 // the extension system. 42 class BookmarkEventRouter : public BookmarkModelObserver { 43 public: 44 explicit BookmarkEventRouter(Profile* profile); 45 virtual ~BookmarkEventRouter(); 46 47 // BookmarkModelObserver: 48 virtual void BookmarkModelLoaded(BookmarkModel* model, 49 bool ids_reassigned) OVERRIDE; 50 virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; 51 virtual void BookmarkNodeMoved(BookmarkModel* model, 52 const BookmarkNode* old_parent, 53 int old_index, 54 const BookmarkNode* new_parent, 55 int new_index) OVERRIDE; 56 virtual void OnWillAddBookmarkNode(BookmarkModel* model, 57 BookmarkNode* node) OVERRIDE; 58 virtual void BookmarkNodeAdded(BookmarkModel* model, 59 const BookmarkNode* parent, 60 int index) OVERRIDE; 61 virtual void BookmarkNodeRemoved(BookmarkModel* model, 62 const BookmarkNode* parent, 63 int old_index, 64 const BookmarkNode* node, 65 const std::set<GURL>& removed_urls) OVERRIDE; 66 virtual void BookmarkAllUserNodesRemoved( 67 BookmarkModel* model, 68 const std::set<GURL>& removed_urls) OVERRIDE; 69 virtual void BookmarkNodeChanged(BookmarkModel* model, 70 const BookmarkNode* node) OVERRIDE; 71 virtual void BookmarkNodeFaviconChanged(BookmarkModel* model, 72 const BookmarkNode* node) OVERRIDE; 73 virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, 74 const BookmarkNode* node) OVERRIDE; 75 virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE; 76 virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE; 77 78 private: 79 // Helper to actually dispatch an event to extension listeners. 80 void DispatchEvent(const std::string& event_name, 81 scoped_ptr<base::ListValue> event_args); 82 83 content::BrowserContext* browser_context_; 84 BookmarkModel* model_; 85 ChromeBookmarkClient* client_; 86 87 DISALLOW_COPY_AND_ASSIGN(BookmarkEventRouter); 88 }; 89 90 class BookmarksAPI : public BrowserContextKeyedAPI, 91 public EventRouter::Observer { 92 public: 93 explicit BookmarksAPI(content::BrowserContext* context); 94 virtual ~BookmarksAPI(); 95 96 // KeyedService implementation. 97 virtual void Shutdown() OVERRIDE; 98 99 // BrowserContextKeyedAPI implementation. 100 static BrowserContextKeyedAPIFactory<BookmarksAPI>* GetFactoryInstance(); 101 102 // EventRouter::Observer implementation. 103 virtual void OnListenerAdded( 104 const EventListenerInfo& details) OVERRIDE; 105 106 private: 107 friend class BrowserContextKeyedAPIFactory<BookmarksAPI>; 108 109 content::BrowserContext* browser_context_; 110 111 // BrowserContextKeyedAPI implementation. 112 static const char* service_name() { 113 return "BookmarksAPI"; 114 } 115 static const bool kServiceIsNULLWhileTesting = true; 116 117 // Created lazily upon OnListenerAdded. 118 scoped_ptr<BookmarkEventRouter> bookmark_event_router_; 119 }; 120 121 class BookmarksFunction : public ChromeAsyncExtensionFunction, 122 public BaseBookmarkModelObserver { 123 public: 124 // AsyncExtensionFunction: 125 virtual bool RunAsync() OVERRIDE; 126 127 protected: 128 virtual ~BookmarksFunction() {} 129 130 // RunAsync semantic equivalent called when the bookmarks are ready. 131 virtual bool RunOnReady() = 0; 132 133 // Helper to get the BookmarkModel. 134 BookmarkModel* GetBookmarkModel(); 135 136 // Helper to get the ChromeBookmarkClient. 137 ChromeBookmarkClient* GetChromeBookmarkClient(); 138 139 // Helper to get the bookmark id as int64 from the given string id. 140 // Sets error_ to an error string if the given id string can't be parsed 141 // as an int64. In case of error, doesn't change id and returns false. 142 bool GetBookmarkIdAsInt64(const std::string& id_string, int64* id); 143 144 // Helper to get the bookmark node from a given string id. 145 // If the given id can't be parsed or doesn't refer to a valid node, sets 146 // error_ and returns NULL. 147 const BookmarkNode* GetBookmarkNodeFromId(const std::string& id_string); 148 149 // Helper to create a bookmark node from a CreateDetails object. If a node 150 // can't be created based on the given details, sets error_ and returns NULL. 151 const BookmarkNode* CreateBookmarkNode( 152 BookmarkModel* model, 153 const api::bookmarks::CreateDetails& details, 154 const BookmarkNode::MetaInfoMap* meta_info); 155 156 // Helper that checks if bookmark editing is enabled. If it's not, this sets 157 // error_ to the appropriate error string. 158 bool EditBookmarksEnabled(); 159 160 // Helper that checks if |node| can be modified. Returns false if |node| 161 // is NULL, or a managed node, or the root node. In these cases the node 162 // can't be edited, can't have new child nodes appended, and its direct 163 // children can't be moved or reordered. 164 bool CanBeModified(const BookmarkNode* node); 165 166 private: 167 // BaseBookmarkModelObserver: 168 virtual void BookmarkModelChanged() OVERRIDE; 169 virtual void BookmarkModelLoaded(BookmarkModel* model, 170 bool ids_reassigned) OVERRIDE; 171 }; 172 173 class BookmarksGetFunction : public BookmarksFunction { 174 public: 175 DECLARE_EXTENSION_FUNCTION("bookmarks.get", BOOKMARKS_GET) 176 177 protected: 178 virtual ~BookmarksGetFunction() {} 179 180 // BookmarksFunction: 181 virtual bool RunOnReady() OVERRIDE; 182 }; 183 184 class BookmarksGetChildrenFunction : public BookmarksFunction { 185 public: 186 DECLARE_EXTENSION_FUNCTION("bookmarks.getChildren", BOOKMARKS_GETCHILDREN) 187 188 protected: 189 virtual ~BookmarksGetChildrenFunction() {} 190 191 // BookmarksFunction: 192 virtual bool RunOnReady() OVERRIDE; 193 }; 194 195 class BookmarksGetRecentFunction : public BookmarksFunction { 196 public: 197 DECLARE_EXTENSION_FUNCTION("bookmarks.getRecent", BOOKMARKS_GETRECENT) 198 199 protected: 200 virtual ~BookmarksGetRecentFunction() {} 201 202 // BookmarksFunction: 203 virtual bool RunOnReady() OVERRIDE; 204 }; 205 206 class BookmarksGetTreeFunction : public BookmarksFunction { 207 public: 208 DECLARE_EXTENSION_FUNCTION("bookmarks.getTree", BOOKMARKS_GETTREE) 209 210 protected: 211 virtual ~BookmarksGetTreeFunction() {} 212 213 // BookmarksFunction: 214 virtual bool RunOnReady() OVERRIDE; 215 }; 216 217 class BookmarksGetSubTreeFunction : public BookmarksFunction { 218 public: 219 DECLARE_EXTENSION_FUNCTION("bookmarks.getSubTree", BOOKMARKS_GETSUBTREE) 220 221 protected: 222 virtual ~BookmarksGetSubTreeFunction() {} 223 224 // BookmarksFunction: 225 virtual bool RunOnReady() OVERRIDE; 226 }; 227 228 class BookmarksSearchFunction : public BookmarksFunction { 229 public: 230 DECLARE_EXTENSION_FUNCTION("bookmarks.search", BOOKMARKS_SEARCH) 231 232 protected: 233 virtual ~BookmarksSearchFunction() {} 234 235 // BookmarksFunction: 236 virtual bool RunOnReady() OVERRIDE; 237 }; 238 239 class BookmarksRemoveFunction : public BookmarksFunction { 240 public: 241 DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE) 242 243 // Returns true on successful parse and sets invalid_id to true if conversion 244 // from id string to int64 failed. 245 static bool ExtractIds(const base::ListValue* args, 246 std::list<int64>* ids, 247 bool* invalid_id); 248 // BookmarksFunction: 249 virtual void GetQuotaLimitHeuristics( 250 QuotaLimitHeuristics* heuristics) const OVERRIDE; 251 252 protected: 253 virtual ~BookmarksRemoveFunction() {} 254 255 // BookmarksFunction: 256 virtual bool RunOnReady() OVERRIDE; 257 }; 258 259 class BookmarksRemoveTreeFunction : public BookmarksRemoveFunction { 260 public: 261 DECLARE_EXTENSION_FUNCTION("bookmarks.removeTree", BOOKMARKS_REMOVETREE) 262 263 protected: 264 virtual ~BookmarksRemoveTreeFunction() {} 265 }; 266 267 class BookmarksCreateFunction : public BookmarksFunction { 268 public: 269 DECLARE_EXTENSION_FUNCTION("bookmarks.create", BOOKMARKS_CREATE) 270 271 // BookmarksFunction: 272 virtual void GetQuotaLimitHeuristics( 273 QuotaLimitHeuristics* heuristics) const OVERRIDE; 274 275 protected: 276 virtual ~BookmarksCreateFunction() {} 277 278 // BookmarksFunction: 279 virtual bool RunOnReady() OVERRIDE; 280 }; 281 282 class BookmarksMoveFunction : public BookmarksFunction { 283 public: 284 DECLARE_EXTENSION_FUNCTION("bookmarks.move", BOOKMARKS_MOVE) 285 286 static bool ExtractIds(const base::ListValue* args, 287 std::list<int64>* ids, 288 bool* invalid_id); 289 290 // BookmarksFunction: 291 virtual void GetQuotaLimitHeuristics( 292 QuotaLimitHeuristics* heuristics) const OVERRIDE; 293 294 protected: 295 virtual ~BookmarksMoveFunction() {} 296 297 // BookmarksFunction: 298 virtual bool RunOnReady() OVERRIDE; 299 }; 300 301 class BookmarksUpdateFunction : public BookmarksFunction { 302 public: 303 DECLARE_EXTENSION_FUNCTION("bookmarks.update", BOOKMARKS_UPDATE) 304 305 static bool ExtractIds(const base::ListValue* args, 306 std::list<int64>* ids, 307 bool* invalid_id); 308 309 // BookmarksFunction: 310 virtual void GetQuotaLimitHeuristics( 311 QuotaLimitHeuristics* heuristics) const OVERRIDE; 312 313 protected: 314 virtual ~BookmarksUpdateFunction() {} 315 316 // BookmarksFunction: 317 virtual bool RunOnReady() OVERRIDE; 318 }; 319 320 class BookmarksIOFunction : public BookmarksFunction, 321 public ui::SelectFileDialog::Listener { 322 public: 323 BookmarksIOFunction(); 324 325 virtual void FileSelected(const base::FilePath& path, int index, void* params) = 0; 326 327 // ui::SelectFileDialog::Listener: 328 virtual void MultiFilesSelected(const std::vector<base::FilePath>& files, 329 void* params) OVERRIDE; 330 virtual void FileSelectionCanceled(void* params) OVERRIDE; 331 332 void SelectFile(ui::SelectFileDialog::Type type); 333 334 protected: 335 virtual ~BookmarksIOFunction(); 336 337 private: 338 void ShowSelectFileDialog( 339 ui::SelectFileDialog::Type type, 340 const base::FilePath& default_path); 341 342 protected: 343 scoped_refptr<ui::SelectFileDialog> select_file_dialog_; 344 }; 345 346 class BookmarksImportFunction : public BookmarksIOFunction { 347 public: 348 DECLARE_EXTENSION_FUNCTION("bookmarks.import", BOOKMARKS_IMPORT) 349 350 // BookmarkManagerIOFunction: 351 virtual void FileSelected(const base::FilePath& path, 352 int index, 353 void* params) OVERRIDE; 354 355 private: 356 virtual ~BookmarksImportFunction() {} 357 358 // BookmarksFunction: 359 virtual bool RunOnReady() OVERRIDE; 360 }; 361 362 class BookmarksExportFunction : public BookmarksIOFunction { 363 public: 364 DECLARE_EXTENSION_FUNCTION("bookmarks.export", BOOKMARKS_EXPORT) 365 366 // BookmarkManagerIOFunction: 367 virtual void FileSelected(const base::FilePath& path, 368 int index, 369 void* params) OVERRIDE; 370 371 private: 372 virtual ~BookmarksExportFunction() {} 373 374 // BookmarksFunction: 375 virtual bool RunOnReady() OVERRIDE; 376 }; 377 378 } // namespace extensions 379 380 #endif // CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_H_ 381