OLD | NEW |
| (Empty) |
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_AUTOCOMPLETE_SHORTCUTS_BACKEND_H_ | |
6 #define CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_BACKEND_H_ | |
7 | |
8 #include <map> | |
9 #include <string> | |
10 #include <vector> | |
11 | |
12 #include "base/files/file_path.h" | |
13 #include "base/gtest_prod_util.h" | |
14 #include "base/memory/ref_counted.h" | |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "base/observer_list.h" | |
17 #include "base/scoped_observer.h" | |
18 #include "base/sequenced_task_runner.h" | |
19 #include "base/strings/string16.h" | |
20 #include "base/synchronization/lock.h" | |
21 #include "base/time/time.h" | |
22 #include "components/history/core/browser/history_service_observer.h" | |
23 #include "components/keyed_service/core/refcounted_keyed_service.h" | |
24 #include "components/omnibox/autocomplete_match.h" | |
25 #include "components/omnibox/shortcuts_database.h" | |
26 #include "components/search_engines/search_terms_data.h" | |
27 #include "url/gurl.h" | |
28 | |
29 class TemplateURLService; | |
30 | |
31 namespace history { | |
32 class HistoryService; | |
33 class ShortcutsDatabase; | |
34 }; // namespace history | |
35 | |
36 // This class manages the shortcut provider backend - access to database on the | |
37 // db thread, etc. | |
38 class ShortcutsBackend : public RefcountedKeyedService, | |
39 public history::HistoryServiceObserver { | |
40 public: | |
41 typedef std::multimap<base::string16, const ShortcutsDatabase::Shortcut> | |
42 ShortcutMap; | |
43 | |
44 // For unit testing, set |suppress_db| to true to prevent creation | |
45 // of the database, in which case all operations are performed in memory only. | |
46 ShortcutsBackend(TemplateURLService* template_url_service, | |
47 scoped_ptr<SearchTermsData> search_terms_data, | |
48 history::HistoryService* history_service, | |
49 scoped_refptr<base::SequencedTaskRunner> db_runner, | |
50 base::FilePath database_path, | |
51 bool suppress_db); | |
52 | |
53 // The interface is guaranteed to be called on the thread AddObserver() | |
54 // was called. | |
55 class ShortcutsBackendObserver { | |
56 public: | |
57 // Called after the database is loaded and Init() completed. | |
58 virtual void OnShortcutsLoaded() = 0; | |
59 // Called when shortcuts changed (added/updated/removed) in the database. | |
60 virtual void OnShortcutsChanged() {} | |
61 | |
62 protected: | |
63 virtual ~ShortcutsBackendObserver() {} | |
64 }; | |
65 | |
66 // Asynchronously initializes the ShortcutsBackend, it is safe to call | |
67 // multiple times - only the first call will be processed. | |
68 bool Init(); | |
69 | |
70 // All of the public functions *must* be called on UI thread only! | |
71 | |
72 bool initialized() const { return current_state_ == INITIALIZED; } | |
73 const ShortcutMap& shortcuts_map() const { return shortcuts_map_; } | |
74 | |
75 // Deletes the Shortcuts with the url. | |
76 bool DeleteShortcutsWithURL(const GURL& shortcut_url); | |
77 | |
78 // Deletes the Shortcuts that begin with the url. | |
79 bool DeleteShortcutsBeginningWithURL(const GURL& shortcut_url); | |
80 | |
81 void AddObserver(ShortcutsBackendObserver* obs); | |
82 void RemoveObserver(ShortcutsBackendObserver* obs); | |
83 | |
84 // Looks for an existing shortcut to match.destination_url that starts with | |
85 // |text|. Updates that shortcut if found, otherwise adds a new shortcut. | |
86 void AddOrUpdateShortcut(const base::string16& text, | |
87 const AutocompleteMatch& match); | |
88 | |
89 private: | |
90 friend class base::RefCountedThreadSafe<ShortcutsBackend>; | |
91 friend class ShortcutsProviderTest; | |
92 friend class ShortcutsBackendTest; | |
93 FRIEND_TEST_ALL_PREFIXES(ShortcutsBackendTest, EntitySuggestionTest); | |
94 | |
95 enum CurrentState { | |
96 NOT_INITIALIZED, // Backend created but not initialized. | |
97 INITIALIZING, // Init() called, but not completed yet. | |
98 INITIALIZED, // Initialization completed, all accessors can be safely | |
99 // called. | |
100 }; | |
101 | |
102 typedef std::map<std::string, ShortcutMap::iterator> GuidMap; | |
103 | |
104 ~ShortcutsBackend() override; | |
105 | |
106 static ShortcutsDatabase::Shortcut::MatchCore MatchToMatchCore( | |
107 const AutocompleteMatch& match, | |
108 TemplateURLService* template_url_service, | |
109 SearchTermsData* search_terms_data); | |
110 | |
111 // RefcountedKeyedService: | |
112 void ShutdownOnUIThread() override; | |
113 | |
114 // history::HistoryServiceObserver: | |
115 void OnURLsDeleted(history::HistoryService* history_service, | |
116 bool all_history, | |
117 bool expired, | |
118 const history::URLRows& deleted_rows, | |
119 const std::set<GURL>& favicon_urls) override; | |
120 | |
121 // Internal initialization of the back-end. Posted by Init() to the DB thread. | |
122 // On completion posts InitCompleted() back to UI thread. | |
123 void InitInternal(); | |
124 | |
125 // Finishes initialization on UI thread, notifies all observers. | |
126 void InitCompleted(); | |
127 | |
128 // Adds the Shortcut to the database. | |
129 bool AddShortcut(const ShortcutsDatabase::Shortcut& shortcut); | |
130 | |
131 // Updates timing and selection count for the Shortcut. | |
132 bool UpdateShortcut(const ShortcutsDatabase::Shortcut& shortcut); | |
133 | |
134 // Deletes the Shortcuts with these IDs. | |
135 bool DeleteShortcutsWithIDs( | |
136 const ShortcutsDatabase::ShortcutIDs& shortcut_ids); | |
137 | |
138 // Deletes all shortcuts whose URLs begin with |url|. If |exact_match| is | |
139 // true, only shortcuts from exactly |url| are deleted. | |
140 bool DeleteShortcutsWithURL(const GURL& url, bool exact_match); | |
141 | |
142 // Deletes all of the shortcuts. | |
143 bool DeleteAllShortcuts(); | |
144 | |
145 TemplateURLService* template_url_service_; | |
146 scoped_ptr<SearchTermsData> search_terms_data_; | |
147 | |
148 CurrentState current_state_; | |
149 base::ObserverList<ShortcutsBackendObserver> observer_list_; | |
150 scoped_refptr<ShortcutsDatabase> db_; | |
151 | |
152 // The |temp_shortcuts_map_| and |temp_guid_map_| used for temporary storage | |
153 // between InitInternal() and InitComplete() to avoid doing a potentially huge | |
154 // copy. | |
155 scoped_ptr<ShortcutMap> temp_shortcuts_map_; | |
156 scoped_ptr<GuidMap> temp_guid_map_; | |
157 | |
158 ShortcutMap shortcuts_map_; | |
159 // This is a helper map for quick access to a shortcut by guid. | |
160 GuidMap guid_map_; | |
161 | |
162 ScopedObserver<history::HistoryService, history::HistoryServiceObserver> | |
163 history_service_observer_; | |
164 | |
165 scoped_refptr<base::SequencedTaskRunner> main_runner_; | |
166 scoped_refptr<base::SequencedTaskRunner> db_runner_; | |
167 | |
168 // For some unit-test only. | |
169 bool no_db_access_; | |
170 | |
171 DISALLOW_COPY_AND_ASSIGN(ShortcutsBackend); | |
172 }; | |
173 | |
174 #endif // CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_BACKEND_H_ | |
OLD | NEW |