Bug 1750791 - Part 3: Simplify UntrustedModulesBackupService. r=mhowell

`UntrustedModulesBackupService` manages two `UntrustedModulesBackupData`
instances to hold third-party module loading events.  We can simply have
two members instead of an array of two items, that makes the code more
readable.

Depends on D137245

Differential Revision: https://phabricator.services.mozilla.com/D137246
This commit is contained in:
Toshihito Kikuchi 2022-02-24 15:00:28 +00:00
parent 92220ca366
commit 74d6f9d144
4 changed files with 24 additions and 35 deletions

View File

@ -29,8 +29,6 @@ using MultiGetUntrustedModulesPromise =
MozPromise<bool /*aIgnored*/, nsresult, true>;
class MOZ_HEAP_CLASS MultiGetUntrustedModulesData final {
using BackupType = UntrustedModulesBackupService::BackupType;
public:
/**
* @param aFlags [in] Combinations of the flags defined under nsITelemetry.
@ -101,7 +99,7 @@ class MOZ_HEAP_CLASS MultiGetUntrustedModulesData final {
MOZ_ASSERT(NS_IsMainThread());
if (aResult.isSome()) {
mBackupSvc->Backup(BackupType::Staging, std::move(aResult.ref()));
mBackupSvc->Backup(std::move(aResult.ref()));
}
OnCompletion();
@ -172,12 +170,12 @@ void MultiGetUntrustedModulesData::Serialize(RefPtr<dom::Promise>&& aPromise) {
if (mFlags & nsITelemetry::EXCLUDE_STACKINFO_FROM_LOADEVENTS) {
// Without the stack info, we can add multiple UntrustedModulesData to
// the serializer directly.
rv = serializer.Add(mBackupSvc->Ref(BackupType::Staging));
rv = serializer.Add(mBackupSvc->Staging());
if (NS_WARN_IF(NS_FAILED(rv))) {
aPromise->MaybeReject(rv);
return;
}
rv = serializer.Add(mBackupSvc->Ref(BackupType::Settled));
rv = serializer.Add(mBackupSvc->Settled());
if (NS_WARN_IF(NS_FAILED(rv))) {
aPromise->MaybeReject(rv);
return;
@ -194,8 +192,7 @@ void MultiGetUntrustedModulesData::Serialize(RefPtr<dom::Promise>&& aPromise) {
// to "Settled" first, then add "Settled" to the serializer.
mBackupSvc->SettleAllStagingData();
const UntrustedModulesBackupData& settledRef =
mBackupSvc->Ref(BackupType::Settled);
const UntrustedModulesBackupData& settledRef = mBackupSvc->Settled();
if (settledRef.IsEmpty()) {
aPromise->MaybeReject(NS_ERROR_NOT_AVAILABLE);
return;
@ -210,8 +207,7 @@ void MultiGetUntrustedModulesData::Serialize(RefPtr<dom::Promise>&& aPromise) {
} else {
// When INCLUDE_OLD_LOADEVENTS is not set, we serialize only the "Staging"
// into a JS object.
const UntrustedModulesBackupData& stagingRef =
mBackupSvc->Ref(BackupType::Staging);
const UntrustedModulesBackupData& stagingRef = mBackupSvc->Staging();
if (stagingRef.IsEmpty()) {
aPromise->MaybeReject(NS_ERROR_NOT_AVAILABLE);

View File

@ -65,27 +65,20 @@ UntrustedModulesBackupService* UntrustedModulesBackupService::Get() {
return sInstance;
}
void UntrustedModulesBackupService::Backup(BackupType aType,
UntrustedModulesData&& aData) {
mBackup[static_cast<uint32_t>(aType)].Add(std::move(aData));
void UntrustedModulesBackupService::Backup(UntrustedModulesData&& aData) {
mStaging.Add(std::move(aData));
}
void UntrustedModulesBackupService::SettleAllStagingData() {
UntrustedModulesBackupData staging;
staging.SwapElements(mBackup[static_cast<uint32_t>(BackupType::Staging)]);
staging.SwapElements(mStaging);
for (auto&& iter = staging.Iter(); !iter.Done(); iter.Next()) {
if (!iter.Data()) {
continue;
}
mBackup[static_cast<uint32_t>(BackupType::Settled)].Add(
std::move(iter.Data()->mData));
mSettled.Add(std::move(iter.Data()->mData));
}
}
const UntrustedModulesBackupData& UntrustedModulesBackupService::Ref(
BackupType aType) const {
return mBackup[static_cast<uint32_t>(aType)];
}
} // namespace mozilla

View File

@ -44,22 +44,24 @@ class UntrustedModulesBackupData
class MOZ_HEAP_CLASS UntrustedModulesBackupService final {
public:
enum class BackupType : uint32_t {
Staging = 0,
Settled,
Count
};
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(UntrustedModulesBackupService)
static UntrustedModulesBackupService* Get();
void Backup(BackupType aType, UntrustedModulesData&& aData);
// Back up data to mStaging
void Backup(UntrustedModulesData&& aData);
void SettleAllStagingData();
const UntrustedModulesBackupData& Ref(BackupType aType) const;
const UntrustedModulesBackupData& Staging() const { return mStaging; }
const UntrustedModulesBackupData& Settled() const { return mSettled; }
private:
UntrustedModulesBackupData mBackup[static_cast<uint32_t>(BackupType::Count)];
// Data not yet submitted as telemetry
UntrustedModulesBackupData mStaging;
// Data already submitted as telemetry
UntrustedModulesBackupData mSettled;
~UntrustedModulesBackupService() = default;
};

View File

@ -427,18 +427,16 @@ TEST_F(UntrustedModulesFixture, Serialize) {
}
TEST_F(UntrustedModulesFixture, Backup) {
using BackupType = UntrustedModulesBackupService::BackupType;
RefPtr<UntrustedModulesBackupService> backupSvc(
UntrustedModulesBackupService::Get());
for (int i = 0; i < 5; ++i) {
backupSvc->Backup(BackupType::Staging, CollectSingleData());
backupSvc->Backup(CollectSingleData());
}
backupSvc->SettleAllStagingData();
EXPECT_TRUE(backupSvc->Ref(BackupType::Staging).IsEmpty());
EXPECT_TRUE(backupSvc->Staging().IsEmpty());
for (const auto& entry : backupSvc->Ref(BackupType::Settled)) {
for (const auto& entry : backupSvc->Settled()) {
const RefPtr<UntrustedModulesDataContainer>& container = entry.GetData();
EXPECT_TRUE(!!container);
const UntrustedModulesData& data = container->mData;