mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 08:15:31 +00:00
25ca8d7890
TabGroup never really made any difference in which thread something go dispatched to. This was the intended use, but development of TabGroups with abstract main threads never made it that far. The good thing is that thish makes it safe to also remove to the SystemGroup and instead switch all SystemGroup dispatches to dispatches to main thread. Timers for setTimeout and workers were the sole users of wrapped and throttled event targets, that those throttled queues have been moved to the BrowsingContextGroup and are now accessed explicitly. The SchedulerEventTarget has been removed, since there are no longer a separate event target for every TaskCategory. Instead a LabellingEventTarget has been added to DocGroup to handle the case where an event is dispatched do DocGroup or when an AbstractThread is created using a DocGroup. This means that we'll actually label more events correctly with the DocGroup that they belong to. DocGroups have also been moved to BrowsingContextGroup. Depends on D67636 Differential Revision: https://phabricator.services.mozilla.com/D65936 --HG-- extra : moz-landing-system : lando
555 lines
14 KiB
Python
555 lines
14 KiB
Python
# -*- 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/.
|
|
|
|
with Files('*Selection*'):
|
|
BUG_COMPONENT = ('Core', 'DOM: Selection')
|
|
|
|
with Files("**"):
|
|
BUG_COMPONENT = ("Core", "DOM: Core & HTML")
|
|
|
|
TEST_DIRS += ['test']
|
|
|
|
XPIDL_SOURCES += [
|
|
'mozIDOMWindow.idl',
|
|
'nsIContentPolicy.idl',
|
|
'nsIDocumentEncoder.idl',
|
|
'nsIDOMRequestService.idl',
|
|
'nsIDroppedLinkHandler.idl',
|
|
'nsIImageLoadingContent.idl',
|
|
'nsIMessageManager.idl',
|
|
'nsIObjectLoadingContent.idl',
|
|
'nsIRemoteWindowContext.idl',
|
|
'nsIScriptableContentIterator.idl',
|
|
'nsIScriptChannel.idl',
|
|
'nsISelectionController.idl',
|
|
'nsISelectionDisplay.idl',
|
|
'nsISelectionListener.idl',
|
|
'nsISlowScriptDebug.idl',
|
|
]
|
|
|
|
XPIDL_MODULE = 'dom'
|
|
|
|
EXPORTS += [
|
|
'AttrArray.h',
|
|
'AutocompleteFieldList.h',
|
|
'Crypto.h',
|
|
'HTMLSplitOnSpacesTokenizer.h',
|
|
'IframeSandboxKeywordList.h',
|
|
'mozAutoDocUpdate.h',
|
|
'NodeUbiReporting.h',
|
|
'nsAttrName.h',
|
|
'nsAttrValue.h',
|
|
'nsAttrValueInlines.h',
|
|
'nsCaseTreatment.h',
|
|
'nsChildContentList.h',
|
|
'nsContentCID.h',
|
|
'nsContentCreatorFunctions.h',
|
|
'nsContentList.h',
|
|
'nsContentListDeclarations.h',
|
|
'nsContentPermissionHelper.h',
|
|
'nsContentPolicyUtils.h',
|
|
'nsContentSink.h',
|
|
'nsContentTypeParser.h',
|
|
'nsContentUtils.h',
|
|
'nsCopySupport.h',
|
|
'nsDeprecatedOperationList.h',
|
|
'nsDocElementCreatedNotificationRunner.h',
|
|
'nsDocumentWarningList.h',
|
|
'nsDOMAttributeMap.h',
|
|
'nsDOMCID.h',
|
|
'nsDOMJSUtils.h',
|
|
'nsDOMNavigationTiming.h',
|
|
'nsDOMString.h',
|
|
'nsDOMTokenList.h',
|
|
'nsFocusManager.h',
|
|
'nsFrameLoader.h', # Because binding headers include it.
|
|
'nsFrameLoaderOwner.h',
|
|
'nsFrameMessageManager.h',
|
|
'nsGlobalWindow.h', # Because binding headers include it.
|
|
'nsGlobalWindowInner.h', # Because binding headers include it.
|
|
'nsGlobalWindowOuter.h', # Because binding headers include it.
|
|
'nsIAnimationObserver.h',
|
|
'nsIContent.h',
|
|
'nsIContentInlines.h',
|
|
'nsIContentSerializer.h',
|
|
'nsIDocumentObserver.h',
|
|
'nsIGlobalObject.h',
|
|
'nsImageLoadingContent.h',
|
|
'nsIMutationObserver.h',
|
|
'nsINode.h',
|
|
'nsINodeList.h',
|
|
'nsIScriptContext.h',
|
|
'nsIScriptGlobalObject.h',
|
|
'nsIScriptObjectPrincipal.h',
|
|
'nsIStyleSheetLinkingElement.h',
|
|
'nsJSEnvironment.h',
|
|
'nsJSUtils.h',
|
|
'nsLineBreaker.h',
|
|
'nsMappedAttributeElement.h',
|
|
'nsNameSpaceManager.h',
|
|
'nsNodeInfoManager.h',
|
|
'nsPIDOMWindow.h',
|
|
'nsPIDOMWindowInlines.h',
|
|
'nsPIWindowRoot.h',
|
|
'nsPropertyTable.h',
|
|
'nsRange.h',
|
|
'nsSandboxFlags.h',
|
|
'nsStructuredCloneContainer.h',
|
|
'nsStubAnimationObserver.h',
|
|
'nsStubDocumentObserver.h',
|
|
'nsStubMutationObserver.h',
|
|
'nsStyledElement.h',
|
|
'nsStyleLinkElement.h',
|
|
'nsTextFragment.h',
|
|
'nsTraversal.h',
|
|
'nsTreeSanitizer.h',
|
|
'nsViewportInfo.h',
|
|
'nsWindowMemoryReporter.h',
|
|
'nsWindowSizes.h',
|
|
'nsWrapperCache.h',
|
|
'nsWrapperCacheInlines.h',
|
|
'XPathGenerator.h',
|
|
]
|
|
|
|
if CONFIG['MOZ_WEBRTC']:
|
|
EXPORTS += [
|
|
'nsDOMDataChannel.h',
|
|
'nsDOMDataChannelDeclarations.h',
|
|
]
|
|
|
|
EXPORTS.mozilla += [
|
|
'CallState.h',
|
|
'ContentIterator.h',
|
|
'CORSMode.h',
|
|
'FlushType.h',
|
|
'FullscreenChange.h',
|
|
'IdentifierMapEntry.h',
|
|
'RangeBoundary.h',
|
|
'RangeUtils.h',
|
|
'ScriptableContentIterator.h',
|
|
'SelectionChangeEventDispatcher.h',
|
|
'TextInputProcessor.h',
|
|
'UseCounter.h',
|
|
]
|
|
|
|
EXPORTS.mozilla.dom += [
|
|
'!UseCounterList.h',
|
|
'!UseCounterWorkerList.h',
|
|
'AbstractRange.h',
|
|
'AncestorIterator.h',
|
|
'AnonymousContent.h',
|
|
'Attr.h',
|
|
'BarProps.h',
|
|
'BindContext.h',
|
|
'BodyConsumer.h',
|
|
'BodyStream.h',
|
|
'BodyUtil.h',
|
|
'BorrowedAttrInfo.h',
|
|
'CharacterData.h',
|
|
'ChildIterator.h',
|
|
'ChildProcessMessageManager.h',
|
|
'ChromeMessageBroadcaster.h',
|
|
'ChromeMessageSender.h',
|
|
'ChromeNodeList.h',
|
|
'ChromeUtils.h',
|
|
'Comment.h',
|
|
'ContentFrameMessageManager.h',
|
|
'ContentProcessMessageManager.h',
|
|
'CustomElementRegistry.h',
|
|
'DirectionalityUtils.h',
|
|
'DispatcherTrait.h',
|
|
'DocGroup.h',
|
|
'Document.h',
|
|
'DocumentFragment.h',
|
|
'DocumentInlines.h',
|
|
'DocumentOrShadowRoot.h',
|
|
'DocumentType.h',
|
|
'DOMArena.h',
|
|
'DOMException.h',
|
|
'DOMImplementation.h',
|
|
'DOMIntersectionObserver.h',
|
|
'DOMMatrix.h',
|
|
'DOMMozPromiseRequestHolder.h',
|
|
'DOMParser.h',
|
|
'DOMPoint.h',
|
|
'DOMQuad.h',
|
|
'DOMRect.h',
|
|
'DOMRequest.h',
|
|
'DOMStringList.h',
|
|
'DOMTokenListSupportedTokens.h',
|
|
'Element.h',
|
|
'ElementInlines.h',
|
|
'EventSource.h',
|
|
'FilteredNodeIterator.h',
|
|
'FormData.h',
|
|
'FragmentOrElement.h',
|
|
'FromParser.h',
|
|
'GeneratedImageContent.h',
|
|
'IdleDeadline.h',
|
|
'IdleRequest.h',
|
|
'IDTracker.h',
|
|
'ImageEncoder.h',
|
|
'ImageTracker.h',
|
|
'IntlUtils.h',
|
|
'Link.h',
|
|
'Location.h',
|
|
'LocationBase.h',
|
|
'MaybeCrossOriginObject.h',
|
|
'MessageBroadcaster.h',
|
|
'MessageListenerManager.h',
|
|
'MessageManagerGlobal.h',
|
|
'MessageSender.h',
|
|
'MimeType.h',
|
|
'MozQueryInterface.h',
|
|
'MutationObservers.h',
|
|
'NameSpaceConstants.h',
|
|
'Navigator.h',
|
|
'NodeInfo.h',
|
|
'NodeInfoInlines.h',
|
|
'NodeIterator.h',
|
|
'ParentProcessMessageManager.h',
|
|
'PlacesBookmark.h',
|
|
'PlacesBookmarkAddition.h',
|
|
'PlacesBookmarkRemoved.h',
|
|
'PlacesEvent.h',
|
|
'PlacesObservers.h',
|
|
'PlacesVisit.h',
|
|
'PlacesWeakCallbackWrapper.h',
|
|
'PopupBlocker.h',
|
|
'Pose.h',
|
|
'PostMessageEvent.h',
|
|
'ProcessMessageManager.h',
|
|
'ResizeObserver.h',
|
|
'ResizeObserverController.h',
|
|
'ResponsiveImageSelector.h',
|
|
'SameProcessMessageQueue.h',
|
|
'ScreenLuminance.h',
|
|
'ScreenOrientation.h',
|
|
'Selection.h',
|
|
'SerializedStackHolder.h',
|
|
'ShadowIncludingTreeIterator.h',
|
|
'ShadowRoot.h',
|
|
'StaticRange.h',
|
|
'StructuredCloneBlob.h',
|
|
'StructuredCloneHolder.h',
|
|
'StructuredCloneTags.h',
|
|
'StructuredCloneTester.h',
|
|
'StyledRange.h',
|
|
'StyleSheetList.h',
|
|
'SubtleCrypto.h',
|
|
'SyncMessageSender.h',
|
|
'Text.h',
|
|
'Timeout.h',
|
|
'TimeoutHandler.h',
|
|
'TimeoutManager.h',
|
|
'TreeIterator.h',
|
|
'TreeOrderedArray.h',
|
|
'TreeOrderedArrayInlines.h',
|
|
'TreeWalker.h',
|
|
'UIDirectionManager.h',
|
|
'UserActivation.h',
|
|
'ViewportMetaData.h',
|
|
'VisualViewport.h',
|
|
'WindowOrientationObserver.h',
|
|
'WindowProxyHolder.h',
|
|
]
|
|
|
|
if CONFIG['FUZZING']:
|
|
EXPORTS.mozilla.dom += [
|
|
'FuzzingFunctions.h',
|
|
]
|
|
|
|
UNIFIED_SOURCES += [
|
|
'AbstractRange.cpp',
|
|
'AnonymousContent.cpp',
|
|
'Attr.cpp',
|
|
'AttrArray.cpp',
|
|
'BarProps.cpp',
|
|
'BodyConsumer.cpp',
|
|
'BodyStream.cpp',
|
|
'BodyUtil.cpp',
|
|
'BorrowedAttrInfo.cpp',
|
|
'CharacterData.cpp',
|
|
'ChildIterator.cpp',
|
|
'ChromeMessageBroadcaster.cpp',
|
|
'ChromeMessageSender.cpp',
|
|
'ChromeNodeList.cpp',
|
|
'ChromeUtils.cpp',
|
|
'Comment.cpp',
|
|
'ContentFrameMessageManager.cpp',
|
|
'ContentIterator.cpp',
|
|
'ContentProcessMessageManager.cpp',
|
|
'Crypto.cpp',
|
|
'CustomElementRegistry.cpp',
|
|
'DirectionalityUtils.cpp',
|
|
'DispatcherTrait.cpp',
|
|
'DocGroup.cpp',
|
|
'Document.cpp',
|
|
'DocumentFragment.cpp',
|
|
'DocumentOrShadowRoot.cpp',
|
|
'DocumentType.cpp',
|
|
'DOMException.cpp',
|
|
'DOMImplementation.cpp',
|
|
'DOMMatrix.cpp',
|
|
'DOMParser.cpp',
|
|
'DOMPoint.cpp',
|
|
'DOMQuad.cpp',
|
|
'DOMRect.cpp',
|
|
'DOMRequest.cpp',
|
|
'DOMStringList.cpp',
|
|
'Element.cpp',
|
|
'EventSource.cpp',
|
|
'FormData.cpp',
|
|
'FragmentOrElement.cpp',
|
|
'GeneratedImageContent.cpp',
|
|
'IdleDeadline.cpp',
|
|
'IdleRequest.cpp',
|
|
'IDTracker.cpp',
|
|
'ImageEncoder.cpp',
|
|
'ImageTracker.cpp',
|
|
'InProcessBrowserChildMessageManager.cpp',
|
|
'IntlUtils.cpp',
|
|
'Link.cpp',
|
|
'Location.cpp',
|
|
'LocationBase.cpp',
|
|
'MaybeCrossOriginObject.cpp',
|
|
'MessageBroadcaster.cpp',
|
|
'MessageListenerManager.cpp',
|
|
'MessageManagerGlobal.cpp',
|
|
'MessageSender.cpp',
|
|
'MimeType.cpp',
|
|
'MozQueryInterface.cpp',
|
|
'MutationObservers.cpp',
|
|
'Navigator.cpp',
|
|
'NodeInfo.cpp',
|
|
'NodeIterator.cpp',
|
|
'NodeUbiReporting.cpp',
|
|
'nsAttrValue.cpp',
|
|
'nsAttrValueOrString.cpp',
|
|
'nsCCUncollectableMarker.cpp',
|
|
'nsContentAreaDragDrop.cpp',
|
|
'nsContentList.cpp',
|
|
'nsContentPermissionHelper.cpp',
|
|
'nsContentPolicy.cpp',
|
|
'nsContentSink.cpp',
|
|
'nsContentTypeParser.cpp',
|
|
'nsCopySupport.cpp',
|
|
'nsDataDocumentContentPolicy.cpp',
|
|
'nsDocumentEncoder.cpp',
|
|
'nsDOMAttributeMap.cpp',
|
|
'nsDOMCaretPosition.cpp',
|
|
'nsDOMMutationObserver.cpp',
|
|
'nsDOMNavigationTiming.cpp',
|
|
'nsDOMSerializer.cpp',
|
|
'nsDOMTokenList.cpp',
|
|
'nsFocusManager.cpp',
|
|
'nsFrameLoader.cpp',
|
|
'nsFrameLoaderOwner.cpp',
|
|
'nsGlobalWindowCommands.cpp',
|
|
'nsHistory.cpp',
|
|
'nsHTMLContentSerializer.cpp',
|
|
'nsIGlobalObject.cpp',
|
|
'nsINode.cpp',
|
|
'nsJSEnvironment.cpp',
|
|
'nsJSUtils.cpp',
|
|
'nsLineBreaker.cpp',
|
|
'nsMappedAttributeElement.cpp',
|
|
'nsMappedAttributes.cpp',
|
|
'nsMimeTypeArray.cpp',
|
|
'nsNameSpaceManager.cpp',
|
|
'nsNoDataProtocolContentPolicy.cpp',
|
|
'nsNodeInfoManager.cpp',
|
|
'nsOpenURIInFrameParams.cpp',
|
|
'nsPlainTextSerializer.cpp',
|
|
'nsPropertyTable.cpp',
|
|
'nsQueryContentEventResult.cpp',
|
|
'nsRange.cpp',
|
|
'nsScreen.cpp',
|
|
'nsStructuredCloneContainer.cpp',
|
|
'nsStubAnimationObserver.cpp',
|
|
'nsStubDocumentObserver.cpp',
|
|
'nsStubMutationObserver.cpp',
|
|
'nsStyledElement.cpp',
|
|
'nsStyleLinkElement.cpp',
|
|
'nsSyncLoadService.cpp',
|
|
'nsTextFragment.cpp',
|
|
'nsTextNode.cpp',
|
|
'nsTraversal.cpp',
|
|
'nsTreeSanitizer.cpp',
|
|
'nsViewportInfo.cpp',
|
|
'nsWindowMemoryReporter.cpp',
|
|
'nsWindowRoot.cpp',
|
|
'nsWrapperCache.cpp',
|
|
'nsXHTMLContentSerializer.cpp',
|
|
'nsXMLContentSerializer.cpp',
|
|
'ParentProcessMessageManager.cpp',
|
|
'PopupBlocker.cpp',
|
|
'Pose.cpp',
|
|
'PostMessageEvent.cpp',
|
|
'ProcessMessageManager.cpp',
|
|
'RangeUtils.cpp',
|
|
'RemoteOuterWindowProxy.cpp',
|
|
'ResizeObserver.cpp',
|
|
'ResizeObserverController.cpp',
|
|
'ResponsiveImageSelector.cpp',
|
|
'SameProcessMessageQueue.cpp',
|
|
'ScreenLuminance.cpp',
|
|
'ScreenOrientation.cpp',
|
|
'ScriptableContentIterator.cpp',
|
|
'Selection.cpp',
|
|
'SelectionChangeEventDispatcher.cpp',
|
|
'SerializedStackHolder.cpp',
|
|
'ShadowRoot.cpp',
|
|
'StaticRange.cpp',
|
|
'StorageAccessPermissionRequest.cpp',
|
|
'StructuredCloneBlob.cpp',
|
|
'StructuredCloneHolder.cpp',
|
|
'StructuredCloneTester.cpp',
|
|
'StyledRange.cpp',
|
|
'StyleSheetList.cpp',
|
|
'SubtleCrypto.cpp',
|
|
'Text.cpp',
|
|
'TextInputProcessor.cpp',
|
|
'ThirdPartyUtil.cpp',
|
|
'Timeout.cpp',
|
|
'TimeoutBudgetManager.cpp',
|
|
'TimeoutExecutor.cpp',
|
|
'TimeoutHandler.cpp',
|
|
'TimeoutManager.cpp',
|
|
'TreeWalker.cpp',
|
|
'UIDirectionManager.cpp',
|
|
'UserActivation.cpp',
|
|
'ViewportMetaData.cpp',
|
|
'VisualViewport.cpp',
|
|
'WindowDestroyedEvent.cpp',
|
|
'WindowNamedPropertiesHandler.cpp',
|
|
'WindowOrientationObserver.cpp',
|
|
'XPathGenerator.cpp',
|
|
]
|
|
|
|
if CONFIG['MOZ_WEBRTC']:
|
|
UNIFIED_SOURCES += [
|
|
'nsDOMDataChannel.cpp',
|
|
]
|
|
|
|
if CONFIG['FUZZING']:
|
|
UNIFIED_SOURCES += [
|
|
'FuzzingFunctions.cpp',
|
|
]
|
|
|
|
if CONFIG['MOZ_PLACES']:
|
|
UNIFIED_SOURCES += [
|
|
'PlacesEvent.cpp',
|
|
'PlacesObservers.cpp',
|
|
'PlacesWeakCallbackWrapper.cpp',
|
|
]
|
|
|
|
# these files couldn't be in UNIFIED_SOURCES for now for reasons given below:
|
|
SOURCES += [
|
|
# Several conflicts with other bindings.
|
|
'DOMIntersectionObserver.cpp',
|
|
# Because of OS X headers.
|
|
'nsContentUtils.cpp',
|
|
# this file doesn't like windows.h
|
|
'nsDOMWindowUtils.cpp',
|
|
# Conflicts with windows.h's definition of SendMessage.
|
|
'nsFrameMessageManager.cpp',
|
|
# These files have a #error "Never include unwrapped windows.h in this file!"
|
|
'nsGlobalWindowInner.cpp',
|
|
'nsGlobalWindowOuter.cpp',
|
|
# Conflicts with windows.h's definition of LoadImage.
|
|
'nsImageLoadingContent.cpp',
|
|
# Because of OS X headers.
|
|
'nsObjectLoadingContent.cpp',
|
|
# nsPluginArray.cpp includes npapi.h indirectly, and that includes a lot of system headers
|
|
'nsPluginArray.cpp',
|
|
]
|
|
|
|
# Are we targeting x86-32 or x86-64? If so, we want to include SSE2 code for
|
|
# nsTextFragment.cpp
|
|
if CONFIG['INTEL_ARCHITECTURE']:
|
|
SOURCES += ['nsTextFragmentSSE2.cpp']
|
|
SOURCES['nsTextFragmentSSE2.cpp'].flags += CONFIG['SSE2_FLAGS']
|
|
|
|
# Are we targeting PowerPC? If so, we can enable a SIMD version for
|
|
# nsTextFragment.cpp as well.
|
|
if CONFIG['CPU_ARCH'].startswith('ppc'):
|
|
SOURCES += ['nsTextFragmentVMX.cpp']
|
|
SOURCES['nsTextFragmentVMX.cpp'].flags += CONFIG['PPC_VMX_FLAGS']
|
|
|
|
EXTRA_JS_MODULES += [
|
|
'ContentAreaDropListener.jsm',
|
|
'DOMRequestHelper.jsm',
|
|
'IndexedDBHelper.jsm',
|
|
'ProcessSelector.jsm',
|
|
'SlowScriptDebug.jsm',
|
|
]
|
|
|
|
XPCOM_MANIFESTS += [
|
|
'components.conf',
|
|
]
|
|
|
|
LOCAL_INCLUDES += [
|
|
'../battery',
|
|
'../events',
|
|
'../media',
|
|
'../network',
|
|
'/caps',
|
|
'/docshell/base',
|
|
'/dom/base',
|
|
'/dom/file',
|
|
'/dom/geolocation',
|
|
'/dom/html',
|
|
'/dom/ipc',
|
|
'/dom/storage',
|
|
'/dom/svg',
|
|
'/dom/u2f',
|
|
'/dom/xml',
|
|
'/dom/xslt/xpath',
|
|
'/dom/xul',
|
|
'/extensions/permissions',
|
|
'/gfx/2d',
|
|
'/image',
|
|
'/js/xpconnect/loader',
|
|
'/js/xpconnect/src',
|
|
'/js/xpconnect/wrappers',
|
|
'/layout/base',
|
|
'/layout/forms',
|
|
'/layout/generic',
|
|
'/layout/style',
|
|
'/layout/svg',
|
|
'/layout/xul',
|
|
'/netwerk/base',
|
|
'/netwerk/url-classifier',
|
|
'/security/manager/ssl',
|
|
'/widget',
|
|
'/xpcom/ds',
|
|
]
|
|
|
|
if CONFIG['MOZ_WEBRTC']:
|
|
LOCAL_INCLUDES += [
|
|
'/netwerk/sctp/datachannel',
|
|
]
|
|
|
|
include('/ipc/chromium/chromium-config.mozbuild')
|
|
|
|
FINAL_LIBRARY = 'xul'
|
|
|
|
if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
|
|
DEFINES['HAVE_SIDEBAR'] = True
|
|
|
|
if CONFIG['MOZ_X11']:
|
|
CXXFLAGS += CONFIG['TK_CFLAGS']
|
|
|
|
GeneratedFile('UseCounterList.h', script='gen-usecounters.py',
|
|
entry_point='use_counter_list', inputs=['UseCounters.conf'])
|
|
|
|
GeneratedFile('UseCounterWorkerList.h', script='gen-usecounters.py',
|
|
entry_point='use_counter_list', inputs=['UseCountersWorker.conf'])
|
|
|
|
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
|
CXXFLAGS += ['-Wno-error=shadow']
|