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
20class Profile;
21
22namespace bookmarks {
23struct BookmarkNodeData;
24}
25
26namespace content {
27class BrowserContext;
28class WebContents;
29}
30
31namespace extensions {
32
33class 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
59class 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.
90class 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
122class ClipboardBookmarkManagerFunction : public extensions::BookmarksFunction {
123 protected:
124  virtual ~ClipboardBookmarkManagerFunction() {}
125
126  bool CopyOrCut(bool cut, const std::vector<std::string>& id_list);
127};
128
129class 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
142class 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
155class 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
168class 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
181class 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
194class 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
206class 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
219class 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
232class 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
245class 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
258class 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
271class 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
284class 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
297class 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
310class 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
323class 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
336class 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
349class 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
362class 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
375class 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
388class 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