1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 sts=2 sw=2 et tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "RegistryMessageUtils.h"
8 #include "nsChromeRegistryContent.h"
9 #include "nsString.h"
10 #include "nsNetUtil.h"
11 #include "nsIResProtocolHandler.h"
12
nsChromeRegistryContent()13 nsChromeRegistryContent::nsChromeRegistryContent() {}
14
RegisterRemoteChrome(const InfallibleTArray<ChromePackage> & aPackages,const InfallibleTArray<SubstitutionMapping> & aSubstitutions,const InfallibleTArray<OverrideMapping> & aOverrides,const nsACString & aLocale,bool aReset)15 void nsChromeRegistryContent::RegisterRemoteChrome(
16 const InfallibleTArray<ChromePackage>& aPackages,
17 const InfallibleTArray<SubstitutionMapping>& aSubstitutions,
18 const InfallibleTArray<OverrideMapping>& aOverrides,
19 const nsACString& aLocale, bool aReset) {
20 MOZ_ASSERT(aReset || mLocale.IsEmpty(), "RegisterChrome twice?");
21
22 if (aReset) {
23 mPackagesHash.Clear();
24 mOverrideTable.Clear();
25 // XXX Can't clear resources.
26 }
27
28 for (uint32_t i = aPackages.Length(); i > 0;) {
29 --i;
30 RegisterPackage(aPackages[i]);
31 }
32
33 for (uint32_t i = aSubstitutions.Length(); i > 0;) {
34 --i;
35 RegisterSubstitution(aSubstitutions[i]);
36 }
37
38 for (uint32_t i = aOverrides.Length(); i > 0;) {
39 --i;
40 RegisterOverride(aOverrides[i]);
41 }
42
43 mLocale = aLocale;
44 }
45
RegisterPackage(const ChromePackage & aPackage)46 void nsChromeRegistryContent::RegisterPackage(const ChromePackage& aPackage) {
47 nsCOMPtr<nsIIOService> io(do_GetIOService());
48 if (!io) return;
49
50 nsCOMPtr<nsIURI> content, locale, skin;
51
52 if (aPackage.contentBaseURI.spec.Length()) {
53 nsresult rv = NS_NewURI(getter_AddRefs(content),
54 aPackage.contentBaseURI.spec, nullptr, nullptr, io);
55 if (NS_FAILED(rv)) return;
56 }
57 if (aPackage.localeBaseURI.spec.Length()) {
58 nsresult rv = NS_NewURI(getter_AddRefs(locale), aPackage.localeBaseURI.spec,
59 nullptr, nullptr, io);
60 if (NS_FAILED(rv)) return;
61 }
62 if (aPackage.skinBaseURI.spec.Length()) {
63 nsresult rv = NS_NewURI(getter_AddRefs(skin), aPackage.skinBaseURI.spec,
64 nullptr, nullptr, io);
65 if (NS_FAILED(rv)) return;
66 }
67
68 PackageEntry* entry = new PackageEntry;
69 entry->flags = aPackage.flags;
70 entry->contentBaseURI = content;
71 entry->localeBaseURI = locale;
72 entry->skinBaseURI = skin;
73
74 mPackagesHash.Put(aPackage.package, entry);
75 }
76
RegisterSubstitution(const SubstitutionMapping & aSubstitution)77 void nsChromeRegistryContent::RegisterSubstitution(
78 const SubstitutionMapping& aSubstitution) {
79 nsCOMPtr<nsIIOService> io(do_GetIOService());
80 if (!io) return;
81
82 nsCOMPtr<nsIProtocolHandler> ph;
83 nsresult rv =
84 io->GetProtocolHandler(aSubstitution.scheme.get(), getter_AddRefs(ph));
85 if (NS_FAILED(rv)) return;
86
87 nsCOMPtr<nsISubstitutingProtocolHandler> sph(do_QueryInterface(ph));
88 if (!sph) return;
89
90 nsCOMPtr<nsIURI> resolvedURI;
91 if (aSubstitution.resolvedURI.spec.Length()) {
92 rv = NS_NewURI(getter_AddRefs(resolvedURI), aSubstitution.resolvedURI.spec,
93 nullptr, nullptr, io);
94 if (NS_FAILED(rv)) return;
95 }
96
97 rv = sph->SetSubstitutionWithFlags(aSubstitution.path, resolvedURI,
98 aSubstitution.flags);
99 if (NS_FAILED(rv)) return;
100 }
101
RegisterOverride(const OverrideMapping & aOverride)102 void nsChromeRegistryContent::RegisterOverride(
103 const OverrideMapping& aOverride) {
104 nsCOMPtr<nsIIOService> io(do_GetIOService());
105 if (!io) return;
106
107 nsCOMPtr<nsIURI> chromeURI, overrideURI;
108 nsresult rv = NS_NewURI(getter_AddRefs(chromeURI), aOverride.originalURI.spec,
109 nullptr, nullptr, io);
110 if (NS_FAILED(rv)) return;
111
112 rv = NS_NewURI(getter_AddRefs(overrideURI), aOverride.overrideURI.spec,
113 nullptr, nullptr, io);
114 if (NS_FAILED(rv)) return;
115
116 mOverrideTable.Put(chromeURI, overrideURI);
117 }
118
GetBaseURIFromPackage(const nsCString & aPackage,const nsCString & aProvider,const nsCString & aPath)119 nsIURI* nsChromeRegistryContent::GetBaseURIFromPackage(
120 const nsCString& aPackage, const nsCString& aProvider,
121 const nsCString& aPath) {
122 PackageEntry* entry;
123 if (!mPackagesHash.Get(aPackage, &entry)) {
124 return nullptr;
125 }
126
127 if (aProvider.EqualsLiteral("locale")) {
128 return entry->localeBaseURI;
129 } else if (aProvider.EqualsLiteral("skin")) {
130 return entry->skinBaseURI;
131 } else if (aProvider.EqualsLiteral("content")) {
132 return entry->contentBaseURI;
133 }
134 return nullptr;
135 }
136
GetFlagsFromPackage(const nsCString & aPackage,uint32_t * aFlags)137 nsresult nsChromeRegistryContent::GetFlagsFromPackage(const nsCString& aPackage,
138 uint32_t* aFlags) {
139 PackageEntry* entry;
140 if (!mPackagesHash.Get(aPackage, &entry)) {
141 return NS_ERROR_FAILURE;
142 }
143 *aFlags = entry->flags;
144 return NS_OK;
145 }
146
147 // All functions following only make sense in chrome, and therefore assert
148
149 #define CONTENT_NOTREACHED() NS_NOTREACHED("Content should not be calling this")
150
151 #define CONTENT_NOT_IMPLEMENTED() \
152 CONTENT_NOTREACHED(); \
153 return NS_ERROR_NOT_IMPLEMENTED;
154
155 NS_IMETHODIMP
GetLocalesForPackage(const nsACString & aPackage,nsIUTF8StringEnumerator ** aResult)156 nsChromeRegistryContent::GetLocalesForPackage(
157 const nsACString& aPackage, nsIUTF8StringEnumerator** aResult) {
158 CONTENT_NOT_IMPLEMENTED();
159 }
160
161 NS_IMETHODIMP
CheckForOSAccessibility()162 nsChromeRegistryContent::CheckForOSAccessibility() {
163 CONTENT_NOT_IMPLEMENTED();
164 }
165
166 NS_IMETHODIMP
CheckForNewChrome()167 nsChromeRegistryContent::CheckForNewChrome() { CONTENT_NOT_IMPLEMENTED(); }
168
169 NS_IMETHODIMP
IsLocaleRTL(const nsACString & aPackage,bool * aResult)170 nsChromeRegistryContent::IsLocaleRTL(const nsACString& aPackage,
171 bool* aResult) {
172 if (aPackage != nsDependentCString("global")) {
173 NS_ERROR("Packages other than global unavailable");
174 return NS_ERROR_NOT_AVAILABLE;
175 }
176 *aResult = GetDirectionForLocale(mLocale);
177 return NS_OK;
178 }
179
180 NS_IMETHODIMP
GetSelectedLocale(const nsACString & aPackage,bool aAsBCP47,nsACString & aLocale)181 nsChromeRegistryContent::GetSelectedLocale(const nsACString& aPackage,
182 bool aAsBCP47, nsACString& aLocale) {
183 if (aPackage != nsDependentCString("global")) {
184 NS_ERROR("Uh-oh, caller wanted something other than 'some local'");
185 return NS_ERROR_NOT_AVAILABLE;
186 }
187 aLocale = mLocale;
188 if (aAsBCP47) {
189 SanitizeForBCP47(aLocale);
190 }
191 return NS_OK;
192 }
193
194 NS_IMETHODIMP
Observe(nsISupports * aSubject,const char * aTopic,const char16_t * aData)195 nsChromeRegistryContent::Observe(nsISupports* aSubject, const char* aTopic,
196 const char16_t* aData) {
197 CONTENT_NOT_IMPLEMENTED();
198 }
199
200 NS_IMETHODIMP
GetStyleOverlays(nsIURI * aChromeURL,nsISimpleEnumerator ** aResult)201 nsChromeRegistryContent::GetStyleOverlays(nsIURI* aChromeURL,
202 nsISimpleEnumerator** aResult) {
203 CONTENT_NOT_IMPLEMENTED();
204 }
205
206 NS_IMETHODIMP
GetXULOverlays(nsIURI * aChromeURL,nsISimpleEnumerator ** aResult)207 nsChromeRegistryContent::GetXULOverlays(nsIURI* aChromeURL,
208 nsISimpleEnumerator** aResult) {
209 CONTENT_NOT_IMPLEMENTED();
210 }
211
ManifestContent(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)212 void nsChromeRegistryContent::ManifestContent(ManifestProcessingContext& cx,
213 int lineno, char* const* argv,
214 int flags) {
215 CONTENT_NOTREACHED();
216 }
217
ManifestLocale(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)218 void nsChromeRegistryContent::ManifestLocale(ManifestProcessingContext& cx,
219 int lineno, char* const* argv,
220 int flags) {
221 CONTENT_NOTREACHED();
222 }
223
ManifestSkin(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)224 void nsChromeRegistryContent::ManifestSkin(ManifestProcessingContext& cx,
225 int lineno, char* const* argv,
226 int flags) {
227 CONTENT_NOTREACHED();
228 }
229
ManifestOverlay(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)230 void nsChromeRegistryContent::ManifestOverlay(ManifestProcessingContext& cx,
231 int lineno, char* const* argv,
232 int flags) {
233 CONTENT_NOTREACHED();
234 }
235
ManifestStyle(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)236 void nsChromeRegistryContent::ManifestStyle(ManifestProcessingContext& cx,
237 int lineno, char* const* argv,
238 int flags) {
239 CONTENT_NOTREACHED();
240 }
241
ManifestOverride(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)242 void nsChromeRegistryContent::ManifestOverride(ManifestProcessingContext& cx,
243 int lineno, char* const* argv,
244 int flags) {
245 CONTENT_NOTREACHED();
246 }
247
ManifestResource(ManifestProcessingContext & cx,int lineno,char * const * argv,int flags)248 void nsChromeRegistryContent::ManifestResource(ManifestProcessingContext& cx,
249 int lineno, char* const* argv,
250 int flags) {
251 CONTENT_NOTREACHED();
252 }
253