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_BOOKMARK_MANAGER_PRIVATE_BOOKMARK_MANAGER_PRIVATE_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_BOOKMARK_MANAGER_PRIVATE_BOOKMARK_MANAGER_PRIVATE_API_H_ 7 8 #include "base/memory/scoped_ptr.h" 9 #include "base/values.h" 10 #include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h" 11 #include "chrome/browser/extensions/chrome_extension_function.h" 12 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 13 #include "chrome/browser/undo/bookmark_undo_service.h" 14 #include "chrome/browser/undo/bookmark_undo_service_factory.h" 15 #include "components/bookmarks/browser/base_bookmark_model_observer.h" 16 #include "components/bookmarks/browser/bookmark_node_data.h" 17 #include "extensions/browser/browser_context_keyed_api_factory.h" 18 #include "extensions/browser/event_router.h" 19 20 class Profile; 21 22 namespace bookmarks { 23 struct BookmarkNodeData; 24 } 25 26 namespace content { 27 class BrowserContext; 28 class WebContents; 29 } 30 31 namespace extensions { 32 33 class BookmarkManagerPrivateEventRouter : public BaseBookmarkModelObserver { 34 public: 35 BookmarkManagerPrivateEventRouter(content::BrowserContext* browser_context, 36 BookmarkModel* bookmark_model); 37 virtual ~BookmarkManagerPrivateEventRouter(); 38 39 // BaseBookmarkModelObserver: 40 virtual void BookmarkModelChanged() OVERRIDE; 41 virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; 42 virtual void OnWillChangeBookmarkMetaInfo(BookmarkModel* model, 43 const BookmarkNode* node) OVERRIDE; 44 virtual void BookmarkMetaInfoChanged(BookmarkModel* model, 45 const BookmarkNode* node) OVERRIDE; 46 47 private: 48 // Helper to actually dispatch an event to extension listeners. 49 void DispatchEvent(const std::string& event_name, 50 scoped_ptr<base::ListValue> event_args); 51 52 // Remembers the previous meta info of a node before it was changed. 53 BookmarkNode::MetaInfoMap prev_meta_info_; 54 55 content::BrowserContext* browser_context_; 56 BookmarkModel* bookmark_model_; 57 }; 58 59 class BookmarkManagerPrivateAPI : public BrowserContextKeyedAPI, 60 public EventRouter::Observer { 61 public: 62 explicit BookmarkManagerPrivateAPI(content::BrowserContext* browser_context); 63 virtual ~BookmarkManagerPrivateAPI(); 64 65 // BrowserContextKeyedService implementation. 66 virtual void Shutdown() OVERRIDE; 67 68 // BrowserContextKeyedAPI implementation. 69 static BrowserContextKeyedAPIFactory<BookmarkManagerPrivateAPI>* 70 GetFactoryInstance(); 71 72 // EventRouter::Observer implementation. 73 virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE; 74 75 private: 76 friend class BrowserContextKeyedAPIFactory<BookmarkManagerPrivateAPI>; 77 78 // BrowserContextKeyedAPI implementation. 79 static const char* service_name() { return "BookmarkManagerPrivateAPI"; } 80 static const bool kServiceIsNULLWhileTesting = true; 81 82 content::BrowserContext* browser_context_; 83 84 // Created lazily upon OnListenerAdded. 85 scoped_ptr<BookmarkManagerPrivateEventRouter> event_router_; 86 }; 87 88 // Class that handles the drag and drop related chrome.bookmarkManagerPrivate 89 // events. This class has one instance per bookmark manager tab. 90 class BookmarkManagerPrivateDragEventRouter 91 : public BookmarkTabHelper::BookmarkDrag { 92 public: 93 BookmarkManagerPrivateDragEventRouter(Profile* profile, 94 content::WebContents* web_contents); 95 virtual ~BookmarkManagerPrivateDragEventRouter(); 96 97 // BookmarkTabHelper::BookmarkDrag interface 98 virtual void OnDragEnter(const bookmarks::BookmarkNodeData& data) OVERRIDE; 99 virtual void OnDragOver(const bookmarks::BookmarkNodeData& data) OVERRIDE; 100 virtual void OnDragLeave(const bookmarks::BookmarkNodeData& data) OVERRIDE; 101 virtual void OnDrop(const bookmarks::BookmarkNodeData& data) OVERRIDE; 102 103 // The bookmark drag and drop data. This gets set after a drop was done on 104 // the page. This returns NULL if no data is available. 105 const bookmarks::BookmarkNodeData* GetBookmarkNodeData(); 106 107 // Clears the drag and drop data. 108 void ClearBookmarkNodeData(); 109 110 private: 111 // Helper to actually dispatch an event to extension listeners. 112 void DispatchEvent(const std::string& event_name, 113 scoped_ptr<base::ListValue> args); 114 115 Profile* profile_; 116 content::WebContents* web_contents_; 117 bookmarks::BookmarkNodeData bookmark_drag_data_; 118 119 DISALLOW_COPY_AND_ASSIGN(BookmarkManagerPrivateDragEventRouter); 120 }; 121 122 class ClipboardBookmarkManagerFunction : public extensions::BookmarksFunction { 123 protected: 124 virtual ~ClipboardBookmarkManagerFunction() {} 125 126 bool CopyOrCut(bool cut, const std::vector<std::string>& id_list); 127 }; 128 129 class BookmarkManagerPrivateCopyFunction 130 : public ClipboardBookmarkManagerFunction { 131 public: 132 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.copy", 133 BOOKMARKMANAGERPRIVATE_COPY) 134 135 protected: 136 virtual ~BookmarkManagerPrivateCopyFunction() {} 137 138 // ExtensionFunction: 139 virtual bool RunOnReady() OVERRIDE; 140 }; 141 142 class BookmarkManagerPrivateCutFunction 143 : public ClipboardBookmarkManagerFunction { 144 public: 145 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.cut", 146 BOOKMARKMANAGERPRIVATE_CUT) 147 148 protected: 149 virtual ~BookmarkManagerPrivateCutFunction() {} 150 151 // ExtensionFunction: 152 virtual bool RunOnReady() OVERRIDE; 153 }; 154 155 class BookmarkManagerPrivatePasteFunction 156 : public extensions::BookmarksFunction { 157 public: 158 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.paste", 159 BOOKMARKMANAGERPRIVATE_PASTE) 160 161 protected: 162 virtual ~BookmarkManagerPrivatePasteFunction() {} 163 164 // ExtensionFunction: 165 virtual bool RunOnReady() OVERRIDE; 166 }; 167 168 class BookmarkManagerPrivateCanPasteFunction 169 : public extensions::BookmarksFunction { 170 public: 171 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.canPaste", 172 BOOKMARKMANAGERPRIVATE_CANPASTE) 173 174 protected: 175 virtual ~BookmarkManagerPrivateCanPasteFunction() {} 176 177 // ExtensionFunction: 178 virtual bool RunOnReady() OVERRIDE; 179 }; 180 181 class BookmarkManagerPrivateSortChildrenFunction 182 : public extensions::BookmarksFunction { 183 public: 184 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.sortChildren", 185 BOOKMARKMANAGERPRIVATE_SORTCHILDREN) 186 187 protected: 188 virtual ~BookmarkManagerPrivateSortChildrenFunction() {} 189 190 // ExtensionFunction: 191 virtual bool RunOnReady() OVERRIDE; 192 }; 193 194 class BookmarkManagerPrivateGetStringsFunction : public AsyncExtensionFunction { 195 public: 196 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.getStrings", 197 BOOKMARKMANAGERPRIVATE_GETSTRINGS) 198 199 protected: 200 virtual ~BookmarkManagerPrivateGetStringsFunction() {} 201 202 // ExtensionFunction: 203 virtual bool RunAsync() OVERRIDE; 204 }; 205 206 class BookmarkManagerPrivateStartDragFunction 207 : public extensions::BookmarksFunction { 208 public: 209 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.startDrag", 210 BOOKMARKMANAGERPRIVATE_STARTDRAG) 211 212 protected: 213 virtual ~BookmarkManagerPrivateStartDragFunction() {} 214 215 // ExtensionFunction: 216 virtual bool RunOnReady() OVERRIDE; 217 }; 218 219 class BookmarkManagerPrivateDropFunction 220 : public extensions::BookmarksFunction { 221 public: 222 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.drop", 223 BOOKMARKMANAGERPRIVATE_DROP) 224 225 protected: 226 virtual ~BookmarkManagerPrivateDropFunction() {} 227 228 // ExtensionFunction: 229 virtual bool RunOnReady() OVERRIDE; 230 }; 231 232 class BookmarkManagerPrivateGetSubtreeFunction 233 : public extensions::BookmarksFunction { 234 public: 235 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.getSubtree", 236 BOOKMARKMANAGERPRIVATE_GETSUBTREE) 237 238 protected: 239 virtual ~BookmarkManagerPrivateGetSubtreeFunction() {} 240 241 // ExtensionFunction: 242 virtual bool RunOnReady() OVERRIDE; 243 }; 244 245 class BookmarkManagerPrivateCanEditFunction 246 : public extensions::BookmarksFunction { 247 public: 248 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.canEdit", 249 BOOKMARKMANAGERPRIVATE_CANEDIT) 250 251 protected: 252 virtual ~BookmarkManagerPrivateCanEditFunction() {} 253 254 // ExtensionFunction: 255 virtual bool RunOnReady() OVERRIDE; 256 }; 257 258 class BookmarkManagerPrivateRecordLaunchFunction 259 : public extensions::BookmarksFunction { 260 public: 261 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.recordLaunch", 262 BOOKMARKMANAGERPRIVATE_RECORDLAUNCH) 263 264 protected: 265 virtual ~BookmarkManagerPrivateRecordLaunchFunction() {} 266 267 // ExtensionFunction: 268 virtual bool RunOnReady() OVERRIDE; 269 }; 270 271 class BookmarkManagerPrivateCreateWithMetaInfoFunction 272 : public extensions::BookmarksFunction { 273 public: 274 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.createWithMetaInfo", 275 BOOKMARKMANAGERPRIVATE_CREATEWITHMETAINFO) 276 277 protected: 278 virtual ~BookmarkManagerPrivateCreateWithMetaInfoFunction() {} 279 280 // ExtensionFunction: 281 virtual bool RunOnReady() OVERRIDE; 282 }; 283 284 class BookmarkManagerPrivateGetMetaInfoFunction 285 : public extensions::BookmarksFunction { 286 public: 287 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.getMetaInfo", 288 BOOKMARKMANAGERPRIVATE_GETMETAINFO) 289 290 protected: 291 virtual ~BookmarkManagerPrivateGetMetaInfoFunction() {} 292 293 // ExtensionFunction: 294 virtual bool RunOnReady() OVERRIDE; 295 }; 296 297 class BookmarkManagerPrivateSetMetaInfoFunction 298 : public extensions::BookmarksFunction { 299 public: 300 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.setMetaInfo", 301 BOOKMARKMANAGERPRIVATE_SETMETAINFO) 302 303 protected: 304 virtual ~BookmarkManagerPrivateSetMetaInfoFunction() {} 305 306 // ExtensionFunction: 307 virtual bool RunOnReady() OVERRIDE; 308 }; 309 310 class BookmarkManagerPrivateUpdateMetaInfoFunction 311 : public extensions::BookmarksFunction { 312 public: 313 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.updateMetaInfo", 314 BOOKMARKMANAGERPRIVATE_UPDATEMETAINFO) 315 316 protected: 317 virtual ~BookmarkManagerPrivateUpdateMetaInfoFunction() {} 318 319 // ExtensionFunction: 320 virtual bool RunOnReady() OVERRIDE; 321 }; 322 323 class BookmarkManagerPrivateCanOpenNewWindowsFunction 324 : public extensions::BookmarksFunction { 325 public: 326 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.canOpenNewWindows", 327 BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS) 328 329 protected: 330 virtual ~BookmarkManagerPrivateCanOpenNewWindowsFunction() {} 331 332 // ExtensionFunction: 333 virtual bool RunOnReady() OVERRIDE; 334 }; 335 336 class BookmarkManagerPrivateRemoveTreesFunction 337 : public extensions::BookmarksFunction { 338 public: 339 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.removeTrees", 340 BOOKMARKMANAGERPRIVATE_REMOVETREES) 341 342 protected: 343 virtual ~BookmarkManagerPrivateRemoveTreesFunction() {} 344 345 // ExtensionFunction: 346 virtual bool RunOnReady() OVERRIDE; 347 }; 348 349 class BookmarkManagerPrivateUndoFunction 350 : public extensions::BookmarksFunction { 351 public: 352 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.undo", 353 BOOKMARKMANAGERPRIVATE_UNDO) 354 355 protected: 356 virtual ~BookmarkManagerPrivateUndoFunction() {} 357 358 // ExtensionFunction: 359 virtual bool RunOnReady() OVERRIDE; 360 }; 361 362 class BookmarkManagerPrivateRedoFunction 363 : public extensions::BookmarksFunction { 364 public: 365 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.redo", 366 BOOKMARKMANAGERPRIVATE_REDO) 367 368 protected: 369 virtual ~BookmarkManagerPrivateRedoFunction() {} 370 371 // ExtensionFunction: 372 virtual bool RunOnReady() OVERRIDE; 373 }; 374 375 class BookmarkManagerPrivateGetUndoInfoFunction 376 : public extensions::BookmarksFunction { 377 public: 378 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.getUndoInfo", 379 BOOKMARKMANAGERPRIVATE_UNDOINFO) 380 381 protected: 382 virtual ~BookmarkManagerPrivateGetUndoInfoFunction() {} 383 384 // ExtensionFunction: 385 virtual bool RunOnReady() OVERRIDE; 386 }; 387 388 class BookmarkManagerPrivateGetRedoInfoFunction 389 : public extensions::BookmarksFunction { 390 public: 391 DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.getRedoInfo", 392 BOOKMARKMANAGERPRIVATE_REDOINFO) 393 394 protected: 395 virtual ~BookmarkManagerPrivateGetRedoInfoFunction() {} 396 397 // ExtensionFunction: 398 virtual bool RunOnReady() OVERRIDE; 399 }; 400 401 } // namespace extensions 402 403 #endif // CHROME_BROWSER_EXTENSIONS_API_BOOKMARK_MANAGER_PRIVATE_BOOKMARK_MANAGER_PRIVATE_API_H_ 404