#include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h"
#include <stddef.h>
#include <memory>
#include <string_view>
#include <utility>
#include <vector>
#include "base/auto_reset.h"
#include "base/base64.h"
#include "base/functional/bind.h"
#include "base/json/values_util.h"
#include "base/lazy_instance.h"
#include "base/memory/scoped_refptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/scoped_multi_source_observation.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "base/values.h"
#include "base/version.h"
#include "base/version_info/version_info.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/webstore_private/extension_install_status.h"
#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_allowlist.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/install_tracker.h"
#include "chrome/browser/extensions/manifest_v2_experiment_manager.h"
#include "chrome/browser/extensions/mv2_experiment_stage.h"
#include "chrome/browser/extensions/scoped_active_install.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_observer.h"
#include "chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h"
#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/supervised_user_browser_utils.h"
#include "chrome/browser/ui/app_list/app_list_util.h"
#include "chrome/browser/ui/extensions/extensions_dialogs.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
#include "components/crx_file/id_util.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.h"
#include "components/safe_browsing/core/browser/safe_browsing_metrics_collector.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/supervised_user/core/browser/supervised_user_preferences.h"
#include "components/supervised_user/core/common/features.h"
#include "content/public/browser/gpu_feature_checker.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/api/management/management_api.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
#include "extensions/browser/extension_function_constants.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extension_util.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/permissions_parser.h"
#include "extensions/common/permissions/permission_set.h"
#include "net/base/load_flags.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/gurl.h"
SafeBrowsingNavigationObserverManager;
namespace extensions {
BeginInstallWithManifest3;
CompleteInstall;
GetBrowserLogin;
GetExtensionStatus;
GetIsLauncherEnabled;
GetStoreLogin;
GetWebGLStatus;
IsPendingCustodianApproval;
IsInIncognitoMode;
SetStoreLogin;
GetFullChromeVersion;
namespace {
class PendingApprovals : public ProfileObserver { … };
void PendingApprovals::PushApproval(
std::unique_ptr<WebstoreInstaller::Approval> approval) { … }
std::unique_ptr<WebstoreInstaller::Approval> PendingApprovals::PopApproval(
Profile* profile,
const std::string& id) { … }
void PendingApprovals::Clear() { … }
api::webstore_private::Result WebstoreInstallHelperResultToApiResult(
WebstoreInstallHelper::Delegate::InstallHelperResultCode result) { … }
static base::LazyInstance<PendingApprovals>::DestructorAtExit
g_pending_approvals = …;
const char kWebstoreLogin[] = …;
const char kAlreadyInstalledError[] = …;
const char kWebstoreInvalidIconUrlError[] = …;
const char kWebstoreInvalidIdError[] = …;
const char kWebstoreInvalidManifestError[] = …;
const char kNoPreviousBeginInstallWithManifestError[] = …;
const char kWebstoreUserCancelledError[] = …;
const char kWebstoreBlockByPolicy[] = …;
const char kIncognitoError[] = …;
#if BUILDFLAG(IS_CHROMEOS_LACROS)
const char kSecondaryProfileError[] =
"Apps may only be installed using the main profile";
const char kLegacyPackagedAppError[] =
"Legacy packaged apps are no longer supported";
#endif
const char kParentBlockedExtensionInstallError[] = …;
const int kExtensionReferrerUserGestureLimit = …;
WebstorePrivateApi::Delegate* test_delegate = …;
std::string GetWebstoreLogin(Profile* profile) { … }
void SetWebstoreLogin(Profile* profile, const std::string& login) { … }
void RecordWebstoreExtensionInstallResult(bool success) { … }
api::webstore_private::ExtensionInstallStatus
ConvertExtensionInstallStatusForAPI(ExtensionInstallStatus status) { … }
ExtensionInstallStatus AddExtensionToPendingList(
const ExtensionId& id,
Profile* profile,
const std::string& justification) { … }
gfx::ImageSkia GetIconImage(const SkBitmap& icon, bool is_app) { … }
enum class WebStoreInstallAllowlistParameter { … };
void ReportWebStoreInstallEsbAllowlistParameter(
const std::optional<bool>& allowlist_parameter) { … }
void ReportWebStoreInstallNotAllowlistedInstalled(bool installed,
bool friction_dialog_shown) { … }
}
base::AutoReset<WebstorePrivateApi::Delegate*>
WebstorePrivateApi::SetDelegateForTesting(Delegate* delegate) { … }
std::unique_ptr<WebstoreInstaller::Approval>
WebstorePrivateApi::PopApprovalForTesting(Profile* profile,
const std::string& extension_id) { … }
void WebstorePrivateApi::ClearPendingApprovalsForTesting() { … }
int WebstorePrivateApi::GetPendingApprovalsCountForTesting() { … }
WebstorePrivateBeginInstallWithManifest3Function::
WebstorePrivateBeginInstallWithManifest3Function() = default;
WebstorePrivateBeginInstallWithManifest3Function::
~WebstorePrivateBeginInstallWithManifest3Function() = default;
std::u16string WebstorePrivateBeginInstallWithManifest3Function::
GetBlockedByPolicyErrorMessageForTesting() const { … }
ExtensionFunction::ResponseAction
WebstorePrivateBeginInstallWithManifest3Function::Run() { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
const std::string& id,
const SkBitmap& icon,
base::Value::Dict parsed_manifest) { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseFailure(
const std::string& id,
WebstoreInstallHelper::Delegate::InstallHelperResultCode result,
const std::string& error_message) { … }
void WebstorePrivateBeginInstallWithManifest3Function::RequestExtensionApproval(
content::WebContents* web_contents) { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnExtensionApprovalDone(
SupervisedUserExtensionsDelegate::ExtensionApprovalResult result) { … }
void WebstorePrivateBeginInstallWithManifest3Function::
OnExtensionApprovalApproved() { … }
void WebstorePrivateBeginInstallWithManifest3Function::
OnExtensionApprovalCanceled() { … }
void WebstorePrivateBeginInstallWithManifest3Function::
OnExtensionApprovalFailed() { … }
void WebstorePrivateBeginInstallWithManifest3Function::
OnExtensionApprovalBlocked() { … }
bool WebstorePrivateBeginInstallWithManifest3Function::
PromptForParentApproval() { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnFrictionPromptDone(
bool result) { … }
void WebstorePrivateBeginInstallWithManifest3Function::
ReportFrictionAcceptedEvent() { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnInstallPromptDone(
ExtensionInstallPrompt::DoneCallbackPayload payload) { … }
void WebstorePrivateBeginInstallWithManifest3Function::OnRequestPromptDone(
ExtensionInstallPrompt::DoneCallbackPayload payload) { … }
void WebstorePrivateBeginInstallWithManifest3Function::
OnBlockByPolicyPromptDone() { … }
void WebstorePrivateBeginInstallWithManifest3Function::HandleInstallProceed(
bool withhold_permissions) { … }
void WebstorePrivateBeginInstallWithManifest3Function::HandleInstallAbort(
bool user_initiated) { … }
ExtensionFunction::ResponseValue
WebstorePrivateBeginInstallWithManifest3Function::BuildResponse(
api::webstore_private::Result result,
const std::string& error) { … }
bool WebstorePrivateBeginInstallWithManifest3Function::ShouldShowFrictionDialog(
Profile* profile) { … }
void WebstorePrivateBeginInstallWithManifest3Function::
ShowInstallFrictionDialog(content::WebContents* contents) { … }
void WebstorePrivateBeginInstallWithManifest3Function::ShowInstallDialog(
content::WebContents* contents) { … }
void WebstorePrivateBeginInstallWithManifest3Function::
ShowBlockedByPolicyDialog(const Extension* extension,
const SkBitmap& icon,
content::WebContents* contents,
base::OnceClosure done_callback) { … }
WebstorePrivateCompleteInstallFunction::
WebstorePrivateCompleteInstallFunction() = default;
WebstorePrivateCompleteInstallFunction::
~WebstorePrivateCompleteInstallFunction() = default;
ExtensionFunction::ResponseAction
WebstorePrivateCompleteInstallFunction::Run() { … }
void WebstorePrivateCompleteInstallFunction::OnExtensionInstallSuccess(
const std::string& id) { … }
void WebstorePrivateCompleteInstallFunction::OnExtensionInstallFailure(
const std::string& id,
const std::string& error,
WebstoreInstaller::FailureReason reason) { … }
void WebstorePrivateCompleteInstallFunction::OnInstallSuccess(
const std::string& id) { … }
WebstorePrivateEnableAppLauncherFunction::
WebstorePrivateEnableAppLauncherFunction() = default;
WebstorePrivateEnableAppLauncherFunction::
~WebstorePrivateEnableAppLauncherFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateEnableAppLauncherFunction::Run() { … }
WebstorePrivateGetBrowserLoginFunction::
WebstorePrivateGetBrowserLoginFunction() = default;
WebstorePrivateGetBrowserLoginFunction::
~WebstorePrivateGetBrowserLoginFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateGetBrowserLoginFunction::Run() { … }
WebstorePrivateGetStoreLoginFunction::WebstorePrivateGetStoreLoginFunction() =
default;
WebstorePrivateGetStoreLoginFunction::~WebstorePrivateGetStoreLoginFunction() { … }
ExtensionFunction::ResponseAction WebstorePrivateGetStoreLoginFunction::Run() { … }
WebstorePrivateSetStoreLoginFunction::WebstorePrivateSetStoreLoginFunction() =
default;
WebstorePrivateSetStoreLoginFunction::~WebstorePrivateSetStoreLoginFunction() { … }
ExtensionFunction::ResponseAction WebstorePrivateSetStoreLoginFunction::Run() { … }
WebstorePrivateGetWebGLStatusFunction::WebstorePrivateGetWebGLStatusFunction()
: … { … }
WebstorePrivateGetWebGLStatusFunction::
~WebstorePrivateGetWebGLStatusFunction() { … }
ExtensionFunction::ResponseAction WebstorePrivateGetWebGLStatusFunction::Run() { … }
void WebstorePrivateGetWebGLStatusFunction::OnFeatureCheck(
bool feature_allowed) { … }
WebstorePrivateGetIsLauncherEnabledFunction::
WebstorePrivateGetIsLauncherEnabledFunction() { … }
WebstorePrivateGetIsLauncherEnabledFunction::
~WebstorePrivateGetIsLauncherEnabledFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateGetIsLauncherEnabledFunction::Run() { … }
WebstorePrivateIsInIncognitoModeFunction::
WebstorePrivateIsInIncognitoModeFunction() = default;
WebstorePrivateIsInIncognitoModeFunction::
~WebstorePrivateIsInIncognitoModeFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateIsInIncognitoModeFunction::Run() { … }
WebstorePrivateIsPendingCustodianApprovalFunction::
WebstorePrivateIsPendingCustodianApprovalFunction() = default;
WebstorePrivateIsPendingCustodianApprovalFunction::
~WebstorePrivateIsPendingCustodianApprovalFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateIsPendingCustodianApprovalFunction::Run() { … }
ExtensionFunction::ResponseValue
WebstorePrivateIsPendingCustodianApprovalFunction::BuildResponse(bool result) { … }
WebstorePrivateGetReferrerChainFunction::
WebstorePrivateGetReferrerChainFunction() = default;
WebstorePrivateGetReferrerChainFunction::
~WebstorePrivateGetReferrerChainFunction() { … }
ExtensionFunction::ResponseAction
WebstorePrivateGetReferrerChainFunction::Run() { … }
WebstorePrivateGetExtensionStatusFunction::
WebstorePrivateGetExtensionStatusFunction() = default;
WebstorePrivateGetExtensionStatusFunction::
~WebstorePrivateGetExtensionStatusFunction() = default;
ExtensionFunction::ResponseAction
WebstorePrivateGetExtensionStatusFunction::Run() { … }
ExtensionFunction::ResponseValue
WebstorePrivateGetExtensionStatusFunction::BuildResponseWithoutManifest(
const ExtensionId& extension_id) { … }
void WebstorePrivateGetExtensionStatusFunction::OnManifestParsed(
const ExtensionId& extension_id,
data_decoder::DataDecoder::ValueOrError result) { … }
WebstorePrivateGetFullChromeVersionFunction::
WebstorePrivateGetFullChromeVersionFunction() = default;
WebstorePrivateGetFullChromeVersionFunction::
~WebstorePrivateGetFullChromeVersionFunction() = default;
ExtensionFunction::ResponseAction
WebstorePrivateGetFullChromeVersionFunction::Run() { … }
WebstorePrivateGetMV2DeprecationStatusFunction::
WebstorePrivateGetMV2DeprecationStatusFunction() = default;
WebstorePrivateGetMV2DeprecationStatusFunction::
~WebstorePrivateGetMV2DeprecationStatusFunction() = default;
ExtensionFunction::ResponseAction
WebstorePrivateGetMV2DeprecationStatusFunction::Run() { … }
}