mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-07 19:59:18 +02:00
The method `Telemetry.getUntrustedModuleLoadEvents()` used to move data, meaning once it was called, the returned data was removed from the application so that the same data would never be returned again. To show third-party modules info on about:support, we need to keep data even after it's submitted as telemetry. At the same time, we need to know which loading events have been submitted and which have not. With this patch UntrustedModulesBackupService holds two storages named "Staging" and "Settled" respectively. To achieve the behavior described earlier, we use the "Staging" to keep instances not yet submitted, and "Settled" to keep instances already submitted. This patch also introduces two flags `INCLUDE_OLD_LOADEVENTS` and `KEEP_LOADEVENTS_NEW` under `nsITelemetry`, with which the caller of `getUntrustedModuleLoadEvents()` can control which instances to be returned and how the returned instances are kept internally. Differential Revision: https://phabricator.services.mozilla.com/D93829
69 lines
2 KiB
C++
69 lines
2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_UntrustedModulesBackupService_h
|
|
#define mozilla_UntrustedModulesBackupService_h
|
|
|
|
#include "mozilla/UntrustedModulesData.h"
|
|
#include "nsRefPtrHashtable.h"
|
|
|
|
namespace mozilla {
|
|
|
|
struct ProcessHashKey {
|
|
GeckoProcessType mType;
|
|
DWORD mPid;
|
|
ProcessHashKey(GeckoProcessType aType, DWORD aPid);
|
|
bool operator==(const ProcessHashKey& aOther) const;
|
|
PLDHashNumber Hash() const;
|
|
};
|
|
|
|
// UntrustedModulesData should not be refcounted as it's exchanged via IPC.
|
|
// Instead, we define this container class owning UntrustedModulesData along
|
|
// with a refcount.
|
|
class MOZ_HEAP_CLASS UntrustedModulesDataContainer final {
|
|
~UntrustedModulesDataContainer() = default;
|
|
|
|
public:
|
|
UntrustedModulesData mData;
|
|
|
|
explicit UntrustedModulesDataContainer(UntrustedModulesData&& aData)
|
|
: mData(std::move(aData)) {}
|
|
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(UntrustedModulesDataContainer)
|
|
};
|
|
|
|
class UntrustedModulesBackupData
|
|
: public nsRefPtrHashtable<nsGenericHashKey<ProcessHashKey>,
|
|
UntrustedModulesDataContainer> {
|
|
public:
|
|
void Add(UntrustedModulesData&& aData);
|
|
};
|
|
|
|
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);
|
|
void SettleAllStagingData();
|
|
const UntrustedModulesBackupData& Ref(BackupType aType) const;
|
|
|
|
private:
|
|
UntrustedModulesBackupData mBackup[static_cast<uint32_t>(BackupType::Count)];
|
|
|
|
~UntrustedModulesBackupService() = default;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_UntrustedModulesBackupService_h
|