Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/extensions/WebExtensionPolicy.h
Line
Count
Source (jump to first uncovered line)
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/Nullable.h"
11
#include "mozilla/dom/WebExtensionPolicyBinding.h"
12
#include "mozilla/extensions/MatchPattern.h"
13
14
#include "jspubtd.h"
15
16
#include "mozilla/Result.h"
17
#include "mozilla/WeakPtr.h"
18
#include "nsCOMPtr.h"
19
#include "nsCycleCollectionParticipant.h"
20
#include "nsISupports.h"
21
#include "nsWrapperCache.h"
22
23
namespace mozilla {
24
namespace extensions {
25
26
using dom::WebExtensionInit;
27
using dom::WebExtensionLocalizeCallback;
28
29
class DocInfo;
30
class WebExtensionContentScript;
31
32
class WebExtensionPolicy final : public nsISupports
33
                               , public nsWrapperCache
34
                               , public SupportsWeakPtr<WebExtensionPolicy>
35
{
36
public:
37
  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
38
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebExtensionPolicy)
39
  MOZ_DECLARE_WEAKREFERENCE_TYPENAME(WebExtensionPolicy)
40
41
  using ScriptArray = nsTArray<RefPtr<WebExtensionContentScript>>;
42
43
  static already_AddRefed<WebExtensionPolicy>
44
  Constructor(dom::GlobalObject& aGlobal, const WebExtensionInit& aInit, ErrorResult& aRv);
45
46
0
  nsAtom* Id() const { return mId; }
47
0
  void GetId(nsAString& aId) const { aId = nsDependentAtomString(mId); };
48
49
0
  const nsCString& MozExtensionHostname() const { return mHostname; }
50
  void GetMozExtensionHostname(nsACString& aHostname) const
51
0
  {
52
0
    aHostname = MozExtensionHostname();
53
0
  }
54
55
  void GetBaseURL(nsACString& aBaseURL) const
56
0
  {
57
0
    MOZ_ALWAYS_SUCCEEDS(mBaseURI->GetSpec(aBaseURL));
58
0
  }
59
60
  void GetURL(const nsAString& aPath, nsAString& aURL, ErrorResult& aRv) const;
61
62
  Result<nsString, nsresult> GetURL(const nsAString& aPath) const;
63
64
  void RegisterContentScript(WebExtensionContentScript& script,
65
                             ErrorResult& aRv);
66
67
  void UnregisterContentScript(const WebExtensionContentScript& script,
68
                               ErrorResult& aRv);
69
70
  void InjectContentScripts(ErrorResult& aRv);
71
72
  bool CanAccessURI(const URLInfo& aURI, bool aExplicit = false, bool aCheckRestricted = true) const
73
0
  {
74
0
    return (!aCheckRestricted || !IsRestrictedURI(aURI)) &&
75
0
            mHostPermissions && mHostPermissions->Matches(aURI, aExplicit);
76
0
  }
77
78
  bool IsPathWebAccessible(const nsAString& aPath) const
79
0
  {
80
0
    return mWebAccessiblePaths.Matches(aPath);
81
0
  }
82
83
  bool HasPermission(const nsAtom* aPermission) const
84
0
  {
85
0
    return mPermissions->Contains(aPermission);
86
0
  }
87
  bool HasPermission(const nsAString& aPermission) const
88
0
  {
89
0
    return mPermissions->Contains(aPermission);
90
0
  }
91
92
  static bool IsRestrictedDoc(const DocInfo& aDoc);
93
  static bool IsRestrictedURI(const URLInfo& aURI);
94
95
  nsCString BackgroundPageHTML() const;
96
97
  void Localize(const nsAString& aInput, nsString& aResult) const;
98
99
  const nsString& Name() const
100
0
  {
101
0
    return mName;
102
0
  }
103
  void GetName(nsAString& aName) const
104
0
  {
105
0
    aName = mName;
106
0
  }
107
108
  const nsString& ContentSecurityPolicy() const
109
0
  {
110
0
    return mContentSecurityPolicy;
111
0
  }
112
  void GetContentSecurityPolicy(nsAString& aCSP) const
113
0
  {
114
0
    aCSP = mContentSecurityPolicy;
115
0
  }
116
117
  already_AddRefed<MatchPatternSet> AllowedOrigins()
118
0
  {
119
0
    return do_AddRef(mHostPermissions);
120
0
  }
121
  void SetAllowedOrigins(MatchPatternSet& aAllowedOrigins)
122
0
  {
123
0
    mHostPermissions = &aAllowedOrigins;
124
0
  }
125
126
  void GetPermissions(nsTArray<nsString>& aResult) const
127
0
  {
128
0
    mPermissions->Get(aResult);
129
0
  }
130
  void SetPermissions(const nsTArray<nsString>& aPermissions)
131
0
  {
132
0
    mPermissions = new AtomSet(aPermissions);
133
0
  }
134
135
  void GetContentScripts(ScriptArray& aScripts) const;
136
0
  const ScriptArray& ContentScripts() const { return mContentScripts; }
137
138
139
0
  bool Active() const { return mActive; }
140
  void SetActive(bool aActive, ErrorResult& aRv);
141
142
143
  static void
144
  GetActiveExtensions(dom::GlobalObject& aGlobal, nsTArray<RefPtr<WebExtensionPolicy>>& aResults);
145
146
  static already_AddRefed<WebExtensionPolicy>
147
  GetByID(dom::GlobalObject& aGlobal, const nsAString& aID);
148
149
  static already_AddRefed<WebExtensionPolicy>
150
  GetByHostname(dom::GlobalObject& aGlobal, const nsACString& aHostname);
151
152
  static already_AddRefed<WebExtensionPolicy>
153
  GetByURI(dom::GlobalObject& aGlobal, nsIURI* aURI);
154
155
  static bool
156
  IsRestrictedURI(dom::GlobalObject& aGlobal, const URLInfo& aURI)
157
0
  {
158
0
    return IsRestrictedURI(aURI);
159
0
  }
160
161
162
  static bool UseRemoteWebExtensions(dom::GlobalObject& aGlobal);
163
  static bool IsExtensionProcess(dom::GlobalObject& aGlobal);
164
165
166
0
  nsISupports* GetParentObject() const { return mParent; }
167
168
  virtual JSObject* WrapObject(JSContext* aCx, JS::HandleObject aGivenProto) override;
169
170
protected:
171
0
  virtual ~WebExtensionPolicy() = default;
172
173
private:
174
  WebExtensionPolicy(dom::GlobalObject& aGlobal, const WebExtensionInit& aInit, ErrorResult& aRv);
175
176
  bool Enable();
177
  bool Disable();
178
179
  nsCOMPtr<nsISupports> mParent;
180
181
  RefPtr<nsAtom> mId;
182
  nsCString mHostname;
183
  nsCOMPtr<nsIURI> mBaseURI;
184
185
  nsString mName;
186
  nsString mContentSecurityPolicy;
187
188
  bool mActive = false;
189
190
  RefPtr<WebExtensionLocalizeCallback> mLocalizeCallback;
191
192
  RefPtr<AtomSet> mPermissions;
193
  RefPtr<MatchPatternSet> mHostPermissions;
194
  MatchGlobSet mWebAccessiblePaths;
195
196
  dom::Nullable<nsTArray<nsString>> mBackgroundScripts;
197
198
  nsTArray<RefPtr<WebExtensionContentScript>> mContentScripts;
199
};
200
201
} // namespace extensions
202
} // namespace mozilla
203
204
#endif // mozilla_extensions_WebExtensionPolicy_h