Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #ifndef mozilla_extensions_WebExtensionPolicy_h
7 : #define mozilla_extensions_WebExtensionPolicy_h
8 :
9 : #include "mozilla/dom/BindingDeclarations.h"
10 : #include "mozilla/dom/WebExtensionPolicyBinding.h"
11 : #include "mozilla/extensions/MatchPattern.h"
12 :
13 : #include "jspubtd.h"
14 :
15 : #include "mozilla/Result.h"
16 : #include "mozilla/WeakPtr.h"
17 : #include "nsCOMPtr.h"
18 : #include "nsCycleCollectionParticipant.h"
19 : #include "nsISupports.h"
20 : #include "nsWrapperCache.h"
21 :
22 : namespace mozilla {
23 : namespace extensions {
24 :
25 : using dom::WebExtensionInit;
26 : using dom::WebExtensionLocalizeCallback;
27 :
28 : class WebExtensionContentScript;
29 :
30 : class WebExtensionPolicy final : public nsISupports
31 : , public nsWrapperCache
32 : , public SupportsWeakPtr<WebExtensionPolicy>
33 : {
34 : public:
35 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
36 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebExtensionPolicy)
37 0 : MOZ_DECLARE_WEAKREFERENCE_TYPENAME(WebExtensionPolicy)
38 :
39 : using ScriptArray = nsTArray<RefPtr<WebExtensionContentScript>>;
40 :
41 : static already_AddRefed<WebExtensionPolicy>
42 : Constructor(dom::GlobalObject& aGlobal, const WebExtensionInit& aInit, ErrorResult& aRv);
43 :
44 0 : nsIAtom* Id() const { return mId; }
45 0 : void GetId(nsAString& aId) const { aId = nsDependentAtomString(mId); };
46 :
47 0 : const nsCString& MozExtensionHostname() const { return mHostname; }
48 0 : void GetMozExtensionHostname(nsACString& aHostname) const
49 : {
50 0 : aHostname = MozExtensionHostname();
51 0 : }
52 :
53 0 : void GetBaseURL(nsACString& aBaseURL) const
54 : {
55 0 : MOZ_ALWAYS_SUCCEEDS(mBaseURI->GetSpec(aBaseURL));
56 0 : }
57 :
58 : void GetURL(const nsAString& aPath, nsAString& aURL, ErrorResult& aRv) const;
59 :
60 : Result<nsString, nsresult> GetURL(const nsAString& aPath) const;
61 :
62 0 : bool CanAccessURI(nsIURI* aURI, bool aExplicit = false) const
63 : {
64 0 : return mHostPermissions && mHostPermissions->Matches(aURI, aExplicit);
65 : }
66 :
67 0 : bool IsPathWebAccessible(const nsAString& aPath) const
68 : {
69 0 : return mWebAccessiblePaths.Matches(aPath);
70 : }
71 :
72 : bool HasPermission(const nsIAtom* aPermission) const
73 : {
74 : return mPermissions->Contains(aPermission);
75 : }
76 0 : bool HasPermission(const nsAString& aPermission) const
77 : {
78 0 : return mPermissions->Contains(aPermission);
79 : }
80 :
81 : nsCString BackgroundPageHTML() const;
82 :
83 : void Localize(const nsAString& aInput, nsString& aResult) const;
84 :
85 : const nsString& ContentSecurityPolicy() const
86 : {
87 : return mContentSecurityPolicy;
88 : }
89 0 : void GetContentSecurityPolicy(nsAString& aCSP) const
90 : {
91 0 : aCSP = mContentSecurityPolicy;
92 0 : }
93 :
94 :
95 0 : already_AddRefed<MatchPatternSet> AllowedOrigins()
96 : {
97 0 : return do_AddRef(mHostPermissions);
98 : }
99 0 : void SetAllowedOrigins(MatchPatternSet& aAllowedOrigins)
100 : {
101 0 : mHostPermissions = &aAllowedOrigins;
102 0 : }
103 :
104 0 : void GetPermissions(nsTArray<nsString>& aResult) const
105 : {
106 0 : mPermissions->Get(aResult);
107 0 : }
108 0 : void SetPermissions(const nsTArray<nsString>& aPermissions)
109 : {
110 0 : mPermissions = new AtomSet(aPermissions);
111 0 : }
112 :
113 : void GetContentScripts(ScriptArray& aScripts) const;
114 0 : const ScriptArray& ContentScripts() const { return mContentScripts; }
115 :
116 :
117 0 : bool Active() const { return mActive; }
118 : void SetActive(bool aActive, ErrorResult& aRv);
119 :
120 :
121 : static void
122 : GetActiveExtensions(dom::GlobalObject& aGlobal, nsTArray<RefPtr<WebExtensionPolicy>>& aResults);
123 :
124 : static already_AddRefed<WebExtensionPolicy>
125 : GetByID(dom::GlobalObject& aGlobal, const nsAString& aID);
126 :
127 : static already_AddRefed<WebExtensionPolicy>
128 : GetByHostname(dom::GlobalObject& aGlobal, const nsACString& aHostname);
129 :
130 : static already_AddRefed<WebExtensionPolicy>
131 : GetByURI(dom::GlobalObject& aGlobal, nsIURI* aURI);
132 :
133 :
134 : static bool IsExtensionProcess(dom::GlobalObject& aGlobal);
135 :
136 :
137 0 : nsISupports* GetParentObject() const { return mParent; }
138 :
139 : virtual JSObject* WrapObject(JSContext* aCx, JS::HandleObject aGivenProto) override;
140 :
141 : protected:
142 0 : virtual ~WebExtensionPolicy() = default;
143 :
144 : private:
145 : WebExtensionPolicy(dom::GlobalObject& aGlobal, const WebExtensionInit& aInit, ErrorResult& aRv);
146 :
147 : bool Enable();
148 : bool Disable();
149 :
150 : nsCOMPtr<nsISupports> mParent;
151 :
152 : nsCOMPtr<nsIAtom> mId;
153 : nsCString mHostname;
154 : nsCOMPtr<nsIURI> mBaseURI;
155 :
156 : nsString mContentSecurityPolicy;
157 :
158 : bool mActive = false;
159 :
160 : RefPtr<WebExtensionLocalizeCallback> mLocalizeCallback;
161 :
162 : RefPtr<AtomSet> mPermissions;
163 : RefPtr<MatchPatternSet> mHostPermissions;
164 : MatchGlobSet mWebAccessiblePaths;
165 :
166 : Nullable<nsTArray<nsString>> mBackgroundScripts;
167 :
168 : nsTArray<RefPtr<WebExtensionContentScript>> mContentScripts;
169 : };
170 :
171 : } // namespace extensions
172 : } // namespace mozilla
173 :
174 : #endif // mozilla_extensions_WebExtensionPolicy_h
|