OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/test/integration/apps_helper.h" | 5 #include "chrome/browser/sync/test/integration/apps_helper.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/sync/test/integration/status_change_checker.h" | |
13 #include "chrome/browser/sync/test/integration/sync_app_helper.h" | 12 #include "chrome/browser/sync/test/integration/sync_app_helper.h" |
14 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" | 13 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" |
15 #include "chrome/browser/sync/test/integration/sync_extension_helper.h" | 14 #include "chrome/browser/sync/test/integration/sync_extension_helper.h" |
16 #include "chrome/browser/sync/test/integration/sync_extension_installer.h" | 15 #include "chrome/browser/sync/test/integration/sync_extension_installer.h" |
17 #include "content/public/browser/notification_observer.h" | |
18 #include "content/public/browser/notification_registrar.h" | |
19 #include "content/public/browser/notification_service.h" | 16 #include "content/public/browser/notification_service.h" |
20 #include "extensions/browser/extension_prefs.h" | 17 #include "extensions/browser/extension_prefs.h" |
21 #include "extensions/browser/extension_prefs_observer.h" | |
22 #include "extensions/browser/extension_registry.h" | 18 #include "extensions/browser/extension_registry.h" |
23 #include "extensions/browser/extension_registry_observer.h" | |
24 #include "extensions/common/manifest.h" | 19 #include "extensions/common/manifest.h" |
25 | 20 |
26 using sync_datatype_helper::test; | 21 using sync_datatype_helper::test; |
27 | 22 |
28 namespace { | 23 namespace { |
29 | 24 |
30 std::string CreateFakeAppName(int index) { | 25 std::string CreateFakeAppName(int index) { |
31 return "fakeapp" + base::IntToString(index); | 26 return "fakeapp" + base::IntToString(index); |
32 } | 27 } |
33 | 28 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 void CopyNTPOrdinals(Profile* source, Profile* destination, int index) { | 137 void CopyNTPOrdinals(Profile* source, Profile* destination, int index) { |
143 SetPageOrdinalForApp(destination, index, GetPageOrdinalForApp(source, index)); | 138 SetPageOrdinalForApp(destination, index, GetPageOrdinalForApp(source, index)); |
144 SetAppLaunchOrdinalForApp( | 139 SetAppLaunchOrdinalForApp( |
145 destination, index, GetAppLaunchOrdinalForApp(source, index)); | 140 destination, index, GetAppLaunchOrdinalForApp(source, index)); |
146 } | 141 } |
147 | 142 |
148 void FixNTPOrdinalCollisions(Profile* profile) { | 143 void FixNTPOrdinalCollisions(Profile* profile) { |
149 SyncAppHelper::GetInstance()->FixNTPOrdinalCollisions(profile); | 144 SyncAppHelper::GetInstance()->FixNTPOrdinalCollisions(profile); |
150 } | 145 } |
151 | 146 |
152 namespace { | 147 } // namespace apps_helper |
153 | 148 |
154 // A helper class to implement waiting for a set of profiles to have matching | 149 AppsMatchChecker::AppsMatchChecker() : profiles_(test()->GetAllProfiles()) { |
155 // extensions lists. | 150 DCHECK_GE(profiles_.size(), 2U); |
156 class AppsMatchChecker : public StatusChangeChecker, | |
157 public extensions::ExtensionRegistryObserver, | |
158 public extensions::ExtensionPrefsObserver, | |
159 public content::NotificationObserver { | |
160 public: | |
161 explicit AppsMatchChecker(const std::vector<Profile*>& profiles); | |
162 ~AppsMatchChecker() override; | |
163 | 151 |
164 // StatusChangeChecker implementation. | 152 for (Profile* profile : profiles_) { |
165 std::string GetDebugMessage() const override; | 153 // Begin mocking the installation of synced extensions from the web store. |
166 bool IsExitConditionSatisfied() override; | 154 synced_extension_installers_.push_back( |
| 155 new SyncedExtensionInstaller(profile)); |
167 | 156 |
168 // extensions::ExtensionRegistryObserver implementation. | 157 // Register as an observer of ExtensionsRegistry to receive notifications of |
169 void OnExtensionLoaded(content::BrowserContext* context, | 158 // big events, like installs and uninstalls. |
170 const extensions::Extension* extension) override; | 159 extensions::ExtensionRegistry* registry = |
171 void OnExtensionUnloaded( | 160 extensions::ExtensionRegistry::Get(profile); |
172 content::BrowserContext* context, | 161 registry->AddObserver(this); |
173 const extensions::Extension* extenion, | |
174 extensions::UnloadedExtensionInfo::Reason reason) override; | |
175 void OnExtensionInstalled(content::BrowserContext* browser_context, | |
176 const extensions::Extension* extension, | |
177 bool is_update) override; | |
178 void OnExtensionUninstalled(content::BrowserContext* browser_context, | |
179 const extensions::Extension* extension, | |
180 extensions::UninstallReason reason) override; | |
181 | 162 |
182 // extensions::ExtensionPrefsObserver implementation. | 163 // Register for ExtensionPrefs events, too, so we can get notifications |
183 void OnExtensionDisableReasonsChanged(const std::string& extension_id, | 164 // about |
184 int disabled_reasons) override; | 165 // smaller but still syncable events, like launch type changes. |
185 void OnExtensionRegistered(const std::string& extension_id, | 166 extensions::ExtensionPrefs* prefs = |
186 const base::Time& install_time, | 167 extensions::ExtensionPrefs::Get(profile); |
187 bool is_enabled) override; | 168 prefs->AddObserver(this); |
188 void OnExtensionPrefsLoaded(const std::string& extension_id, | 169 } |
189 const extensions::ExtensionPrefs* prefs) override; | |
190 void OnExtensionPrefsDeleted(const std::string& extension_id) override; | |
191 void OnExtensionStateChanged(const std::string& extension_id, | |
192 bool state) override; | |
193 | 170 |
194 // Implementation of content::NotificationObserver. | 171 registrar_.Add(this, chrome::NOTIFICATION_APP_LAUNCHER_REORDERED, |
195 void Observe(int type, | 172 content::NotificationService::AllSources()); |
196 const content::NotificationSource& source, | |
197 const content::NotificationDetails& details) override; | |
198 | |
199 void Wait(); | |
200 | |
201 private: | |
202 std::vector<Profile*> profiles_; | |
203 bool observing_; | |
204 | |
205 content::NotificationRegistrar registrar_; | |
206 | |
207 // This installs apps, too. | |
208 ScopedVector<SyncedExtensionInstaller> synced_extension_installers_; | |
209 | |
210 DISALLOW_COPY_AND_ASSIGN(AppsMatchChecker); | |
211 }; | |
212 | |
213 AppsMatchChecker::AppsMatchChecker(const std::vector<Profile*>& profiles) | |
214 : profiles_(profiles), observing_(false) { | |
215 DCHECK_GE(profiles_.size(), 2U); | |
216 } | 173 } |
217 | 174 |
218 AppsMatchChecker::~AppsMatchChecker() { | 175 AppsMatchChecker::~AppsMatchChecker() { |
219 if (observing_) { | 176 for (Profile* profile : profiles_) { |
220 for (std::vector<Profile*>::iterator it = profiles_.begin(); | 177 extensions::ExtensionRegistry* registry = |
221 it != profiles_.end(); | 178 extensions::ExtensionRegistry::Get(profile); |
222 ++it) { | 179 registry->RemoveObserver(this); |
223 extensions::ExtensionRegistry* registry = | 180 extensions::ExtensionPrefs* prefs = |
224 extensions::ExtensionRegistry::Get(*it); | 181 extensions::ExtensionPrefs::Get(profile); |
225 registry->RemoveObserver(this); | 182 prefs->RemoveObserver(this); |
226 extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(*it); | |
227 prefs->RemoveObserver(this); | |
228 } | |
229 } | 183 } |
| 184 |
| 185 registrar_.Remove(this, chrome::NOTIFICATION_APP_LAUNCHER_REORDERED, |
| 186 content::NotificationService::AllSources()); |
230 } | 187 } |
231 | 188 |
232 std::string AppsMatchChecker::GetDebugMessage() const { | 189 std::string AppsMatchChecker::GetDebugMessage() const { |
233 return "Waiting for apps to match"; | 190 return "Waiting for apps to match"; |
234 } | 191 } |
235 | 192 |
236 bool AppsMatchChecker::IsExitConditionSatisfied() { | 193 bool AppsMatchChecker::IsExitConditionSatisfied() { |
237 std::vector<Profile*>::iterator it = profiles_.begin(); | 194 std::vector<Profile*>::iterator it = profiles_.begin(); |
238 Profile* profile0 = *it; | 195 Profile* profile0 = *it; |
239 ++it; | 196 ++it; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 CheckExitCondition(); | 257 CheckExitCondition(); |
301 } | 258 } |
302 | 259 |
303 void AppsMatchChecker::Observe(int type, | 260 void AppsMatchChecker::Observe(int type, |
304 const content::NotificationSource& source, | 261 const content::NotificationSource& source, |
305 const content::NotificationDetails& details) { | 262 const content::NotificationDetails& details) { |
306 DCHECK_EQ(chrome::NOTIFICATION_APP_LAUNCHER_REORDERED, type); | 263 DCHECK_EQ(chrome::NOTIFICATION_APP_LAUNCHER_REORDERED, type); |
307 CheckExitCondition(); | 264 CheckExitCondition(); |
308 } | 265 } |
309 | 266 |
310 void AppsMatchChecker::Wait() { | |
311 for (std::vector<Profile*>::iterator it = profiles_.begin(); | |
312 it != profiles_.end(); | |
313 ++it) { | |
314 // Begin mocking the installation of synced extensions from the web store. | |
315 synced_extension_installers_.push_back(new SyncedExtensionInstaller(*it)); | |
316 | |
317 // Register as an observer of ExtensionsRegistry to receive notifications of | |
318 // big events, like installs and uninstalls. | |
319 extensions::ExtensionRegistry* registry = | |
320 extensions::ExtensionRegistry::Get(*it); | |
321 registry->AddObserver(this); | |
322 | |
323 // Register for ExtensionPrefs events, too, so we can get notifications | |
324 // about | |
325 // smaller but still syncable events, like launch type changes. | |
326 extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(*it); | |
327 prefs->AddObserver(this); | |
328 } | |
329 | |
330 registrar_.Add(this, | |
331 chrome::NOTIFICATION_APP_LAUNCHER_REORDERED, | |
332 content::NotificationService::AllSources()); | |
333 | |
334 observing_ = true; | |
335 | |
336 if (IsExitConditionSatisfied()) { | |
337 DVLOG(1) << "Apps matched without waiting"; | |
338 return; | |
339 } | |
340 | |
341 DVLOG(1) << "Starting Wait: " << GetDebugMessage(); | |
342 StartBlockingWait(); | |
343 } | |
344 | |
345 } // namespace | |
346 | |
347 bool AwaitAllProfilesHaveSameApps() { | |
348 std::vector<Profile*> profiles; | |
349 if (test()->use_verifier()) { | |
350 profiles.push_back(test()->verifier()); | |
351 } | |
352 for (int i = 0; i < test()->num_clients(); ++i) { | |
353 profiles.push_back(test()->GetProfile(i)); | |
354 } | |
355 | |
356 AppsMatchChecker checker(profiles); | |
357 checker.Wait(); | |
358 return !checker.TimedOut(); | |
359 } | |
360 | |
361 } // namespace apps_helper | |
OLD | NEW |