Commit b4b3566f authored by Swapnil's avatar Swapnil Committed by Commit Bot

Report UNPACKER_CLIENT_FAILED detailed error to InstallStageTracker

Many force installed extensions fail to install inside
SandboxedUnpacker with error UNPACKER_CLIENT_FAILED error. We
report a string that gives details about this error. We want to report
this error detail through event based reporting. This CL is a pre
work that reports detailed error to InstallStageTracker.

Bug: b/173099675
Change-Id: I541ed65b209073bb9434db75567e94e955b4c64c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532082Reviewed-by: default avatarOleg Davydov <burunduk@chromium.org>
Reviewed-by: default avatarSaurabh Nijhara <snijhara@google.com>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Commit-Queue: Swapnil Gupta <swapnilgupta@google.com>
Cr-Commit-Position: refs/heads/master@{#830559}
parent 2fd760f2
......@@ -27,6 +27,7 @@
#include "components/user_manager/user_names.h"
#include "content/public/test/browser_task_environment.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "extensions/common/extension_builder.h"
#include "net/base/net_errors.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -524,7 +525,9 @@ TEST_F(ExtensionInstallEventLogCollectorTest,
// One extension failed.
tracker->ReportSandboxedUnpackerFailureReason(
kExtensionId1,
extensions::SandboxedUnpackerFailureReason::CRX_HEADER_INVALID);
extensions::CrxInstallError(
extensions::SandboxedUnpackerFailureReason::CRX_HEADER_INVALID,
base::string16()));
ASSERT_TRUE(VerifyEventAddedSuccessfully(1 /*expected_add_count*/,
0 /*expected_add_all_count*/));
EXPECT_EQ(em::ExtensionInstallReportLogEvent::INSTALLATION_FAILED,
......
......@@ -1101,7 +1101,7 @@ void CrxInstaller::NotifyCrxInstallComplete(
break;
case CrxInstallErrorType::SANDBOXED_UNPACKER_FAILURE:
install_stage_tracker->ReportSandboxedUnpackerFailureReason(
extension_id, error->sandbox_failure_detail());
extension_id, error.value());
break;
case CrxInstallErrorType::OTHER:
install_stage_tracker->ReportCrxInstallError(
......
......@@ -15,6 +15,7 @@
#include "extensions/browser/disable_reason.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/install/crx_install_error.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "extensions/browser/updater/extension_downloader.h"
#if defined(OS_CHROMEOS)
......
......@@ -21,6 +21,7 @@
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/install/crx_install_error.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "extensions/browser/pref_names.h"
#include "extensions/browser/updater/safe_manifest_parser.h"
#include "extensions/common/extension.h"
......@@ -520,9 +521,13 @@ TEST_F(ForceInstalledMetricsTest,
ExtensionsCrxInstallErrorSandboxUnpackFailure) {
SetupForceList(true /*is_from_store */);
install_stage_tracker()->ReportSandboxedUnpackerFailureReason(
kExtensionId1, SandboxedUnpackerFailureReason::CRX_FILE_NOT_READABLE);
kExtensionId1,
CrxInstallError(SandboxedUnpackerFailureReason::CRX_FILE_NOT_READABLE,
base::string16()));
install_stage_tracker()->ReportSandboxedUnpackerFailureReason(
kExtensionId2, SandboxedUnpackerFailureReason::UNZIP_FAILED);
kExtensionId2,
CrxInstallError(SandboxedUnpackerFailureReason::UNZIP_FAILED,
base::string16()));
// ForceInstalledMetrics shuts down timer because all extension are either
// loaded or failed.
EXPECT_FALSE(fake_timer_->IsRunning());
......@@ -542,7 +547,9 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsCrxHeaderInvalidFromCache) {
install_stage_tracker()->ReportDownloadingCacheStatus(
kExtensionId1, ExtensionDownloaderDelegate::CacheStatus::CACHE_HIT);
install_stage_tracker()->ReportSandboxedUnpackerFailureReason(
kExtensionId1, SandboxedUnpackerFailureReason::CRX_HEADER_INVALID);
kExtensionId1,
CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID,
base::string16()));
auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build();
registry()->AddEnabled(ext2.get());
force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get());
......@@ -565,7 +572,9 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsCrxHeaderInvalidNotFromCache) {
install_stage_tracker()->ReportDownloadingCacheStatus(
kExtensionId1, ExtensionDownloaderDelegate::CacheStatus::CACHE_MISS);
install_stage_tracker()->ReportSandboxedUnpackerFailureReason(
kExtensionId1, SandboxedUnpackerFailureReason::CRX_HEADER_INVALID);
kExtensionId1,
CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID,
base::string16()));
auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build();
registry()->AddEnabled(ext2.get());
force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get());
......@@ -589,7 +598,9 @@ TEST_F(ForceInstalledMetricsTest,
install_stage_tracker()->ReportDownloadingCacheStatus(
kExtensionId1, ExtensionDownloaderDelegate::CacheStatus::CACHE_MISS);
install_stage_tracker()->ReportSandboxedUnpackerFailureReason(
kExtensionId1, SandboxedUnpackerFailureReason::CRX_HEADER_INVALID);
kExtensionId1,
CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID,
base::string16()));
auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build();
registry()->AddEnabled(ext2.get());
force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get());
......
......@@ -13,6 +13,7 @@
#include "chrome/browser/profiles/profile.h"
#include "components/prefs/pref_service.h"
#include "extensions/browser/install/crx_install_error.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "extensions/browser/pref_names.h"
#include "extensions/common/extension_urls.h"
......
......@@ -7,6 +7,7 @@
#include "base/check_op.h"
#include "chrome/browser/extensions/forced_extensions/install_stage_tracker_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "net/base/net_errors.h"
#if defined(OS_CHROMEOS)
......@@ -43,6 +44,7 @@ InstallStageTracker::UserInfo::UserInfo(user_manager::UserType user_type,
// InstallStageTracker::InstallationData implementation.
InstallStageTracker::InstallationData::InstallationData() = default;
InstallStageTracker::InstallationData::~InstallationData() = default;
InstallStageTracker::InstallationData::InstallationData(
const InstallationData&) = default;
......@@ -303,11 +305,18 @@ void InstallStageTracker::ReportCrxInstallError(
void InstallStageTracker::ReportSandboxedUnpackerFailureReason(
const ExtensionId& id,
SandboxedUnpackerFailureReason unpacker_failure_reason) {
const CrxInstallError& crx_install_error) {
base::Optional<SandboxedUnpackerFailureReason> unpacker_failure_reason =
crx_install_error.sandbox_failure_detail();
DCHECK(unpacker_failure_reason);
InstallationData& data = installation_data_map_[id];
data.failure_reason =
FailureReason::CRX_INSTALL_ERROR_SANDBOXED_UNPACKER_FAILURE;
data.unpacker_failure_reason = unpacker_failure_reason;
if (data.unpacker_failure_reason ==
SandboxedUnpackerFailureReason::UNPACKER_CLIENT_FAILED) {
data.unpacker_client_failed_error = crx_install_error.message();
}
NotifyObserversOfFailure(
id, FailureReason::CRX_INSTALL_ERROR_SANDBOXED_UNPACKER_FAILURE, data);
}
......
......@@ -11,9 +11,9 @@
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/optional.h"
#include "base/strings/string16.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/install/crx_install_error.h"
#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
#include "extensions/browser/install_stage.h"
#include "extensions/browser/updater/extension_downloader_delegate.h"
#include "extensions/browser/updater/safe_manifest_parser.h"
......@@ -289,6 +289,7 @@ class InstallStageTracker : public KeyedService {
// installation stage if known.
struct InstallationData {
InstallationData();
~InstallationData();
InstallationData(const InstallationData&);
base::Optional<Stage> install_stage;
......@@ -346,6 +347,9 @@ class InstallStageTracker : public KeyedService {
base::Optional<base::TimeTicks> finalizing_started_time;
// Time at which the installation process is complete.
base::Optional<base::TimeTicks> installation_complete_time;
// Detailed error description when extension failed to install with
// SandboxedUnpackerFailureReason equal to UNPACKER_CLIENT FAILED.
base::Optional<base::string16> unpacker_client_failed_error;
};
class Observer : public base::CheckedObserver {
......@@ -436,7 +440,7 @@ class InstallStageTracker : public KeyedService {
CrxInstallErrorDetail crx_install_error);
void ReportSandboxedUnpackerFailureReason(
const ExtensionId& id,
SandboxedUnpackerFailureReason unpacker_failure_reason);
const CrxInstallError& crx_install_error);
// Retrieves known information for installation of extension |id|.
// Returns empty data if not found.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment