OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 COMPONENTS_PREVIEWS_CORE_PREVIEWS_BLACK_LIST_H_ |
| 6 #define COMPONENTS_PREVIEWS_CORE_PREVIEWS_BLACK_LIST_H_ |
| 7 |
| 8 #include <stdint.h> |
| 9 |
| 10 #include <memory> |
| 11 #include <queue> |
| 12 #include <string> |
| 13 #include <vector> |
| 14 |
| 15 #include "base/callback.h" |
| 16 #include "base/macros.h" |
| 17 #include "base/memory/weak_ptr.h" |
| 18 #include "base/threading/thread_checker.h" |
| 19 #include "components/previews/core/previews_opt_out_store.h" |
| 20 |
| 21 class GURL; |
| 22 |
| 23 namespace base { |
| 24 class Clock; |
| 25 } |
| 26 |
| 27 namespace previews { |
| 28 class PreviewsBlackListItem; |
| 29 |
| 30 // Manages the state of black listed domains for the previews experiment. Loads |
| 31 // the stored black list from |opt_out_store| and manages an in memory black |
| 32 // list on the IO thread. Updates to the black list are stored in memory and |
| 33 // pushed to the store. Asynchronous modifications are stored in a queue and |
| 34 // executed in order. Reading from the black list is always synchronous, and if |
| 35 // the black list is not currently loaded (e.g., at startup, after clearing |
| 36 // browsing history), domains are reported as black listed. The list stores no |
| 37 // more than previews::params::MaxInMemoryHostsInBlackList hosts in-memory, |
| 38 // which defaults to 100. |
| 39 class PreviewsBlackList { |
| 40 public: |
| 41 // |opt_out_store| is the backing store to retrieve and store black list |
| 42 // information, and can be null. When |opt_out_store| is null, the in-memory |
| 43 // map will be immediately loaded to empty. If |opt_out_store| is non-null, |
| 44 // it will be used to load the in-memory map asynchronously. |
| 45 PreviewsBlackList(std::unique_ptr<PreviewsOptOutStore> opt_out_store, |
| 46 std::unique_ptr<base::Clock> clock); |
| 47 ~PreviewsBlackList(); |
| 48 |
| 49 // Asynchronously adds a new navigation to to the in-memory black list and |
| 50 // backing store. |opt_out| is whether the user opted out of the preview or |
| 51 // navigated away from the page without opting out. |type| is only passed to |
| 52 // the backing store. If the in memory map has reached the max number of hosts |
| 53 // allowed, and |url| is a new host, a host will be evicted based on recency |
| 54 // of the hosts most recent opt out. |
| 55 void AddPreviewNavigation(const GURL& url, bool opt_out, PreviewsType type); |
| 56 |
| 57 // Synchronously determines if |host_name| should be allowed to show previews. |
| 58 // If the black list has loaded yet, this will always return false. |type| is |
| 59 // not used to make this decision. |
| 60 bool IsLoadedAndAllowed(const GURL& url, PreviewsType type) const; |
| 61 |
| 62 private: |
| 63 // Synchronous version of AddPreviewNavigation method. |
| 64 void AddPreviewNavigationSync(const GURL& host_name, |
| 65 bool opt_out, |
| 66 PreviewsType type); |
| 67 |
| 68 // Returns the PreviewsBlackListItem representing |host_name|. If there is no |
| 69 // item for |host_name|, returns null. |
| 70 PreviewsBlackListItem* GetBlackListItem(const std::string& host_name) const; |
| 71 |
| 72 // Returns a new PreviewsBlackListItem representing |host_name|. Adds the new |
| 73 // item to the in-memory map. |
| 74 PreviewsBlackListItem* CreateBlackListItem(const std::string& host_name); |
| 75 |
| 76 // Callback passed to the backing store when loading black list information. |
| 77 // Moves the returned map into the in-memory black list and runs any |
| 78 // outstanding tasks. |
| 79 void LoadBlackListDone(std::unique_ptr<BlackListItemMap> black_list_item_map); |
| 80 |
| 81 // Called while waiting for the black list to be loaded from the backing |
| 82 // store. |
| 83 // Enqueues a task to run when when loading black list information has |
| 84 // completed. Maintains the order that tasks were called in. |
| 85 void QueuePendingTask(base::Closure callback); |
| 86 |
| 87 // Evicts one entry from the in-memory black list based on recency of a hosts |
| 88 // most recent opt out time. |
| 89 void EvictOldestOptOut(); |
| 90 |
| 91 // Map maintaining the in-memory black list. |
| 92 std::unique_ptr<BlackListItemMap> black_list_item_map_; |
| 93 |
| 94 // Whether the black list is done being loaded from the backing store. |
| 95 bool loaded_; |
| 96 |
| 97 // The backing store of the black list information. |
| 98 std::unique_ptr<PreviewsOptOutStore> opt_out_store_; |
| 99 |
| 100 // Callbacks to be run after loading information from the backing store has |
| 101 // completed. |
| 102 std::queue<base::Closure> pending_callbacks_; |
| 103 |
| 104 std::unique_ptr<base::Clock> clock_; |
| 105 |
| 106 base::ThreadChecker thread_checker_; |
| 107 |
| 108 base::WeakPtrFactory<PreviewsBlackList> weak_factory_; |
| 109 |
| 110 DISALLOW_COPY_AND_ASSIGN(PreviewsBlackList); |
| 111 }; |
| 112 |
| 113 } // namespace previews |
| 114 |
| 115 #endif // COMPONENTS_PREVIEWS_CORE_PREVIEWS_BLACK_LIST_H_ |
OLD | NEW |