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