1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 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 "base/basictypes.h"
8 
9 #include "XPCModule.h"
10 #include "mozilla/ModuleUtils.h"
11 #include "nsImageModule.h"
12 #include "nsLayoutStatics.h"
13 #include "nsContentCID.h"
14 #include "nsContentDLF.h"
15 #include "nsContentPolicyUtils.h"
16 #include "nsDataDocumentContentPolicy.h"
17 #include "nsNoDataProtocolContentPolicy.h"
18 #include "nsDOMCID.h"
19 #include "nsHTMLContentSerializer.h"
20 #include "nsHTMLParts.h"
21 #include "nsIComponentManager.h"
22 #include "nsIContentIterator.h"
23 #include "nsIContentSerializer.h"
24 #include "nsIContentViewer.h"
25 #include "nsIController.h"
26 #include "nsIControllers.h"
27 #include "nsIDocument.h"
28 #include "nsIDocumentEncoder.h"
29 #include "nsIFactory.h"
30 #include "nsIIdleService.h"
31 #include "nsHTMLStyleSheet.h"
32 #include "nsILayoutDebugger.h"
33 #include "nsNameSpaceManager.h"
34 #include "nsIObserver.h"
35 #include "nsIObserverService.h"
36 #include "nsIScriptNameSpaceManager.h"
37 #include "nsIScriptError.h"
38 #include "nsISelection.h"
39 #include "nsCaret.h"
40 #include "nsPlainTextSerializer.h"
41 #include "nsXMLContentSerializer.h"
42 #include "nsXHTMLContentSerializer.h"
43 #ifdef MOZ_OLD_STYLE
44 #include "nsRuleNode.h"
45 #endif
46 #include "nsContentAreaDragDrop.h"
47 #include "nsBox.h"
48 #include "nsIFrameTraversal.h"
49 #include "nsLayoutCID.h"
50 #include "nsStyleSheetService.h"
51 #include "nsFocusManager.h"
52 #include "ThirdPartyUtil.h"
53 #include "nsStructuredCloneContainer.h"
54 #include "gfxPlatform.h"
55 #include "mozilla/gfx/gfxVars.h"
56 
57 #include "nsIEventListenerService.h"
58 #include "nsIMessageManager.h"
59 
60 // Transformiix stuff
61 #include "mozilla/dom/XPathEvaluator.h"
62 #include "txNodeSetAdaptor.h"
63 
64 #include "mozilla/dom/DOMParser.h"
65 #include "nsDOMSerializer.h"
66 
67 // view stuff
68 #include "nsContentCreatorFunctions.h"
69 
70 #include "nsHostObjectURI.h"
71 #include "nsGlobalWindowCommands.h"
72 #include "nsIControllerCommandTable.h"
73 #include "nsJSProtocolHandler.h"
74 #include "nsScriptNameSpaceManager.h"
75 #include "nsIControllerContext.h"
76 #include "nsZipArchive.h"
77 #include "mozilla/Attributes.h"
78 #include "mozilla/dom/DOMRequest.h"
79 #include "mozilla/dom/LocalStorageManager.h"
80 #include "mozilla/dom/network/UDPSocketChild.h"
81 #include "mozilla/dom/quota/QuotaManagerService.h"
82 #include "mozilla/dom/ServiceWorkerManager.h"
83 #include "mozilla/dom/SessionStorageManager.h"
84 #include "mozilla/dom/WorkerDebuggerManager.h"
85 #include "mozilla/dom/Notification.h"
86 #include "mozilla/OSFileConstants.h"
87 #include "mozilla/Services.h"
88 
89 #ifdef MOZ_WEBSPEECH_TEST_BACKEND
90 #include "mozilla/dom/FakeSpeechRecognitionService.h"
91 #endif
92 #ifdef MOZ_WEBSPEECH
93 #include "mozilla/dom/nsSynthVoiceRegistry.h"
94 #endif
95 
96 #include "mozilla/dom/PushNotifier.h"
97 using mozilla::dom::PushNotifier;
98 #define PUSHNOTIFIER_CID                             \
99   {                                                  \
100     0x2fc2d3e3, 0x020f, 0x404e, {                    \
101       0xb0, 0x6a, 0x6e, 0xcf, 0x3e, 0xa2, 0x33, 0x4a \
102     }                                                \
103   }
104 
105 #include "AudioChannelAgent.h"
106 using mozilla::dom::AudioChannelAgent;
107 
108 // Editor stuff
109 #include "nsEditorCID.h"
110 #include "mozilla/EditorController.h"  //CID
111 #include "mozilla/HTMLEditor.h"
112 
113 #include "nsScriptSecurityManager.h"
114 #include "ContentPrincipal.h"
115 #include "ExpandedPrincipal.h"
116 #include "SystemPrincipal.h"
117 #include "NullPrincipal.h"
118 #include "nsNetCID.h"
119 #if defined(MOZ_WIDGET_ANDROID)
120 #include "nsHapticFeedback.h"
121 #endif
122 #include "nsParserUtils.h"
123 
124 #include "nsHTMLCanvasFrame.h"
125 
126 class nsIDocumentLoaderFactory;
127 
128 #define PRODUCT_NAME "Gecko"
129 
130 /* 0ddf4df8-4dbb-4133-8b79-9afb966514f5 */
131 #define NS_PLUGINDOCLOADERFACTORY_CID                \
132   {                                                  \
133     0x0ddf4df8, 0x4dbb, 0x4133, {                    \
134       0x8b, 0x79, 0x9a, 0xfb, 0x96, 0x65, 0x14, 0xf5 \
135     }                                                \
136   }
137 
138 #define NS_WINDOWCOMMANDTABLE_CID                    \
139   { /* 0DE2FBFA-6B7F-11D7-BBBA-0003938A9D96 */       \
140     0x0DE2FBFA, 0x6B7F, 0x11D7, {                    \
141       0xBB, 0xBA, 0x00, 0x03, 0x93, 0x8A, 0x9D, 0x96 \
142     }                                                \
143   }
144 
145 #include "nsIBoxObject.h"
146 
147 #ifdef MOZ_XUL
148 #include "inDOMView.h"
149 #endif /* MOZ_XUL */
150 
151 #include "inDeepTreeWalker.h"
152 
153 #ifdef MOZ_XUL
154 #include "XULDocument.h"
155 #include "nsIXULSortService.h"
156 #endif
157 
158 static void Shutdown();
159 
160 #include "nsGeolocation.h"
161 #include "nsDeviceSensors.h"
162 #include "mozilla/dom/nsContentSecurityManager.h"
163 #include "mozilla/dom/nsCSPService.h"
164 #include "mozilla/dom/nsCSPContext.h"
165 #include "nsIPowerManagerService.h"
166 #include "nsIMediaManager.h"
167 #include "mozilla/dom/nsMixedContentBlocker.h"
168 
169 #include "AudioChannelService.h"
170 #include "mozilla/net/WebSocketEventService.h"
171 
172 #include "mozilla/dom/power/PowerManagerService.h"
173 
174 #include "nsIPresentationService.h"
175 
176 #include "MediaManager.h"
177 
178 #include "GMPService.h"
179 
180 #include "mozilla/dom/PresentationDeviceManager.h"
181 #include "mozilla/dom/PresentationTCPSessionTransport.h"
182 
183 #include "nsScriptError.h"
184 
185 #include "mozilla/TextInputProcessor.h"
186 
187 using namespace mozilla;
188 using namespace mozilla::dom;
189 using mozilla::dom::NotificationTelemetryService;
190 using mozilla::dom::UDPSocketChild;
191 using mozilla::dom::WorkerDebuggerManager;
192 using mozilla::dom::power::PowerManagerService;
193 using mozilla::dom::quota::QuotaManagerService;
194 using mozilla::gmp::GeckoMediaPluginService;
195 
196 #define NS_EDITORCOMMANDTABLE_CID                    \
197   {                                                  \
198     0x4f5e62b8, 0xd659, 0x4156, {                    \
199       0x84, 0xfc, 0x2f, 0x60, 0x99, 0x40, 0x03, 0x69 \
200     }                                                \
201   }
202 
203 #define NS_EDITINGCOMMANDTABLE_CID                   \
204   {                                                  \
205     0xcb38a746, 0xbeb8, 0x43f3, {                    \
206       0x94, 0x29, 0x77, 0x96, 0xe1, 0xa9, 0x3f, 0xb4 \
207     }                                                \
208   }
209 
210 #define NS_HAPTICFEEDBACK_CID                        \
211   {                                                  \
212     0x1f15dbc8, 0xbfaa, 0x45de, {                    \
213       0x8a, 0x46, 0x08, 0xe2, 0xe2, 0x63, 0x26, 0xb0 \
214     }                                                \
215   }
216 
217 NS_GENERIC_FACTORY_CONSTRUCTOR(TextEditor)
218 
219 NS_GENERIC_FACTORY_CONSTRUCTOR(nsParserUtils)
220 
221 NS_GENERIC_FACTORY_CONSTRUCTOR(HTMLEditor)
222 
223 // Transformiix
224 /* 5d5d92cd-6bf8-11d9-bf4a-000a95dc234c */
225 #define TRANSFORMIIX_NODESET_CID                    \
226   {                                                 \
227     0x5d5d92cd, 0x6bf8, 0x11d9, {                   \
228       0xbf, 0x4a, 0x0, 0x0a, 0x95, 0xdc, 0x23, 0x4c \
229     }                                               \
230   }
231 
232 #define TRANSFORMIIX_NODESET_CONTRACTID "@mozilla.org/transformiix-nodeset;1"
233 
234 // PresentationDeviceManager
235 /* e1e79dec-4085-4994-ac5b-744b016697e6 */
236 #define PRESENTATION_DEVICE_MANAGER_CID              \
237   {                                                  \
238     0xe1e79dec, 0x4085, 0x4994, {                    \
239       0xac, 0x5b, 0x74, 0x4b, 0x01, 0x66, 0x97, 0xe6 \
240     }                                                \
241   }
242 
243 #define PRESENTATION_TCP_SESSION_TRANSPORT_CID       \
244   {                                                  \
245     0xc9d023f4, 0x6228, 0x4c07, {                    \
246       0x8b, 0x1d, 0x9c, 0x19, 0x57, 0x3f, 0xaa, 0x27 \
247     }                                                \
248   }
249 
250 already_AddRefed<nsIPresentationService> NS_CreatePresentationService();
251 
252 // Factory Constructor
253 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(txNodeSetAdaptor, Init)
254 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDOMSerializer)
255 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHostObjectURI)
256 NS_GENERIC_FACTORY_CONSTRUCTOR(DOMParser)
257 NS_GENERIC_FACTORY_CONSTRUCTOR(LocalStorageManager)
258 NS_GENERIC_FACTORY_CONSTRUCTOR(SessionStorageManager)
259 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(DOMRequestService,
260                                          DOMRequestService::FactoryCreate)
261 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(QuotaManagerService,
262                                          QuotaManagerService::FactoryCreate)
263 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(ServiceWorkerManager,
264                                          ServiceWorkerManager::GetInstance)
265 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(WorkerDebuggerManager,
266                                          WorkerDebuggerManager::GetInstance)
267 
268 #ifdef MOZ_WEBSPEECH
269 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(
270     nsSynthVoiceRegistry, nsSynthVoiceRegistry::GetInstanceForService)
271 #endif
272 
273 NS_GENERIC_FACTORY_CONSTRUCTOR(AudioChannelAgent)
274 
275 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceSensors)
276 
277 #if defined(ANDROID)
278 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHapticFeedback)
279 #endif
280 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(ThirdPartyUtil, Init)
281 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIPowerManagerService,
282                                          PowerManagerService::GetInstance)
283 
284 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIMediaManagerService,
285                                          MediaManager::GetInstance)
286 NS_GENERIC_FACTORY_CONSTRUCTOR(PresentationDeviceManager)
287 NS_GENERIC_FACTORY_CONSTRUCTOR(TextInputProcessor)
288 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIPresentationService,
289                                          NS_CreatePresentationService)
290 NS_GENERIC_FACTORY_CONSTRUCTOR(PresentationTCPSessionTransport)
291 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NotificationTelemetryService, Init)
292 NS_GENERIC_FACTORY_CONSTRUCTOR(PushNotifier)
293 
294 //-----------------------------------------------------------------------------
295 
296 static bool gInitialized = false;
297 
298 // Perform our one-time intialization for this module
299 
Initialize()300 static nsresult Initialize() {
301   if (gInitialized) {
302     MOZ_CRASH("Recursive layout module initialization");
303     return NS_ERROR_FAILURE;
304   }
305   if (XRE_GetProcessType() == GeckoProcessType_GPU) {
306     // We mark the layout module as being available in the GPU process so that
307     // XPCOM's component manager initializes the power manager service, which
308     // is needed for nsAppShell. However, we don't actually need anything in
309     // the layout module itself.
310     return NS_OK;
311   }
312 
313   static_assert(sizeof(uintptr_t) == sizeof(void*),
314                 "Eeek! You'll need to adjust the size of uintptr_t to the "
315                 "size of a pointer on your platform.");
316 
317   gInitialized = true;
318 
319   nsresult rv;
320   rv = xpcModuleCtor();
321   if (NS_FAILED(rv)) return rv;
322 
323   rv = nsLayoutStatics::Initialize();
324   if (NS_FAILED(rv)) {
325     Shutdown();
326     return rv;
327   }
328 
329   return NS_OK;
330 }
331 
332 // Shutdown this module, releasing all of the module resources
333 
334 // static
Shutdown()335 void Shutdown() {
336   NS_PRECONDITION(gInitialized, "module not initialized");
337   if (!gInitialized) return;
338 
339   gInitialized = false;
340 
341   nsLayoutStatics::Release();
342 }
343 
344 #ifdef DEBUG
345 nsresult NS_NewLayoutDebugger(nsILayoutDebugger** aResult);
346 #endif
347 
348 nsresult NS_NewBoxObject(nsIBoxObject** aResult);
349 
350 #ifdef MOZ_XUL
351 nsresult NS_NewListBoxObject(nsIBoxObject** aResult);
352 nsresult NS_NewScrollBoxObject(nsIBoxObject** aResult);
353 nsresult NS_NewMenuBoxObject(nsIBoxObject** aResult);
354 nsresult NS_NewPopupBoxObject(nsIBoxObject** aResult);
355 nsresult NS_NewContainerBoxObject(nsIBoxObject** aResult);
356 nsresult NS_NewTreeBoxObject(nsIBoxObject** aResult);
357 #endif
358 
359 nsresult NS_CreateFrameTraversal(nsIFrameTraversal** aResult);
360 
361 nsresult NS_NewDomSelection(nsISelection** aResult);
362 already_AddRefed<nsIContentViewer> NS_NewContentViewer();
363 nsresult NS_NewContentDocumentLoaderFactory(nsIDocumentLoaderFactory** aResult);
364 nsresult NS_NewHTMLCopyTextEncoder(nsIDocumentEncoder** aResult);
365 nsresult NS_NewTextEncoder(nsIDocumentEncoder** aResult);
366 nsresult NS_NewContentPolicy(nsIContentPolicy** aResult);
367 
368 nsresult NS_NewEventListenerService(nsIEventListenerService** aResult);
369 nsresult NS_NewGlobalMessageManager(nsIMessageBroadcaster** aResult);
370 nsresult NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult);
371 nsresult NS_NewChildProcessMessageManager(nsISyncMessageSender** aResult);
372 
373 nsresult NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID,
374                               void** aResult);
375 
376 #define MAKE_CTOR(ctor_, iface_, func_)                                       \
377   static nsresult ctor_(nsISupports* aOuter, REFNSIID aIID, void** aResult) { \
378     *aResult = nullptr;                                                       \
379     if (aOuter) return NS_ERROR_NO_AGGREGATION;                               \
380     iface_* inst;                                                             \
381     nsresult rv = func_(&inst);                                               \
382     if (NS_SUCCEEDED(rv)) {                                                   \
383       rv = inst->QueryInterface(aIID, aResult);                               \
384       NS_RELEASE(inst);                                                       \
385     }                                                                         \
386     return rv;                                                                \
387   }
388 
389 // As above, but expects
390 //   already_AddRefed<nsIFoo> NS_NewFoo();
391 // instead of
392 //   nsresult NS_NewFoo(nsIFoo**);
393 #define MAKE_CTOR2(ctor_, iface_, func_)                                      \
394   static nsresult ctor_(nsISupports* aOuter, REFNSIID aIID, void** aResult) { \
395     *aResult = nullptr;                                                       \
396     if (aOuter) {                                                             \
397       return NS_ERROR_NO_AGGREGATION;                                         \
398     }                                                                         \
399     nsCOMPtr<iface_> inst = func_();                                          \
400     inst.forget(aResult);                                                     \
401     return NS_OK;                                                             \
402   }
403 
404 #ifdef DEBUG
405 MAKE_CTOR(CreateNewLayoutDebugger, nsILayoutDebugger, NS_NewLayoutDebugger)
406 #endif
407 
408 MAKE_CTOR(CreateNewFrameTraversal, nsIFrameTraversal, NS_CreateFrameTraversal)
409 MAKE_CTOR(CreateNewBoxObject, nsIBoxObject, NS_NewBoxObject)
410 
411 #ifdef MOZ_XUL
412 MAKE_CTOR(CreateNewListBoxObject, nsIBoxObject, NS_NewListBoxObject)
413 MAKE_CTOR(CreateNewMenuBoxObject, nsIBoxObject, NS_NewMenuBoxObject)
414 MAKE_CTOR(CreateNewPopupBoxObject, nsIBoxObject, NS_NewPopupBoxObject)
415 MAKE_CTOR(CreateNewScrollBoxObject, nsIBoxObject, NS_NewScrollBoxObject)
416 MAKE_CTOR(CreateNewTreeBoxObject, nsIBoxObject, NS_NewTreeBoxObject)
417 MAKE_CTOR(CreateNewContainerBoxObject, nsIBoxObject, NS_NewContainerBoxObject)
418 #endif  // MOZ_XUL
419 
420 #ifdef MOZ_XUL
421 NS_GENERIC_FACTORY_CONSTRUCTOR(inDOMView)
422 #endif
423 NS_GENERIC_FACTORY_CONSTRUCTOR(inDeepTreeWalker)
424 
425 MAKE_CTOR2(CreateContentViewer, nsIContentViewer, NS_NewContentViewer)
426 MAKE_CTOR(CreateHTMLDocument, nsIDocument, NS_NewHTMLDocument)
427 MAKE_CTOR(CreateXMLDocument, nsIDocument, NS_NewXMLDocument)
428 MAKE_CTOR(CreateSVGDocument, nsIDocument, NS_NewSVGDocument)
429 MAKE_CTOR(CreateImageDocument, nsIDocument, NS_NewImageDocument)
430 MAKE_CTOR(CreateDOMSelection, nsISelection, NS_NewDomSelection)
431 MAKE_CTOR2(CreateContentIterator, nsIContentIterator, NS_NewContentIterator)
432 MAKE_CTOR2(CreatePreContentIterator, nsIContentIterator,
433            NS_NewPreContentIterator)
434 MAKE_CTOR2(CreateSubtreeIterator, nsIContentIterator,
435            NS_NewContentSubtreeIterator)
436 MAKE_CTOR(CreateTextEncoder, nsIDocumentEncoder, NS_NewTextEncoder)
437 MAKE_CTOR(CreateHTMLCopyTextEncoder, nsIDocumentEncoder,
438           NS_NewHTMLCopyTextEncoder)
439 MAKE_CTOR(CreateXMLContentSerializer, nsIContentSerializer,
440           NS_NewXMLContentSerializer)
441 MAKE_CTOR(CreateHTMLContentSerializer, nsIContentSerializer,
442           NS_NewHTMLContentSerializer)
443 MAKE_CTOR(CreateXHTMLContentSerializer, nsIContentSerializer,
444           NS_NewXHTMLContentSerializer)
445 MAKE_CTOR(CreatePlainTextSerializer, nsIContentSerializer,
446           NS_NewPlainTextSerializer)
447 MAKE_CTOR(CreateContentPolicy, nsIContentPolicy, NS_NewContentPolicy)
448 #ifdef MOZ_XUL
449 MAKE_CTOR(CreateXULSortService, nsIXULSortService, NS_NewXULSortService)
450 MAKE_CTOR(CreateXULDocument, nsIDocument, NS_NewXULDocument)
451 // NS_NewXULControllers
452 #endif
453 MAKE_CTOR(CreateContentDLF, nsIDocumentLoaderFactory,
454           NS_NewContentDocumentLoaderFactory)
455 MAKE_CTOR(CreateEventListenerService, nsIEventListenerService,
456           NS_NewEventListenerService)
457 MAKE_CTOR(CreateGlobalMessageManager, nsIMessageBroadcaster,
458           NS_NewGlobalMessageManager)
459 MAKE_CTOR(CreateParentMessageManager, nsIMessageBroadcaster,
460           NS_NewParentProcessMessageManager)
461 MAKE_CTOR(CreateChildMessageManager, nsISyncMessageSender,
462           NS_NewChildProcessMessageManager)
463 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDataDocumentContentPolicy)
464 NS_GENERIC_FACTORY_CONSTRUCTOR(nsNoDataProtocolContentPolicy)
465 MAKE_CTOR(CreatePluginDocument, nsIDocument, NS_NewPluginDocument)
466 MAKE_CTOR(CreateVideoDocument, nsIDocument, NS_NewVideoDocument)
467 MAKE_CTOR(CreateFocusManager, nsIFocusManager, NS_NewFocusManager)
468 
469 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsStyleSheetService, Init)
470 
471 NS_GENERIC_FACTORY_CONSTRUCTOR(nsJSURI)
472 
473 // views are not refcounted, so this is the same as
474 // NS_GENERIC_FACTORY_CONSTRUCTOR without the NS_ADDREF/NS_RELEASE
475 #define NS_GENERIC_FACTORY_CONSTRUCTOR_NOREFS(_InstanceClass)                  \
476   static nsresult _InstanceClass##Constructor(nsISupports* aOuter,             \
477                                               REFNSIID aIID, void** aResult) { \
478     nsresult rv;                                                               \
479                                                                                \
480     *aResult = nullptr;                                                        \
481     if (nullptr != aOuter) {                                                   \
482       rv = NS_ERROR_NO_AGGREGATION;                                            \
483       return rv;                                                               \
484     }                                                                          \
485                                                                                \
486     _InstanceClass* inst = new _InstanceClass();                               \
487     if (nullptr == inst) {                                                     \
488       rv = NS_ERROR_OUT_OF_MEMORY;                                             \
489       return rv;                                                               \
490     }                                                                          \
491     rv = inst->QueryInterface(aIID, aResult);                                  \
492                                                                                \
493     return rv;                                                                 \
494   }
495 
496 #define NS_GEOLOCATION_CID                           \
497   {                                                  \
498     0x1E1C3FF, 0x94A, 0xD048, {                      \
499       0x44, 0xB4, 0x62, 0xD2, 0x9C, 0x7B, 0x4F, 0x39 \
500     }                                                \
501   }
502 
503 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(Geolocation, Init)
504 
505 #define NS_GEOLOCATION_SERVICE_CID                   \
506   {                                                  \
507     0x404d02a, 0x1CA, 0xAAAB, {                      \
508       0x47, 0x62, 0x94, 0x4b, 0x1b, 0xf2, 0xf7, 0xb5 \
509     }                                                \
510   }
511 
512 #define NS_AUDIOCHANNEL_SERVICE_CID                  \
513   {                                                  \
514     0xf712e983, 0x048a, 0x443f, {                    \
515       0x88, 0x02, 0xfc, 0xc3, 0xd9, 0x27, 0xce, 0xac \
516     }                                                \
517   }
518 
519 #define NS_WEBSOCKETEVENT_SERVICE_CID                \
520   {                                                  \
521     0x31689828, 0xda66, 0x49a6, {                    \
522       0x87, 0x0c, 0xdf, 0x62, 0xb8, 0x3f, 0xe7, 0x89 \
523     }                                                \
524   }
525 
526 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(
527     nsGeolocationService, nsGeolocationService::GetGeolocationService)
528 
529 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(AudioChannelService,
530                                          AudioChannelService::GetOrCreate)
531 
532 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(WebSocketEventService,
533                                          WebSocketEventService::GetOrCreate)
534 
535 #ifdef MOZ_WEBSPEECH_TEST_BACKEND
536 NS_GENERIC_FACTORY_CONSTRUCTOR(FakeSpeechRecognitionService)
537 #endif
538 
539 NS_GENERIC_FACTORY_CONSTRUCTOR(nsContentSecurityManager)
540 NS_GENERIC_FACTORY_CONSTRUCTOR(nsCSPContext)
541 NS_GENERIC_FACTORY_CONSTRUCTOR(CSPService)
542 NS_GENERIC_FACTORY_CONSTRUCTOR(nsMixedContentBlocker)
543 
544 NS_GENERIC_FACTORY_CONSTRUCTOR(ContentPrincipal)
545 NS_GENERIC_FACTORY_CONSTRUCTOR(ExpandedPrincipal)
546 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(
547     SystemPrincipal,
548     nsScriptSecurityManager::SystemPrincipalSingletonConstructor)
549 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NullPrincipal, Init)
550 NS_GENERIC_FACTORY_CONSTRUCTOR(nsStructuredCloneContainer)
551 
552 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(OSFileConstantsService,
553                                          OSFileConstantsService::GetOrCreate);
554 
555 NS_GENERIC_FACTORY_CONSTRUCTOR(UDPSocketChild)
556 
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(GeckoMediaPluginService,GeckoMediaPluginService::GetGeckoMediaPluginService)557 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(
558     GeckoMediaPluginService,
559     GeckoMediaPluginService::GetGeckoMediaPluginService)
560 
561 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScriptError)
562 
563 #ifdef ACCESSIBILITY
564 #include "xpcAccessibilityService.h"
565 
566 MAKE_CTOR(CreateA11yService, nsIAccessibilityService,
567           NS_GetAccessibilityService)
568 #endif
569 
570 static nsresult Construct_nsIScriptSecurityManager(nsISupports* aOuter,
571                                                    REFNSIID aIID,
572                                                    void** aResult) {
573   if (!aResult) return NS_ERROR_NULL_POINTER;
574   *aResult = nullptr;
575   if (aOuter) return NS_ERROR_NO_AGGREGATION;
576   nsScriptSecurityManager* obj =
577       nsScriptSecurityManager::GetScriptSecurityManager();
578   if (!obj) return NS_ERROR_OUT_OF_MEMORY;
579   if (NS_FAILED(obj->QueryInterface(aIID, aResult))) return NS_ERROR_FAILURE;
580   return NS_OK;
581 }
582 
583 #ifdef DEBUG
584 NS_DEFINE_NAMED_CID(NS_LAYOUT_DEBUGGER_CID);
585 #endif
586 NS_DEFINE_NAMED_CID(NS_FRAMETRAVERSAL_CID);
587 NS_DEFINE_NAMED_CID(NS_BOXOBJECT_CID);
588 #ifdef MOZ_XUL
589 NS_DEFINE_NAMED_CID(NS_LISTBOXOBJECT_CID);
590 NS_DEFINE_NAMED_CID(NS_MENUBOXOBJECT_CID);
591 NS_DEFINE_NAMED_CID(NS_POPUPBOXOBJECT_CID);
592 NS_DEFINE_NAMED_CID(NS_CONTAINERBOXOBJECT_CID);
593 NS_DEFINE_NAMED_CID(NS_SCROLLBOXOBJECT_CID);
594 NS_DEFINE_NAMED_CID(NS_TREEBOXOBJECT_CID);
595 #endif  // MOZ_XUL
596 #ifdef MOZ_XUL
597 NS_DEFINE_NAMED_CID(IN_DOMVIEW_CID);
598 #endif
599 NS_DEFINE_NAMED_CID(IN_DEEPTREEWALKER_CID);
600 NS_DEFINE_NAMED_CID(NS_CONTENT_VIEWER_CID);
601 NS_DEFINE_NAMED_CID(NS_HTMLDOCUMENT_CID);
602 NS_DEFINE_NAMED_CID(NS_XMLDOCUMENT_CID);
603 NS_DEFINE_NAMED_CID(NS_SVGDOCUMENT_CID);
604 NS_DEFINE_NAMED_CID(NS_IMAGEDOCUMENT_CID);
605 NS_DEFINE_NAMED_CID(NS_DOMSELECTION_CID);
606 NS_DEFINE_NAMED_CID(NS_CONTENTITERATOR_CID);
607 NS_DEFINE_NAMED_CID(NS_PRECONTENTITERATOR_CID);
608 NS_DEFINE_NAMED_CID(NS_SUBTREEITERATOR_CID);
609 NS_DEFINE_NAMED_CID(NS_TEXT_ENCODER_CID);
610 NS_DEFINE_NAMED_CID(NS_HTMLCOPY_TEXT_ENCODER_CID);
611 NS_DEFINE_NAMED_CID(NS_XMLCONTENTSERIALIZER_CID);
612 NS_DEFINE_NAMED_CID(NS_XHTMLCONTENTSERIALIZER_CID);
613 NS_DEFINE_NAMED_CID(NS_HTMLCONTENTSERIALIZER_CID);
614 NS_DEFINE_NAMED_CID(NS_PLAINTEXTSERIALIZER_CID);
615 NS_DEFINE_NAMED_CID(NS_PARSERUTILS_CID);
616 NS_DEFINE_NAMED_CID(NS_SCRIPTABLEUNESCAPEHTML_CID);
617 NS_DEFINE_NAMED_CID(NS_CONTENTPOLICY_CID);
618 NS_DEFINE_NAMED_CID(NS_DATADOCUMENTCONTENTPOLICY_CID);
619 NS_DEFINE_NAMED_CID(NS_NODATAPROTOCOLCONTENTPOLICY_CID);
620 NS_DEFINE_NAMED_CID(NS_XULCONTROLLERS_CID);
621 #ifdef MOZ_XUL
622 NS_DEFINE_NAMED_CID(NS_XULSORTSERVICE_CID);
623 NS_DEFINE_NAMED_CID(NS_XULDOCUMENT_CID);
624 #endif
625 NS_DEFINE_NAMED_CID(NS_CONTENT_DOCUMENT_LOADER_FACTORY_CID);
626 NS_DEFINE_NAMED_CID(NS_JSPROTOCOLHANDLER_CID);
627 NS_DEFINE_NAMED_CID(NS_JSURI_CID);
628 NS_DEFINE_NAMED_CID(NS_WINDOWCOMMANDTABLE_CID);
629 NS_DEFINE_NAMED_CID(NS_WINDOWCONTROLLER_CID);
630 NS_DEFINE_NAMED_CID(NS_PLUGINDOCLOADERFACTORY_CID);
631 NS_DEFINE_NAMED_CID(NS_PLUGINDOCUMENT_CID);
632 NS_DEFINE_NAMED_CID(NS_VIDEODOCUMENT_CID);
633 NS_DEFINE_NAMED_CID(NS_STYLESHEETSERVICE_CID);
634 NS_DEFINE_NAMED_CID(TRANSFORMIIX_NODESET_CID);
635 NS_DEFINE_NAMED_CID(NS_XMLSERIALIZER_CID);
636 NS_DEFINE_NAMED_CID(NS_HOSTOBJECTURI_CID);
637 NS_DEFINE_NAMED_CID(NS_DOMPARSER_CID);
638 NS_DEFINE_NAMED_CID(NS_DOMSESSIONSTORAGEMANAGER_CID);
639 NS_DEFINE_NAMED_CID(NS_DOMLOCALSTORAGEMANAGER_CID);
640 NS_DEFINE_NAMED_CID(NS_TEXTEDITOR_CID);
641 NS_DEFINE_NAMED_CID(DOMREQUEST_SERVICE_CID);
642 NS_DEFINE_NAMED_CID(QUOTAMANAGER_SERVICE_CID);
643 NS_DEFINE_NAMED_CID(SERVICEWORKERMANAGER_CID);
644 NS_DEFINE_NAMED_CID(NOTIFICATIONTELEMETRYSERVICE_CID);
645 NS_DEFINE_NAMED_CID(PUSHNOTIFIER_CID);
646 NS_DEFINE_NAMED_CID(WORKERDEBUGGERMANAGER_CID);
647 NS_DEFINE_NAMED_CID(NS_AUDIOCHANNELAGENT_CID);
648 NS_DEFINE_NAMED_CID(NS_HTMLEDITOR_CID);
649 NS_DEFINE_NAMED_CID(NS_EDITORCONTROLLER_CID);
650 NS_DEFINE_NAMED_CID(NS_EDITINGCONTROLLER_CID);
651 NS_DEFINE_NAMED_CID(NS_EDITORCOMMANDTABLE_CID);
652 NS_DEFINE_NAMED_CID(NS_EDITINGCOMMANDTABLE_CID);
653 NS_DEFINE_NAMED_CID(NS_GEOLOCATION_SERVICE_CID);
654 NS_DEFINE_NAMED_CID(NS_GEOLOCATION_CID);
655 NS_DEFINE_NAMED_CID(NS_AUDIOCHANNEL_SERVICE_CID);
656 NS_DEFINE_NAMED_CID(NS_WEBSOCKETEVENT_SERVICE_CID);
657 NS_DEFINE_NAMED_CID(NS_FOCUSMANAGER_CID);
658 NS_DEFINE_NAMED_CID(NS_CONTENTSECURITYMANAGER_CID);
659 NS_DEFINE_NAMED_CID(CSPSERVICE_CID);
660 NS_DEFINE_NAMED_CID(NS_CSPCONTEXT_CID);
661 NS_DEFINE_NAMED_CID(NS_MIXEDCONTENTBLOCKER_CID);
662 NS_DEFINE_NAMED_CID(NS_EVENTLISTENERSERVICE_CID);
663 NS_DEFINE_NAMED_CID(NS_GLOBALMESSAGEMANAGER_CID);
664 NS_DEFINE_NAMED_CID(NS_PARENTPROCESSMESSAGEMANAGER_CID);
665 NS_DEFINE_NAMED_CID(NS_CHILDPROCESSMESSAGEMANAGER_CID);
666 NS_DEFINE_NAMED_CID(NS_SCRIPTSECURITYMANAGER_CID);
667 NS_DEFINE_NAMED_CID(NS_PRINCIPAL_CID);
668 NS_DEFINE_NAMED_CID(NS_EXPANDEDPRINCIPAL_CID);
669 NS_DEFINE_NAMED_CID(NS_SYSTEMPRINCIPAL_CID);
670 NS_DEFINE_NAMED_CID(NS_NULLPRINCIPAL_CID);
671 NS_DEFINE_NAMED_CID(THIRDPARTYUTIL_CID);
672 NS_DEFINE_NAMED_CID(NS_STRUCTUREDCLONECONTAINER_CID);
673 NS_DEFINE_NAMED_CID(NS_DEVICE_SENSORS_CID);
674 #if defined(ANDROID)
675 NS_DEFINE_NAMED_CID(NS_HAPTICFEEDBACK_CID);
676 #endif
677 NS_DEFINE_NAMED_CID(NS_POWERMANAGERSERVICE_CID);
678 NS_DEFINE_NAMED_CID(OSFILECONSTANTSSERVICE_CID);
679 NS_DEFINE_NAMED_CID(UDPSOCKETCHILD_CID);
680 NS_DEFINE_NAMED_CID(NS_MEDIAMANAGERSERVICE_CID);
681 #ifdef MOZ_WEBSPEECH_TEST_BACKEND
682 NS_DEFINE_NAMED_CID(NS_FAKE_SPEECH_RECOGNITION_SERVICE_CID);
683 #endif
684 #ifdef MOZ_WEBSPEECH
685 NS_DEFINE_NAMED_CID(NS_SYNTHVOICEREGISTRY_CID);
686 #endif
687 
688 #ifdef ACCESSIBILITY
689 NS_DEFINE_NAMED_CID(NS_ACCESSIBILITY_SERVICE_CID);
690 #endif
691 
692 NS_DEFINE_NAMED_CID(GECKO_MEDIA_PLUGIN_SERVICE_CID);
693 
694 NS_DEFINE_NAMED_CID(PRESENTATION_SERVICE_CID);
695 NS_DEFINE_NAMED_CID(PRESENTATION_DEVICE_MANAGER_CID);
696 NS_DEFINE_NAMED_CID(PRESENTATION_TCP_SESSION_TRANSPORT_CID);
697 
698 NS_DEFINE_NAMED_CID(TEXT_INPUT_PROCESSOR_CID);
699 
700 NS_DEFINE_NAMED_CID(NS_SCRIPTERROR_CID);
701 
CreateWindowCommandTableConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)702 static nsresult CreateWindowCommandTableConstructor(nsISupports* aOuter,
703                                                     REFNSIID aIID,
704                                                     void** aResult) {
705   nsresult rv;
706   nsCOMPtr<nsIControllerCommandTable> commandTable =
707       do_CreateInstance(NS_CONTROLLERCOMMANDTABLE_CONTRACTID, &rv);
708   if (NS_FAILED(rv)) return rv;
709 
710   rv = nsWindowCommandRegistration::RegisterWindowCommands(commandTable);
711   if (NS_FAILED(rv)) return rv;
712 
713   return commandTable->QueryInterface(aIID, aResult);
714 }
715 
CreateWindowControllerWithSingletonCommandTable(nsISupports * aOuter,REFNSIID aIID,void ** aResult)716 static nsresult CreateWindowControllerWithSingletonCommandTable(
717     nsISupports* aOuter, REFNSIID aIID, void** aResult) {
718   nsresult rv;
719   nsCOMPtr<nsIController> controller = do_CreateInstance(
720       "@mozilla.org/embedcomp/base-command-controller;1", &rv);
721 
722   if (NS_FAILED(rv)) return rv;
723 
724   nsCOMPtr<nsIControllerCommandTable> windowCommandTable =
725       do_GetService(kNS_WINDOWCOMMANDTABLE_CID, &rv);
726   if (NS_FAILED(rv)) return rv;
727 
728   // this is a singleton; make it immutable
729   windowCommandTable->MakeImmutable();
730 
731   nsCOMPtr<nsIControllerContext> controllerContext =
732       do_QueryInterface(controller, &rv);
733   if (NS_FAILED(rv)) return rv;
734 
735   controllerContext->Init(windowCommandTable);
736   if (NS_FAILED(rv)) return rv;
737 
738   return controller->QueryInterface(aIID, aResult);
739 }
740 
741 // Constructor of a controller which is set up to use, internally, a
742 // singleton command-table pre-filled with editor commands.
EditorControllerConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)743 static nsresult EditorControllerConstructor(nsISupports* aOuter, REFNSIID aIID,
744                                             void** aResult) {
745   nsresult rv;
746   nsCOMPtr<nsIController> controller = do_CreateInstance(
747       "@mozilla.org/embedcomp/base-command-controller;1", &rv);
748   if (NS_FAILED(rv)) return rv;
749 
750   nsCOMPtr<nsIControllerCommandTable> editorCommandTable =
751       do_GetService(kNS_EDITORCOMMANDTABLE_CID, &rv);
752   if (NS_FAILED(rv)) return rv;
753 
754   // this guy is a singleton, so make it immutable
755   editorCommandTable->MakeImmutable();
756 
757   nsCOMPtr<nsIControllerContext> controllerContext =
758       do_QueryInterface(controller, &rv);
759   if (NS_FAILED(rv)) return rv;
760 
761   rv = controllerContext->Init(editorCommandTable);
762   if (NS_FAILED(rv)) return rv;
763 
764   return controller->QueryInterface(aIID, aResult);
765 }
766 
767 // Constructor of a controller which is set up to use, internally, a
768 // singleton command-table pre-filled with editing commands.
nsEditingControllerConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)769 static nsresult nsEditingControllerConstructor(nsISupports* aOuter,
770                                                REFNSIID aIID, void** aResult) {
771   nsresult rv;
772   nsCOMPtr<nsIController> controller = do_CreateInstance(
773       "@mozilla.org/embedcomp/base-command-controller;1", &rv);
774   if (NS_FAILED(rv)) return rv;
775 
776   nsCOMPtr<nsIControllerCommandTable> editingCommandTable =
777       do_GetService(kNS_EDITINGCOMMANDTABLE_CID, &rv);
778   if (NS_FAILED(rv)) return rv;
779 
780   // this guy is a singleton, so make it immutable
781   editingCommandTable->MakeImmutable();
782 
783   nsCOMPtr<nsIControllerContext> controllerContext =
784       do_QueryInterface(controller, &rv);
785   if (NS_FAILED(rv)) return rv;
786 
787   rv = controllerContext->Init(editingCommandTable);
788   if (NS_FAILED(rv)) return rv;
789 
790   return controller->QueryInterface(aIID, aResult);
791 }
792 
793 // Constructor for a command-table pre-filled with editor commands
nsEditorCommandTableConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)794 static nsresult nsEditorCommandTableConstructor(nsISupports* aOuter,
795                                                 REFNSIID aIID, void** aResult) {
796   nsresult rv;
797   nsCOMPtr<nsIControllerCommandTable> commandTable =
798       do_CreateInstance(NS_CONTROLLERCOMMANDTABLE_CONTRACTID, &rv);
799   if (NS_FAILED(rv)) return rv;
800 
801   rv = EditorController::RegisterEditorCommands(commandTable);
802   if (NS_FAILED(rv)) return rv;
803 
804   // we don't know here whether we're being created as an instance,
805   // or a service, so we can't become immutable
806 
807   return commandTable->QueryInterface(aIID, aResult);
808 }
809 
810 // Constructor for a command-table pre-filled with editing commands
nsEditingCommandTableConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)811 static nsresult nsEditingCommandTableConstructor(nsISupports* aOuter,
812                                                  REFNSIID aIID,
813                                                  void** aResult) {
814   nsresult rv;
815   nsCOMPtr<nsIControllerCommandTable> commandTable =
816       do_CreateInstance(NS_CONTROLLERCOMMANDTABLE_CONTRACTID, &rv);
817   if (NS_FAILED(rv)) return rv;
818 
819   rv = EditorController::RegisterEditingCommands(commandTable);
820   if (NS_FAILED(rv)) return rv;
821 
822   // we don't know here whether we're being created as an instance,
823   // or a service, so we can't become immutable
824 
825   return commandTable->QueryInterface(aIID, aResult);
826 }
827 
828 static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
829     // clang-format off
830   XPCONNECT_CIDENTRIES
831 #ifdef DEBUG
832   { &kNS_LAYOUT_DEBUGGER_CID, false, nullptr, CreateNewLayoutDebugger },
833 #endif
834   { &kNS_FRAMETRAVERSAL_CID, false, nullptr, CreateNewFrameTraversal },
835   { &kNS_BOXOBJECT_CID, false, nullptr, CreateNewBoxObject },
836 #ifdef MOZ_XUL
837   { &kNS_LISTBOXOBJECT_CID, false, nullptr, CreateNewListBoxObject },
838   { &kNS_MENUBOXOBJECT_CID, false, nullptr, CreateNewMenuBoxObject },
839   { &kNS_POPUPBOXOBJECT_CID, false, nullptr, CreateNewPopupBoxObject },
840   { &kNS_CONTAINERBOXOBJECT_CID, false, nullptr, CreateNewContainerBoxObject },
841   { &kNS_SCROLLBOXOBJECT_CID, false, nullptr, CreateNewScrollBoxObject },
842   { &kNS_TREEBOXOBJECT_CID, false, nullptr, CreateNewTreeBoxObject },
843 #endif // MOZ_XUL
844 #ifdef MOZ_XUL
845   { &kIN_DOMVIEW_CID, false, nullptr, inDOMViewConstructor },
846 #endif
847   { &kIN_DEEPTREEWALKER_CID, false, nullptr, inDeepTreeWalkerConstructor },
848   { &kNS_CONTENT_VIEWER_CID, false, nullptr, CreateContentViewer },
849   { &kNS_HTMLDOCUMENT_CID, false, nullptr, CreateHTMLDocument },
850   { &kNS_XMLDOCUMENT_CID, false, nullptr, CreateXMLDocument },
851   { &kNS_SVGDOCUMENT_CID, false, nullptr, CreateSVGDocument },
852   { &kNS_IMAGEDOCUMENT_CID, false, nullptr, CreateImageDocument },
853   { &kNS_DOMSELECTION_CID, false, nullptr, CreateDOMSelection },
854   { &kNS_CONTENTITERATOR_CID, false, nullptr, CreateContentIterator },
855   { &kNS_PRECONTENTITERATOR_CID, false, nullptr, CreatePreContentIterator },
856   { &kNS_SUBTREEITERATOR_CID, false, nullptr, CreateSubtreeIterator },
857   { &kNS_TEXT_ENCODER_CID, false, nullptr, CreateTextEncoder },
858   { &kNS_HTMLCOPY_TEXT_ENCODER_CID, false, nullptr, CreateHTMLCopyTextEncoder },
859   { &kNS_XMLCONTENTSERIALIZER_CID, false, nullptr, CreateXMLContentSerializer },
860   { &kNS_HTMLCONTENTSERIALIZER_CID, false, nullptr, CreateHTMLContentSerializer },
861   { &kNS_XHTMLCONTENTSERIALIZER_CID, false, nullptr, CreateXHTMLContentSerializer },
862   { &kNS_PLAINTEXTSERIALIZER_CID, false, nullptr, CreatePlainTextSerializer },
863   { &kNS_PARSERUTILS_CID, false, nullptr, nsParserUtilsConstructor },
864   { &kNS_SCRIPTABLEUNESCAPEHTML_CID, false, nullptr, nsParserUtilsConstructor },
865   { &kNS_CONTENTPOLICY_CID, false, nullptr, CreateContentPolicy },
866   { &kNS_DATADOCUMENTCONTENTPOLICY_CID, false, nullptr, nsDataDocumentContentPolicyConstructor },
867   { &kNS_NODATAPROTOCOLCONTENTPOLICY_CID, false, nullptr, nsNoDataProtocolContentPolicyConstructor },
868   { &kNS_XULCONTROLLERS_CID, false, nullptr, NS_NewXULControllers },
869 #ifdef MOZ_XUL
870   { &kNS_XULSORTSERVICE_CID, false, nullptr, CreateXULSortService },
871   { &kNS_XULDOCUMENT_CID, false, nullptr, CreateXULDocument },
872 #endif
873   { &kNS_CONTENT_DOCUMENT_LOADER_FACTORY_CID, false, nullptr, CreateContentDLF },
874   { &kNS_JSPROTOCOLHANDLER_CID, false, nullptr, nsJSProtocolHandler::Create },
875   { &kNS_JSURI_CID, false, nullptr, nsJSURIConstructor },
876   { &kNS_WINDOWCOMMANDTABLE_CID, false, nullptr, CreateWindowCommandTableConstructor },
877   { &kNS_WINDOWCONTROLLER_CID, false, nullptr, CreateWindowControllerWithSingletonCommandTable },
878   { &kNS_PLUGINDOCLOADERFACTORY_CID, false, nullptr, CreateContentDLF },
879   { &kNS_PLUGINDOCUMENT_CID, false, nullptr, CreatePluginDocument },
880   { &kNS_VIDEODOCUMENT_CID, false, nullptr, CreateVideoDocument },
881   { &kNS_STYLESHEETSERVICE_CID, false, nullptr, nsStyleSheetServiceConstructor },
882   { &kTRANSFORMIIX_NODESET_CID, false, nullptr, txNodeSetAdaptorConstructor },
883   { &kNS_XMLSERIALIZER_CID, false, nullptr, nsDOMSerializerConstructor },
884   { &kNS_HOSTOBJECTURI_CID, false, nullptr, nsHostObjectURIConstructor },
885   { &kNS_DOMPARSER_CID, false, nullptr, DOMParserConstructor },
886   { &kNS_DOMSESSIONSTORAGEMANAGER_CID, false, nullptr, SessionStorageManagerConstructor },
887   { &kNS_DOMLOCALSTORAGEMANAGER_CID, false, nullptr, LocalStorageManagerConstructor },
888   { &kNS_TEXTEDITOR_CID, false, nullptr, TextEditorConstructor },
889   { &kDOMREQUEST_SERVICE_CID, false, nullptr, DOMRequestServiceConstructor },
890   { &kQUOTAMANAGER_SERVICE_CID, false, nullptr, QuotaManagerServiceConstructor },
891   { &kSERVICEWORKERMANAGER_CID, false, nullptr, ServiceWorkerManagerConstructor },
892   { &kNOTIFICATIONTELEMETRYSERVICE_CID, false, nullptr, NotificationTelemetryServiceConstructor },
893   { &kPUSHNOTIFIER_CID, false, nullptr, PushNotifierConstructor },
894   { &kWORKERDEBUGGERMANAGER_CID, true, nullptr, WorkerDebuggerManagerConstructor },
895   { &kNS_AUDIOCHANNELAGENT_CID, true, nullptr, AudioChannelAgentConstructor },
896   { &kNS_HTMLEDITOR_CID, false, nullptr, HTMLEditorConstructor },
897   { &kNS_EDITORCONTROLLER_CID, false, nullptr, EditorControllerConstructor },
898   { &kNS_EDITINGCONTROLLER_CID, false, nullptr, nsEditingControllerConstructor },
899   { &kNS_EDITORCOMMANDTABLE_CID, false, nullptr, nsEditorCommandTableConstructor },
900   { &kNS_EDITINGCOMMANDTABLE_CID, false, nullptr, nsEditingCommandTableConstructor },
901   { &kNS_GEOLOCATION_SERVICE_CID, false, nullptr, nsGeolocationServiceConstructor },
902   { &kNS_GEOLOCATION_CID, false, nullptr, GeolocationConstructor },
903   { &kNS_AUDIOCHANNEL_SERVICE_CID, false, nullptr, AudioChannelServiceConstructor },
904   { &kNS_WEBSOCKETEVENT_SERVICE_CID, false, nullptr, WebSocketEventServiceConstructor },
905   { &kNS_FOCUSMANAGER_CID, false, nullptr, CreateFocusManager },
906 #ifdef MOZ_WEBSPEECH_TEST_BACKEND
907   { &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID, false, nullptr, FakeSpeechRecognitionServiceConstructor },
908 #endif
909 #ifdef MOZ_WEBSPEECH
910   { &kNS_SYNTHVOICEREGISTRY_CID, true, nullptr, nsSynthVoiceRegistryConstructor },
911 #endif
912   { &kNS_CONTENTSECURITYMANAGER_CID, false, nullptr, nsContentSecurityManagerConstructor },
913   { &kCSPSERVICE_CID, false, nullptr, CSPServiceConstructor },
914   { &kNS_CSPCONTEXT_CID, false, nullptr, nsCSPContextConstructor },
915   { &kNS_MIXEDCONTENTBLOCKER_CID, false, nullptr, nsMixedContentBlockerConstructor },
916   { &kNS_EVENTLISTENERSERVICE_CID, false, nullptr, CreateEventListenerService },
917   { &kNS_GLOBALMESSAGEMANAGER_CID, false, nullptr, CreateGlobalMessageManager },
918   { &kNS_PARENTPROCESSMESSAGEMANAGER_CID, false, nullptr, CreateParentMessageManager },
919   { &kNS_CHILDPROCESSMESSAGEMANAGER_CID, false, nullptr, CreateChildMessageManager },
920   { &kNS_SCRIPTSECURITYMANAGER_CID, false, nullptr, Construct_nsIScriptSecurityManager },
921   { &kNS_PRINCIPAL_CID, false, nullptr, ContentPrincipalConstructor },
922   { &kNS_EXPANDEDPRINCIPAL_CID, false, nullptr, ExpandedPrincipalConstructor },
923   { &kNS_SYSTEMPRINCIPAL_CID, false, nullptr, SystemPrincipalConstructor },
924   { &kNS_NULLPRINCIPAL_CID, false, nullptr, NullPrincipalConstructor },
925   { &kNS_DEVICE_SENSORS_CID, false, nullptr, nsDeviceSensorsConstructor },
926 #if defined(ANDROID)
927   { &kNS_HAPTICFEEDBACK_CID, false, nullptr, nsHapticFeedbackConstructor },
928 #endif
929   { &kTHIRDPARTYUTIL_CID, false, nullptr, ThirdPartyUtilConstructor },
930   { &kNS_STRUCTUREDCLONECONTAINER_CID, false, nullptr, nsStructuredCloneContainerConstructor },
931   { &kNS_POWERMANAGERSERVICE_CID, false, nullptr, nsIPowerManagerServiceConstructor, Module::ALLOW_IN_GPU_PROCESS },
932   { &kOSFILECONSTANTSSERVICE_CID, true, nullptr, OSFileConstantsServiceConstructor },
933   { &kUDPSOCKETCHILD_CID, false, nullptr, UDPSocketChildConstructor },
934   { &kGECKO_MEDIA_PLUGIN_SERVICE_CID, true, nullptr, GeckoMediaPluginServiceConstructor },
935   { &kNS_MEDIAMANAGERSERVICE_CID, false, nullptr, nsIMediaManagerServiceConstructor },
936 #ifdef ACCESSIBILITY
937   { &kNS_ACCESSIBILITY_SERVICE_CID, false, nullptr, CreateA11yService },
938 #endif
939   { &kPRESENTATION_SERVICE_CID, false, nullptr, nsIPresentationServiceConstructor },
940   { &kPRESENTATION_DEVICE_MANAGER_CID, false, nullptr, PresentationDeviceManagerConstructor },
941   { &kPRESENTATION_TCP_SESSION_TRANSPORT_CID, false, nullptr, PresentationTCPSessionTransportConstructor },
942   { &kTEXT_INPUT_PROCESSOR_CID, false, nullptr, TextInputProcessorConstructor },
943   { &kNS_SCRIPTERROR_CID, false, nullptr, nsScriptErrorConstructor },
944   { nullptr }
945     // clang-format on
946 };
947 
948 static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
949     // clang-format off
950   XPCONNECT_CONTRACTS
951   { "@mozilla.org/layout/xul-boxobject;1", &kNS_BOXOBJECT_CID },
952 #ifdef MOZ_XUL
953   { "@mozilla.org/layout/xul-boxobject-listbox;1", &kNS_LISTBOXOBJECT_CID },
954   { "@mozilla.org/layout/xul-boxobject-menu;1", &kNS_MENUBOXOBJECT_CID },
955   { "@mozilla.org/layout/xul-boxobject-popup;1", &kNS_POPUPBOXOBJECT_CID },
956   { "@mozilla.org/layout/xul-boxobject-container;1", &kNS_CONTAINERBOXOBJECT_CID },
957   { "@mozilla.org/layout/xul-boxobject-scrollbox;1", &kNS_SCROLLBOXOBJECT_CID },
958   { "@mozilla.org/layout/xul-boxobject-tree;1", &kNS_TREEBOXOBJECT_CID },
959 #endif // MOZ_XUL
960 #ifdef MOZ_XUL
961   { "@mozilla.org/inspector/dom-view;1", &kIN_DOMVIEW_CID },
962 #endif
963   { "@mozilla.org/inspector/deep-tree-walker;1", &kIN_DEEPTREEWALKER_CID },
964   { "@mozilla.org/xml/xml-document;1", &kNS_XMLDOCUMENT_CID },
965   { "@mozilla.org/svg/svg-document;1", &kNS_SVGDOCUMENT_CID },
966   { "@mozilla.org/content/dom-selection;1", &kNS_DOMSELECTION_CID },
967   { "@mozilla.org/content/post-content-iterator;1", &kNS_CONTENTITERATOR_CID },
968   { "@mozilla.org/content/pre-content-iterator;1", &kNS_PRECONTENTITERATOR_CID },
969   { "@mozilla.org/content/subtree-content-iterator;1", &kNS_SUBTREEITERATOR_CID },
970   { NS_DOC_ENCODER_CONTRACTID_BASE "text/xml", &kNS_TEXT_ENCODER_CID },
971   { NS_DOC_ENCODER_CONTRACTID_BASE "application/xml", &kNS_TEXT_ENCODER_CID },
972   { NS_DOC_ENCODER_CONTRACTID_BASE "application/xhtml+xml", &kNS_TEXT_ENCODER_CID },
973   { NS_DOC_ENCODER_CONTRACTID_BASE "image/svg+xml", &kNS_TEXT_ENCODER_CID },
974   { NS_DOC_ENCODER_CONTRACTID_BASE "text/html", &kNS_TEXT_ENCODER_CID },
975   { NS_DOC_ENCODER_CONTRACTID_BASE "text/plain", &kNS_TEXT_ENCODER_CID },
976   { NS_HTMLCOPY_ENCODER_CONTRACTID, &kNS_HTMLCOPY_TEXT_ENCODER_CID },
977   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "text/xml", &kNS_XMLCONTENTSERIALIZER_CID },
978   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "application/xml", &kNS_XMLCONTENTSERIALIZER_CID },
979   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "application/xhtml+xml", &kNS_XHTMLCONTENTSERIALIZER_CID },
980   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "image/svg+xml", &kNS_XMLCONTENTSERIALIZER_CID },
981   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "text/html", &kNS_HTMLCONTENTSERIALIZER_CID },
982   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "application/vnd.mozilla.xul+xml", &kNS_XMLCONTENTSERIALIZER_CID },
983   { NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "text/plain", &kNS_PLAINTEXTSERIALIZER_CID },
984   { NS_PARSERUTILS_CONTRACTID, &kNS_PARSERUTILS_CID },
985   { NS_SCRIPTABLEUNESCAPEHTML_CONTRACTID, &kNS_SCRIPTABLEUNESCAPEHTML_CID },
986   { NS_CONTENTPOLICY_CONTRACTID, &kNS_CONTENTPOLICY_CID },
987   { NS_DATADOCUMENTCONTENTPOLICY_CONTRACTID, &kNS_DATADOCUMENTCONTENTPOLICY_CID },
988   { NS_NODATAPROTOCOLCONTENTPOLICY_CONTRACTID, &kNS_NODATAPROTOCOLCONTENTPOLICY_CID },
989   { "@mozilla.org/xul/xul-controllers;1", &kNS_XULCONTROLLERS_CID },
990 #ifdef MOZ_XUL
991   { "@mozilla.org/xul/xul-sort-service;1", &kNS_XULSORTSERVICE_CID },
992 #endif
993   { CONTENT_DLF_CONTRACTID, &kNS_CONTENT_DOCUMENT_LOADER_FACTORY_CID },
994   { NS_JSPROTOCOLHANDLER_CONTRACTID, &kNS_JSPROTOCOLHANDLER_CID },
995   { NS_WINDOWCONTROLLER_CONTRACTID, &kNS_WINDOWCONTROLLER_CID },
996   { PLUGIN_DLF_CONTRACTID, &kNS_PLUGINDOCLOADERFACTORY_CID },
997   { NS_STYLESHEETSERVICE_CONTRACTID, &kNS_STYLESHEETSERVICE_CID },
998   { TRANSFORMIIX_NODESET_CONTRACTID, &kTRANSFORMIIX_NODESET_CID },
999   { NS_XMLSERIALIZER_CONTRACTID, &kNS_XMLSERIALIZER_CID },
1000   { NS_DOMPARSER_CONTRACTID, &kNS_DOMPARSER_CID },
1001   { "@mozilla.org/dom/localStorage-manager;1", &kNS_DOMLOCALSTORAGEMANAGER_CID },
1002   // Keeping the old ContractID for backward compatibility
1003   { "@mozilla.org/dom/storagemanager;1", &kNS_DOMLOCALSTORAGEMANAGER_CID },
1004   { "@mozilla.org/dom/sessionStorage-manager;1", &kNS_DOMSESSIONSTORAGEMANAGER_CID },
1005   { "@mozilla.org/editor/texteditor;1", &kNS_TEXTEDITOR_CID },
1006   { DOMREQUEST_SERVICE_CONTRACTID, &kDOMREQUEST_SERVICE_CID },
1007   { QUOTAMANAGER_SERVICE_CONTRACTID, &kQUOTAMANAGER_SERVICE_CID },
1008   { SERVICEWORKERMANAGER_CONTRACTID, &kSERVICEWORKERMANAGER_CID },
1009   { NOTIFICATIONTELEMETRYSERVICE_CONTRACTID, &kNOTIFICATIONTELEMETRYSERVICE_CID },
1010   { PUSHNOTIFIER_CONTRACTID, &kPUSHNOTIFIER_CID },
1011   { WORKERDEBUGGERMANAGER_CONTRACTID, &kWORKERDEBUGGERMANAGER_CID },
1012   { NS_AUDIOCHANNELAGENT_CONTRACTID, &kNS_AUDIOCHANNELAGENT_CID },
1013   { "@mozilla.org/editor/htmleditor;1", &kNS_HTMLEDITOR_CID },
1014   { "@mozilla.org/editor/editorcontroller;1", &kNS_EDITORCONTROLLER_CID },
1015   { "@mozilla.org/editor/editingcontroller;1", &kNS_EDITINGCONTROLLER_CID },
1016   { "@mozilla.org/geolocation/service;1", &kNS_GEOLOCATION_SERVICE_CID },
1017   { "@mozilla.org/geolocation;1", &kNS_GEOLOCATION_CID },
1018   { "@mozilla.org/audiochannel/service;1", &kNS_AUDIOCHANNEL_SERVICE_CID },
1019   { "@mozilla.org/websocketevent/service;1", &kNS_WEBSOCKETEVENT_SERVICE_CID },
1020   { "@mozilla.org/focus-manager;1", &kNS_FOCUSMANAGER_CID },
1021 #ifdef MOZ_WEBSPEECH_TEST_BACKEND
1022   { NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "fake", &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID },
1023 #endif
1024 #ifdef MOZ_WEBSPEECH
1025   { NS_SYNTHVOICEREGISTRY_CONTRACTID, &kNS_SYNTHVOICEREGISTRY_CID },
1026 #endif
1027   { NS_CONTENTSECURITYMANAGER_CONTRACTID, &kNS_CONTENTSECURITYMANAGER_CID },
1028   { CSPSERVICE_CONTRACTID, &kCSPSERVICE_CID },
1029   { NS_CSPCONTEXT_CONTRACTID, &kNS_CSPCONTEXT_CID },
1030   { NS_MIXEDCONTENTBLOCKER_CONTRACTID, &kNS_MIXEDCONTENTBLOCKER_CID },
1031   { NS_EVENTLISTENERSERVICE_CONTRACTID, &kNS_EVENTLISTENERSERVICE_CID },
1032   { NS_GLOBALMESSAGEMANAGER_CONTRACTID, &kNS_GLOBALMESSAGEMANAGER_CID },
1033   { NS_PARENTPROCESSMESSAGEMANAGER_CONTRACTID, &kNS_PARENTPROCESSMESSAGEMANAGER_CID },
1034   { NS_CHILDPROCESSMESSAGEMANAGER_CONTRACTID, &kNS_CHILDPROCESSMESSAGEMANAGER_CID },
1035   { NS_SCRIPTSECURITYMANAGER_CONTRACTID, &kNS_SCRIPTSECURITYMANAGER_CID },
1036   { NS_PRINCIPAL_CONTRACTID, &kNS_PRINCIPAL_CID },
1037   { NS_EXPANDEDPRINCIPAL_CONTRACTID, &kNS_EXPANDEDPRINCIPAL_CID },
1038   { NS_SYSTEMPRINCIPAL_CONTRACTID, &kNS_SYSTEMPRINCIPAL_CID },
1039   { NS_NULLPRINCIPAL_CONTRACTID, &kNS_NULLPRINCIPAL_CID },
1040   { NS_DEVICE_SENSORS_CONTRACTID, &kNS_DEVICE_SENSORS_CID },
1041 #if defined(ANDROID)
1042   { "@mozilla.org/widget/hapticfeedback;1", &kNS_HAPTICFEEDBACK_CID },
1043 #endif
1044   { THIRDPARTYUTIL_CONTRACTID, &kTHIRDPARTYUTIL_CID },
1045   { NS_STRUCTUREDCLONECONTAINER_CONTRACTID, &kNS_STRUCTUREDCLONECONTAINER_CID },
1046   { POWERMANAGERSERVICE_CONTRACTID, &kNS_POWERMANAGERSERVICE_CID, Module::ALLOW_IN_GPU_PROCESS },
1047   { OSFILECONSTANTSSERVICE_CONTRACTID, &kOSFILECONSTANTSSERVICE_CID },
1048   { "@mozilla.org/udp-socket-child;1", &kUDPSOCKETCHILD_CID },
1049   { MEDIAMANAGERSERVICE_CONTRACTID, &kNS_MEDIAMANAGERSERVICE_CID },
1050 #ifdef ACCESSIBILITY
1051   { "@mozilla.org/accessibilityService;1", &kNS_ACCESSIBILITY_SERVICE_CID },
1052   { "@mozilla.org/accessibleRetrieval;1", &kNS_ACCESSIBILITY_SERVICE_CID },
1053 #endif
1054   { "@mozilla.org/gecko-media-plugin-service;1",  &kGECKO_MEDIA_PLUGIN_SERVICE_CID },
1055   { PRESENTATION_SERVICE_CONTRACTID, &kPRESENTATION_SERVICE_CID },
1056   { PRESENTATION_DEVICE_MANAGER_CONTRACTID, &kPRESENTATION_DEVICE_MANAGER_CID },
1057   { PRESENTATION_TCP_SESSION_TRANSPORT_CONTRACTID, &kPRESENTATION_TCP_SESSION_TRANSPORT_CID },
1058   { "@mozilla.org/text-input-processor;1", &kTEXT_INPUT_PROCESSOR_CID },
1059   { NS_SCRIPTERROR_CONTRACTID, &kNS_SCRIPTERROR_CID },
1060   { nullptr }
1061 };
1062 
1063 static const mozilla::Module::CategoryEntry kLayoutCategories[] = {
1064   XPCONNECT_CATEGORIES
1065   { "content-policy", NS_DATADOCUMENTCONTENTPOLICY_CONTRACTID, NS_DATADOCUMENTCONTENTPOLICY_CONTRACTID },
1066   { "content-policy", NS_NODATAPROTOCOLCONTENTPOLICY_CONTRACTID, NS_NODATAPROTOCOLCONTENTPOLICY_CONTRACTID },
1067   { "content-policy", "CSPService", CSPSERVICE_CONTRACTID },
1068   { "content-policy", NS_MIXEDCONTENTBLOCKER_CONTRACTID, NS_MIXEDCONTENTBLOCKER_CONTRACTID },
1069   { "net-channel-event-sinks", "CSPService", CSPSERVICE_CONTRACTID },
1070   { "net-channel-event-sinks", NS_MIXEDCONTENTBLOCKER_CONTRACTID, NS_MIXEDCONTENTBLOCKER_CONTRACTID },
1071   { "app-startup", "Script Security Manager", "service," NS_SCRIPTSECURITYMANAGER_CONTRACTID },
1072   { "app-startup", "Push Notifier", "service," PUSHNOTIFIER_CONTRACTID },
1073   { "clear-origin-attributes-data", "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID },
1074   { OBSERVER_TOPIC_IDLE_DAILY, "QuotaManagerService", QUOTAMANAGER_SERVICE_CONTRACTID },
1075   CONTENTDLF_CATEGORIES
1076   { "profile-after-change", "PresentationDeviceManager", PRESENTATION_DEVICE_MANAGER_CONTRACTID },
1077   { "profile-after-change", "PresentationService", PRESENTATION_SERVICE_CONTRACTID },
1078   { "profile-after-change", "Notification Telemetry Service", NOTIFICATIONTELEMETRYSERVICE_CONTRACTID },
1079   { nullptr }
1080     // clang-format on
1081 };
1082 
LayoutModuleDtor()1083 static void LayoutModuleDtor() {
1084   if (XRE_GetProcessType() == GeckoProcessType_GPU) {
1085     return;
1086   }
1087 
1088   Shutdown();
1089   nsContentUtils::XPCOMShutdown();
1090 
1091   // Layout depends heavily on gfx and imagelib, so we want to make sure that
1092   // these modules are shut down after all the layout cleanup runs.
1093   mozilla::image::ShutdownModule();
1094   gfxPlatform::Shutdown();
1095   gfx::gfxVars::Shutdown();
1096 
1097   nsScriptSecurityManager::Shutdown();
1098   xpcModuleDtor();
1099 }
1100 
1101 static const mozilla::Module kLayoutModule = {mozilla::Module::kVersion,
1102                                               kLayoutCIDs,
1103                                               kLayoutContracts,
1104                                               kLayoutCategories,
1105                                               nullptr,
1106                                               Initialize,
1107                                               LayoutModuleDtor,
1108                                               Module::ALLOW_IN_GPU_PROCESS};
1109 
1110 NSMODULE_DEFN(nsLayoutModule) = &kLayoutModule;
1111