summaryrefslogtreecommitdiffstats
path: root/layout/build
diff options
context:
space:
mode:
Diffstat (limited to 'layout/build')
-rw-r--r--layout/build/components.conf484
-rw-r--r--layout/build/moz.build77
-rw-r--r--layout/build/nsContentDLF.cpp335
-rw-r--r--layout/build/nsContentDLF.h92
-rw-r--r--layout/build/nsLayoutCID.h105
-rw-r--r--layout/build/nsLayoutModule.cpp243
-rw-r--r--layout/build/nsLayoutModule.h39
-rw-r--r--layout/build/nsLayoutStatics.cpp396
-rw-r--r--layout/build/nsLayoutStatics.h56
9 files changed, 1827 insertions, 0 deletions
diff --git a/layout/build/components.conf b/layout/build/components.conf
new file mode 100644
index 0000000000..0239a7c85c
--- /dev/null
+++ b/layout/build/components.conf
@@ -0,0 +1,484 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+Headers = [
+ '/layout/build/nsLayoutModule.h',
+]
+
+UnloadFunc = 'nsLayoutModuleDtor'
+
+# This module's unload function needs to be called as late as possible.
+Priority = 100
+
+content_types = [
+ 'application/ecmascript',
+ 'application/javascript',
+ 'application/json',
+ 'application/mathml+xml',
+ 'application/rdf+xml',
+ 'application/vnd.wap.xhtml+xml',
+ 'application/x-javascript',
+ 'application/x-view-source',
+ 'application/xhtml+xml',
+ 'application/xml',
+ 'image/svg+xml',
+ 'text/cache-manifest',
+ 'text/css',
+ 'text/ecmascript',
+ 'text/html',
+ 'text/javascript',
+ 'text/json',
+ 'text/plain',
+ 'text/rdf',
+ 'text/vtt',
+ 'text/xml',
+
+ 'image/apng',
+ 'image/bmp',
+ 'image/gif',
+ 'image/icon',
+ 'image/jpeg',
+ 'image/jpg',
+ 'image/pjpeg',
+ 'image/png',
+ 'image/vnd.microsoft.icon',
+ 'image/webp',
+ 'image/x-icon',
+ 'image/x-ms-bmp',
+ 'image/x-png',
+]
+
+if defined('MOZ_WEBM'):
+ content_types += [
+ "audio/webm",
+ "video/webm",
+ ]
+
+Classes = [
+ {
+ 'cid': '{574ce83e-fe9f-4095-b85c-7909abbf7c37}',
+ 'type': 'nsJSURI::Mutator',
+ 'headers': ['nsJSProtocolHandler.h'],
+ },
+ {
+ 'cid': '{58f089ee-512a-42d2-a935-d0c874128930}',
+ 'type': 'nsJSURI::Mutator',
+ 'headers': ['nsJSProtocolHandler.h'],
+ },
+ {
+ 'cid': '{48118355-e9a5-4452-ab18-59cc426fb817}',
+ 'type': 'nsIDocumentViewer',
+ },
+ {
+ 'cid': '{bbe50ef2-80eb-469d-b70d-02858275389f}',
+ 'type': 'mozilla::dom::BlobURL::Mutator',
+ 'headers': ['mozilla/dom/BlobURL.h'],
+ },
+ {
+ 'cid': '{f5475c51-59a7-4757-b3d9-e211a9410872}',
+ 'type': 'mozilla::dom::BlobURL::Mutator',
+ 'headers': ['mozilla/dom/BlobURL.h'],
+ },
+ {
+ 'js_name': 'cpmm',
+ 'cid': '{fe0ff7c3-8e97-448b-9a8a-86afdb9fbbb6}',
+ 'contract_ids': ['@mozilla.org/childprocessmessagemanager;1'],
+ 'legacy_constructor': 'CreateChildMessageManager',
+ },
+ {
+ 'cid': '{fc886801-e768-11d4-9885-00c04fa0cf4b}',
+ 'contract_ids': ['@mozilla.org/content/document-loader-factory;1'],
+ 'type': 'nsIDocumentLoaderFactory',
+ 'categories': {
+ 'Gecko-Content-Viewers': {
+ 'name': content_types,
+ 'backgroundtasks': BackgroundTasksSelector.ALL_TASKS,
+ }
+ },
+ },
+ {
+ 'cid': '{0ddf4df8-4dbb-4133-8b79-9afb966514f5}',
+ 'contract_ids': ['@mozilla.org/content/plugin/document-loader-factory;1'],
+ 'type': 'nsIDocumentLoaderFactory',
+ },
+ {
+ 'cid': '{3b55e72e-ab7e-431b-89c0-3b06a8b14016}',
+ 'contract_ids': ['@mozilla.org/content/style-sheet-service;1'],
+ 'type': 'nsStyleSheetService',
+ 'headers': ['nsStyleSheetService.h'],
+ 'init_method': 'Init',
+ },
+ {
+ 'cid': '{cdcc1ab8-3cea-4e6c-a294-a651fa35227f}',
+ 'contract_ids': ['@mozilla.org/contentsecuritymanager;1'],
+ 'type': 'nsContentSecurityManager',
+ 'headers': ['mozilla/dom/nsContentSecurityManager.h'],
+ },
+ {
+ 'cid': '{09d9ed1a-e5d4-4004-bfe0-27ceb923d9ac}',
+ 'contract_ids': ['@mozilla.org/cspcontext;1'],
+ 'type': 'nsCSPContext',
+ 'headers': ['mozilla/dom/nsCSPContext.h'],
+ },
+ {
+ 'cid': '{8d2f40b2-4875-4c95-97d9-3f7dca2cb460}',
+ 'contract_ids': ['@mozilla.org/cspservice;1'],
+ 'type': 'CSPService',
+ 'headers': ['mozilla/dom/nsCSPService.h'],
+ 'categories': {'content-policy': 'CSPService', 'net-channel-event-sinks': 'CSPService'},
+ },
+ {
+ 'cid': '{1147d32c-215b-4014-b180-07fe7aedf915}',
+ 'contract_ids': ['@mozilla.org/data-document-content-policy;1'],
+ 'type': 'nsDataDocumentContentPolicy',
+ 'headers': ['/dom/base/nsDataDocumentContentPolicy.h'],
+ 'categories': {'content-policy': '@mozilla.org/data-document-content-policy;1'},
+ },
+ {
+ 'cid': '{ecba5203-77da-465a-865e-78b7af10d8f7}',
+ 'contract_ids': ['@mozilla.org/devicesensors;1'],
+ 'type': 'nsDeviceSensors',
+ 'headers': ['nsDeviceSensors.h'],
+ },
+ {
+ 'cid': '{38bd0634-0fd4-46f0-b85f-13ced889eeec}',
+ 'contract_ids': ['@mozilla.org/docshell/structured-clone-container;1'],
+ 'type': 'nsStructuredCloneContainer',
+ 'headers': ['nsStructuredCloneContainer.h'],
+ },
+ {
+ 'js_name': 'DOMRequest',
+ 'cid': '{3160e271-138d-4cc7-9d63-6429f16957c7}',
+ 'contract_ids': ['@mozilla.org/dom/dom-request-service;1'],
+ 'interfaces': ['nsIDOMRequestService'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::DOMRequestService',
+ 'headers': ['mozilla/dom/DOMRequest.h'],
+ 'constructor': 'mozilla::dom::DOMRequestService::FactoryCreate',
+ },
+ {
+ 'js_name': 'domStorageManager',
+ 'cid': '{656db07c-aa80-49e4-bce8-e431baae697d}',
+ 'contract_ids': ['@mozilla.org/dom/localStorage-manager;1'],
+ 'interfaces': ['nsIDOMStorageManager', 'nsILocalStorageManager'],
+ 'legacy_constructor': 'LocalStorageManagerConstructor',
+ },
+ {
+ 'cid': '{64e4bf03-773e-408e-939a-e11652fdfd28}',
+ 'contract_ids': ['@mozilla.org/dom/sessionStorage-manager;1'],
+ 'legacy_constructor': 'SessionStorageManagerConstructor',
+ },
+ {
+ 'js_name': 'qms',
+ 'cid': '{5a75c25a-5e7e-4d90-8f7c-07eb15cc0aa8}',
+ 'contract_ids': ['@mozilla.org/dom/quota-manager-service;1'],
+ 'interfaces': ['nsIQuotaManagerService'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::quota::QuotaManagerService',
+ 'headers': ['mozilla/dom/quota/QuotaManagerService.h'],
+ 'constructor': 'mozilla::dom::quota::QuotaManagerService::FactoryCreate',
+ 'categories': {'idle-daily': 'QuotaManagerService'},
+ },
+ {
+ 'cid': '{ae2793c0-2ba3-4adb-9c5e-c23525812c64}',
+ 'contract_ids': ['@mozilla.org/dom/sdb-connection;1'],
+ 'legacy_constructor': 'mozilla::dom::SDBConnection::Create',
+ 'headers': ['mozilla/dom/SDBConnection.h'],
+ },
+ {
+ 'cid': '{62ec8731-55ad-4246-b2ea-f26c1fe19d2d}',
+ 'contract_ids': ['@mozilla.org/dom/workers/workerdebuggermanager;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::WorkerDebuggerManager',
+ 'headers': ['mozilla/dom/WorkerDebuggerManager.h'],
+ 'constructor': 'mozilla::dom::WorkerDebuggerManager::GetInstance',
+ },
+ {
+ 'js_name': 'els',
+ 'cid': '{baa34652-f1f1-4185-b224-244ee82a413a}',
+ 'contract_ids': ['@mozilla.org/eventlistenerservice;1'],
+ 'interfaces': ['nsIEventListenerService'],
+ 'type': 'nsIEventListenerService',
+ },
+ {
+ 'cid': '{e8ee88b0-5571-4086-a45b-39a716906bdb}',
+ 'contract_ids': [],
+ 'type': 'ExpandedPrincipal::Deserializer',
+ 'headers': ['/caps/ExpandedPrincipal.h'],
+ },
+ {
+ 'js_name': 'focus',
+ 'cid': '{cf7fd51f-aba2-44c1-9ff0-11f7508efcd4}',
+ 'contract_ids': ['@mozilla.org/focus-manager;1'],
+ 'interfaces': ['nsIFocusManager'],
+ 'type': 'nsIFocusManager',
+ },
+ {
+ 'cid': '{7b121f7e-ebe4-43ab-9410-dc9087a1dba6}',
+ 'contract_ids': ['@mozilla.org/gecko-media-plugin-service;1'],
+ 'singleton': True,
+ 'type': 'mozilla::gmp::GeckoMediaPluginService',
+ 'headers': ['GMPService.h'],
+ 'constructor': 'mozilla::gmp::GeckoMediaPluginService::GetGeckoMediaPluginService',
+ },
+ {
+ 'cid': '{01e1c3ff-094a-d048-44b4-62d29c7b4f39}',
+ 'contract_ids': ['@mozilla.org/geolocation;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::Geolocation',
+ 'headers': ['/dom/geolocation/Geolocation.h'],
+ 'constructor': 'mozilla::dom::Geolocation::NonWindowSingleton',
+ },
+ {
+ 'js_name': 'mm',
+ 'cid': '{130b016f-fad7-4526-bc7f-827dabf79265}',
+ 'contract_ids': ['@mozilla.org/globalmessagemanager;1'],
+ 'legacy_constructor': 'CreateGlobalMessageManager',
+ },
+ {
+ 'cid': '{bfcb82c2-5611-4318-90d6-baf4a7864252}',
+ 'contract_ids': ['@mozilla.org/inspector/deep-tree-walker;1'],
+ 'type': 'inDeepTreeWalker',
+ 'headers': ['/layout/inspector/inDeepTreeWalker.h'],
+ },
+ {
+ 'cid': '{0e3afd3d-eb60-4c2b-963b-56d7c439f124}',
+ 'contract_ids': ['@mozilla.org/layout/content-policy;1'],
+ 'legacy_constructor': 'CreateContentPolicy',
+ },
+ {
+ 'cid': '{4aef38b7-6364-4e23-a5e7-12f837fbbd9c}',
+ 'contract_ids': [
+ '@mozilla.org/layout/contentserializer;1?mimetype=application/vnd.mozilla.xul+xml',
+ '@mozilla.org/layout/contentserializer;1?mimetype=application/xml',
+ '@mozilla.org/layout/contentserializer;1?mimetype=image/svg+xml',
+ '@mozilla.org/layout/contentserializer;1?mimetype=text/xml',
+ ],
+ 'type': 'nsIContentSerializer',
+ 'legacy_constructor': 'CreateXMLContentSerializer',
+ },
+ {
+ 'cid': '{e7c2aaf5-c11a-4954-9dbf-e28edec1fd91}',
+ 'contract_ids': ['@mozilla.org/layout/contentserializer;1?mimetype=application/xhtml+xml'],
+ 'legacy_constructor': 'CreateXHTMLContentSerializer',
+ },
+ {
+ 'cid': '{9d3f70da-86e9-11d4-95ec-00b0d03e37b7}',
+ 'contract_ids': ['@mozilla.org/layout/contentserializer;1?mimetype=text/html'],
+ 'type': 'nsIContentSerializer',
+ 'legacy_constructor': 'CreateHTMLContentSerializer',
+ },
+ {
+ 'cid': '{6030f7ef-32ed-46a7-9a63-6a5d3f90445f}',
+ 'contract_ids': ['@mozilla.org/layout/contentserializer;1?mimetype=text/plain'],
+ 'legacy_constructor': 'CreatePlainTextSerializer',
+ },
+ {
+ 'cid': '{abc622ea-9655-4123-80d9-22621bdd5465}',
+ 'contract_ids': ['@mozilla.org/mediaManagerService;1'],
+ 'singleton': True,
+ 'type': 'nsIMediaManagerService',
+ 'headers': ['mozilla/MediaManager.h'],
+ 'constructor': 'mozilla::MediaManager::GetInstance',
+ },
+ {
+ 'cid': '{daf1461b-bf29-4f88-8d0e-4bcdf332c862}',
+ 'contract_ids': ['@mozilla.org/mixedcontentblocker;1'],
+ 'type': 'nsMixedContentBlocker',
+ 'headers': ['mozilla/dom/nsMixedContentBlocker.h'],
+ 'categories': {
+ 'content-policy': {
+ 'name': '@mozilla.org/mixedcontentblocker;1',
+ 'backgroundtasks': BackgroundTasksSelector.ALL_TASKS,
+ },
+ 'net-channel-event-sinks': {
+ 'name': '@mozilla.org/mixedcontentblocker;1',
+ 'backgroundtasks': BackgroundTasksSelector.ALL_TASKS,
+ },
+ },
+ },
+ {
+ 'cid': '{041a129f-10ce-4bda-a60d-e027a26d5ed0}',
+ 'contract_ids': ['@mozilla.org/referrer-info;1'],
+ 'type': 'mozilla::dom::ReferrerInfo',
+ 'headers': ['mozilla/dom/ReferrerInfo.h'],
+ },
+ {
+ 'cid': '{bfc310d2-38a0-11d3-8cd3-0060b0fc14a3}',
+ 'contract_ids': ['@mozilla.org/network/protocol;1?name=javascript'],
+ 'type': 'nsJSProtocolHandler',
+ 'headers': ['nsJSProtocolHandler.h'],
+ 'protocol_config': {
+ 'scheme': 'javascript',
+ 'flags': [
+ 'URI_NORELATIVE',
+ 'URI_NOAUTH',
+ 'URI_INHERITS_SECURITY_CONTEXT',
+ 'URI_LOADABLE_BY_ANYONE',
+ 'URI_NON_PERSISTABLE',
+ 'URI_OPENING_EXECUTES_SCRIPT',
+ ],
+ },
+ },
+ {
+ 'cid': '{ac9e3e82-bfbd-4f26-941e-f58c8ee178c1}',
+ 'contract_ids': ['@mozilla.org/no-data-protocol-content-policy;1'],
+ 'type': 'nsNoDataProtocolContentPolicy',
+ 'headers': ['/dom/base/nsNoDataProtocolContentPolicy.h'],
+ 'categories': {'content-policy': '@mozilla.org/no-data-protocol-content-policy;1'},
+ },
+ {
+ 'cid': '{bd066e5f-146f-4472-8331-7bfd05b1ed90}',
+ 'contract_ids': [],
+ 'type': 'mozilla::NullPrincipal::Deserializer',
+ 'headers': ['/caps/NullPrincipal.h'],
+ },
+ {
+ 'js_name': 'ppmm',
+ 'cid': '{2a058404-fb85-44ec-8cfd-e8cbdc988dc1}',
+ 'contract_ids': ['@mozilla.org/parentprocessmessagemanager;1'],
+ 'legacy_constructor': 'CreateParentMessageManager',
+ },
+ {
+ 'cid': '{af7b24cb-893f-41bb-961f-5a69388e27c3}',
+ 'contract_ids': ['@mozilla.org/parserutils;1'],
+ 'type': 'nsParserUtils',
+ 'headers': ['nsParserUtils.h'],
+ },
+ {
+ 'cid': '{653e0e4d-3ee4-45fa-b272-97c20bc01eb8}',
+ 'contract_ids': [],
+ 'type': 'mozilla::ContentPrincipal::Deserializer',
+ 'headers': ['/caps/ContentPrincipal.h'],
+ },
+ {
+ 'cid': '{2fc2d3e3-020f-404e-b06a-6ecf3ea2334a}',
+ 'contract_ids': ['@mozilla.org/push/Notifier;1'],
+ 'type': 'mozilla::dom::PushNotifier',
+ 'headers': ['mozilla/dom/PushNotifier.h'],
+ },
+ {
+ 'cid': '{f68037ec-2790-44c5-8e5f-df5da58b93a7}',
+ 'contract_ids': ['@mozilla.org/scriptable-content-iterator;1'],
+ 'type': 'ScriptableContentIterator',
+ 'headers': ['mozilla/ScriptableContentIterator.h'],
+ },
+ {
+ 'cid': '{1950539a-90f0-4d22-b5af-71329c68fa35}',
+ 'contract_ids': ['@mozilla.org/scripterror;1'],
+ 'type': 'nsScriptError',
+ 'headers': ['/dom/bindings/nsScriptError.h'],
+ },
+ {
+ 'js_name': 'scriptSecurityManager',
+ 'cid': '{7ee2a4c0-4b93-17d3-ba18-0060b0f199a2}',
+ 'contract_ids': ['@mozilla.org/scriptsecuritymanager;1'],
+ 'interfaces': ['nsIScriptSecurityManager'],
+ 'legacy_constructor': 'Construct_nsIScriptSecurityManager',
+ },
+ {
+ 'name': 'ServiceWorkerManager',
+ 'cid': '{c74bde32-bcc7-4840-8430-c733351b212a}',
+ 'contract_ids': ['@mozilla.org/serviceworkers/manager;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::ServiceWorkerManager',
+ 'headers': ['mozilla/dom/ServiceWorkerManager.h'],
+ 'constructor': 'mozilla::dom::ServiceWorkerManager::GetInstance',
+ },
+ {
+ 'cid': '{69da374a-fda3-4a93-9fbc-d9304f66a7fe}',
+ 'contract_ids': ['@mozilla.org/storage/activity-service;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::StorageActivityService',
+ 'headers': ['mozilla/StaticPtr.h', 'mozilla/dom/StorageActivityService.h'],
+ 'constructor': 'mozilla::dom::StorageActivityService::GetOrCreate',
+ },
+ {
+ 'cid': '{4a6212db-accb-11d3-b765-0060b0b6cecb}',
+ 'contract_ids': ['@mozilla.org/systemprincipal;1'],
+ 'singleton': True,
+ 'type': 'nsIPrincipal',
+ 'headers': ['nsScriptSecurityManager.h', '/caps/SystemPrincipal.h'],
+ 'constructor': 'nsScriptSecurityManager::SystemPrincipalSingletonConstructor',
+ },
+ {
+ 'cid': '{caaab47f-1e31-478e-8919-970904e9cb72}',
+ 'contract_ids': ['@mozilla.org/text-input-processor;1'],
+ 'type': 'mozilla::TextInputProcessor',
+ 'headers': ['mozilla/TextInputProcessor.h'],
+ },
+ {
+ 'name': 'ThirdPartyUtil',
+ 'cid': '{08c6cc8b-cfb0-421d-b1f7-683ff2989681}',
+ 'contract_ids': ['@mozilla.org/thirdpartyutil;1'],
+ 'type': 'ThirdPartyUtil',
+ 'headers': ['/dom/base/ThirdPartyUtil.h'],
+ 'init_method': 'Init',
+ },
+ {
+ 'cid': '{31689828-da66-49a6-870c-df62b83fe789}',
+ 'contract_ids': ['@mozilla.org/websocketevent/service;1'],
+ 'singleton': True,
+ 'type': 'mozilla::net::WebSocketEventService',
+ 'headers': ['mozilla/net/WebSocketEventService.h'],
+ 'constructor': 'mozilla::net::WebSocketEventService::GetOrCreate',
+ },
+ {
+ 'cid': '{abfbb785-5a44-49cf-88db-2f300bf727c9}',
+ 'contract_ids': ['@mozilla.org/eventsourceevent/service;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::EventSourceEventService',
+ 'headers': ['mozilla/dom/EventSourceEventService.h'],
+ 'constructor': 'mozilla::dom::EventSourceEventService::GetOrCreate',
+ },
+]
+
+if defined('MOZ_WEBSPEECH'):
+ Classes += [
+ {
+ 'cid': '{7090524d-5574-4492-a77f-d8d558ced59d}',
+ 'contract_ids': ['@mozilla.org/synth-voice-registry;1'],
+ 'singleton': True,
+ 'type': 'mozilla::dom::nsSynthVoiceRegistry',
+ 'headers': ['mozilla/dom/nsSynthVoiceRegistry.h'],
+ 'constructor': 'mozilla::dom::nsSynthVoiceRegistry::GetInstanceForService',
+ },
+ {
+ 'cid': '{0ff5ce56-5b09-4db8-adc6-8266af95f864}',
+ 'contract_ids': ['@mozilla.org/webspeech/service;1?name=online'],
+ 'type': 'mozilla::OnlineSpeechRecognitionService',
+ 'headers': ['mozilla/dom/OnlineSpeechRecognitionService.h'],
+ },
+ ]
+
+if defined('MOZ_WEBSPEECH_TEST_BACKEND'):
+ Classes += [
+ {
+ 'cid': '{48c345e7-9929-4f9a-a563-f478222dabcd}',
+ 'contract_ids': ['@mozilla.org/webspeech/service;1?name=fake'],
+ 'type': 'mozilla::FakeSpeechRecognitionService',
+ 'headers': ['mozilla/dom/FakeSpeechRecognitionService.h'],
+ },
+ ]
+
+if defined('ACCESSIBILITY'):
+ Classes += [
+ {
+ 'cid': '{3b265b69-f813-48ff-880d-d88d101af404}',
+ 'contract_ids': ['@mozilla.org/accessibilityService;1'],
+ 'type': 'nsIAccessibilityService',
+ },
+ ]
+
+if buildconfig.substs['MOZ_WIDGET_TOOLKIT'] == 'android':
+ Classes += [
+ {
+ 'cid': '{1f15dbc8-bfaa-45de-8a46-08e2e26326b0}',
+ 'contract_ids': ['@mozilla.org/widget/hapticfeedback;1'],
+ 'type': 'nsHapticFeedback',
+ 'headers': ['/dom/system/android/nsHapticFeedback.h'],
+ },
+ ]
diff --git a/layout/build/moz.build b/layout/build/moz.build
new file mode 100644
index 0000000000..b2059e396e
--- /dev/null
+++ b/layout/build/moz.build
@@ -0,0 +1,77 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ "nsContentDLF.h",
+ "nsLayoutCID.h",
+ "nsLayoutStatics.h",
+]
+
+UNIFIED_SOURCES += [
+ "nsContentDLF.cpp",
+ "nsLayoutModule.cpp",
+ "nsLayoutStatics.cpp",
+]
+
+include("/ipc/chromium/chromium-config.mozbuild")
+
+LOCAL_INCLUDES += [
+ "!/security/rlbox",
+ "../base",
+ "../forms",
+ "../generic",
+ "../inspector",
+ "../mathml",
+ "../painting",
+ "../style",
+ "../tables",
+ "../xul",
+ "/caps",
+ "/docshell/base",
+ "/dom/audiochannel",
+ "/dom/base",
+ "/dom/bindings",
+ "/dom/canvas",
+ "/dom/filesystem",
+ "/dom/geolocation",
+ "/dom/html",
+ "/dom/jsurl",
+ "/dom/media",
+ "/dom/storage",
+ "/dom/xslt/base",
+ "/dom/xslt/xml",
+ "/dom/xslt/xpath",
+ "/dom/xslt/xslt",
+ "/dom/xul",
+ "/editor/composer",
+ "/js/xpconnect/loader",
+ "/js/xpconnect/src",
+ "/netwerk/base",
+ "/netwerk/cookie",
+ "/parser/htmlparser",
+ "/toolkit/components/sessionstore",
+ "/view",
+]
+
+if CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows":
+ LOCAL_INCLUDES += [
+ "/dom/system/windows",
+ ]
+elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
+ LOCAL_INCLUDES += [
+ "/dom/system/mac",
+ ]
+elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "android":
+ LOCAL_INCLUDES += [
+ "/dom/system",
+ "/dom/system/android",
+ ]
+
+XPCOM_MANIFESTS += [
+ "components.conf",
+]
+
+FINAL_LIBRARY = "xul"
diff --git a/layout/build/nsContentDLF.cpp b/layout/build/nsContentDLF.cpp
new file mode 100644
index 0000000000..a9234099b0
--- /dev/null
+++ b/layout/build/nsContentDLF.cpp
@@ -0,0 +1,335 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "nsContentDLF.h"
+
+#include "mozilla/Encoding.h"
+
+#include "nsCOMPtr.h"
+#include "nsDocShell.h"
+#include "nsGenericHTMLElement.h"
+#include "nsGkAtoms.h"
+#include "nsIDocumentViewer.h"
+#include "nsIDocumentLoaderFactory.h"
+#include "mozilla/dom/Document.h"
+#include "nsNodeInfoManager.h"
+#include "nsString.h"
+#include "nsContentCID.h"
+#include "nsNetUtil.h"
+#include "nsCRT.h"
+#include "nsIViewSourceChannel.h"
+#include "nsContentUtils.h"
+#include "imgLoader.h"
+#include "nsCharsetSource.h"
+#include "nsMimeTypes.h"
+#include "DecoderTraits.h"
+
+// Factory code for creating variations on html documents
+
+#undef NOISY_REGISTRY
+
+using mozilla::dom::Document;
+
+already_AddRefed<nsIDocumentViewer> NS_NewDocumentViewer();
+
+static const char* const gHTMLTypes[] = {TEXT_HTML, VIEWSOURCE_CONTENT_TYPE,
+ APPLICATION_XHTML_XML,
+ APPLICATION_WAPXHTML_XML, 0};
+
+static const char* const gXMLTypes[] = {TEXT_XML,
+ APPLICATION_XML,
+ APPLICATION_MATHML_XML,
+ APPLICATION_RDF_XML,
+ TEXT_RDF,
+ 0};
+
+static const char* const gSVGTypes[] = {IMAGE_SVG_XML, 0};
+
+static bool IsTypeInList(const nsACString& aType, const char* const aList[]) {
+ int32_t typeIndex;
+ for (typeIndex = 0; aList[typeIndex]; ++typeIndex) {
+ if (aType.Equals(aList[typeIndex])) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+nsresult NS_NewContentDocumentLoaderFactory(
+ nsIDocumentLoaderFactory** aResult) {
+ MOZ_ASSERT(aResult, "null OUT ptr");
+ if (!aResult) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ RefPtr<nsContentDLF> it = new nsContentDLF();
+ it.forget(aResult);
+ return NS_OK;
+}
+
+nsContentDLF::nsContentDLF() = default;
+
+nsContentDLF::~nsContentDLF() = default;
+
+NS_IMPL_ISUPPORTS(nsContentDLF, nsIDocumentLoaderFactory)
+
+NS_IMETHODIMP
+nsContentDLF::CreateInstance(const char* aCommand, nsIChannel* aChannel,
+ nsILoadGroup* aLoadGroup,
+ const nsACString& aContentType,
+ nsIDocShell* aContainer, nsISupports* aExtraInfo,
+ nsIStreamListener** aDocListener,
+ nsIDocumentViewer** aDocViewer) {
+ // Make a copy of aContentType, because we're possibly going to change it.
+ nsAutoCString contentType(aContentType);
+
+ // Are we viewing source?
+ nsCOMPtr<nsIViewSourceChannel> viewSourceChannel =
+ do_QueryInterface(aChannel);
+ if (viewSourceChannel) {
+ aCommand = "view-source";
+
+ // The parser freaks out when it sees the content-type that a
+ // view-source channel normally returns. Get the actual content
+ // type of the data. If it's known, use it; otherwise use
+ // text/plain.
+ nsAutoCString type;
+ mozilla::Unused << viewSourceChannel->GetOriginalContentType(type);
+ bool knownType = (!type.EqualsLiteral(VIEWSOURCE_CONTENT_TYPE) &&
+ IsTypeInList(type, gHTMLTypes)) ||
+ nsContentUtils::IsPlainTextType(type) ||
+ IsTypeInList(type, gXMLTypes) ||
+ IsTypeInList(type, gSVGTypes) ||
+ IsTypeInList(type, gXMLTypes);
+
+ if (knownType) {
+ viewSourceChannel->SetContentType(type);
+ } else if (IsImageContentType(type)) {
+ // If it's an image, we want to display it the same way we normally would.
+ contentType = type;
+ } else {
+ viewSourceChannel->SetContentType(nsLiteralCString(TEXT_PLAIN));
+ }
+ } else if (aContentType.EqualsLiteral(VIEWSOURCE_CONTENT_TYPE)) {
+ aChannel->SetContentType(nsLiteralCString(TEXT_PLAIN));
+ contentType = TEXT_PLAIN;
+ }
+
+ nsresult rv;
+ bool imageDocument = false;
+ // Try html or plaintext; both use the same document CID
+ if (IsTypeInList(contentType, gHTMLTypes) ||
+ nsContentUtils::IsPlainTextType(contentType)) {
+ rv = CreateDocument(
+ aCommand, aChannel, aLoadGroup, aContainer,
+ []() -> already_AddRefed<Document> {
+ RefPtr<Document> doc;
+ nsresult rv =
+ NS_NewHTMLDocument(getter_AddRefs(doc), nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
+ aDocListener, aDocViewer);
+ } // Try XML
+ else if (IsTypeInList(contentType, gXMLTypes)) {
+ rv = CreateDocument(
+ aCommand, aChannel, aLoadGroup, aContainer,
+ []() -> already_AddRefed<Document> {
+ RefPtr<Document> doc;
+ nsresult rv =
+ NS_NewXMLDocument(getter_AddRefs(doc), nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
+ aDocListener, aDocViewer);
+ } // Try SVG
+ else if (IsTypeInList(contentType, gSVGTypes)) {
+ rv = CreateDocument(
+ aCommand, aChannel, aLoadGroup, aContainer,
+ []() -> already_AddRefed<Document> {
+ RefPtr<Document> doc;
+ nsresult rv =
+ NS_NewSVGDocument(getter_AddRefs(doc), nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
+ aDocListener, aDocViewer);
+ } else if (mozilla::DecoderTraits::ShouldHandleMediaType(
+ contentType.get(),
+ /* DecoderDoctorDiagnostics* */ nullptr)) {
+ rv = CreateDocument(
+ aCommand, aChannel, aLoadGroup, aContainer,
+ []() -> already_AddRefed<Document> {
+ RefPtr<Document> doc;
+ nsresult rv =
+ NS_NewVideoDocument(getter_AddRefs(doc), nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
+ aDocListener, aDocViewer);
+ } // Try image types
+ else if (IsImageContentType(contentType)) {
+ imageDocument = true;
+ rv = CreateDocument(
+ aCommand, aChannel, aLoadGroup, aContainer,
+ []() -> already_AddRefed<Document> {
+ RefPtr<Document> doc;
+ nsresult rv =
+ NS_NewImageDocument(getter_AddRefs(doc), nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
+ aDocListener, aDocViewer);
+ } else {
+ // If we get here, then we weren't able to create anything. Sorry!
+ return NS_ERROR_FAILURE;
+ }
+
+ if (NS_SUCCEEDED(rv) && !imageDocument) {
+ Document* doc = (*aDocViewer)->GetDocument();
+ MOZ_ASSERT(doc);
+ doc->MakeBrowsingContextNonSynthetic();
+ }
+
+ return rv;
+}
+
+NS_IMETHODIMP
+nsContentDLF::CreateInstanceForDocument(nsISupports* aContainer,
+ Document* aDocument,
+ const char* aCommand,
+ nsIDocumentViewer** aDocumentViewer) {
+ MOZ_ASSERT(aDocument);
+
+ nsCOMPtr<nsIDocumentViewer> viewer = NS_NewDocumentViewer();
+
+ // Bind the document to the Content Viewer
+ viewer->LoadStart(aDocument);
+ viewer.forget(aDocumentViewer);
+ return NS_OK;
+}
+
+/* static */
+already_AddRefed<Document> nsContentDLF::CreateBlankDocument(
+ nsILoadGroup* aLoadGroup, nsIPrincipal* aPrincipal,
+ nsIPrincipal* aPartitionedPrincipal, nsDocShell* aContainer) {
+ // create a new blank HTML document
+ RefPtr<Document> blankDoc;
+ mozilla::Unused << NS_NewHTMLDocument(getter_AddRefs(blankDoc), nullptr,
+ nullptr);
+
+ if (!blankDoc) {
+ return nullptr;
+ }
+
+ // initialize
+ nsCOMPtr<nsIURI> uri;
+ NS_NewURI(getter_AddRefs(uri), "about:blank"_ns);
+ if (!uri) {
+ return nullptr;
+ }
+ blankDoc->ResetToURI(uri, aLoadGroup, aPrincipal, aPartitionedPrincipal);
+ blankDoc->SetContainer(aContainer);
+
+ // add some simple content structure
+ nsNodeInfoManager* nim = blankDoc->NodeInfoManager();
+
+ RefPtr<mozilla::dom::NodeInfo> htmlNodeInfo;
+
+ // generate an html html element
+ htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::html, 0, kNameSpaceID_XHTML,
+ nsINode::ELEMENT_NODE);
+ nsCOMPtr<nsIContent> htmlElement =
+ NS_NewHTMLHtmlElement(htmlNodeInfo.forget());
+
+ // generate an html head element
+ htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::head, 0, kNameSpaceID_XHTML,
+ nsINode::ELEMENT_NODE);
+ nsCOMPtr<nsIContent> headElement =
+ NS_NewHTMLHeadElement(htmlNodeInfo.forget());
+
+ // generate an html body elemment
+ htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::body, 0, kNameSpaceID_XHTML,
+ nsINode::ELEMENT_NODE);
+ nsCOMPtr<nsIContent> bodyElement =
+ NS_NewHTMLBodyElement(htmlNodeInfo.forget());
+
+ // blat in the structure
+ NS_ASSERTION(blankDoc->GetChildCount() == 0, "Shouldn't have children");
+ if (!htmlElement || !headElement || !bodyElement) {
+ return nullptr;
+ }
+
+ mozilla::IgnoredErrorResult rv;
+ blankDoc->AppendChildTo(htmlElement, false, rv);
+ if (rv.Failed()) {
+ return nullptr;
+ }
+
+ htmlElement->AppendChildTo(headElement, false, rv);
+ if (rv.Failed()) {
+ return nullptr;
+ }
+
+ // XXXbz Why not notifying here?
+ htmlElement->AppendChildTo(bodyElement, false, rv);
+ if (rv.Failed()) {
+ return nullptr;
+ }
+
+ // add a nice bow
+ blankDoc->SetDocumentCharacterSetSource(kCharsetFromDocTypeDefault);
+ blankDoc->SetDocumentCharacterSet(UTF_8_ENCODING);
+ return blankDoc.forget();
+}
+
+nsresult nsContentDLF::CreateDocument(
+ const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup,
+ nsIDocShell* aContainer, nsContentDLF::DocumentCreator aDocumentCreator,
+ nsIStreamListener** aDocListener, nsIDocumentViewer** aDocumentViewer) {
+ MOZ_ASSERT(aDocumentCreator);
+
+ nsresult rv = NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsIURI> aURL;
+ rv = aChannel->GetURI(getter_AddRefs(aURL));
+ if (NS_FAILED(rv)) return rv;
+
+#ifdef NOISY_CREATE_DOC
+ if (nullptr != aURL) {
+ nsAutoString tmp;
+ aURL->ToString(tmp);
+ fputs(NS_LossyConvertUTF16toASCII(tmp).get(), stdout);
+ printf(": creating document\n");
+ }
+#endif
+
+ // Create the document
+ RefPtr<Document> doc = aDocumentCreator();
+ NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
+
+ // Create the content viewer XXX: could reuse content viewer here!
+ nsCOMPtr<nsIDocumentViewer> viewer = NS_NewDocumentViewer();
+
+ doc->SetContainer(static_cast<nsDocShell*>(aContainer));
+ doc->SetAllowDeclarativeShadowRoots(
+ mozilla::StaticPrefs::dom_webcomponents_shadowdom_declarative_enabled());
+
+ // Initialize the document to begin loading the data. An
+ // nsIStreamListener connected to the parser is returned in
+ // aDocListener.
+ rv = doc->StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer,
+ aDocListener, true);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Bind the document to the Content Viewer
+ viewer->LoadStart(doc);
+ viewer.forget(aDocumentViewer);
+ return NS_OK;
+}
+
+bool nsContentDLF::IsImageContentType(const nsACString& aContentType) {
+ return imgLoader::SupportImageWithMimeType(aContentType);
+}
diff --git a/layout/build/nsContentDLF.h b/layout/build/nsContentDLF.h
new file mode 100644
index 0000000000..b16ec75503
--- /dev/null
+++ b/layout/build/nsContentDLF.h
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsContentDLF_h__
+#define nsContentDLF_h__
+
+#include "nsIDocumentLoaderFactory.h"
+#include "nsMimeTypes.h"
+
+class nsDocShell;
+class nsIChannel;
+class nsIDocumentViewer;
+class nsILoadGroup;
+class nsIStreamListener;
+
+#define CONTENT_DLF_CONTRACTID "@mozilla.org/content/document-loader-factory;1"
+#define PLUGIN_DLF_CONTRACTID \
+ "@mozilla.org/content/plugin/document-loader-factory;1"
+
+class nsContentDLF final : public nsIDocumentLoaderFactory {
+ protected:
+ virtual ~nsContentDLF();
+
+ public:
+ nsContentDLF();
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIDOCUMENTLOADERFACTORY
+
+ nsresult InitUAStyleSheet();
+
+ typedef already_AddRefed<mozilla::dom::Document> (*DocumentCreator)();
+ nsresult CreateDocument(const char* aCommand, nsIChannel* aChannel,
+ nsILoadGroup* aLoadGroup, nsIDocShell* aContainer,
+ DocumentCreator aDocumentCreator,
+ nsIStreamListener** aDocListener,
+ nsIDocumentViewer** aDocumentViewer);
+
+ /**
+ * Create a blank document using the given loadgroup and given
+ * principal. aPrincipal is allowed to be null, in which case the
+ * new document will get the about:blank content principal.
+ */
+ static already_AddRefed<mozilla::dom::Document> CreateBlankDocument(
+ nsILoadGroup* aLoadGroup, nsIPrincipal* aPrincipal,
+ nsIPrincipal* aPartitionedPrincipal, nsDocShell* aContainer);
+
+ private:
+ static nsresult EnsureUAStyleSheet();
+ static bool IsImageContentType(const nsACString&);
+};
+
+nsresult NS_NewContentDocumentLoaderFactory(nsIDocumentLoaderFactory** aResult);
+
+// clang-format off
+#ifdef MOZ_WEBM
+#define CONTENTDLF_WEBM_CATEGORIES \
+ { "Gecko-Content-Viewers", VIDEO_WEBM, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", AUDIO_WEBM, "@mozilla.org/content/document-loader-factory;1" },
+#else
+#define CONTENTDLF_WEBM_CATEGORIES
+#endif
+
+#define CONTENTDLF_CATEGORIES \
+ { "Gecko-Content-Viewers", TEXT_HTML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_PLAIN, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_CACHE_MANIFEST, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_CSS, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_JAVASCRIPT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_ECMASCRIPT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_JAVASCRIPT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_ECMASCRIPT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_XJAVASCRIPT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_JSON, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_JSON, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_XHTML_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_RDF_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_RDF, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", VIEWSOURCE_CONTENT_TYPE, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", IMAGE_SVG_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_MATHML_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", TEXT_VTT, "@mozilla.org/content/document-loader-factory;1" }, \
+ { "Gecko-Content-Viewers", APPLICATION_WAPXHTML_XML, "@mozilla.org/content/document-loader-factory;1" }, \
+ CONTENTDLF_WEBM_CATEGORIES
+// clang-format on
+
+#endif
diff --git a/layout/build/nsLayoutCID.h b/layout/build/nsLayoutCID.h
new file mode 100644
index 0000000000..9805225fd2
--- /dev/null
+++ b/layout/build/nsLayoutCID.h
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsLayoutCID_h__
+#define nsLayoutCID_h__
+
+// {1691E1F4-EE41-11d4-9885-00C04FA0CF4B}
+#define NS_FRAMETRAVERSAL_CID \
+ { \
+ 0x1691e1f4, 0xee41, 0x11d4, { \
+ 0x98, 0x85, 0x0, 0xc0, 0x4f, 0xa0, 0xcf, 0x4b \
+ } \
+ }
+
+/* a6cf90f9-15b3-11d2-932e-00805f8add32 */
+#define NS_LAYOUT_DEBUGGER_CID \
+ { \
+ 0xa6cf90f9, 0x15b3, 0x11d2, { \
+ 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 \
+ } \
+ }
+
+// {2fe88332-31c6-4829-b247-a07d8a73e80f}
+#define NS_CANVASRENDERINGCONTEXTWEBGL_CID \
+ { \
+ 0x2fe88332, 0x31c6, 0x4829, { \
+ 0xb2, 0x47, 0xa0, 0x7d, 0x8a, 0x7e, 0xe8, 0x0fe \
+ } \
+ }
+
+// {ae2793c0-2ba3-4adb-9c5e-c23525812c64}
+#define NS_SDBCONNECTION_CID \
+ { \
+ 0xae2793c0, 0x2ba3, 0x4adb, { \
+ 0x9c, 0x5e, 0xc2, 0x35, 0x25, 0x81, 0x2c, 0x64 \
+ } \
+ }
+
+// {656DB07C-AA80-49e4-BCE8-E431BAAE697D}
+#define NS_DOMLOCALSTORAGEMANAGER_CID \
+ { \
+ 0x656db07c, 0xaa80, 0x49e4, { \
+ 0xbc, 0xe8, 0xe4, 0x31, 0xba, 0xae, 0x69, 0x7d \
+ } \
+ }
+
+// {93ad72a6-02cd-4716-9626-d47d5ec275ec}
+#define NS_DOMJSON_CID \
+ { \
+ 0x93ad72a6, 0x02cd, 0x4716, { \
+ 0x96, 0x26, 0xd4, 0x7d, 0x5e, 0xc2, 0x75, 0xec \
+ } \
+ }
+
+// {CF7FD51F-ABA2-44C1-9FF0-11F7508EFCD4}
+#define NS_FOCUSMANAGER_CID \
+ { \
+ 0xcf7fd51f, 0xaba2, 0x44c1, { \
+ 0x9f, 0xf0, 0x11, 0xf7, 0x50, 0x8e, 0xfc, 0xd4 \
+ } \
+ }
+
+// {3160e271-138d-4cc7-9d63-6429f16957c7}
+#define DOMREQUEST_SERVICE_CID \
+ { \
+ 0x3160e271, 0x138d, 0x4cc7, { \
+ 0x9d, 0x63, 0x64, 0x29, 0xf1, 0x69, 0x57, 0xc7 \
+ } \
+ }
+
+// {5a75c25a-5e7e-4d90-8f7c-07eb15cc0aa8}
+#define QUOTAMANAGER_SERVICE_CID \
+ { \
+ 0x5a75c25a, 0x5e7e, 0x4d90, { \
+ 0x8f, 0x7c, 0x07, 0xeb, 0x15, 0xcc, 0x0a, 0xa8 \
+ } \
+ }
+
+// {c74bde32-bcc7-4840-8430-c733351b212a}
+#define SERVICEWORKERMANAGER_CID \
+ { \
+ 0xc74bde32, 0xbcc7, 0x4840, { \
+ 0x84, 0x30, 0xc7, 0x33, 0x35, 0x1b, 0x21, 0x2a \
+ } \
+ }
+
+// {69da374a-fda3-4a93-9fbc-d9304f66a7fe}
+#define STORAGEACTIVITYSERVICE_CID \
+ { \
+ 0x69da374a, 0xfda3, 0x4a93, { \
+ 0x9f, 0xbc, 0xd9, 0x30, 0x4f, 0x66, 0xa7, 0xfe \
+ } \
+ }
+
+#define NOTIFICATIONTELEMETRYSERVICE_CID \
+ { \
+ 0x5995b782, 0x6a0e, 0x4066, { \
+ 0xaa, 0xc5, 0x27, 0x6f, 0x0a, 0x9a, 0xd8, 0xcf \
+ } \
+ }
+
+#endif /* nsLayoutCID_h__ */
diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp
new file mode 100644
index 0000000000..542785f156
--- /dev/null
+++ b/layout/build/nsLayoutModule.cpp
@@ -0,0 +1,243 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsLayoutModule.h"
+
+#include "base/basictypes.h"
+
+#include "XPCModule.h"
+#include "mozilla/Components.h"
+#include "mozilla/ModuleUtils.h"
+#include "nsImageModule.h"
+#include "nsLayoutStatics.h"
+#include "nsContentCID.h"
+#include "nsContentDLF.h"
+#include "nsContentPolicyUtils.h"
+#include "nsDataDocumentContentPolicy.h"
+#include "nsNoDataProtocolContentPolicy.h"
+#include "nsDOMCID.h"
+#include "nsFrameMessageManager.h"
+#include "nsHTMLContentSerializer.h"
+#include "nsHTMLParts.h"
+#include "nsIContentSerializer.h"
+#include "nsIDocumentViewer.h"
+#include "nsPlainTextSerializer.h"
+#include "nsXMLContentSerializer.h"
+#include "nsXHTMLContentSerializer.h"
+#include "nsLayoutCID.h"
+#include "nsFocusManager.h"
+#include "ThirdPartyUtil.h"
+#include "gfxPlatform.h"
+#include "mozilla/gfx/gfxVars.h"
+#include "mozilla/dom/quota/QuotaManagerService.h"
+
+#include "nsIEventListenerService.h"
+
+// view stuff
+#include "nsContentCreatorFunctions.h"
+
+#include "mozilla/dom/LocalStorageCommon.h"
+#include "mozilla/dom/LocalStorageManager.h"
+#include "mozilla/dom/LocalStorageManager2.h"
+#include "mozilla/dom/SessionStorageManager.h"
+
+#ifdef MOZ_WEBSPEECH
+# include "mozilla/dom/nsSynthVoiceRegistry.h"
+# include "mozilla/dom/OnlineSpeechRecognitionService.h"
+#endif
+
+#include "mozilla/dom/PushNotifier.h"
+using mozilla::dom::PushNotifier;
+#define PUSHNOTIFIER_CID \
+ { \
+ 0x2fc2d3e3, 0x020f, 0x404e, { \
+ 0xb0, 0x6a, 0x6e, 0xcf, 0x3e, 0xa2, 0x33, 0x4a \
+ } \
+ }
+
+#include "nsScriptSecurityManager.h"
+#include "nsNetCID.h"
+#if defined(MOZ_WIDGET_ANDROID)
+# include "nsHapticFeedback.h"
+#endif
+#include "nsParserUtils.h"
+
+class nsIDocumentLoaderFactory;
+
+#define PRODUCT_NAME "Gecko"
+
+#include "inDeepTreeWalker.h"
+
+static void Shutdown();
+
+#include "mozilla/dom/nsContentSecurityManager.h"
+
+using namespace mozilla;
+using namespace mozilla::dom;
+using namespace mozilla::net;
+
+//-----------------------------------------------------------------------------
+
+static bool gInitialized = false;
+
+// Perform our one-time intialization for this module
+
+void nsLayoutModuleInitialize() {
+ if (gInitialized) {
+ MOZ_CRASH("Recursive layout module initialization");
+ }
+
+ static_assert(sizeof(uintptr_t) == sizeof(void*),
+ "Eeek! You'll need to adjust the size of uintptr_t to the "
+ "size of a pointer on your platform.");
+
+ gInitialized = true;
+
+ if (NS_FAILED(xpcModuleCtor())) {
+ MOZ_CRASH("xpcModuleCtor failed");
+ }
+
+ if (NS_FAILED(nsLayoutStatics::Initialize())) {
+ Shutdown();
+ MOZ_CRASH("nsLayoutStatics::Initialize failed");
+ }
+}
+
+// Shutdown this module, releasing all of the module resources
+
+// static
+void Shutdown() {
+ MOZ_ASSERT(gInitialized, "module not initialized");
+ if (!gInitialized) return;
+
+ gInitialized = false;
+
+ nsLayoutStatics::Release();
+}
+
+already_AddRefed<nsIDocumentViewer> NS_NewDocumentViewer();
+nsresult NS_NewContentDocumentLoaderFactory(nsIDocumentLoaderFactory** aResult);
+nsresult NS_NewContentPolicy(nsIContentPolicy** aResult);
+
+nsresult NS_NewEventListenerService(nsIEventListenerService** aResult);
+nsresult NS_NewGlobalMessageManager(nsISupports** aResult);
+nsresult NS_NewParentProcessMessageManager(nsISupports** aResult);
+nsresult NS_NewChildProcessMessageManager(nsISupports** aResult);
+
+#define MAKE_CTOR(ctor_, iface_, func_) \
+ nsresult ctor_(REFNSIID aIID, void** aResult) { \
+ *aResult = nullptr; \
+ iface_* inst; \
+ nsresult rv = func_(&inst); \
+ if (NS_SUCCEEDED(rv)) { \
+ rv = inst->QueryInterface(aIID, aResult); \
+ NS_RELEASE(inst); \
+ } \
+ return rv; \
+ }
+
+#define MAKE_GENERIC_CTOR(iface_, func_) \
+ NS_IMPL_COMPONENT_FACTORY(iface_) { \
+ nsCOMPtr<iface_> inst; \
+ if (NS_SUCCEEDED(func_(getter_AddRefs(inst)))) { \
+ return inst.forget(); \
+ } \
+ return nullptr; \
+ }
+
+#define MAKE_GENERIC_CTOR2(iface_, func_) \
+ NS_IMPL_COMPONENT_FACTORY(iface_) { return func_(); }
+
+MAKE_GENERIC_CTOR2(nsIDocumentViewer, NS_NewDocumentViewer)
+
+MAKE_CTOR(CreateXMLContentSerializer, nsIContentSerializer,
+ NS_NewXMLContentSerializer)
+MAKE_CTOR(CreateHTMLContentSerializer, nsIContentSerializer,
+ NS_NewHTMLContentSerializer)
+MAKE_CTOR(CreateXHTMLContentSerializer, nsIContentSerializer,
+ NS_NewXHTMLContentSerializer)
+MAKE_CTOR(CreatePlainTextSerializer, nsIContentSerializer,
+ NS_NewPlainTextSerializer)
+MAKE_CTOR(CreateContentPolicy, nsIContentPolicy, NS_NewContentPolicy)
+
+MAKE_GENERIC_CTOR(nsIDocumentLoaderFactory, NS_NewContentDocumentLoaderFactory)
+MAKE_GENERIC_CTOR(nsIEventListenerService, NS_NewEventListenerService)
+MAKE_CTOR(CreateGlobalMessageManager, nsISupports, NS_NewGlobalMessageManager)
+MAKE_CTOR(CreateParentMessageManager, nsISupports,
+ NS_NewParentProcessMessageManager)
+MAKE_CTOR(CreateChildMessageManager, nsISupports,
+ NS_NewChildProcessMessageManager)
+
+MAKE_GENERIC_CTOR(nsIFocusManager, NS_NewFocusManager)
+
+// views are not refcounted, so this is the same as
+// NS_GENERIC_FACTORY_CONSTRUCTOR without the NS_ADDREF/NS_RELEASE
+#define NS_GENERIC_FACTORY_CONSTRUCTOR_NOREFS(_InstanceClass) \
+ static nsresult _InstanceClass##Constructor(REFNSIID aIID, void** aResult) { \
+ nsresult rv; \
+ \
+ *aResult = nullptr; \
+ \
+ _InstanceClass* inst = new _InstanceClass(); \
+ if (nullptr == inst) { \
+ rv = NS_ERROR_OUT_OF_MEMORY; \
+ return rv; \
+ } \
+ rv = inst->QueryInterface(aIID, aResult); \
+ \
+ return rv; \
+ }
+
+#ifdef ACCESSIBILITY
+# include "xpcAccessibilityService.h"
+
+MAKE_GENERIC_CTOR(nsIAccessibilityService, NS_GetAccessibilityService)
+#endif
+
+nsresult Construct_nsIScriptSecurityManager(REFNSIID aIID, void** aResult) {
+ if (!aResult) return NS_ERROR_NULL_POINTER;
+ *aResult = nullptr;
+ nsScriptSecurityManager* obj =
+ nsScriptSecurityManager::GetScriptSecurityManager();
+ if (!obj) return NS_ERROR_OUT_OF_MEMORY;
+ if (NS_FAILED(obj->QueryInterface(aIID, aResult))) return NS_ERROR_FAILURE;
+ return NS_OK;
+}
+
+nsresult LocalStorageManagerConstructor(REFNSIID aIID, void** aResult) {
+ if (NextGenLocalStorageEnabled()) {
+ RefPtr<LocalStorageManager2> manager = new LocalStorageManager2();
+ return manager->QueryInterface(aIID, aResult);
+ }
+
+ RefPtr<LocalStorageManager> manager = new LocalStorageManager();
+ return manager->QueryInterface(aIID, aResult);
+}
+
+nsresult SessionStorageManagerConstructor(REFNSIID aIID, void** aResult) {
+ RefPtr<SessionStorageManager> manager = new SessionStorageManager(nullptr);
+ return manager->QueryInterface(aIID, aResult);
+}
+
+void nsLayoutModuleDtor() {
+ if (XRE_GetProcessType() == GeckoProcessType_GPU ||
+ XRE_GetProcessType() == GeckoProcessType_VR ||
+ XRE_GetProcessType() == GeckoProcessType_RDD) {
+ return;
+ }
+
+ Shutdown();
+ nsContentUtils::XPCOMShutdown();
+
+ // Layout depends heavily on gfx and imagelib, so we want to make sure that
+ // these modules are shut down after all the layout cleanup runs.
+ mozilla::image::ShutdownModule();
+ gfxPlatform::Shutdown();
+ gfx::gfxVars::Shutdown();
+
+ nsScriptSecurityManager::Shutdown();
+ xpcModuleDtor();
+}
diff --git a/layout/build/nsLayoutModule.h b/layout/build/nsLayoutModule.h
new file mode 100644
index 0000000000..67003186d0
--- /dev/null
+++ b/layout/build/nsLayoutModule.h
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsLayoutModule_h
+#define nsLayoutModule_h
+
+#include "nscore.h"
+#include "nsID.h"
+#include "mozilla/AlreadyAddRefed.h"
+
+class nsIPresentationService;
+class nsISupports;
+
+// This function initializes various layout statics, as well as XPConnect.
+// It should be called only once, and before the first time any XPCOM module in
+// nsLayoutModule is used.
+void nsLayoutModuleInitialize();
+
+void nsLayoutModuleDtor();
+
+nsresult CreateXMLContentSerializer(const nsID& aIID, void** aResult);
+nsresult CreateHTMLContentSerializer(const nsID& aIID, void** aResult);
+nsresult CreateXHTMLContentSerializer(const nsID& aIID, void** aResult);
+nsresult CreatePlainTextSerializer(const nsID& aIID, void** aResult);
+nsresult CreateContentPolicy(const nsID& aIID, void** aResult);
+nsresult CreateGlobalMessageManager(const nsID& aIID, void** aResult);
+nsresult CreateParentMessageManager(const nsID& aIID, void** aResult);
+nsresult CreateChildMessageManager(const nsID& aIID, void** aResult);
+
+nsresult Construct_nsIScriptSecurityManager(const nsIID& aIID, void** aResult);
+nsresult LocalStorageManagerConstructor(const nsIID& aIID, void** aResult);
+nsresult SessionStorageManagerConstructor(const nsIID& aIID, void** aResult);
+
+already_AddRefed<nsIPresentationService> NS_CreatePresentationService();
+
+#endif // nsLayoutModule_h
diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp
new file mode 100644
index 0000000000..1738098ed2
--- /dev/null
+++ b/layout/build/nsLayoutStatics.cpp
@@ -0,0 +1,396 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "base/basictypes.h"
+
+#include "nsLayoutStatics.h"
+#include "nscore.h"
+
+#include "mozilla/intl/AppDateTimeFormat.h"
+#include "mozilla/dom/ServiceWorkerRegistrar.h"
+#include "nsAttrValue.h"
+#include "nsComputedDOMStyle.h"
+#include "nsContentDLF.h"
+#include "nsContentUtils.h"
+#include "nsCSSAnonBoxes.h"
+#include "mozilla/css/ErrorReporter.h"
+#include "nsCSSProps.h"
+#include "nsCSSPseudoElements.h"
+#include "nsCSSRendering.h"
+#include "nsGenericHTMLFrameElement.h"
+#include "mozilla/dom/Attr.h"
+#include "mozilla/dom/PopupBlocker.h"
+#include "nsIFrame.h"
+#include "nsFrameState.h"
+#include "nsGlobalWindowInner.h"
+#include "nsGlobalWindowOuter.h"
+#include "nsGkAtoms.h"
+#include "nsImageFrame.h"
+#include "mozilla/GlobalStyleSheetCache.h"
+#include "nsRegion.h"
+#include "nsRepeatService.h"
+#include "nsFloatManager.h"
+#include "nsTextControlFrame.h"
+#include "txMozillaXSLTProcessor.h"
+#include "nsTreeSanitizer.h"
+#include "nsCellMap.h"
+#include "nsTextFrame.h"
+#include "nsCCUncollectableMarker.h"
+#include "nsTextFragment.h"
+#include "nsCORSListenerProxy.h"
+#include "nsHtml5Module.h"
+#include "nsHTMLTags.h"
+#include "nsFocusManager.h"
+#include "mozilla/dom/HTMLDNSPrefetch.h"
+#include "mozilla/dom/HTMLInputElement.h"
+#include "mozilla/dom/SVGElementFactory.h"
+#include "nsMathMLAtoms.h"
+#include "nsMathMLOperators.h"
+#include "Navigator.h"
+#include "StorageObserver.h"
+#include "CacheObserver.h"
+#include "DisplayItemClip.h"
+#include "HitTestInfo.h"
+#include "ActiveLayerTracker.h"
+#include "AnimationCommon.h"
+#include "LayerAnimationInfo.h"
+
+#include "AudioChannelService.h"
+#include "mozilla/dom/PromiseDebugging.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
+
+#include "nsXULPopupManager.h"
+#include "nsXULContentUtils.h"
+#include "nsXULPrototypeCache.h"
+#include "nsXULTooltipListener.h"
+
+#include "mozilla/dom/UIDirectionManager.h"
+
+#include "CubebUtils.h"
+#include "WebAudioUtils.h"
+
+#include "nsError.h"
+
+#include "nsJSEnvironment.h"
+#include "nsContentSink.h"
+#include "nsFrameMessageManager.h"
+#include "nsDOMMutationObserver.h"
+#include "nsHyphenationManager.h"
+#include "nsWindowMemoryReporter.h"
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/ProcessPriorityManager.h"
+#include "mozilla/PermissionManager.h"
+#include "mozilla/dom/CustomElementRegistry.h"
+#include "mozilla/EventDispatcher.h"
+#include "mozilla/IMEStateManager.h"
+#ifndef MOZ_WIDGET_ANDROID
+# include "mozilla/Viaduct.h"
+#endif
+#include "mozilla/dom/HTMLVideoElement.h"
+#include "ThirdPartyUtil.h"
+#include "TouchManager.h"
+#include "DecoderDoctorLogger.h"
+#include "MediaDecoder.h"
+#include "mozilla/ClearSiteData.h"
+#include "mozilla/EditorController.h"
+#include "mozilla/HTMLEditorController.h"
+#include "mozilla/ServoBindings.h"
+#include "mozilla/StaticPresData.h"
+#include "mozilla/dom/AbstractRange.h"
+#include "mozilla/dom/Document.h"
+#include "mozilla/dom/WebIDLGlobalNameHash.h"
+#include "mozilla/dom/PointerEventHandler.h"
+#include "mozilla/dom/RemoteWorkerService.h"
+#include "mozilla/dom/BlobURLProtocolHandler.h"
+#include "mozilla/dom/ReportingHeader.h"
+#include "mozilla/dom/BrowserParent.h"
+#include "mozilla/dom/MIDIPlatformService.h"
+#include "mozilla/dom/quota/ActorsParent.h"
+#include "mozilla/dom/quota/StringifyUtils.h"
+#include "mozilla/dom/localstorage/ActorsParent.h"
+#include "mozilla/net/UrlClassifierFeatureFactory.h"
+#include "mozilla/RemoteLazyInputStreamStorage.h"
+#include "nsLayoutUtils.h"
+#include "nsThreadManager.h"
+#include "mozilla/css/ImageLoader.h"
+#include "gfxUserFontSet.h"
+#include "RestoreTabContentObserver.h"
+#include "mozilla/intl/nsComplexBreaker.h"
+
+#include "nsRLBoxExpatDriver.h"
+#include "RLBoxWOFF2Types.h"
+
+using namespace mozilla;
+using namespace mozilla::net;
+using namespace mozilla::dom;
+using namespace mozilla::dom::ipc;
+using namespace mozilla::dom::quota;
+
+nsrefcnt nsLayoutStatics::sLayoutStaticRefcnt = 0;
+
+nsresult nsLayoutStatics::Initialize() {
+ NS_ASSERTION(sLayoutStaticRefcnt == 0, "nsLayoutStatics isn't zero!");
+
+ sLayoutStaticRefcnt = 1;
+ NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt, "nsLayoutStatics",
+ 1);
+
+ nsresult rv;
+
+ ContentParent::StartUp();
+
+ nsCSSProps::Init();
+
+#ifdef DEBUG
+ nsCSSPseudoElements::AssertAtoms();
+ nsCSSAnonBoxes::AssertAtoms();
+ DebugVerifyFrameStateBits();
+#endif
+
+ StartupJSEnvironment();
+
+ nsGlobalWindowInner::Init();
+ nsGlobalWindowOuter::Init();
+
+ rv = nsContentUtils::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize nsContentUtils");
+ return rv;
+ }
+
+ nsAttrValue::Init();
+
+ rv = nsTextFragment::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize nsTextFragment");
+ return rv;
+ }
+
+ nsCellMap::Init();
+
+ StaticPresData::Init();
+ nsCSSRendering::Init();
+ css::ImageLoader::Init();
+
+ rv = HTMLDNSPrefetch::Initialize();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize HTML DNS prefetch");
+ return rv;
+ }
+
+ nsMathMLOperators::AddRefTable();
+
+#ifdef DEBUG
+ nsIFrame::DisplayReflowStartup();
+#endif
+ Attr::Initialize();
+
+ PopupBlocker::Initialize();
+
+ rv = txMozillaXSLTProcessor::Startup();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize txMozillaXSLTProcessor");
+ return rv;
+ }
+
+ rv = StorageObserver::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize StorageObserver");
+ return rv;
+ }
+
+ rv = nsCCUncollectableMarker::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize nsCCUncollectableMarker");
+ return rv;
+ }
+
+ rv = nsXULPopupManager::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize nsXULPopupManager");
+ return rv;
+ }
+
+ rv = nsFocusManager::Init();
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not initialize nsFocusManager");
+ return rv;
+ }
+
+ DecoderDoctorLogger::Init();
+ CubebUtils::InitLibrary();
+
+ nsHtml5Module::InitializeStatics();
+ nsLayoutUtils::Initialize();
+ PointerEventHandler::InitializeStatics();
+ TouchManager::InitializeStatics();
+
+ nsWindowMemoryReporter::Init();
+
+ SVGElementFactory::Init();
+
+ ProcessPriorityManager::Init();
+
+ UIDirectionManager::Initialize();
+
+ CacheObserver::Init();
+
+ IMEStateManager::Init();
+
+ ServiceWorkerRegistrar::Initialize();
+
+ MediaDecoder::InitStatics();
+
+ PromiseDebugging::Init();
+
+ if (XRE_IsParentProcess() || XRE_IsContentProcess()) {
+ InitializeServo();
+ }
+
+ // This must be initialized on the main-thread.
+ mozilla::RemoteLazyInputStreamStorage::Initialize();
+
+ if (XRE_IsParentProcess()) {
+ // On content process we initialize these components when PContentChild is
+ // fully initialized.
+ mozilla::dom::RemoteWorkerService::Initialize();
+ }
+
+ ClearSiteData::Initialize();
+
+ // Reporting API.
+ ReportingHeader::Initialize();
+
+ InitializeScopedLogExtraInfo();
+
+ Stringifyable::InitTLS();
+
+ if (XRE_IsParentProcess()) {
+ InitializeQuotaManager();
+ InitializeLocalStorage();
+ }
+
+ ThirdPartyUtil::Startup();
+
+ RestoreTabContentObserver::Initialize();
+
+ ComplexBreaker::Initialize();
+
+ RLBoxExpatSandboxPool::Initialize();
+
+ RLBoxWOFF2SandboxPool::Initalize();
+
+ if (XRE_IsParentProcess()) {
+ MIDIPlatformService::InitStatics();
+ }
+
+#ifndef MOZ_WIDGET_ANDROID
+ if (XRE_IsParentProcess()) {
+ InitializeViaduct();
+ }
+#endif
+
+ return NS_OK;
+}
+
+void nsLayoutStatics::Shutdown() {
+ // Don't need to shutdown nsWindowMemoryReporter, that will be done by the
+ // memory reporter manager.
+
+ if (XRE_IsParentProcess() || XRE_IsContentProcess()) {
+ ShutdownServo();
+ }
+
+ mozilla::dom::AbstractRange::Shutdown();
+ Document::Shutdown();
+ nsMessageManagerScriptExecutor::Shutdown();
+ nsFocusManager::Shutdown();
+ nsXULPopupManager::Shutdown();
+ UIDirectionManager::Shutdown();
+ StorageObserver::Shutdown();
+ txMozillaXSLTProcessor::Shutdown();
+ Attr::Shutdown();
+ PopupBlocker::Shutdown();
+ IMEStateManager::Shutdown();
+ EditorController::Shutdown();
+ HTMLEditorController::Shutdown();
+ HTMLDNSPrefetch::Shutdown();
+ nsCSSRendering::Shutdown();
+ StaticPresData::Shutdown();
+#ifdef DEBUG
+ nsIFrame::DisplayReflowShutdown();
+#endif
+ nsCellMap::Shutdown();
+ ActiveLayerTracker::Shutdown();
+
+ // Release all of our atoms
+ nsRepeatService::Shutdown();
+
+ nsXULContentUtils::Finish();
+ nsXULPrototypeCache::ReleaseGlobals();
+
+ SVGElementFactory::Shutdown();
+ nsMathMLOperators::ReleaseTable();
+
+ nsFloatManager::Shutdown();
+ nsImageFrame::ReleaseGlobals();
+
+ mozilla::css::ErrorReporter::ReleaseGlobals();
+
+ nsTextFragment::Shutdown();
+
+ nsAttrValue::Shutdown();
+ nsContentUtils::Shutdown();
+ nsMixedContentBlocker::Shutdown();
+ GlobalStyleSheetCache::Shutdown();
+
+ ShutdownJSEnvironment();
+ nsGlobalWindowInner::ShutDown();
+ nsGlobalWindowOuter::ShutDown();
+
+ CubebUtils::ShutdownLibrary();
+ WebAudioUtils::Shutdown();
+
+ nsCORSListenerProxy::Shutdown();
+
+ PointerEventHandler::ReleaseStatics();
+
+ TouchManager::ReleaseStatics();
+
+ nsTreeSanitizer::ReleaseStatics();
+
+ nsHtml5Module::ReleaseStatics();
+
+ mozilla::EventDispatcher::Shutdown();
+
+ HTMLInputElement::DestroyUploadLastDir();
+
+ nsLayoutUtils::Shutdown();
+
+ nsHyphenationManager::Shutdown();
+ nsDOMMutationObserver::Shutdown();
+
+ mozilla::intl::AppDateTimeFormat::Shutdown();
+
+ ContentParent::ShutDown();
+
+ DisplayItemClip::Shutdown();
+ HitTestInfo::Shutdown();
+
+ CacheObserver::Shutdown();
+
+ PromiseDebugging::Shutdown();
+
+ BlobURLProtocolHandler::RemoveDataEntries();
+
+ css::ImageLoader::Shutdown();
+
+ mozilla::net::UrlClassifierFeatureFactory::Shutdown();
+
+ RestoreTabContentObserver::Shutdown();
+
+ ComplexBreaker::Shutdown();
+}
diff --git a/layout/build/nsLayoutStatics.h b/layout/build/nsLayoutStatics.h
new file mode 100644
index 0000000000..984f7c984e
--- /dev/null
+++ b/layout/build/nsLayoutStatics.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsLayoutStatics_h__
+#define nsLayoutStatics_h__
+
+#include "nscore.h"
+#include "MainThreadUtils.h"
+#include "nsISupportsImpl.h"
+#include "nsDebug.h"
+
+// This isn't really a class, it's a namespace for static methods.
+// Documents and other objects can hold a reference to the layout static
+// objects so that they last past the xpcom-shutdown notification.
+
+class nsLayoutStatics {
+ public:
+ // Called by the layout module constructor. This call performs an AddRef()
+ // internally.
+ static nsresult Initialize();
+
+ static void AddRef() {
+ NS_ASSERTION(NS_IsMainThread(),
+ "nsLayoutStatics reference counting must be on main thread");
+
+ NS_ASSERTION(sLayoutStaticRefcnt,
+ "nsLayoutStatics already dropped to zero!");
+
+ ++sLayoutStaticRefcnt;
+ NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt, "nsLayoutStatics",
+ 1);
+ }
+ static void Release() {
+ NS_ASSERTION(NS_IsMainThread(),
+ "nsLayoutStatics reference counting must be on main thread");
+
+ --sLayoutStaticRefcnt;
+ NS_LOG_RELEASE(&sLayoutStaticRefcnt, sLayoutStaticRefcnt,
+ "nsLayoutStatics");
+
+ if (!sLayoutStaticRefcnt) Shutdown();
+ }
+
+ private:
+ // not to be called!
+ nsLayoutStatics();
+
+ static void Shutdown();
+
+ static nsrefcnt sLayoutStaticRefcnt;
+};
+
+#endif // nsLayoutStatics_h__