1// Copyright 2014 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_BOOKMARKS_CHROME_BOOKMARK_CLIENT_H_
6#define CHROME_BROWSER_BOOKMARKS_CHROME_BOOKMARK_CLIENT_H_
7
8#include <set>
9#include <vector>
10
11#include "base/callback_list.h"
12#include "base/deferred_sequenced_task_runner.h"
13#include "base/macros.h"
14#include "components/bookmarks/browser/base_bookmark_model_observer.h"
15#include "components/bookmarks/browser/bookmark_client.h"
16#include "components/policy/core/browser/managed_bookmarks_tracker.h"
17
18class BookmarkModel;
19class GURL;
20class HistoryService;
21class HistoryServiceFactory;
22class Profile;
23
24class ChromeBookmarkClient : public bookmarks::BookmarkClient,
25                             public BaseBookmarkModelObserver {
26 public:
27  explicit ChromeBookmarkClient(Profile* profile);
28  virtual ~ChromeBookmarkClient();
29
30  void Init(BookmarkModel* model);
31
32  // KeyedService:
33  virtual void Shutdown() OVERRIDE;
34
35  // Returns the managed_node.
36  const BookmarkNode* managed_node() { return managed_node_; }
37
38  // Returns true if the given node belongs to the managed bookmarks tree.
39  bool IsDescendantOfManagedNode(const BookmarkNode* node);
40
41  // Returns true if there is at least one managed node in the |list|.
42  bool HasDescendantsOfManagedNode(
43      const std::vector<const BookmarkNode*>& list);
44
45  // bookmarks::BookmarkClient:
46  virtual bool PreferTouchIcon() OVERRIDE;
47  virtual base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
48      const GURL& page_url,
49      favicon_base::IconType type,
50      const favicon_base::FaviconImageCallback& callback,
51      base::CancelableTaskTracker* tracker) OVERRIDE;
52  virtual bool SupportsTypedCountForNodes() OVERRIDE;
53  virtual void GetTypedCountForNodes(
54      const NodeSet& nodes,
55      NodeTypedCountPairs* node_typed_count_pairs) OVERRIDE;
56  virtual bool IsPermanentNodeVisible(
57      const BookmarkPermanentNode* node) OVERRIDE;
58  virtual void RecordAction(const base::UserMetricsAction& action) OVERRIDE;
59  virtual bookmarks::LoadExtraCallback GetLoadExtraNodesCallback() OVERRIDE;
60  virtual bool CanSetPermanentNodeTitle(
61      const BookmarkNode* permanent_node) OVERRIDE;
62  virtual bool CanSyncNode(const BookmarkNode* node) OVERRIDE;
63  virtual bool CanBeEditedByUser(const BookmarkNode* node) OVERRIDE;
64
65 private:
66  friend class HistoryServiceFactory;
67  void SetHistoryService(HistoryService* history_service);
68
69  // BaseBookmarkModelObserver:
70  virtual void BookmarkModelChanged() OVERRIDE;
71  virtual void BookmarkNodeRemoved(BookmarkModel* model,
72                                   const BookmarkNode* parent,
73                                   int old_index,
74                                   const BookmarkNode* node,
75                                   const std::set<GURL>& removed_urls) OVERRIDE;
76  virtual void BookmarkAllUserNodesRemoved(
77      BookmarkModel* model,
78      const std::set<GURL>& removed_urls) OVERRIDE;
79  virtual void BookmarkModelLoaded(BookmarkModel* model,
80                                   bool ids_reassigned) OVERRIDE;
81
82  // Helper for GetLoadExtraNodesCallback().
83  static bookmarks::BookmarkPermanentNodeList LoadExtraNodes(
84      scoped_ptr<BookmarkPermanentNode> managed_node,
85      scoped_ptr<base::ListValue> initial_managed_bookmarks,
86      int64* next_node_id);
87
88  // Returns the management domain that configured the managed bookmarks,
89  // or an empty string.
90  std::string GetManagedBookmarksDomain();
91
92  Profile* profile_;
93
94  // HistoryService associated to the Profile. Due to circular dependency, this
95  // cannot be passed to the constructor, nor lazily fetched. Instead the value
96  // is initialized from HistoryServiceFactory.
97  HistoryService* history_service_;
98
99  scoped_ptr<base::CallbackList<void(const std::set<GURL>&)>::Subscription>
100      favicon_changed_subscription_;
101
102  // Pointer to the BookmarkModel. Will be non-NULL from the call to Init to
103  // the call to Shutdown. Must be valid for the whole interval.
104  BookmarkModel* model_;
105
106  scoped_ptr<policy::ManagedBookmarksTracker> managed_bookmarks_tracker_;
107  BookmarkPermanentNode* managed_node_;
108
109  DISALLOW_COPY_AND_ASSIGN(ChromeBookmarkClient);
110};
111
112#endif  // CHROME_BROWSER_BOOKMARKS_CHROME_BOOKMARK_CLIENT_H_
113