910e62b5创建于 1月15日历史提交
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_CLIENT_H_
#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_CLIENT_H_

#include <cstdint>
#include <map>
#include <string>
#include <unordered_map>
#include <utility>

#include "base/functional/callback_forward.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/bookmarks/common/bookmark_metrics.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/keyed_service/core/keyed_service.h"

class GURL;

namespace bookmarks {

class BookmarkModel;
class BookmarkNode;
class BookmarkPermanentNode;

// A callback that generates a std::unique_ptr<BookmarkPermanentNode>, given a
// max ID to use. The max ID argument will be updated after if a new node has
// been created and assigned an ID.
using LoadManagedNodeCallback =
    base::OnceCallback<std::unique_ptr<BookmarkPermanentNode>(int64_t*)>;

// This class abstracts operations that depends on the embedder's environment,
// e.g. Chrome.
class BookmarkClient {
 public:
  // Type representing a mapping from URLs to the number of times the URL has
  // been typed by the user in the Omnibox.
  using UrlTypedCountMap = std::unordered_map<const GURL*, int>;

  virtual ~BookmarkClient() = default;

  // Called during initialization of BookmarkModel.
  virtual void Init(BookmarkModel* model);

  // Called when loading from disk triggered some recovery, meaning that IDs or
  // UUIDs could have been reassigned. If IDs were reassigned, which is not
  // always the case, `local_or_syncable_reassigned_ids_per_old_id` contains
  // the mapping from old IDs (before reassignment) to new ones.
  virtual void RequiredRecoveryToLoad(
      const std::multimap<int64_t, int64_t>&
          local_or_syncable_reassigned_ids_per_old_id);

  // Gets a bookmark folder that the provided URL can be saved to. If nullptr is
  // returned, the bookmark is saved to the default location (usually this is
  // the last modified folder). This affords features the option to override the
  // default folder if relevant for the URL.
  virtual const BookmarkNode* GetSuggestedSaveLocation(const GURL& url);

  // Requests a favicon from the history cache for the web page at `page_url`
  // for icon type favicon_base::IconType::kFavicon. `callback` is run when the
  // favicon has been fetched, which returns gfx::Image is a multi-resolution
  // image of gfx::kFaviconSize DIP width and height. The data from the history
  // cache is resized if need be.
  virtual base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
      const GURL& page_url,
      favicon_base::FaviconImageCallback callback,
      base::CancelableTaskTracker* tracker);

  // Returns true if the embedder supports typed count for URL.
  virtual bool SupportsTypedCountForUrls();

  // Retrieves the number of times each bookmark URL has been typed in
  // the Omnibox by the user. For each key (URL) in `url_typed_count_map`,
  // the corresponding value will be updated with the typed count of that URL.
  // `url_typed_count_map` must not be null.
  virtual void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map);

  // Returns a task that will be used to load a managed root node. This task
  // will be invoked in the Profile's IO task runner.
  virtual LoadManagedNodeCallback GetLoadManagedNodeCallback() = 0;

  // Returns whether sync-the-feature is currently on, for the purpose of
  // logging metrics and influence predicates such
  // `BookmarkModel::IsLocalOnlyNode()`.
  virtual bool IsSyncFeatureEnabledIncludingBookmarks() = 0;

  // Returns true if the `permanent_node` can have its title updated.
  virtual bool CanSetPermanentNodeTitle(const BookmarkNode* permanent_node) = 0;

  // Returns true if `node` is considered a managed node.
  virtual bool IsNodeManaged(const BookmarkNode* node) = 0;

  // Encodes the bookmark sync data into a string blob. It's used by the
  // bookmark model to persist the sync metadata together with the bookmark
  // model. It comes with two variants: the blob corresponding to the
  // local-or-syncable bookmarks and the one for account bookmarks. In
  // normal circumnstances, at most one of them is non-empty.
  virtual std::string EncodeLocalOrSyncableBookmarkSyncMetadata() = 0;
  virtual std::string EncodeAccountBookmarkSyncMetadata() = 0;

  // Decodes a string representing the sync metadata stored in `metadata_str`.
  // Same as with encoding, it comes with two variants, one for
  // local-or-syncable bookmarks and one for account bookmarks. The model calls
  // this method after it has loaded the model data. `schedule_save_closure` is
  // a repeating call back to trigger a model and metadata persistence process.
  virtual void DecodeLocalOrSyncableBookmarkSyncMetadata(
      const std::string& metadata_str,
      const base::RepeatingClosure& schedule_save_closure) = 0;

  // Decoding of sync metadata corresponding to account bookmarks may result in
  // metadata being invalidated. In this case, account bookmarks are also
  // deleted automatically.
  enum class DecodeAccountBookmarkSyncMetadataResult {
    kSuccess,
    kMustRemoveAccountPermanentFolders,
  };
  virtual DecodeAccountBookmarkSyncMetadataResult
  DecodeAccountBookmarkSyncMetadata(
      const std::string& metadata_str,
      const base::RepeatingClosure& schedule_save_closure) = 0;

  // Similar to BookmarkModelObserver::BookmarkNodeRemoved(), but transfers
  // ownership of BookmarkNode, which allows undoing the operation.
  virtual void OnBookmarkNodeRemovedUndoable(
      const BookmarkNode* parent,
      size_t index,
      std::unique_ptr<BookmarkNode> node) = 0;

  // Creates a persistent timer that allows recording metrics periodically
  // (every 24hrs or on next startup). `metrics_callback` contains the logic to
  // compute the metrics to be logged.
  virtual void SchedulePersistentTimerForDailyMetrics(
      base::RepeatingClosure metrics_callback) = 0;
};

}  // namespace bookmarks

#endif  // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_CLIENT_H_