sync_extension_helper.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/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)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enables the extension with the given name on |profile|.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableExtension(Profile* profile, const std::string& name);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disables the extension with the given name on |profile|.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableExtension(Profile* profile, const std::string& name);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (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)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs all extensions pending sync in |profile| of the given
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // type.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InstallExtensionsPendingForSync(Profile* profile);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff |profile1| and |profile2| have the same extensions and
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they are all in the same state.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ExtensionStatesMatch(Profile* profile1, Profile* profile2);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExtensionState {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum EnabledState { DISABLED, PENDING, ENABLED };
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionState();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ExtensionState();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Equals(const ExtensionState &other) const;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnabledState enabled_state;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool incognito_enabled;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, ExtensionState> ExtensionStateMap;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, scoped_refptr<extensions::Extension> >
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionNameMap;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<Profile*, ExtensionNameMap> ProfileExtensionNameMap;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::string> StringMap;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<std::string, extensions::Manifest::Type> TypeMap;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<SyncExtensionHelper>;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncExtensionHelper();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SyncExtensionHelper();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a map from |profile|'s installed extensions to their state.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionStateMap GetExtensionStates(Profile* profile);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes extensions for |profile| and creates an entry in
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile_extensions_| for it.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupProfile(Profile* profile);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an extension for the given name in |profile|.  type and
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // index.  Two extensions with the name but different profiles will
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have the same id.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> GetExtension(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile, const std::string& name,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Type type) WARN_UNUSED_RESULT;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileExtensionNameMap profile_extensions_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringMap id_to_name_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TypeMap id_to_type_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool setup_completed_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncExtensionHelper);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
125