|
1 /* -*- Mode: C++; tab-width: 8; 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 nsChromeRegistryChrome_h |
|
7 #define nsChromeRegistryChrome_h |
|
8 |
|
9 #include "nsCOMArray.h" |
|
10 #include "nsChromeRegistry.h" |
|
11 #include "nsVoidArray.h" |
|
12 #include "mozilla/Move.h" |
|
13 |
|
14 namespace mozilla { |
|
15 namespace dom { |
|
16 class PContentParent; |
|
17 } |
|
18 } |
|
19 |
|
20 class nsIPrefBranch; |
|
21 |
|
22 class nsChromeRegistryChrome : public nsChromeRegistry |
|
23 { |
|
24 public: |
|
25 nsChromeRegistryChrome(); |
|
26 ~nsChromeRegistryChrome(); |
|
27 |
|
28 nsresult Init() MOZ_OVERRIDE; |
|
29 |
|
30 NS_IMETHOD CheckForNewChrome() MOZ_OVERRIDE; |
|
31 NS_IMETHOD CheckForOSAccessibility() MOZ_OVERRIDE; |
|
32 NS_IMETHOD GetLocalesForPackage(const nsACString& aPackage, |
|
33 nsIUTF8StringEnumerator* *aResult) MOZ_OVERRIDE; |
|
34 NS_IMETHOD IsLocaleRTL(const nsACString& package, |
|
35 bool *aResult) MOZ_OVERRIDE; |
|
36 NS_IMETHOD GetSelectedLocale(const nsACString& aPackage, |
|
37 nsACString& aLocale) MOZ_OVERRIDE; |
|
38 NS_IMETHOD Observe(nsISupports *aSubject, const char *aTopic, |
|
39 const char16_t *someData) MOZ_OVERRIDE; |
|
40 |
|
41 #ifdef MOZ_XUL |
|
42 NS_IMETHOD GetXULOverlays(nsIURI *aURI, |
|
43 nsISimpleEnumerator **_retval) MOZ_OVERRIDE; |
|
44 NS_IMETHOD GetStyleOverlays(nsIURI *aURI, |
|
45 nsISimpleEnumerator **_retval) MOZ_OVERRIDE; |
|
46 #endif |
|
47 |
|
48 void SendRegisteredChrome(mozilla::dom::PContentParent* aChild); |
|
49 |
|
50 private: |
|
51 static PLDHashOperator CollectPackages(PLDHashTable *table, |
|
52 PLDHashEntryHdr *entry, |
|
53 uint32_t number, void *arg); |
|
54 |
|
55 nsresult OverrideLocalePackage(const nsACString& aPackage, |
|
56 nsACString& aOverride); |
|
57 nsresult SelectLocaleFromPref(nsIPrefBranch* prefs); |
|
58 nsresult UpdateSelectedLocale() MOZ_OVERRIDE; |
|
59 nsIURI* GetBaseURIFromPackage(const nsCString& aPackage, |
|
60 const nsCString& aProvider, |
|
61 const nsCString& aPath) MOZ_OVERRIDE; |
|
62 nsresult GetFlagsFromPackage(const nsCString& aPackage, |
|
63 uint32_t* aFlags) MOZ_OVERRIDE; |
|
64 |
|
65 static const PLDHashTableOps kTableOps; |
|
66 static PLDHashNumber HashKey(PLDHashTable *table, const void *key); |
|
67 static bool MatchKey(PLDHashTable *table, const PLDHashEntryHdr *entry, |
|
68 const void *key); |
|
69 static void ClearEntry(PLDHashTable *table, PLDHashEntryHdr *entry); |
|
70 static bool InitEntry(PLDHashTable *table, PLDHashEntryHdr *entry, |
|
71 const void *key); |
|
72 |
|
73 struct ProviderEntry |
|
74 { |
|
75 ProviderEntry(const nsACString& aProvider, nsIURI* aBase) : |
|
76 provider(aProvider), |
|
77 baseURI(aBase) { } |
|
78 |
|
79 nsCString provider; |
|
80 nsCOMPtr<nsIURI> baseURI; |
|
81 }; |
|
82 |
|
83 class nsProviderArray |
|
84 { |
|
85 public: |
|
86 nsProviderArray() : |
|
87 mArray(1) { } |
|
88 ~nsProviderArray() |
|
89 { Clear(); } |
|
90 |
|
91 // When looking up locales and skins, the "selected" locale is not always |
|
92 // available. This enum identifies what kind of match is desired/found. |
|
93 enum MatchType { |
|
94 EXACT = 0, |
|
95 LOCALE = 1, // "en-GB" is selected, we found "en-US" |
|
96 ANY = 2 |
|
97 }; |
|
98 |
|
99 nsIURI* GetBase(const nsACString& aPreferred, MatchType aType); |
|
100 const nsACString& GetSelected(const nsACString& aPreferred, MatchType aType); |
|
101 void SetBase(const nsACString& aProvider, nsIURI* base); |
|
102 void EnumerateToArray(nsTArray<nsCString> *a); |
|
103 void Clear(); |
|
104 |
|
105 private: |
|
106 ProviderEntry* GetProvider(const nsACString& aPreferred, MatchType aType); |
|
107 |
|
108 nsVoidArray mArray; |
|
109 }; |
|
110 |
|
111 struct PackageEntry : public PLDHashEntryHdr |
|
112 { |
|
113 PackageEntry(const nsACString& package) |
|
114 : package(package), flags(0) { } |
|
115 ~PackageEntry() { } |
|
116 |
|
117 nsCString package; |
|
118 nsCOMPtr<nsIURI> baseURI; |
|
119 uint32_t flags; |
|
120 nsProviderArray locales; |
|
121 nsProviderArray skins; |
|
122 }; |
|
123 |
|
124 class OverlayListEntry : public nsURIHashKey |
|
125 { |
|
126 public: |
|
127 typedef nsURIHashKey::KeyType KeyType; |
|
128 typedef nsURIHashKey::KeyTypePointer KeyTypePointer; |
|
129 |
|
130 OverlayListEntry(KeyTypePointer aKey) : nsURIHashKey(aKey) { } |
|
131 OverlayListEntry(OverlayListEntry&& toMove) : nsURIHashKey(mozilla::Move(toMove)), |
|
132 mArray(mozilla::Move(toMove.mArray)) { } |
|
133 ~OverlayListEntry() { } |
|
134 |
|
135 void AddURI(nsIURI* aURI); |
|
136 |
|
137 nsCOMArray<nsIURI> mArray; |
|
138 }; |
|
139 |
|
140 class OverlayListHash |
|
141 { |
|
142 public: |
|
143 OverlayListHash() { } |
|
144 ~OverlayListHash() { } |
|
145 |
|
146 void Add(nsIURI* aBase, nsIURI* aOverlay); |
|
147 void Clear() { mTable.Clear(); } |
|
148 const nsCOMArray<nsIURI>* GetArray(nsIURI* aBase); |
|
149 |
|
150 private: |
|
151 nsTHashtable<OverlayListEntry> mTable; |
|
152 }; |
|
153 |
|
154 // Hashes on the file to be overlaid (chrome://browser/content/browser.xul) |
|
155 // to a list of overlays/stylesheets |
|
156 OverlayListHash mOverlayHash; |
|
157 OverlayListHash mStyleHash; |
|
158 |
|
159 bool mProfileLoaded; |
|
160 |
|
161 nsCString mSelectedLocale; |
|
162 nsCString mSelectedSkin; |
|
163 |
|
164 // Hash of package names ("global") to PackageEntry objects |
|
165 PLDHashTable mPackagesHash; |
|
166 |
|
167 virtual void ManifestContent(ManifestProcessingContext& cx, int lineno, |
|
168 char *const * argv, bool platform, |
|
169 bool contentaccessible); |
|
170 virtual void ManifestLocale(ManifestProcessingContext& cx, int lineno, |
|
171 char *const * argv, bool platform, |
|
172 bool contentaccessible); |
|
173 virtual void ManifestSkin(ManifestProcessingContext& cx, int lineno, |
|
174 char *const * argv, bool platform, |
|
175 bool contentaccessible); |
|
176 virtual void ManifestOverlay(ManifestProcessingContext& cx, int lineno, |
|
177 char *const * argv, bool platform, |
|
178 bool contentaccessible); |
|
179 virtual void ManifestStyle(ManifestProcessingContext& cx, int lineno, |
|
180 char *const * argv, bool platform, |
|
181 bool contentaccessible); |
|
182 virtual void ManifestOverride(ManifestProcessingContext& cx, int lineno, |
|
183 char *const * argv, bool platform, |
|
184 bool contentaccessible); |
|
185 virtual void ManifestResource(ManifestProcessingContext& cx, int lineno, |
|
186 char *const * argv, bool platform, |
|
187 bool contentaccessible); |
|
188 }; |
|
189 |
|
190 #endif // nsChromeRegistryChrome_h |