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