| 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/extensions_helper.h" | 5 #include "chrome/browser/sync/test/integration/extensions_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/memory/ptr_util.h" |
| 9 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 10 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
| 11 #include "chrome/browser/sync/test/integration/status_change_checker.h" | |
| 12 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" | 12 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" |
| 13 #include "chrome/browser/sync/test/integration/sync_extension_helper.h" | 13 #include "chrome/browser/sync/test/integration/sync_extension_helper.h" |
| 14 #include "chrome/browser/sync/test/integration/sync_extension_installer.h" | 14 #include "chrome/browser/sync/test/integration/sync_extension_installer.h" |
| 15 #include "content/public/browser/notification_observer.h" | |
| 16 #include "content/public/browser/notification_registrar.h" | |
| 17 #include "content/public/browser/notification_source.h" | 15 #include "content/public/browser/notification_source.h" |
| 18 #include "extensions/browser/extension_registry.h" | 16 #include "extensions/browser/extension_registry.h" |
| 19 #include "extensions/browser/extension_registry_observer.h" | |
| 20 #include "extensions/common/manifest.h" | 17 #include "extensions/common/manifest.h" |
| 21 | 18 |
| 22 using sync_datatype_helper::test; | 19 using sync_datatype_helper::test; |
| 23 | 20 |
| 24 namespace extensions_helper { | 21 namespace extensions_helper { |
| 25 | 22 |
| 26 // Returns a unique extension name based in the integer |index|. | 23 // Returns a unique extension name based in the integer |index|. |
| 27 std::string CreateFakeExtensionName(int index) { | 24 std::string CreateFakeExtensionName(int index) { |
| 28 return SyncExtensionHelper::GetInstance()->CreateFakeExtensionName(index); | 25 return SyncExtensionHelper::GetInstance()->CreateFakeExtensionName(index); |
| 29 } | 26 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 | 120 |
| 124 bool IsIncognitoEnabled(Profile* profile, int index) { | 121 bool IsIncognitoEnabled(Profile* profile, int index) { |
| 125 return SyncExtensionHelper::GetInstance()->IsIncognitoEnabled( | 122 return SyncExtensionHelper::GetInstance()->IsIncognitoEnabled( |
| 126 profile, CreateFakeExtensionName(index)); | 123 profile, CreateFakeExtensionName(index)); |
| 127 } | 124 } |
| 128 | 125 |
| 129 void InstallExtensionsPendingForSync(Profile* profile) { | 126 void InstallExtensionsPendingForSync(Profile* profile) { |
| 130 SyncExtensionHelper::GetInstance()->InstallExtensionsPendingForSync(profile); | 127 SyncExtensionHelper::GetInstance()->InstallExtensionsPendingForSync(profile); |
| 131 } | 128 } |
| 132 | 129 |
| 133 namespace { | 130 } // namespace extensions_helper |
| 134 | 131 |
| 135 // A helper class to implement waiting for a set of profiles to have matching | 132 ExtensionsMatchChecker::ExtensionsMatchChecker() |
| 136 // extensions lists. It waits for calls on both interfaces: | 133 : profiles_(test()->GetAllProfiles()) { |
| 137 // ExtensionRegistryObserver and NotificationObserver. Observing | 134 DCHECK_GE(profiles_.size(), 2U); |
| 138 // NOTIFICATION_EXTENSION_UPDATING_STARTED notification is needed for tests | 135 for (Profile* profile : profiles_) { |
| 139 // against local server because in such tests extensions are not installed and | 136 // Begin mocking the installation of synced extensions from the web store. |
| 140 // ExtensionRegistryObserver methods are not called. | 137 synced_extension_installers_.push_back( |
| 141 class ExtensionsMatchChecker : public StatusChangeChecker, | 138 base::MakeUnique<SyncedExtensionInstaller>(profile)); |
| 142 public extensions::ExtensionRegistryObserver, | |
| 143 public content::NotificationObserver { | |
| 144 public: | |
| 145 explicit ExtensionsMatchChecker(const std::vector<Profile*>& profiles); | |
| 146 ~ExtensionsMatchChecker() override; | |
| 147 | 139 |
| 148 // StatusChangeChecker implementation. | 140 extensions::ExtensionRegistry* registry = |
| 149 std::string GetDebugMessage() const override; | 141 extensions::ExtensionRegistry::Get(profile); |
| 150 bool IsExitConditionSatisfied() override; | 142 registry->AddObserver(this); |
| 151 | 143 registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED, |
| 152 // extensions::ExtensionRegistryObserver implementation. | 144 content::Source<Profile>(profile)); |
| 153 void OnExtensionLoaded(content::BrowserContext* context, | 145 } |
| 154 const extensions::Extension* extension) override; | |
| 155 void OnExtensionUnloaded( | |
| 156 content::BrowserContext* context, | |
| 157 const extensions::Extension* extenion, | |
| 158 extensions::UnloadedExtensionInfo::Reason reason) override; | |
| 159 void OnExtensionInstalled(content::BrowserContext* browser_context, | |
| 160 const extensions::Extension* extension, | |
| 161 bool is_update) override; | |
| 162 void OnExtensionUninstalled(content::BrowserContext* browser_context, | |
| 163 const extensions::Extension* extension, | |
| 164 extensions::UninstallReason reason) override; | |
| 165 | |
| 166 // content::NotificationObserver implementation. | |
| 167 void Observe(int type, | |
| 168 const content::NotificationSource& source, | |
| 169 const content::NotificationDetails& details) override; | |
| 170 | |
| 171 void Wait(); | |
| 172 | |
| 173 private: | |
| 174 std::vector<Profile*> profiles_; | |
| 175 ScopedVector<SyncedExtensionInstaller> synced_extension_installers_; | |
| 176 content::NotificationRegistrar registrar_; | |
| 177 bool observing_; | |
| 178 | |
| 179 DISALLOW_COPY_AND_ASSIGN(ExtensionsMatchChecker); | |
| 180 }; | |
| 181 | |
| 182 ExtensionsMatchChecker::ExtensionsMatchChecker( | |
| 183 const std::vector<Profile*>& profiles) | |
| 184 : profiles_(profiles), observing_(false) { | |
| 185 DCHECK_GE(profiles_.size(), 2U); | |
| 186 } | 146 } |
| 187 | 147 |
| 188 ExtensionsMatchChecker::~ExtensionsMatchChecker() { | 148 ExtensionsMatchChecker::~ExtensionsMatchChecker() { |
| 189 if (observing_) { | 149 for (Profile* profile : profiles_) { |
| 190 for (std::vector<Profile*>::iterator it = profiles_.begin(); | 150 extensions::ExtensionRegistry* registry = |
| 191 it != profiles_.end(); | 151 extensions::ExtensionRegistry::Get(profile); |
| 192 ++it) { | 152 registry->RemoveObserver(this); |
| 193 extensions::ExtensionRegistry* registry = | |
| 194 extensions::ExtensionRegistry::Get(*it); | |
| 195 registry->RemoveObserver(this); | |
| 196 } | |
| 197 } | 153 } |
| 198 } | 154 } |
| 199 | 155 |
| 200 std::string ExtensionsMatchChecker::GetDebugMessage() const { | 156 std::string ExtensionsMatchChecker::GetDebugMessage() const { |
| 201 return "Waiting for extensions to match"; | 157 return "Waiting for extensions to match"; |
| 202 } | 158 } |
| 203 | 159 |
| 204 bool ExtensionsMatchChecker::IsExitConditionSatisfied() { | 160 bool ExtensionsMatchChecker::IsExitConditionSatisfied() { |
| 205 std::vector<Profile*>::iterator it = profiles_.begin(); | 161 std::vector<Profile*>::iterator it = profiles_.begin(); |
| 206 Profile* profile0 = *it; | 162 Profile* profile0 = *it; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 CheckExitCondition(); | 197 CheckExitCondition(); |
| 242 } | 198 } |
| 243 | 199 |
| 244 void ExtensionsMatchChecker::Observe( | 200 void ExtensionsMatchChecker::Observe( |
| 245 int type, | 201 int type, |
| 246 const content::NotificationSource& source, | 202 const content::NotificationSource& source, |
| 247 const content::NotificationDetails& details) { | 203 const content::NotificationDetails& details) { |
| 248 DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED, type); | 204 DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED, type); |
| 249 CheckExitCondition(); | 205 CheckExitCondition(); |
| 250 } | 206 } |
| 251 | |
| 252 void ExtensionsMatchChecker::Wait() { | |
| 253 for (std::vector<Profile*>::iterator it = profiles_.begin(); | |
| 254 it != profiles_.end(); | |
| 255 ++it) { | |
| 256 // Begin mocking the installation of synced extensions from the web store. | |
| 257 synced_extension_installers_.push_back(new SyncedExtensionInstaller(*it)); | |
| 258 | |
| 259 extensions::ExtensionRegistry* registry = | |
| 260 extensions::ExtensionRegistry::Get(*it); | |
| 261 registry->AddObserver(this); | |
| 262 registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED, | |
| 263 content::Source<Profile>(*it)); | |
| 264 } | |
| 265 | |
| 266 observing_ = true; | |
| 267 | |
| 268 if (IsExitConditionSatisfied()) { | |
| 269 DVLOG(1) << "Extensions matched without waiting"; | |
| 270 return; | |
| 271 } | |
| 272 | |
| 273 DVLOG(1) << "Starting Wait: " << GetDebugMessage(); | |
| 274 StartBlockingWait(); | |
| 275 } | |
| 276 | |
| 277 } // namespace | |
| 278 | |
| 279 bool AwaitAllProfilesHaveSameExtensions() { | |
| 280 std::vector<Profile*> profiles; | |
| 281 for (int i = 0; i < test()->num_clients(); ++i) { | |
| 282 profiles.push_back(test()->GetProfile(i)); | |
| 283 } | |
| 284 | |
| 285 ExtensionsMatchChecker checker(profiles); | |
| 286 checker.Wait(); | |
| 287 return !checker.TimedOut(); | |
| 288 } | |
| 289 | |
| 290 } // namespace extensions_helper | |
| OLD | NEW |