bookmarks_api.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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
21class ChromeBookmarkClient;
22
23namespace base {
24class FilePath;
25class ListValue;
26}
27
28namespace content {
29class BrowserContext;
30}
31
32namespace extensions {
33
34namespace api {
35namespace bookmarks {
36struct CreateDetails;
37}
38}
39
40// Observes BookmarkModel and then routes the notifications as events to
41// the extension system.
42class 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
90class 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
121class 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
173class 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
184class 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
195class 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
206class 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
217class 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
228class 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
239class 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
259class BookmarksRemoveTreeFunction : public BookmarksRemoveFunction {
260 public:
261  DECLARE_EXTENSION_FUNCTION("bookmarks.removeTree", BOOKMARKS_REMOVETREE)
262
263 protected:
264  virtual ~BookmarksRemoveTreeFunction() {}
265};
266
267class 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
282class 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
301class 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
320class 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
346class 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
362class 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