summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/WebExtensionPolicy.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /toolkit/components/extensions/WebExtensionPolicy.h
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--toolkit/components/extensions/WebExtensionPolicy.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/toolkit/components/extensions/WebExtensionPolicy.h b/toolkit/components/extensions/WebExtensionPolicy.h
new file mode 100644
index 0000000000..9ebb51716f
--- /dev/null
+++ b/toolkit/components/extensions/WebExtensionPolicy.h
@@ -0,0 +1,221 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/* 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 mozilla_extensions_WebExtensionPolicy_h
+#define mozilla_extensions_WebExtensionPolicy_h
+
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/Nullable.h"
+#include "mozilla/dom/WebExtensionPolicyBinding.h"
+#include "mozilla/dom/WindowProxyHolder.h"
+#include "mozilla/extensions/MatchPattern.h"
+
+#include "jspubtd.h"
+
+#include "mozilla/Result.h"
+#include "mozilla/WeakPtr.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupports.h"
+#include "nsWrapperCache.h"
+
+namespace mozilla {
+namespace dom {
+class Promise;
+} // namespace dom
+
+namespace extensions {
+
+using dom::WebExtensionInit;
+using dom::WebExtensionLocalizeCallback;
+
+class DocInfo;
+class WebExtensionContentScript;
+
+class WebExtensionPolicy final : public nsISupports,
+ public nsWrapperCache,
+ public SupportsWeakPtr {
+ public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebExtensionPolicy)
+
+ using ScriptArray = nsTArray<RefPtr<WebExtensionContentScript>>;
+
+ static already_AddRefed<WebExtensionPolicy> Constructor(
+ dom::GlobalObject& aGlobal, const WebExtensionInit& aInit,
+ ErrorResult& aRv);
+
+ nsAtom* Id() const { return mId; }
+ void GetId(nsAString& aId) const { aId = nsDependentAtomString(mId); };
+
+ const nsCString& MozExtensionHostname() const { return mHostname; }
+ void GetMozExtensionHostname(nsACString& aHostname) const {
+ aHostname = MozExtensionHostname();
+ }
+
+ void GetBaseURL(nsACString& aBaseURL) const {
+ MOZ_ALWAYS_SUCCEEDS(mBaseURI->GetSpec(aBaseURL));
+ }
+
+ bool IsPrivileged() { return mIsPrivileged; }
+
+ void GetURL(const nsAString& aPath, nsAString& aURL, ErrorResult& aRv) const;
+
+ Result<nsString, nsresult> GetURL(const nsAString& aPath) const;
+
+ void RegisterContentScript(WebExtensionContentScript& script,
+ ErrorResult& aRv);
+
+ void UnregisterContentScript(const WebExtensionContentScript& script,
+ ErrorResult& aRv);
+
+ void InjectContentScripts(ErrorResult& aRv);
+
+ bool CanAccessURI(const URLInfo& aURI, bool aExplicit = false,
+ bool aCheckRestricted = true,
+ bool aAllowFilePermission = false) const;
+
+ bool IsPathWebAccessible(const nsAString& aPath) const {
+ return mWebAccessiblePaths.Matches(aPath);
+ }
+
+ bool HasPermission(const nsAtom* aPermission) const {
+ return mPermissions->Contains(aPermission);
+ }
+ bool HasPermission(const nsAString& aPermission) const {
+ return mPermissions->Contains(aPermission);
+ }
+
+ static bool IsRestrictedDoc(const DocInfo& aDoc);
+ static bool IsRestrictedURI(const URLInfo& aURI);
+
+ nsCString BackgroundPageHTML() const;
+
+ MOZ_CAN_RUN_SCRIPT
+ void Localize(const nsAString& aInput, nsString& aResult) const;
+
+ const nsString& Name() const { return mName; }
+ void GetName(nsAString& aName) const { aName = mName; }
+
+ uint32_t ManifestVersion() const { return mManifestVersion; }
+
+ const nsString& ExtensionPageCSP() const { return mExtensionPageCSP; }
+ void GetExtensionPageCSP(nsAString& aCSP) const { aCSP = mExtensionPageCSP; }
+
+ const nsString& BaseCSP() const { return mBaseCSP; }
+ void GetBaseCSP(nsAString& aCSP) const { aCSP = mBaseCSP; }
+
+ already_AddRefed<MatchPatternSet> AllowedOrigins() {
+ return do_AddRef(mHostPermissions);
+ }
+ void SetAllowedOrigins(MatchPatternSet& aAllowedOrigins) {
+ mHostPermissions = &aAllowedOrigins;
+ }
+
+ void GetPermissions(nsTArray<nsString>& aResult) const {
+ mPermissions->Get(aResult);
+ }
+ void SetPermissions(const nsTArray<nsString>& aPermissions) {
+ mPermissions = new AtomSet(aPermissions);
+ }
+
+ void GetContentScripts(ScriptArray& aScripts) const;
+ const ScriptArray& ContentScripts() const { return mContentScripts; }
+
+ bool Active() const { return mActive; }
+ void SetActive(bool aActive, ErrorResult& aRv);
+
+ bool PrivateBrowsingAllowed() const;
+
+ bool CanAccessContext(nsILoadContext* aContext) const;
+
+ bool CanAccessWindow(const dom::WindowProxyHolder& aWindow) const;
+
+ void GetReadyPromise(JSContext* aCx, JS::MutableHandleObject aResult) const;
+ dom::Promise* ReadyPromise() const { return mReadyPromise; }
+
+ void GetBackgroundWorker(nsString& aScriptURL) const {
+ aScriptURL.Assign(mBackgroundWorkerScript);
+ }
+
+ bool IsManifestBackgroundWorker(const nsAString& aWorkerScriptURL) const {
+ return mBackgroundWorkerScript.Equals(aWorkerScriptURL);
+ }
+
+ uint64_t GetBrowsingContextGroupId() const;
+ uint64_t GetBrowsingContextGroupId(ErrorResult& aRv);
+
+ static void GetActiveExtensions(
+ dom::GlobalObject& aGlobal,
+ nsTArray<RefPtr<WebExtensionPolicy>>& aResults);
+
+ static already_AddRefed<WebExtensionPolicy> GetByID(
+ dom::GlobalObject& aGlobal, const nsAString& aID);
+
+ static already_AddRefed<WebExtensionPolicy> GetByHostname(
+ dom::GlobalObject& aGlobal, const nsACString& aHostname);
+
+ static already_AddRefed<WebExtensionPolicy> GetByURI(
+ dom::GlobalObject& aGlobal, nsIURI* aURI);
+
+ static bool IsRestrictedURI(dom::GlobalObject& aGlobal, const URLInfo& aURI) {
+ return IsRestrictedURI(aURI);
+ }
+
+ static bool UseRemoteWebExtensions(dom::GlobalObject& aGlobal);
+ static bool IsExtensionProcess(dom::GlobalObject& aGlobal);
+ static bool BackgroundServiceWorkerEnabled(dom::GlobalObject& aGlobal);
+
+ nsISupports* GetParentObject() const { return mParent; }
+
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::HandleObject aGivenProto) override;
+
+ protected:
+ virtual ~WebExtensionPolicy() = default;
+
+ private:
+ WebExtensionPolicy(dom::GlobalObject& aGlobal, const WebExtensionInit& aInit,
+ ErrorResult& aRv);
+
+ bool Enable();
+ bool Disable();
+ void InitializeBaseCSP();
+
+ nsCOMPtr<nsISupports> mParent;
+
+ RefPtr<nsAtom> mId;
+ nsCString mHostname;
+ nsCOMPtr<nsIURI> mBaseURI;
+
+ nsString mName;
+ uint32_t mManifestVersion = 2;
+ nsString mExtensionPageCSP;
+ nsString mBaseCSP;
+
+ uint64_t mBrowsingContextGroupId = 0;
+
+ bool mActive = false;
+ bool mAllowPrivateBrowsingByDefault = true;
+
+ RefPtr<WebExtensionLocalizeCallback> mLocalizeCallback;
+
+ bool mIsPrivileged;
+ RefPtr<AtomSet> mPermissions;
+ RefPtr<MatchPatternSet> mHostPermissions;
+ MatchGlobSet mWebAccessiblePaths;
+
+ dom::Nullable<nsTArray<nsString>> mBackgroundScripts;
+ nsString mBackgroundWorkerScript;
+
+ nsTArray<RefPtr<WebExtensionContentScript>> mContentScripts;
+
+ RefPtr<dom::Promise> mReadyPromise;
+};
+
+} // namespace extensions
+} // namespace mozilla
+
+#endif // mozilla_extensions_WebExtensionPolicy_h