113 lines
3.3 KiB
C++
113 lines
3.3 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 http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef __AboutThirdParty_h__
|
|
#define __AboutThirdParty_h__
|
|
|
|
#include "mozilla/MozPromise.h"
|
|
#include "nsIAboutThirdParty.h"
|
|
#include "nsInterfaceHashtable.h"
|
|
#include "nsTArray.h"
|
|
#include "nsTHashMap.h"
|
|
#include "nsTHashSet.h"
|
|
|
|
namespace mozilla {
|
|
|
|
class DynamicBlocklistWriter;
|
|
|
|
using InstallLocationT =
|
|
CompactPair<nsString, nsCOMPtr<nsIInstalledApplication>>;
|
|
using ComponentPathMapT = nsInterfaceHashtable<nsStringCaseInsensitiveHashKey,
|
|
nsIInstalledApplication>;
|
|
|
|
enum class KnownModuleType : uint32_t {
|
|
Ime = 0,
|
|
IconOverlay,
|
|
ContextMenuHandler,
|
|
CopyHookHandler,
|
|
DragDropHandler,
|
|
PropertySheetHandler,
|
|
DataHandler,
|
|
DropHandler,
|
|
IconHandler,
|
|
InfotipHandler,
|
|
PropertyHandler,
|
|
|
|
Last,
|
|
};
|
|
|
|
struct InstallLocationComparator {
|
|
const nsAString& mFilePath;
|
|
|
|
explicit InstallLocationComparator(const nsAString& aFilePath);
|
|
int operator()(const InstallLocationT& aLocation) const;
|
|
};
|
|
|
|
class InstalledApplication final : public nsIInstalledApplication {
|
|
nsString mName;
|
|
nsString mPublisher;
|
|
|
|
~InstalledApplication() = default;
|
|
|
|
public:
|
|
InstalledApplication() = default;
|
|
InstalledApplication(nsString&& aAppName, nsString&& aPublisher);
|
|
|
|
InstalledApplication(InstalledApplication&&) = delete;
|
|
InstalledApplication& operator=(InstalledApplication&&) = delete;
|
|
InstalledApplication(const InstalledApplication&) = delete;
|
|
InstalledApplication& operator=(const InstalledApplication&) = delete;
|
|
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
NS_DECL_NSIINSTALLEDAPPLICATION
|
|
};
|
|
|
|
using BackgroundThreadPromise =
|
|
MozPromise<bool /* aIgnored */, nsresult, /* IsExclusive */ false>;
|
|
|
|
class AboutThirdParty final : public nsIAboutThirdParty {
|
|
// Atomic only supports 32-bit or 64-bit types.
|
|
enum class WorkerState : uint32_t {
|
|
Init,
|
|
Running,
|
|
Done,
|
|
};
|
|
Atomic<WorkerState, SequentiallyConsistent> mWorkerState;
|
|
RefPtr<BackgroundThreadPromise::Private> mPromise;
|
|
nsTHashMap<nsStringCaseInsensitiveHashKey, uint32_t> mKnownModules;
|
|
ComponentPathMapT mComponentPaths;
|
|
nsTArray<InstallLocationT> mLocations;
|
|
|
|
#if defined(MOZ_LAUNCHER_PROCESS)
|
|
Atomic<DynamicBlocklistWriter*> mPendingWriter;
|
|
// The current blocklist. May differ from mDynamicBlocklistAtLaunch
|
|
// if the user has blocked/unblocked modules. Note that this does not
|
|
// take effect until restart.
|
|
nsTHashSet<nsStringCaseInsensitiveHashKey> mDynamicBlocklist;
|
|
// The blocklist that was used at launch, which is currently in effect.
|
|
nsTHashSet<nsStringCaseInsensitiveHashKey> mDynamicBlocklistAtLaunch;
|
|
#endif
|
|
|
|
~AboutThirdParty() = default;
|
|
void BackgroundThread();
|
|
void AddKnownModule(const nsString& aPath, KnownModuleType aType);
|
|
|
|
public:
|
|
static already_AddRefed<AboutThirdParty> GetSingleton();
|
|
|
|
AboutThirdParty();
|
|
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
NS_DECL_NSIABOUTTHIRDPARTY
|
|
|
|
// Have a function separated from dom::Promise so that
|
|
// both JS method and GTest can use.
|
|
RefPtr<BackgroundThreadPromise> CollectSystemInfoAsync();
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // __AboutThirdParty_h__
|