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