1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
/* -*- 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__
|