1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
#include <map>
#include <string>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/memory/singleton.h"
#include "extensions/browser/disable_reason.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/manifest.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
class Profile;
class SyncTest;
namespace extensions {
class Extension;
}
class SyncExtensionHelper {
public:
// Singleton implementation.
static SyncExtensionHelper* GetInstance();
SyncExtensionHelper(const SyncExtensionHelper&) = delete;
SyncExtensionHelper& operator=(const SyncExtensionHelper&) = delete;
// Initializes the profiles in |test| and registers them with
// internal data structures.
void SetupIfNecessary(SyncTest* test);
// Installs the extension with the given name to |profile|, and returns the
// extension ID of the new extension.
std::string InstallExtension(Profile* profile,
const std::string& name,
extensions::Manifest::Type type);
// Uninstalls the extension with the given name from |profile|.
void UninstallExtension(Profile* profile, const std::string& name);
// Returns a vector containing the names of all currently installed extensions
// on |profile|.
std::vector<std::string> GetInstalledExtensionNames(Profile* profile) const;
// Enables the extension with the given name on |profile|.
void EnableExtension(Profile* profile, const std::string& name);
// Disables the extension with the given name on |profile|.
void DisableExtension(Profile* profile, const std::string& name);
// Returns true if the extension with the given name is enabled on |profile|.
bool IsExtensionEnabled(Profile* profile, const std::string& name) const;
// Enables the extension with the given name to run in incognito mode
void IncognitoEnableExtension(Profile* profile, const std::string& name);
// Disables the extension with the given name from running in incognito mode
void IncognitoDisableExtension(Profile* profile, const std::string& name);
// Returns true iff the extension is enabled in incognito mode on |profile|.
bool IsIncognitoEnabled(Profile* profile, const std::string& name) const;
// Returns true iff the extension with the given id is pending
// install in |profile|.
bool IsExtensionPendingInstallForSync(Profile* profile,
const std::string& id) const;
// Installs all extensions pending sync in |profile|.
void InstallExtensionsPendingForSync(Profile* profile);
// Returns true iff |profile1| and |profile2| have the same extensions and
// they are all in the same state.
static bool ExtensionStatesMatch(Profile* profile1, Profile* profile2);
// Returns a unique extension name based in the integer |index|.
std::string CreateFakeExtensionName(int index);
// Converts a fake extension name back into the index used to generate it.
// Returns true if successful, false on failure.
bool ExtensionNameToIndex(const std::string& name, int* index);
private:
struct ExtensionState {
enum EnabledState { DISABLED, PENDING, ENABLED };
ExtensionState(EnabledState state,
const extensions::DisableReasonSet& reasons,
bool incognito_enabled);
ExtensionState(ExtensionState&& other);
ExtensionState(const ExtensionState& other) = delete;
ExtensionState& operator=(const ExtensionState& other) = delete;
~ExtensionState();
bool operator==(const ExtensionState& other) const = default;
EnabledState enabled_state = ENABLED;
extensions::DisableReasonSet disable_reasons;
bool incognito_enabled = false;
};
using ExtensionStateMap = std::map<std::string, ExtensionState>;
using ExtensionNameMap =
std::map<std::string, scoped_refptr<extensions::Extension>>;
using ProfileExtensionNameMap = std::map<Profile*, ExtensionNameMap>;
using StringMap = std::map<std::string, std::string>;
using TypeMap = std::map<std::string, extensions::Manifest::Type>;
friend struct base::DefaultSingletonTraits<SyncExtensionHelper>;
SyncExtensionHelper();
~SyncExtensionHelper();
// Returns a map from |profile|'s installed extensions to their state.
static ExtensionStateMap GetExtensionStates(Profile* profile);
// Initializes extensions for |profile| and creates an entry in
// |profile_extensions_| for it.
void SetupProfile(Profile* profile);
// Returns an extension for the given name in |profile|. type and
// index. Two extensions with the name but different profiles will
// have the same id.
[[nodiscard]] scoped_refptr<extensions::Extension> GetExtension(
Profile* profile,
const std::string& name,
extensions::Manifest::Type type);
std::string extension_name_prefix_;
ProfileExtensionNameMap profile_extensions_;
StringMap id_to_name_;
TypeMap id_to_type_;
bool setup_completed_ = false;
};
#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_EXTENSION_HELPER_H_
|