| Index: chrome/browser/sync/test/integration/extensions_helper.h
 | 
| diff --git a/chrome/browser/sync/test/integration/extensions_helper.h b/chrome/browser/sync/test/integration/extensions_helper.h
 | 
| index f807abfcb16ad2c3cd753517570f689a82e6d35a..eabab5123ca80fb246a8921366a48c1059c4e448 100644
 | 
| --- a/chrome/browser/sync/test/integration/extensions_helper.h
 | 
| +++ b/chrome/browser/sync/test/integration/extensions_helper.h
 | 
| @@ -5,13 +5,20 @@
 | 
|  #ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_EXTENSIONS_HELPER_H_
 | 
|  #define CHROME_BROWSER_SYNC_TEST_INTEGRATION_EXTENSIONS_HELPER_H_
 | 
|  
 | 
| +#include <memory>
 | 
|  #include <string>
 | 
|  #include <vector>
 | 
|  
 | 
|  #include "base/compiler_specific.h"
 | 
| +#include "chrome/browser/sync/test/integration/status_change_checker.h"
 | 
|  #include "chrome/browser/sync/test/integration/sync_test.h"
 | 
| +#include "content/public/browser/notification_observer.h"
 | 
| +#include "content/public/browser/notification_registrar.h"
 | 
| +#include "extensions/browser/extension_registry_observer.h"
 | 
| +#include "extensions/common/extension.h"
 | 
|  
 | 
|  class Profile;
 | 
| +class SyncedExtensionInstaller;
 | 
|  
 | 
|  namespace extensions_helper {
 | 
|  
 | 
| @@ -74,4 +81,49 @@ bool AwaitAllProfilesHaveSameExtensions();
 | 
|  
 | 
|  }  // namespace extensions_helper
 | 
|  
 | 
| +// A helper class to implement waiting for a set of profiles to have matching
 | 
| +// extensions lists. It waits for calls on both interfaces:
 | 
| +// ExtensionRegistryObserver and NotificationObserver. Observing
 | 
| +// NOTIFICATION_EXTENSION_UPDATING_STARTED notification is needed for tests
 | 
| +// against local server because in such tests extensions are not installed and
 | 
| +// ExtensionRegistryObserver methods are not called.
 | 
| +class ExtensionsMatchChecker : public StatusChangeChecker,
 | 
| +                               public extensions::ExtensionRegistryObserver,
 | 
| +                               public content::NotificationObserver {
 | 
| + public:
 | 
| +  ExtensionsMatchChecker();
 | 
| +  ~ExtensionsMatchChecker() override;
 | 
| +
 | 
| +  // StatusChangeChecker implementation.
 | 
| +  std::string GetDebugMessage() const override;
 | 
| +  bool IsExitConditionSatisfied() override;
 | 
| +
 | 
| +  // extensions::ExtensionRegistryObserver implementation.
 | 
| +  void OnExtensionLoaded(content::BrowserContext* context,
 | 
| +                         const extensions::Extension* extension) override;
 | 
| +  void OnExtensionUnloaded(
 | 
| +      content::BrowserContext* context,
 | 
| +      const extensions::Extension* extenion,
 | 
| +      extensions::UnloadedExtensionInfo::Reason reason) override;
 | 
| +  void OnExtensionInstalled(content::BrowserContext* browser_context,
 | 
| +                            const extensions::Extension* extension,
 | 
| +                            bool is_update) override;
 | 
| +  void OnExtensionUninstalled(content::BrowserContext* browser_context,
 | 
| +                              const extensions::Extension* extension,
 | 
| +                              extensions::UninstallReason reason) override;
 | 
| +
 | 
| +  // content::NotificationObserver implementation.
 | 
| +  void Observe(int type,
 | 
| +               const content::NotificationSource& source,
 | 
| +               const content::NotificationDetails& details) override;
 | 
| +
 | 
| + private:
 | 
| +  std::vector<Profile*> profiles_;
 | 
| +  std::vector<std::unique_ptr<SyncedExtensionInstaller>>
 | 
| +      synced_extension_installers_;
 | 
| +  content::NotificationRegistrar registrar_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(ExtensionsMatchChecker);
 | 
| +};
 | 
| +
 | 
|  #endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_EXTENSIONS_HELPER_H_
 | 
| 
 |