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)#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncTest;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncExtensionHelper {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Singleton implementation.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SyncExtensionHelper* GetInstance();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the profiles in |test| and registers them with
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // internal data structures.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupIfNecessary(SyncTest* test);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs the extension with the given name to |profile|, and returns the
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension ID of the new extension.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string InstallExtension(Profile* profile,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& name,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               extensions::Manifest::Type type);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstalls the extension with the given name from |profile|.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(Profile* profile, const std::string& name);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a vector containing the names of all currently installed extensions
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on |profile|.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> GetInstalledExtensionNames(Profile* profile) const;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Enables the extension with the given name on |profile|.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void EnableExtension(Profile* profile, const std::string& name);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Disables the extension with the given name on |profile|.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DisableExtension(Profile* profile, const std::string& name);
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension with the given name is enabled on |profile|.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionEnabled(Profile* profile, const std::string& name) const;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enables the extension with the given name to run in incognito mode
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncognitoEnableExtension(Profile* profile, const std::string& name);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disables the extension with the given name from running in incognito mode
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncognitoDisableExtension(Profile* profile, const std::string& name);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff the extension is enabled in incognito mode on |profile|.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsIncognitoEnabled(Profile* profile, const std::string& name) const;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff the extension with the given id is pending
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install in |profile|.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionPendingInstallForSync(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile, const std::string& id) const;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Installs all extensions pending sync in |profile|.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InstallExtensionsPendingForSync(Profile* profile);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff |profile1| and |profile2| have the same extensions and
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they are all in the same state.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ExtensionStatesMatch(Profile* profile1, Profile* profile2);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExtensionState {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum EnabledState { DISABLED, PENDING, ENABLED };
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionState();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ExtensionState();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Equals(const ExtensionState &other) const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnabledState enabled_state;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool incognito_enabled;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, ExtensionState> ExtensionStateMap;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, scoped_refptr<extensions::Extension> >
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionNameMap;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<Profile*, ExtensionNameMap> ProfileExtensionNameMap;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::string> StringMap;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<std::string, extensions::Manifest::Type> TypeMap;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<SyncExtensionHelper>;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncExtensionHelper();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SyncExtensionHelper();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a map from |profile|'s installed extensions to their state.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionStateMap GetExtensionStates(Profile* profile);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes extensions for |profile| and creates an entry in
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile_extensions_| for it.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupProfile(Profile* profile);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an extension for the given name in |profile|.  type and
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // index.  Two extensions with the name but different profiles will
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have the same id.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> GetExtension(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile, const std::string& name,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Type type) WARN_UNUSED_RESULT;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileExtensionNameMap profile_extensions_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringMap id_to_name_;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TypeMap id_to_type_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool setup_completed_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncExtensionHelper);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
124