15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/extensions_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync/test/integration/status_change_checker.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_extension_helper.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync/test/integration/sync_extension_installer.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry_observer.h"
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_datatype_helper::test;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions_helper {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char extension_name_prefix[] = "fakeextension";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasSameExtensionsAsVerifier(int index) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->ExtensionStatesMatch(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test()->GetProfile(index), test()->verifier());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AllProfilesHaveSameExtensionsAsVerifier() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasSameExtensionsAsVerifier(i)) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Profile " << i << " doesn't have the same extensions as"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       " the verifier profile.";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AllProfilesHaveSameExtensions() {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < test()->num_clients(); ++i) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SyncExtensionHelper::GetInstance()->ExtensionStatesMatch(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test()->GetProfile(0), test()->GetProfile(i))) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Profile " << i << " doesnt have the same extensions as"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       " profile 0.";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string InstallExtension(Profile* profile, int index) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->InstallExtension(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateFakeExtensionName(index),
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::TYPE_EXTENSION);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string InstallExtensionForAllProfiles(int index) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallExtension(test()->GetProfile(i), index);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return InstallExtension(test()->verifier(), index);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UninstallExtension(Profile* profile, int index) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->UninstallExtension(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, CreateFakeExtensionName(index));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<int> GetInstalledExtensions(Profile* profile) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> indices;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> names =
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncExtensionHelper::GetInstance()->GetInstalledExtensionNames(profile);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<std::string>::const_iterator it = names.begin();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != names.end(); ++it) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ExtensionNameToIndex(*it, &index)) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      indices.push_back(index);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return indices;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void EnableExtension(Profile* profile, int index) {
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return SyncExtensionHelper::GetInstance()->EnableExtension(
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile, CreateFakeExtensionName(index));
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DisableExtension(Profile* profile, int index) {
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return SyncExtensionHelper::GetInstance()->DisableExtension(
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile, CreateFakeExtensionName(index));
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsExtensionEnabled(Profile* profile, int index) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->IsExtensionEnabled(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, CreateFakeExtensionName(index));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IncognitoEnableExtension(Profile* profile, int index) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->IncognitoEnableExtension(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, CreateFakeExtensionName(index));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IncognitoDisableExtension(Profile* profile, int index) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->IncognitoDisableExtension(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, CreateFakeExtensionName(index));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsIncognitoEnabled(Profile* profile, int index) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncExtensionHelper::GetInstance()->IsIncognitoEnabled(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, CreateFakeExtensionName(index));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallExtensionsPendingForSync(Profile* profile) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncExtensionHelper::GetInstance()->InstallExtensionsPendingForSync(profile);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateFakeExtensionName(int index) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension_name_prefix + base::IntToString(index);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionNameToIndex(const std::string& name, int* index) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!StartsWithASCII(name, extension_name_prefix, true) ||
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !base::StringToInt(name.substr(strlen(extension_name_prefix)), index)) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Unable to convert extension name \"" << name
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "\" to index";
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A helper class to implement waiting for a set of profiles to have matching
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// extensions lists.
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ExtensionsMatchChecker : public StatusChangeChecker,
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               public extensions::ExtensionRegistryObserver {
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ExtensionsMatchChecker(const std::vector<Profile*>& profiles);
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ExtensionsMatchChecker();
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // StatusChangeChecker implementation.
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual std::string GetDebugMessage() const OVERRIDE;
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // extensions::ExtensionRegistryObserver implementation.
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionLoaded(
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* context,
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension) OVERRIDE;
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionUnloaded(
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* context,
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extenion,
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionInstalled(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension,
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool is_update) OVERRIDE;
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionUninstalled(
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const extensions::Extension* extension,
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE;
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Wait();
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<Profile*> profiles_;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<SyncedExtensionInstaller> synced_extension_installers_;
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool observing_;
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionsMatchChecker);
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
177116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExtensionsMatchChecker::ExtensionsMatchChecker(
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::vector<Profile*>& profiles)
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : profiles_(profiles), observing_(false) {
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_GE(profiles_.size(), 2U);
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
183116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExtensionsMatchChecker::~ExtensionsMatchChecker() {
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (observing_) {
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (std::vector<Profile*>::iterator it = profiles_.begin();
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         it != profiles_.end();
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         ++it) {
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionRegistry* registry =
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          extensions::ExtensionRegistry::Get(*it);
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      registry->RemoveObserver(this);
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string ExtensionsMatchChecker::GetDebugMessage() const {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return "Waiting for extensions to match";
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ExtensionsMatchChecker::IsExitConditionSatisfied() {
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<Profile*>::iterator it = profiles_.begin();
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile0 = *it;
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ++it;
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (; it != profiles_.end(); ++it) {
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!SyncExtensionHelper::GetInstance()->ExtensionStatesMatch(profile0,
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                                  *it)) {
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExtensionsMatchChecker::OnExtensionLoaded(
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* context,
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const extensions::Extension* extension) {
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckExitCondition();
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExtensionsMatchChecker::OnExtensionUnloaded(
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* context,
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const extensions::Extension* extenion,
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extensions::UnloadedExtensionInfo::Reason reason) {
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckExitCondition();
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExtensionsMatchChecker::OnExtensionInstalled(
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* browser_context,
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const extensions::Extension* extension,
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool is_update) {
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckExitCondition();
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExtensionsMatchChecker::OnExtensionUninstalled(
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* browser_context,
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const extensions::Extension* extension,
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    extensions::UninstallReason reason) {
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckExitCondition();
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExtensionsMatchChecker::Wait() {
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (std::vector<Profile*>::iterator it = profiles_.begin();
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       it != profiles_.end();
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       ++it) {
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Begin mocking the installation of synced extensions from the web store.
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    synced_extension_installers_.push_back(new SyncedExtensionInstaller(*it));
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extensions::ExtensionRegistry* registry =
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::ExtensionRegistry::Get(*it);
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    registry->AddObserver(this);
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  observing_ = true;
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (IsExitConditionSatisfied()) {
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Extensions matched without waiting";
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "Starting Wait: " << GetDebugMessage();
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StartBlockingWait();
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AwaitAllProfilesHaveSameExtensionsAsVerifier() {
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<Profile*> profiles;
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  profiles.push_back(test()->verifier());
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < test()->num_clients(); ++i) {
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profiles.push_back(test()->GetProfile(i));
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionsMatchChecker checker(profiles);
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  checker.Wait();
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return !checker.TimedOut();
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions_helper
277