mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
3151ea13e6
--HG-- rename : content/base/src/Attr.cpp => dom/base/Attr.cpp rename : content/base/src/Attr.h => dom/base/Attr.h rename : content/base/src/AutocompleteFieldList.h => dom/base/AutocompleteFieldList.h rename : content/base/public/BlobSet.h => dom/base/BlobSet.h rename : content/base/public/CORSMode.h => dom/base/CORSMode.h rename : content/base/src/ChildIterator.cpp => dom/base/ChildIterator.cpp rename : content/base/src/ChildIterator.h => dom/base/ChildIterator.h rename : content/base/src/Comment.cpp => dom/base/Comment.cpp rename : content/base/src/Comment.h => dom/base/Comment.h rename : content/base/src/DOMImplementation.cpp => dom/base/DOMImplementation.cpp rename : content/base/src/DOMImplementation.h => dom/base/DOMImplementation.h rename : content/base/src/DOMMatrix.cpp => dom/base/DOMMatrix.cpp rename : content/base/src/DOMMatrix.h => dom/base/DOMMatrix.h rename : content/base/src/DOMParser.cpp => dom/base/DOMParser.cpp rename : content/base/src/DOMParser.h => dom/base/DOMParser.h rename : content/base/src/DOMPoint.cpp => dom/base/DOMPoint.cpp rename : content/base/src/DOMPoint.h => dom/base/DOMPoint.h rename : content/base/src/DOMQuad.cpp => dom/base/DOMQuad.cpp rename : content/base/src/DOMQuad.h => dom/base/DOMQuad.h rename : content/base/src/DOMRect.cpp => dom/base/DOMRect.cpp rename : content/base/src/DOMRect.h => dom/base/DOMRect.h rename : content/base/src/DOMStringList.cpp => dom/base/DOMStringList.cpp rename : content/base/src/DOMStringList.h => dom/base/DOMStringList.h rename : content/base/src/DirectionalityUtils.cpp => dom/base/DirectionalityUtils.cpp rename : content/base/public/DirectionalityUtils.h => dom/base/DirectionalityUtils.h rename : content/base/src/DocumentFragment.cpp => dom/base/DocumentFragment.cpp rename : content/base/src/DocumentFragment.h => dom/base/DocumentFragment.h rename : content/base/src/DocumentType.cpp => dom/base/DocumentType.cpp rename : content/base/src/DocumentType.h => dom/base/DocumentType.h rename : content/base/src/Element.cpp => dom/base/Element.cpp rename : content/base/public/Element.h => dom/base/Element.h rename : content/base/public/ElementInlines.h => dom/base/ElementInlines.h rename : content/base/src/EventSource.cpp => dom/base/EventSource.cpp rename : content/base/src/EventSource.h => dom/base/EventSource.h rename : content/base/src/FeedWriterEnabled.h => dom/base/FeedWriterEnabled.h rename : content/base/src/File.cpp => dom/base/File.cpp rename : content/base/public/File.h => dom/base/File.h rename : content/base/src/FileIOObject.cpp => dom/base/FileIOObject.cpp rename : content/base/src/FileIOObject.h => dom/base/FileIOObject.h rename : content/base/src/FragmentOrElement.cpp => dom/base/FragmentOrElement.cpp rename : content/base/public/FragmentOrElement.h => dom/base/FragmentOrElement.h rename : content/base/public/FromParser.h => dom/base/FromParser.h rename : content/base/public/HTMLSplitOnSpacesTokenizer.h => dom/base/HTMLSplitOnSpacesTokenizer.h rename : content/base/src/ImportManager.cpp => dom/base/ImportManager.cpp rename : content/base/src/ImportManager.h => dom/base/ImportManager.h rename : content/base/src/Link.cpp => dom/base/Link.cpp rename : content/base/src/Link.h => dom/base/Link.h rename : content/base/src/MultipartFileImpl.cpp => dom/base/MultipartFileImpl.cpp rename : content/base/src/MultipartFileImpl.h => dom/base/MultipartFileImpl.h rename : content/base/src/NodeIterator.cpp => dom/base/NodeIterator.cpp rename : content/base/src/NodeIterator.h => dom/base/NodeIterator.h rename : content/base/src/ResponsiveImageSelector.cpp => dom/base/ResponsiveImageSelector.cpp rename : content/base/src/ResponsiveImageSelector.h => dom/base/ResponsiveImageSelector.h rename : content/base/src/ShadowRoot.cpp => dom/base/ShadowRoot.cpp rename : content/base/src/ShadowRoot.h => dom/base/ShadowRoot.h rename : content/base/src/StyleSheetList.cpp => dom/base/StyleSheetList.cpp rename : content/base/src/StyleSheetList.h => dom/base/StyleSheetList.h rename : content/base/src/Text.cpp => dom/base/Text.cpp rename : content/base/src/Text.h => dom/base/Text.h rename : content/base/src/ThirdPartyUtil.cpp => dom/base/ThirdPartyUtil.cpp rename : content/base/src/ThirdPartyUtil.h => dom/base/ThirdPartyUtil.h rename : content/base/src/TreeWalker.cpp => dom/base/TreeWalker.cpp rename : content/base/src/TreeWalker.h => dom/base/TreeWalker.h rename : content/base/src/WebSocket.cpp => dom/base/WebSocket.cpp rename : content/base/src/WebSocket.h => dom/base/WebSocket.h rename : content/base/src/contentAreaDropListener.js => dom/base/contentAreaDropListener.js rename : content/base/src/contentAreaDropListener.manifest => dom/base/contentAreaDropListener.manifest rename : content/base/crashtests/1024428-1.html => dom/base/crashtests/1024428-1.html rename : content/base/crashtests/1026714.html => dom/base/crashtests/1026714.html rename : content/base/crashtests/1027461-1.html => dom/base/crashtests/1027461-1.html rename : content/base/crashtests/1027461-inner.xul => dom/base/crashtests/1027461-inner.xul rename : content/base/crashtests/116848-1.html => dom/base/crashtests/116848-1.html rename : content/base/crashtests/149320-1.html => dom/base/crashtests/149320-1.html rename : content/base/crashtests/205225-1.html => dom/base/crashtests/205225-1.html rename : content/base/crashtests/231475-1.html => dom/base/crashtests/231475-1.html rename : content/base/crashtests/293388-1.html => dom/base/crashtests/293388-1.html rename : content/base/crashtests/308120-1.xul => dom/base/crashtests/308120-1.xul rename : content/base/crashtests/324871-1.html => dom/base/crashtests/324871-1.html rename : content/base/crashtests/325730-1.html => dom/base/crashtests/325730-1.html rename : content/base/crashtests/326618-1.html => dom/base/crashtests/326618-1.html rename : content/base/crashtests/326646-1.html => dom/base/crashtests/326646-1.html rename : content/base/crashtests/326778-1.xul => dom/base/crashtests/326778-1.xul rename : content/base/crashtests/326865-1.html => dom/base/crashtests/326865-1.html rename : content/base/crashtests/327694.html => dom/base/crashtests/327694.html rename : content/base/crashtests/330925-1.xhtml => dom/base/crashtests/330925-1.xhtml rename : content/base/crashtests/336381-1.xhtml => dom/base/crashtests/336381-1.xhtml rename : content/base/crashtests/336715-1.xhtml => dom/base/crashtests/336715-1.xhtml rename : content/base/crashtests/338391-1.xhtml => dom/base/crashtests/338391-1.xhtml rename : content/base/crashtests/340733-1.html => dom/base/crashtests/340733-1.html rename : content/base/crashtests/343730-1.xhtml => dom/base/crashtests/343730-1.xhtml rename : content/base/crashtests/343850-1.xhtml => dom/base/crashtests/343850-1.xhtml rename : content/base/crashtests/343889-1.html => dom/base/crashtests/343889-1.html rename : content/base/crashtests/344434-1.xhtml => dom/base/crashtests/344434-1.xhtml rename : content/base/crashtests/344882-1.html => dom/base/crashtests/344882-1.html rename : content/base/crashtests/345837-1.xhtml => dom/base/crashtests/345837-1.xhtml rename : content/base/crashtests/348049-1.xhtml => dom/base/crashtests/348049-1.xhtml rename : content/base/crashtests/349355-1.html => dom/base/crashtests/349355-1.html rename : content/base/crashtests/354645-1.xul => dom/base/crashtests/354645-1.xul rename : content/base/crashtests/360599-1.html => dom/base/crashtests/360599-1.html rename : content/base/crashtests/366200-1.xhtml => dom/base/crashtests/366200-1.xhtml rename : content/base/crashtests/371466-1.xhtml => dom/base/crashtests/371466-1.xhtml rename : content/base/crashtests/377360-1.xhtml => dom/base/crashtests/377360-1.xhtml rename : content/base/crashtests/377960-1.html => dom/base/crashtests/377960-1.html rename : content/base/crashtests/377960-2.html => dom/base/crashtests/377960-2.html rename : content/base/crashtests/384663-1-inner.xul => dom/base/crashtests/384663-1-inner.xul rename : content/base/crashtests/384663-1.html => dom/base/crashtests/384663-1.html rename : content/base/crashtests/386000-1.html => dom/base/crashtests/386000-1.html rename : content/base/crashtests/386794-1.html => dom/base/crashtests/386794-1.html rename : content/base/crashtests/387460-1-inner.xhtml => dom/base/crashtests/387460-1-inner.xhtml rename : content/base/crashtests/387460-1.html => dom/base/crashtests/387460-1.html rename : content/base/crashtests/395469-1.xhtml => dom/base/crashtests/395469-1.xhtml rename : content/base/crashtests/395469-2.xhtml => dom/base/crashtests/395469-2.xhtml rename : content/base/crashtests/398088-1.xul => dom/base/crashtests/398088-1.xul rename : content/base/crashtests/399712-1.html => dom/base/crashtests/399712-1.html rename : content/base/crashtests/400763-1.html => dom/base/crashtests/400763-1.html rename : content/base/crashtests/401993-1.html => dom/base/crashtests/401993-1.html rename : content/base/crashtests/401993-1.xml => dom/base/crashtests/401993-1.xml rename : content/base/crashtests/407818.html => dom/base/crashtests/407818.html rename : content/base/crashtests/410860-1.xml => dom/base/crashtests/410860-1.xml rename : content/base/crashtests/411882-1.xhtml => dom/base/crashtests/411882-1.xhtml rename : content/base/crashtests/416734-1.html => dom/base/crashtests/416734-1.html rename : content/base/crashtests/418928-1.html => dom/base/crashtests/418928-1.html rename : content/base/crashtests/420620-1.html => dom/base/crashtests/420620-1.html rename : content/base/crashtests/424276-1.html => dom/base/crashtests/424276-1.html rename : content/base/crashtests/426987-1.html => dom/base/crashtests/426987-1.html rename : content/base/crashtests/43040-1.html => dom/base/crashtests/43040-1.html rename : content/base/crashtests/443538-1.svg => dom/base/crashtests/443538-1.svg rename : content/base/crashtests/448615-1.html => dom/base/crashtests/448615-1.html rename : content/base/crashtests/450383-1.html => dom/base/crashtests/450383-1.html rename : content/base/crashtests/450385-1.html => dom/base/crashtests/450385-1.html rename : content/base/crashtests/458637-1-inner.xhtml => dom/base/crashtests/458637-1-inner.xhtml rename : content/base/crashtests/458637-1.html => dom/base/crashtests/458637-1.html rename : content/base/crashtests/467392.html => dom/base/crashtests/467392.html rename : content/base/crashtests/472593-1.html => dom/base/crashtests/472593-1.html rename : content/base/crashtests/474041-1.svg => dom/base/crashtests/474041-1.svg rename : content/base/crashtests/483818-1.html => dom/base/crashtests/483818-1.html rename : content/base/crashtests/490760-1.xhtml => dom/base/crashtests/490760-1.xhtml rename : content/base/crashtests/493281-1.html => dom/base/crashtests/493281-1.html rename : content/base/crashtests/493281-2.html => dom/base/crashtests/493281-2.html rename : content/base/crashtests/494810-1.html => dom/base/crashtests/494810-1.html rename : content/base/crashtests/509536-1.html => dom/base/crashtests/509536-1.html rename : content/base/crashtests/522516-1.html => dom/base/crashtests/522516-1.html rename : content/base/crashtests/529670.html => dom/base/crashtests/529670.html rename : content/base/crashtests/535926-1.html => dom/base/crashtests/535926-1.html rename : content/base/crashtests/543645.html => dom/base/crashtests/543645.html rename : content/base/crashtests/551631-1.html => dom/base/crashtests/551631-1.html rename : content/base/crashtests/552651.html => dom/base/crashtests/552651.html rename : content/base/crashtests/552651.xml => dom/base/crashtests/552651.xml rename : content/base/crashtests/554230-1.xhtml => dom/base/crashtests/554230-1.xhtml rename : content/base/crashtests/558973.html => dom/base/crashtests/558973.html rename : content/base/crashtests/561981-1-iframe.xhtml => dom/base/crashtests/561981-1-iframe.xhtml rename : content/base/crashtests/561981-1.html => dom/base/crashtests/561981-1.html rename : content/base/crashtests/561981-2-iframe.xhtml => dom/base/crashtests/561981-2-iframe.xhtml rename : content/base/crashtests/561981-2.html => dom/base/crashtests/561981-2.html rename : content/base/crashtests/564079-1.html => dom/base/crashtests/564079-1.html rename : content/base/crashtests/564114.html => dom/base/crashtests/564114.html rename : content/base/crashtests/565125-1.html => dom/base/crashtests/565125-1.html rename : content/base/crashtests/575462.svg => dom/base/crashtests/575462.svg rename : content/base/crashtests/582601.html => dom/base/crashtests/582601.html rename : content/base/crashtests/590395-1.html => dom/base/crashtests/590395-1.html rename : content/base/crashtests/593302-1.html => dom/base/crashtests/593302-1.html rename : content/base/crashtests/593302-2.html => dom/base/crashtests/593302-2.html rename : content/base/crashtests/595606-1.html => dom/base/crashtests/595606-1.html rename : content/base/crashtests/595606-2.html => dom/base/crashtests/595606-2.html rename : content/base/crashtests/604262-1.html => dom/base/crashtests/604262-1.html rename : content/base/crashtests/605672-1.svg => dom/base/crashtests/605672-1.svg rename : content/base/crashtests/606729-1.html => dom/base/crashtests/606729-1.html rename : content/base/crashtests/610571-1.html => dom/base/crashtests/610571-1.html rename : content/base/crashtests/628599-1.html => dom/base/crashtests/628599-1.html rename : content/base/crashtests/637214-1.svg => dom/base/crashtests/637214-1.svg rename : content/base/crashtests/637214-2.svg => dom/base/crashtests/637214-2.svg rename : content/base/crashtests/642022-1.html => dom/base/crashtests/642022-1.html rename : content/base/crashtests/646184.html => dom/base/crashtests/646184.html rename : content/base/crashtests/658845-1.svg => dom/base/crashtests/658845-1.svg rename : content/base/crashtests/667336-1.html => dom/base/crashtests/667336-1.html rename : content/base/crashtests/679459.html => dom/base/crashtests/679459.html rename : content/base/crashtests/679689-1.html => dom/base/crashtests/679689-1.html rename : content/base/crashtests/682463.html => dom/base/crashtests/682463.html rename : content/base/crashtests/693212.xhtml => dom/base/crashtests/693212.xhtml rename : content/base/crashtests/698974-1.html => dom/base/crashtests/698974-1.html rename : content/base/crashtests/700090-1.html => dom/base/crashtests/700090-1.html rename : content/base/crashtests/700090-2.html => dom/base/crashtests/700090-2.html rename : content/base/crashtests/700512-worker.js => dom/base/crashtests/700512-worker.js rename : content/base/crashtests/700512.html => dom/base/crashtests/700512.html rename : content/base/crashtests/709384.html => dom/base/crashtests/709384.html rename : content/base/crashtests/709954.html => dom/base/crashtests/709954.html rename : content/base/crashtests/713417-2.html => dom/base/crashtests/713417-2.html rename : content/base/crashtests/713417.html => dom/base/crashtests/713417.html rename : content/base/crashtests/715056.html => dom/base/crashtests/715056.html rename : content/base/crashtests/741163-1.html => dom/base/crashtests/741163-1.html rename : content/base/crashtests/752226-1.html => dom/base/crashtests/752226-1.html rename : content/base/crashtests/752226-2.html => dom/base/crashtests/752226-2.html rename : content/base/crashtests/766426.html => dom/base/crashtests/766426.html rename : content/base/crashtests/771639.html => dom/base/crashtests/771639.html rename : content/base/crashtests/786854.html => dom/base/crashtests/786854.html rename : content/base/crashtests/815043.html => dom/base/crashtests/815043.html rename : content/base/crashtests/815276.html => dom/base/crashtests/815276.html rename : content/base/crashtests/815477.html => dom/base/crashtests/815477.html rename : content/base/crashtests/815500.html => dom/base/crashtests/815500.html rename : content/base/crashtests/816253.html => dom/base/crashtests/816253.html rename : content/base/crashtests/819014.html => dom/base/crashtests/819014.html rename : content/base/crashtests/822691.html => dom/base/crashtests/822691.html rename : content/base/crashtests/822723.html => dom/base/crashtests/822723.html rename : content/base/crashtests/824719.html => dom/base/crashtests/824719.html rename : content/base/crashtests/827190.html => dom/base/crashtests/827190.html rename : content/base/crashtests/828054.html => dom/base/crashtests/828054.html rename : content/base/crashtests/828903-iframe.html => dom/base/crashtests/828903-iframe.html rename : content/base/crashtests/828903.html => dom/base/crashtests/828903.html rename : content/base/crashtests/829428.html => dom/base/crashtests/829428.html rename : content/base/crashtests/830098.html => dom/base/crashtests/830098.html rename : content/base/crashtests/831287.html => dom/base/crashtests/831287.html rename : content/base/crashtests/832644.html => dom/base/crashtests/832644.html rename : content/base/crashtests/836890.html => dom/base/crashtests/836890.html rename : content/base/crashtests/838489-1.html => dom/base/crashtests/838489-1.html rename : content/base/crashtests/838489-2.html => dom/base/crashtests/838489-2.html rename : content/base/crashtests/841205.html => dom/base/crashtests/841205.html rename : content/base/crashtests/844404.html => dom/base/crashtests/844404.html rename : content/base/crashtests/845093-1.html => dom/base/crashtests/845093-1.html rename : content/base/crashtests/845093-2.html => dom/base/crashtests/845093-2.html rename : content/base/crashtests/847127.html => dom/base/crashtests/847127.html rename : content/base/crashtests/849601.html => dom/base/crashtests/849601.html rename : content/base/crashtests/849727.html => dom/base/crashtests/849727.html rename : content/base/crashtests/849732.html => dom/base/crashtests/849732.html rename : content/base/crashtests/851353-1.html => dom/base/crashtests/851353-1.html rename : content/base/crashtests/863950.html => dom/base/crashtests/863950.html rename : content/base/crashtests/864448.html => dom/base/crashtests/864448.html rename : content/base/crashtests/930250.html => dom/base/crashtests/930250.html rename : content/base/crashtests/942979.html => dom/base/crashtests/942979.html rename : content/base/crashtests/978646.html => dom/base/crashtests/978646.html rename : content/base/crashtests/xhr_abortinprogress.html => dom/base/crashtests/xhr_abortinprogress.html rename : content/base/crashtests/xhr_empty_datauri.html => dom/base/crashtests/xhr_empty_datauri.html rename : content/base/crashtests/xhr_html_nullresponse.html => dom/base/crashtests/xhr_html_nullresponse.html rename : content/base/src/messageWakeupService.js => dom/base/messageWakeupService.js rename : content/base/src/messageWakeupService.manifest => dom/base/messageWakeupService.manifest rename : content/base/src/mozAutoDocUpdate.h => dom/base/mozAutoDocUpdate.h rename : content/base/public/mozFlushType.h => dom/base/mozFlushType.h rename : content/base/src/nsAtomListUtils.cpp => dom/base/nsAtomListUtils.cpp rename : content/base/src/nsAtomListUtils.h => dom/base/nsAtomListUtils.h rename : content/base/src/nsAttrAndChildArray.cpp => dom/base/nsAttrAndChildArray.cpp rename : content/base/src/nsAttrAndChildArray.h => dom/base/nsAttrAndChildArray.h rename : content/base/src/nsAttrName.h => dom/base/nsAttrName.h rename : content/base/src/nsAttrValue.cpp => dom/base/nsAttrValue.cpp rename : content/base/src/nsAttrValue.h => dom/base/nsAttrValue.h rename : content/base/src/nsAttrValueInlines.h => dom/base/nsAttrValueInlines.h rename : content/base/src/nsAttrValueOrString.cpp => dom/base/nsAttrValueOrString.cpp rename : content/base/src/nsAttrValueOrString.h => dom/base/nsAttrValueOrString.h rename : content/base/src/nsCCUncollectableMarker.cpp => dom/base/nsCCUncollectableMarker.cpp rename : content/base/src/nsCCUncollectableMarker.h => dom/base/nsCCUncollectableMarker.h rename : content/base/src/nsCSPContext.cpp => dom/base/nsCSPContext.cpp rename : content/base/src/nsCSPContext.h => dom/base/nsCSPContext.h rename : content/base/src/nsCSPParser.cpp => dom/base/nsCSPParser.cpp rename : content/base/src/nsCSPParser.h => dom/base/nsCSPParser.h rename : content/base/src/nsCSPService.cpp => dom/base/nsCSPService.cpp rename : content/base/src/nsCSPService.h => dom/base/nsCSPService.h rename : content/base/src/nsCSPUtils.cpp => dom/base/nsCSPUtils.cpp rename : content/base/src/nsCSPUtils.h => dom/base/nsCSPUtils.h rename : content/base/public/nsCaseTreatment.h => dom/base/nsCaseTreatment.h rename : content/base/src/nsContentAreaDragDrop.cpp => dom/base/nsContentAreaDragDrop.cpp rename : content/base/src/nsContentAreaDragDrop.h => dom/base/nsContentAreaDragDrop.h rename : content/base/public/nsContentCID.h => dom/base/nsContentCID.h rename : content/base/public/nsContentCreatorFunctions.h => dom/base/nsContentCreatorFunctions.h rename : content/base/src/nsContentIterator.cpp => dom/base/nsContentIterator.cpp rename : content/base/src/nsContentList.cpp => dom/base/nsContentList.cpp rename : content/base/src/nsContentList.h => dom/base/nsContentList.h rename : content/base/src/nsContentListDeclarations.h => dom/base/nsContentListDeclarations.h rename : content/base/src/nsContentPolicy.cpp => dom/base/nsContentPolicy.cpp rename : content/base/src/nsContentPolicy.h => dom/base/nsContentPolicy.h rename : content/base/public/nsContentPolicyUtils.h => dom/base/nsContentPolicyUtils.h rename : content/base/src/nsContentSink.cpp => dom/base/nsContentSink.cpp rename : content/base/src/nsContentSink.h => dom/base/nsContentSink.h rename : content/base/public/nsContentTypeParser.h => dom/base/nsContentTypeParser.h rename : content/base/src/nsContentUtils.cpp => dom/base/nsContentUtils.cpp rename : content/base/public/nsContentUtils.h => dom/base/nsContentUtils.h rename : content/base/src/nsCopySupport.cpp => dom/base/nsCopySupport.cpp rename : content/base/public/nsCopySupport.h => dom/base/nsCopySupport.h rename : content/base/src/nsCrossSiteListenerProxy.cpp => dom/base/nsCrossSiteListenerProxy.cpp rename : content/base/src/nsCrossSiteListenerProxy.h => dom/base/nsCrossSiteListenerProxy.h rename : content/base/src/nsDOMAttributeMap.cpp => dom/base/nsDOMAttributeMap.cpp rename : content/base/src/nsDOMAttributeMap.h => dom/base/nsDOMAttributeMap.h rename : content/base/src/nsDOMCaretPosition.cpp => dom/base/nsDOMCaretPosition.cpp rename : content/base/src/nsDOMCaretPosition.h => dom/base/nsDOMCaretPosition.h rename : content/base/src/nsDOMDataChannel.cpp => dom/base/nsDOMDataChannel.cpp rename : content/base/src/nsDOMDataChannel.h => dom/base/nsDOMDataChannel.h rename : content/base/src/nsDOMDataChannelDeclarations.h => dom/base/nsDOMDataChannelDeclarations.h rename : content/base/src/nsDOMFileReader.cpp => dom/base/nsDOMFileReader.cpp rename : content/base/src/nsDOMFileReader.h => dom/base/nsDOMFileReader.h rename : content/base/src/nsDOMMutationObserver.cpp => dom/base/nsDOMMutationObserver.cpp rename : content/base/src/nsDOMMutationObserver.h => dom/base/nsDOMMutationObserver.h rename : content/base/src/nsDOMSerializer.cpp => dom/base/nsDOMSerializer.cpp rename : content/base/src/nsDOMSerializer.h => dom/base/nsDOMSerializer.h rename : content/base/src/nsDOMSettableTokenList.cpp => dom/base/nsDOMSettableTokenList.cpp rename : content/base/src/nsDOMSettableTokenList.h => dom/base/nsDOMSettableTokenList.h rename : content/base/src/nsDOMTokenList.cpp => dom/base/nsDOMTokenList.cpp rename : content/base/src/nsDOMTokenList.h => dom/base/nsDOMTokenList.h rename : content/base/src/nsDataDocumentContentPolicy.cpp => dom/base/nsDataDocumentContentPolicy.cpp rename : content/base/src/nsDataDocumentContentPolicy.h => dom/base/nsDataDocumentContentPolicy.h rename : content/base/public/nsDeprecatedOperationList.h => dom/base/nsDeprecatedOperationList.h rename : content/base/public/nsDocElementCreatedNotificationRunner.h => dom/base/nsDocElementCreatedNotificationRunner.h rename : content/base/src/nsDocument.cpp => dom/base/nsDocument.cpp rename : content/base/src/nsDocument.h => dom/base/nsDocument.h rename : content/base/src/nsDocumentEncoder.cpp => dom/base/nsDocumentEncoder.cpp rename : content/base/src/nsElementFrameLoaderOwner.cpp => dom/base/nsElementFrameLoaderOwner.cpp rename : content/base/src/nsElementFrameLoaderOwner.h => dom/base/nsElementFrameLoaderOwner.h rename : content/base/src/nsFormData.cpp => dom/base/nsFormData.cpp rename : content/base/src/nsFormData.h => dom/base/nsFormData.h rename : content/base/src/nsFrameLoader.cpp => dom/base/nsFrameLoader.cpp rename : content/base/src/nsFrameLoader.h => dom/base/nsFrameLoader.h rename : content/base/src/nsFrameMessageManager.cpp => dom/base/nsFrameMessageManager.cpp rename : content/base/src/nsFrameMessageManager.h => dom/base/nsFrameMessageManager.h rename : content/base/src/nsGenConImageContent.cpp => dom/base/nsGenConImageContent.cpp rename : content/base/src/nsGenericDOMDataNode.cpp => dom/base/nsGenericDOMDataNode.cpp rename : content/base/src/nsGenericDOMDataNode.h => dom/base/nsGenericDOMDataNode.h rename : content/base/src/nsGkAtomList.h => dom/base/nsGkAtomList.h rename : content/base/src/nsGkAtoms.cpp => dom/base/nsGkAtoms.cpp rename : content/base/src/nsGkAtoms.h => dom/base/nsGkAtoms.h rename : content/base/src/nsHTMLContentSerializer.cpp => dom/base/nsHTMLContentSerializer.cpp rename : content/base/src/nsHTMLContentSerializer.h => dom/base/nsHTMLContentSerializer.h rename : content/base/src/nsHostObjectProtocolHandler.cpp => dom/base/nsHostObjectProtocolHandler.cpp rename : content/base/public/nsHostObjectProtocolHandler.h => dom/base/nsHostObjectProtocolHandler.h rename : content/base/src/nsHostObjectURI.cpp => dom/base/nsHostObjectURI.cpp rename : content/base/src/nsHostObjectURI.h => dom/base/nsHostObjectURI.h rename : content/base/public/nsIAttribute.h => dom/base/nsIAttribute.h rename : content/base/public/nsIContent.h => dom/base/nsIContent.h rename : content/base/public/nsIContentInlines.h => dom/base/nsIContentInlines.h rename : content/base/public/nsIContentIterator.h => dom/base/nsIContentIterator.h rename : content/base/public/nsIContentPolicy.idl => dom/base/nsIContentPolicy.idl rename : content/base/public/nsIContentSecurityPolicy.idl => dom/base/nsIContentSecurityPolicy.idl rename : content/base/public/nsIContentSerializer.h => dom/base/nsIContentSerializer.h rename : content/base/public/nsIDOMDataChannel.idl => dom/base/nsIDOMDataChannel.idl rename : content/base/public/nsIDOMFile.idl => dom/base/nsIDOMFile.idl rename : content/base/public/nsIDOMFileList.idl => dom/base/nsIDOMFileList.idl rename : content/base/public/nsIDOMFileReader.idl => dom/base/nsIDOMFileReader.idl rename : content/base/public/nsIDOMFormData.idl => dom/base/nsIDOMFormData.idl rename : content/base/public/nsIDOMParser.idl => dom/base/nsIDOMParser.idl rename : content/base/public/nsIDOMSerializer.idl => dom/base/nsIDOMSerializer.idl rename : content/base/public/nsIDocument.h => dom/base/nsIDocument.h rename : content/base/public/nsIDocumentEncoder.idl => dom/base/nsIDocumentEncoder.idl rename : content/base/public/nsIDocumentInlines.h => dom/base/nsIDocumentInlines.h rename : content/base/public/nsIDocumentObserver.h => dom/base/nsIDocumentObserver.h rename : content/base/public/nsIDroppedLinkHandler.idl => dom/base/nsIDroppedLinkHandler.idl rename : content/base/public/nsIFrameLoader.idl => dom/base/nsIFrameLoader.idl rename : content/base/public/nsIImageLoadingContent.idl => dom/base/nsIImageLoadingContent.idl rename : content/base/public/nsIMessageManager.idl => dom/base/nsIMessageManager.idl rename : content/base/public/nsIMutationObserver.h => dom/base/nsIMutationObserver.h rename : content/base/src/nsINode.cpp => dom/base/nsINode.cpp rename : content/base/public/nsINode.h => dom/base/nsINode.h rename : content/base/public/nsINodeList.h => dom/base/nsINodeList.h rename : content/base/public/nsIObjectLoadingContent.idl => dom/base/nsIObjectLoadingContent.idl rename : content/base/public/nsIScriptElement.h => dom/base/nsIScriptElement.h rename : content/base/public/nsIScriptLoaderObserver.idl => dom/base/nsIScriptLoaderObserver.idl rename : content/base/public/nsISelection.idl => dom/base/nsISelection.idl rename : content/base/public/nsISelectionController.idl => dom/base/nsISelectionController.idl rename : content/base/public/nsISelectionDisplay.idl => dom/base/nsISelectionDisplay.idl rename : content/base/public/nsISelectionListener.idl => dom/base/nsISelectionListener.idl rename : content/base/public/nsISelectionPrivate.idl => dom/base/nsISelectionPrivate.idl rename : content/base/public/nsIStyleSheetLinkingElement.h => dom/base/nsIStyleSheetLinkingElement.h rename : content/base/public/nsIXMLHttpRequest.idl => dom/base/nsIXMLHttpRequest.idl rename : content/base/src/nsImageLoadingContent.cpp => dom/base/nsImageLoadingContent.cpp rename : content/base/src/nsImageLoadingContent.h => dom/base/nsImageLoadingContent.h rename : content/base/src/nsInProcessTabChildGlobal.cpp => dom/base/nsInProcessTabChildGlobal.cpp rename : content/base/src/nsInProcessTabChildGlobal.h => dom/base/nsInProcessTabChildGlobal.h rename : content/base/src/nsLineBreaker.cpp => dom/base/nsLineBreaker.cpp rename : content/base/public/nsLineBreaker.h => dom/base/nsLineBreaker.h rename : content/base/src/nsMappedAttributeElement.cpp => dom/base/nsMappedAttributeElement.cpp rename : content/base/src/nsMappedAttributeElement.h => dom/base/nsMappedAttributeElement.h rename : content/base/src/nsMappedAttributes.cpp => dom/base/nsMappedAttributes.cpp rename : content/base/src/nsMappedAttributes.h => dom/base/nsMappedAttributes.h rename : content/base/src/nsMixedContentBlocker.cpp => dom/base/nsMixedContentBlocker.cpp rename : content/base/src/nsMixedContentBlocker.h => dom/base/nsMixedContentBlocker.h rename : content/base/src/nsNameSpaceManager.cpp => dom/base/nsNameSpaceManager.cpp rename : content/base/public/nsNameSpaceManager.h => dom/base/nsNameSpaceManager.h rename : content/base/src/nsNoDataProtocolContentPolicy.cpp => dom/base/nsNoDataProtocolContentPolicy.cpp rename : content/base/src/nsNoDataProtocolContentPolicy.h => dom/base/nsNoDataProtocolContentPolicy.h rename : content/base/src/nsNodeInfoManager.cpp => dom/base/nsNodeInfoManager.cpp rename : content/base/src/nsNodeInfoManager.h => dom/base/nsNodeInfoManager.h rename : content/base/src/nsNodeUtils.cpp => dom/base/nsNodeUtils.cpp rename : content/base/src/nsNodeUtils.h => dom/base/nsNodeUtils.h rename : content/base/src/nsObjectLoadingContent.cpp => dom/base/nsObjectLoadingContent.cpp rename : content/base/src/nsObjectLoadingContent.h => dom/base/nsObjectLoadingContent.h rename : content/base/src/nsPlainTextSerializer.cpp => dom/base/nsPlainTextSerializer.cpp rename : content/base/src/nsPlainTextSerializer.h => dom/base/nsPlainTextSerializer.h rename : content/base/src/nsPropertyTable.cpp => dom/base/nsPropertyTable.cpp rename : content/base/src/nsPropertyTable.h => dom/base/nsPropertyTable.h rename : content/base/src/nsRange.cpp => dom/base/nsRange.cpp rename : content/base/src/nsRange.h => dom/base/nsRange.h rename : content/base/src/nsReferencedElement.cpp => dom/base/nsReferencedElement.cpp rename : content/base/public/nsReferencedElement.h => dom/base/nsReferencedElement.h rename : content/base/src/nsSandboxFlags.h => dom/base/nsSandboxFlags.h rename : content/base/src/nsScriptElement.cpp => dom/base/nsScriptElement.cpp rename : content/base/src/nsScriptElement.h => dom/base/nsScriptElement.h rename : content/base/src/nsScriptLoader.cpp => dom/base/nsScriptLoader.cpp rename : content/base/src/nsScriptLoader.h => dom/base/nsScriptLoader.h rename : content/base/src/nsStubDocumentObserver.cpp => dom/base/nsStubDocumentObserver.cpp rename : content/base/src/nsStubDocumentObserver.h => dom/base/nsStubDocumentObserver.h rename : content/base/src/nsStubMutationObserver.cpp => dom/base/nsStubMutationObserver.cpp rename : content/base/src/nsStubMutationObserver.h => dom/base/nsStubMutationObserver.h rename : content/base/src/nsStyleLinkElement.cpp => dom/base/nsStyleLinkElement.cpp rename : content/base/src/nsStyleLinkElement.h => dom/base/nsStyleLinkElement.h rename : content/base/src/nsStyledElement.cpp => dom/base/nsStyledElement.cpp rename : content/base/src/nsStyledElement.h => dom/base/nsStyledElement.h rename : content/base/src/nsSyncLoadService.cpp => dom/base/nsSyncLoadService.cpp rename : content/base/src/nsSyncLoadService.h => dom/base/nsSyncLoadService.h rename : content/base/src/nsTextFragment.cpp => dom/base/nsTextFragment.cpp rename : content/base/src/nsTextFragment.h => dom/base/nsTextFragment.h rename : content/base/src/nsTextFragmentImpl.h => dom/base/nsTextFragmentImpl.h rename : content/base/src/nsTextFragmentSSE2.cpp => dom/base/nsTextFragmentSSE2.cpp rename : content/base/src/nsTextNode.cpp => dom/base/nsTextNode.cpp rename : content/base/src/nsTextNode.h => dom/base/nsTextNode.h rename : content/base/src/nsTraversal.cpp => dom/base/nsTraversal.cpp rename : content/base/src/nsTraversal.h => dom/base/nsTraversal.h rename : content/base/src/nsTreeSanitizer.cpp => dom/base/nsTreeSanitizer.cpp rename : content/base/public/nsTreeSanitizer.h => dom/base/nsTreeSanitizer.h rename : content/base/src/nsViewportInfo.cpp => dom/base/nsViewportInfo.cpp rename : content/base/public/nsViewportInfo.h => dom/base/nsViewportInfo.h rename : content/base/src/nsXHTMLContentSerializer.cpp => dom/base/nsXHTMLContentSerializer.cpp rename : content/base/src/nsXHTMLContentSerializer.h => dom/base/nsXHTMLContentSerializer.h rename : content/base/src/nsXMLContentSerializer.cpp => dom/base/nsXMLContentSerializer.cpp rename : content/base/src/nsXMLContentSerializer.h => dom/base/nsXMLContentSerializer.h rename : content/base/src/nsXMLHttpRequest.cpp => dom/base/nsXMLHttpRequest.cpp rename : content/base/src/nsXMLHttpRequest.h => dom/base/nsXMLHttpRequest.h rename : content/base/src/nsXMLNameSpaceMap.cpp => dom/base/nsXMLNameSpaceMap.cpp rename : content/base/public/nsXMLNameSpaceMap.h => dom/base/nsXMLNameSpaceMap.h rename : content/base/test/345339_iframe.html => dom/base/test/345339_iframe.html rename : content/base/test/Ahem.ttf => dom/base/test/Ahem.ttf rename : content/base/test/TestCSPParser.cpp => dom/base/test/TestCSPParser.cpp rename : content/base/test/TestGetURL.cpp => dom/base/test/TestGetURL.cpp rename : content/base/test/TestNativeXMLHttpRequest.cpp => dom/base/test/TestNativeXMLHttpRequest.cpp rename : content/base/test/TestPlainTextSerializer.cpp => dom/base/test/TestPlainTextSerializer.cpp rename : content/base/test/accesscontrol.resource => dom/base/test/accesscontrol.resource rename : content/base/test/accesscontrol.resource^headers^ => dom/base/test/accesscontrol.resource^headers^ rename : content/base/test/badContentType.eventsource => dom/base/test/badContentType.eventsource rename : content/base/test/badContentType.eventsource^headers^ => dom/base/test/badContentType.eventsource^headers^ rename : content/base/test/badHTTPResponseCode.eventsource => dom/base/test/badHTTPResponseCode.eventsource rename : content/base/test/badHTTPResponseCode.eventsource^headers^ => dom/base/test/badHTTPResponseCode.eventsource^headers^ rename : content/base/test/badMessageEvent.eventsource => dom/base/test/badMessageEvent.eventsource rename : content/base/test/badMessageEvent.eventsource^headers^ => dom/base/test/badMessageEvent.eventsource^headers^ rename : content/base/test/badMessageEvent2.eventsource => dom/base/test/badMessageEvent2.eventsource rename : content/base/test/badMessageEvent2.eventsource^headers^ => dom/base/test/badMessageEvent2.eventsource^headers^ rename : content/base/test/browser.ini => dom/base/test/browser.ini rename : content/base/test/browser_bug1058164.js => dom/base/test/browser_bug1058164.js rename : content/base/test/browser_bug593387.js => dom/base/test/browser_bug593387.js rename : content/base/test/browser_bug902350.js => dom/base/test/browser_bug902350.js rename : content/base/test/browser_state_notifications.js => dom/base/test/browser_state_notifications.js rename : content/base/test/bug282547.sjs => dom/base/test/bug282547.sjs rename : content/base/test/bug298064-subframe.html => dom/base/test/bug298064-subframe.html rename : content/base/test/bug313646.txt => dom/base/test/bug313646.txt rename : content/base/test/bug382113_object.html => dom/base/test/bug382113_object.html rename : content/base/test/bug419132.html => dom/base/test/bug419132.html rename : content/base/test/bug426308-redirect.sjs => dom/base/test/bug426308-redirect.sjs rename : content/base/test/bug435425.sjs => dom/base/test/bug435425.sjs rename : content/base/test/bug435425_redirect.sjs => dom/base/test/bug435425_redirect.sjs rename : content/base/test/bug444322.js => dom/base/test/bug444322.js rename : content/base/test/bug444322.txt => dom/base/test/bug444322.txt rename : content/base/test/bug444546.sjs => dom/base/test/bug444546.sjs rename : content/base/test/bug455629-helper.svg => dom/base/test/bug455629-helper.svg rename : content/base/test/bug457746.sjs => dom/base/test/bug457746.sjs rename : content/base/test/bug461735-post-redirect.js => dom/base/test/bug461735-post-redirect.js rename : content/base/test/bug461735-redirect1.sjs => dom/base/test/bug461735-redirect1.sjs rename : content/base/test/bug461735-redirect2.sjs => dom/base/test/bug461735-redirect2.sjs rename : content/base/test/bug466080.sjs => dom/base/test/bug466080.sjs rename : content/base/test/bug466409-empty.css => dom/base/test/bug466409-empty.css rename : content/base/test/bug466409-page.html => dom/base/test/bug466409-page.html rename : content/base/test/bug475156.sjs => dom/base/test/bug475156.sjs rename : content/base/test/bug482935.sjs => dom/base/test/bug482935.sjs rename : content/base/test/bug540854.sjs => dom/base/test/bug540854.sjs rename : content/base/test/bug578096LoadChromeScript.js => dom/base/test/bug578096LoadChromeScript.js rename : content/base/test/bug638112-response.txt => dom/base/test/bug638112-response.txt rename : content/base/test/bug638112.sjs => dom/base/test/bug638112.sjs rename : content/base/test/bug682592-subframe-ref.html => dom/base/test/bug682592-subframe-ref.html rename : content/base/test/bug682592-subframe.html => dom/base/test/bug682592-subframe.html rename : content/base/test/bug696301-script-1.js => dom/base/test/bug696301-script-1.js rename : content/base/test/bug696301-script-1.js^headers^ => dom/base/test/bug696301-script-1.js^headers^ rename : content/base/test/bug696301-script-2.js => dom/base/test/bug696301-script-2.js rename : content/base/test/bug803225_test_mailto.html => dom/base/test/bug803225_test_mailto.html rename : content/base/test/bug819051.sjs => dom/base/test/bug819051.sjs rename : content/base/test/chrome/blockNoPlugins.xml => dom/base/test/chrome/blockNoPlugins.xml rename : content/base/test/chrome/blockPluginHard.xml => dom/base/test/chrome/blockPluginHard.xml rename : content/base/test/chrome/bug421622-referer.sjs => dom/base/test/chrome/bug421622-referer.sjs rename : content/base/test/chrome/chrome.ini => dom/base/test/chrome/chrome.ini rename : content/base/test/chrome/cpows_child.js => dom/base/test/chrome/cpows_child.js rename : content/base/test/chrome/cpows_parent.xul => dom/base/test/chrome/cpows_parent.xul rename : content/base/test/chrome/file_bug391728.html => dom/base/test/chrome/file_bug391728.html rename : content/base/test/chrome/file_bug391728_2.html => dom/base/test/chrome/file_bug391728_2.html rename : content/base/test/chrome/file_bug549682.xul => dom/base/test/chrome/file_bug549682.xul rename : content/base/test/chrome/file_bug616841.xul => dom/base/test/chrome/file_bug616841.xul rename : content/base/test/chrome/file_bug816340.xul => dom/base/test/chrome/file_bug816340.xul rename : content/base/test/chrome/file_bug990812-1.xul => dom/base/test/chrome/file_bug990812-1.xul rename : content/base/test/chrome/file_bug990812-2.xul => dom/base/test/chrome/file_bug990812-2.xul rename : content/base/test/chrome/file_bug990812-3.xul => dom/base/test/chrome/file_bug990812-3.xul rename : content/base/test/chrome/file_bug990812-4.xul => dom/base/test/chrome/file_bug990812-4.xul rename : content/base/test/chrome/file_bug990812-5.xul => dom/base/test/chrome/file_bug990812-5.xul rename : content/base/test/chrome/file_bug990812.xul => dom/base/test/chrome/file_bug990812.xul rename : content/base/test/chrome/fileconstructor_file.png => dom/base/test/chrome/fileconstructor_file.png rename : content/base/test/chrome/frame_bug814638.xul => dom/base/test/chrome/frame_bug814638.xul rename : content/base/test/chrome/host_bug814638.xul => dom/base/test/chrome/host_bug814638.xul rename : content/base/test/chrome/mochitest.ini => dom/base/test/chrome/mochitest.ini rename : content/base/test/chrome/nochrome_bug765993.html => dom/base/test/chrome/nochrome_bug765993.html rename : content/base/test/chrome/nochrome_bug765993.js => dom/base/test/chrome/nochrome_bug765993.js rename : content/base/test/chrome/nochrome_bug765993.js^headers^ => dom/base/test/chrome/nochrome_bug765993.js^headers^ rename : content/base/test/chrome/test_bug1063837.xul => dom/base/test/chrome/test_bug1063837.xul rename : content/base/test/chrome/test_bug206691.xul => dom/base/test/chrome/test_bug206691.xul rename : content/base/test/chrome/test_bug339494.xul => dom/base/test/chrome/test_bug339494.xul rename : content/base/test/chrome/test_bug357450.xul => dom/base/test/chrome/test_bug357450.xul rename : content/base/test/chrome/test_bug380418.html => dom/base/test/chrome/test_bug380418.html rename : content/base/test/chrome/test_bug380418.html^headers^ => dom/base/test/chrome/test_bug380418.html^headers^ rename : content/base/test/chrome/test_bug383430.html => dom/base/test/chrome/test_bug383430.html rename : content/base/test/chrome/test_bug391728.html => dom/base/test/chrome/test_bug391728.html rename : content/base/test/chrome/test_bug421622.xul => dom/base/test/chrome/test_bug421622.xul rename : content/base/test/chrome/test_bug429785.xul => dom/base/test/chrome/test_bug429785.xul rename : content/base/test/chrome/test_bug430050.xul => dom/base/test/chrome/test_bug430050.xul rename : content/base/test/chrome/test_bug467123.xul => dom/base/test/chrome/test_bug467123.xul rename : content/base/test/chrome/test_bug549682.xul => dom/base/test/chrome/test_bug549682.xul rename : content/base/test/chrome/test_bug571390.xul => dom/base/test/chrome/test_bug571390.xul rename : content/base/test/chrome/test_bug574596.html => dom/base/test/chrome/test_bug574596.html rename : content/base/test/chrome/test_bug599295.html => dom/base/test/chrome/test_bug599295.html rename : content/base/test/chrome/test_bug616841.xul => dom/base/test/chrome/test_bug616841.xul rename : content/base/test/chrome/test_bug635835.xul => dom/base/test/chrome/test_bug635835.xul rename : content/base/test/chrome/test_bug650776.html => dom/base/test/chrome/test_bug650776.html rename : content/base/test/chrome/test_bug650784.html => dom/base/test/chrome/test_bug650784.html rename : content/base/test/chrome/test_bug682305.html => dom/base/test/chrome/test_bug682305.html rename : content/base/test/chrome/test_bug683852.xul => dom/base/test/chrome/test_bug683852.xul rename : content/base/test/chrome/test_bug750096.html => dom/base/test/chrome/test_bug750096.html rename : content/base/test/chrome/test_bug752226-3.xul => dom/base/test/chrome/test_bug752226-3.xul rename : content/base/test/chrome/test_bug752226-4.xul => dom/base/test/chrome/test_bug752226-4.xul rename : content/base/test/chrome/test_bug765993.html => dom/base/test/chrome/test_bug765993.html rename : content/base/test/chrome/test_bug780199.xul => dom/base/test/chrome/test_bug780199.xul rename : content/base/test/chrome/test_bug780529.xul => dom/base/test/chrome/test_bug780529.xul rename : content/base/test/chrome/test_bug800386.xul => dom/base/test/chrome/test_bug800386.xul rename : content/base/test/chrome/test_bug814638.xul => dom/base/test/chrome/test_bug814638.xul rename : content/base/test/chrome/test_bug816340.xul => dom/base/test/chrome/test_bug816340.xul rename : content/base/test/chrome/test_bug914381.html => dom/base/test/chrome/test_bug914381.html rename : content/base/test/chrome/test_bug990812.xul => dom/base/test/chrome/test_bug990812.xul rename : content/base/test/chrome/test_cpows.xul => dom/base/test/chrome/test_cpows.xul rename : content/base/test/chrome/test_document_register.xul => dom/base/test/chrome/test_document_register.xul rename : content/base/test/chrome/test_domparsing.xul => dom/base/test/chrome/test_domparsing.xul rename : content/base/test/chrome/test_fileconstructor.xul => dom/base/test/chrome/test_fileconstructor.xul rename : content/base/test/chrome/test_fileconstructor_tempfile.xul => dom/base/test/chrome/test_fileconstructor_tempfile.xul rename : content/base/test/chrome/test_title.xul => dom/base/test/chrome/test_title.xul rename : content/base/test/chrome/title_window.xul => dom/base/test/chrome/title_window.xul rename : content/base/test/copypaste.js => dom/base/test/copypaste.js rename : content/base/test/csp/chrome.ini => dom/base/test/csp/chrome.ini rename : content/base/test/csp/file_CSP.css => dom/base/test/csp/file_CSP.css rename : content/base/test/csp/file_CSP.sjs => dom/base/test/csp/file_CSP.sjs rename : content/base/test/csp/file_CSP_bug663567.xsl => dom/base/test/csp/file_CSP_bug663567.xsl rename : content/base/test/csp/file_CSP_bug663567_allows.xml => dom/base/test/csp/file_CSP_bug663567_allows.xml rename : content/base/test/csp/file_CSP_bug663567_allows.xml^headers^ => dom/base/test/csp/file_CSP_bug663567_allows.xml^headers^ rename : content/base/test/csp/file_CSP_bug663567_blocks.xml => dom/base/test/csp/file_CSP_bug663567_blocks.xml rename : content/base/test/csp/file_CSP_bug663567_blocks.xml^headers^ => dom/base/test/csp/file_CSP_bug663567_blocks.xml^headers^ rename : content/base/test/csp/file_CSP_bug802872.html => dom/base/test/csp/file_CSP_bug802872.html rename : content/base/test/csp/file_CSP_bug802872.html^headers^ => dom/base/test/csp/file_CSP_bug802872.html^headers^ rename : content/base/test/csp/file_CSP_bug802872.js => dom/base/test/csp/file_CSP_bug802872.js rename : content/base/test/csp/file_CSP_bug802872.sjs => dom/base/test/csp/file_CSP_bug802872.sjs rename : content/base/test/csp/file_CSP_bug885433_allows.html => dom/base/test/csp/file_CSP_bug885433_allows.html rename : content/base/test/csp/file_CSP_bug885433_allows.html^headers^ => dom/base/test/csp/file_CSP_bug885433_allows.html^headers^ rename : content/base/test/csp/file_CSP_bug885433_blocks.html => dom/base/test/csp/file_CSP_bug885433_blocks.html rename : content/base/test/csp/file_CSP_bug885433_blocks.html^headers^ => dom/base/test/csp/file_CSP_bug885433_blocks.html^headers^ rename : content/base/test/csp/file_CSP_bug888172.html => dom/base/test/csp/file_CSP_bug888172.html rename : content/base/test/csp/file_CSP_bug888172.sjs => dom/base/test/csp/file_CSP_bug888172.sjs rename : content/base/test/csp/file_CSP_bug909029_none.html => dom/base/test/csp/file_CSP_bug909029_none.html rename : content/base/test/csp/file_CSP_bug909029_none.html^headers^ => dom/base/test/csp/file_CSP_bug909029_none.html^headers^ rename : content/base/test/csp/file_CSP_bug909029_star.html => dom/base/test/csp/file_CSP_bug909029_star.html rename : content/base/test/csp/file_CSP_bug909029_star.html^headers^ => dom/base/test/csp/file_CSP_bug909029_star.html^headers^ rename : content/base/test/csp/file_CSP_bug910139.sjs => dom/base/test/csp/file_CSP_bug910139.sjs rename : content/base/test/csp/file_CSP_bug910139.xml => dom/base/test/csp/file_CSP_bug910139.xml rename : content/base/test/csp/file_CSP_bug910139.xsl => dom/base/test/csp/file_CSP_bug910139.xsl rename : content/base/test/csp/file_CSP_bug941404.html => dom/base/test/csp/file_CSP_bug941404.html rename : content/base/test/csp/file_CSP_bug941404_xhr.html => dom/base/test/csp/file_CSP_bug941404_xhr.html rename : content/base/test/csp/file_CSP_bug941404_xhr.html^headers^ => dom/base/test/csp/file_CSP_bug941404_xhr.html^headers^ rename : content/base/test/csp/file_CSP_evalscript_main.html => dom/base/test/csp/file_CSP_evalscript_main.html rename : content/base/test/csp/file_CSP_evalscript_main.html^headers^ => dom/base/test/csp/file_CSP_evalscript_main.html^headers^ rename : content/base/test/csp/file_CSP_evalscript_main.js => dom/base/test/csp/file_CSP_evalscript_main.js rename : content/base/test/csp/file_CSP_evalscript_main_allowed.html => dom/base/test/csp/file_CSP_evalscript_main_allowed.html rename : content/base/test/csp/file_CSP_evalscript_main_allowed.html^headers^ => dom/base/test/csp/file_CSP_evalscript_main_allowed.html^headers^ rename : content/base/test/csp/file_CSP_evalscript_main_allowed.js => dom/base/test/csp/file_CSP_evalscript_main_allowed.js rename : content/base/test/csp/file_CSP_frameancestors.sjs => dom/base/test/csp/file_CSP_frameancestors.sjs rename : content/base/test/csp/file_CSP_frameancestors_main.html => dom/base/test/csp/file_CSP_frameancestors_main.html rename : content/base/test/csp/file_CSP_frameancestors_main.js => dom/base/test/csp/file_CSP_frameancestors_main.js rename : content/base/test/csp/file_CSP_inlinescript_main.html => dom/base/test/csp/file_CSP_inlinescript_main.html rename : content/base/test/csp/file_CSP_inlinescript_main.html^headers^ => dom/base/test/csp/file_CSP_inlinescript_main.html^headers^ rename : content/base/test/csp/file_CSP_inlinescript_main_allowed.html => dom/base/test/csp/file_CSP_inlinescript_main_allowed.html rename : content/base/test/csp/file_CSP_inlinescript_main_allowed.html^headers^ => dom/base/test/csp/file_CSP_inlinescript_main_allowed.html^headers^ rename : content/base/test/csp/file_CSP_inlinestyle_main.html => dom/base/test/csp/file_CSP_inlinestyle_main.html rename : content/base/test/csp/file_CSP_inlinestyle_main.html^headers^ => dom/base/test/csp/file_CSP_inlinestyle_main.html^headers^ rename : content/base/test/csp/file_CSP_inlinestyle_main_allowed.html => dom/base/test/csp/file_CSP_inlinestyle_main_allowed.html rename : content/base/test/csp/file_CSP_inlinestyle_main_allowed.html^headers^ => dom/base/test/csp/file_CSP_inlinestyle_main_allowed.html^headers^ rename : content/base/test/csp/file_CSP_main.html => dom/base/test/csp/file_CSP_main.html rename : content/base/test/csp/file_CSP_main.html^headers^ => dom/base/test/csp/file_CSP_main.html^headers^ rename : content/base/test/csp/file_CSP_main.js => dom/base/test/csp/file_CSP_main.js rename : content/base/test/csp/file_base-uri.html => dom/base/test/csp/file_base-uri.html rename : content/base/test/csp/file_bug836922_npolicies.html => dom/base/test/csp/file_bug836922_npolicies.html rename : content/base/test/csp/file_bug836922_npolicies.html^headers^ => dom/base/test/csp/file_bug836922_npolicies.html^headers^ rename : content/base/test/csp/file_bug836922_npolicies_ro_violation.sjs => dom/base/test/csp/file_bug836922_npolicies_ro_violation.sjs rename : content/base/test/csp/file_bug836922_npolicies_violation.sjs => dom/base/test/csp/file_bug836922_npolicies_violation.sjs rename : content/base/test/csp/file_bug886164.html => dom/base/test/csp/file_bug886164.html rename : content/base/test/csp/file_bug886164.html^headers^ => dom/base/test/csp/file_bug886164.html^headers^ rename : content/base/test/csp/file_bug886164_2.html => dom/base/test/csp/file_bug886164_2.html rename : content/base/test/csp/file_bug886164_2.html^headers^ => dom/base/test/csp/file_bug886164_2.html^headers^ rename : content/base/test/csp/file_bug886164_3.html => dom/base/test/csp/file_bug886164_3.html rename : content/base/test/csp/file_bug886164_3.html^headers^ => dom/base/test/csp/file_bug886164_3.html^headers^ rename : content/base/test/csp/file_bug886164_4.html => dom/base/test/csp/file_bug886164_4.html rename : content/base/test/csp/file_bug886164_4.html^headers^ => dom/base/test/csp/file_bug886164_4.html^headers^ rename : content/base/test/csp/file_bug886164_5.html => dom/base/test/csp/file_bug886164_5.html rename : content/base/test/csp/file_bug886164_5.html^headers^ => dom/base/test/csp/file_bug886164_5.html^headers^ rename : content/base/test/csp/file_bug886164_6.html => dom/base/test/csp/file_bug886164_6.html rename : content/base/test/csp/file_bug886164_6.html^headers^ => dom/base/test/csp/file_bug886164_6.html^headers^ rename : content/base/test/csp/file_connect-src.html => dom/base/test/csp/file_connect-src.html rename : content/base/test/csp/file_csp_bug768029.html => dom/base/test/csp/file_csp_bug768029.html rename : content/base/test/csp/file_csp_bug768029.sjs => dom/base/test/csp/file_csp_bug768029.sjs rename : content/base/test/csp/file_csp_bug773891.html => dom/base/test/csp/file_csp_bug773891.html rename : content/base/test/csp/file_csp_bug773891.sjs => dom/base/test/csp/file_csp_bug773891.sjs rename : content/base/test/csp/file_csp_invalid_source_expression.html => dom/base/test/csp/file_csp_invalid_source_expression.html rename : content/base/test/csp/file_csp_path_matching.html => dom/base/test/csp/file_csp_path_matching.html rename : content/base/test/csp/file_csp_path_matching.js => dom/base/test/csp/file_csp_path_matching.js rename : content/base/test/csp/file_csp_path_matching_redirect.html => dom/base/test/csp/file_csp_path_matching_redirect.html rename : content/base/test/csp/file_csp_path_matching_redirect_server.sjs => dom/base/test/csp/file_csp_path_matching_redirect_server.sjs rename : content/base/test/csp/file_csp_redirects_main.html => dom/base/test/csp/file_csp_redirects_main.html rename : content/base/test/csp/file_csp_redirects_page.sjs => dom/base/test/csp/file_csp_redirects_page.sjs rename : content/base/test/csp/file_csp_redirects_resource.sjs => dom/base/test/csp/file_csp_redirects_resource.sjs rename : content/base/test/csp/file_csp_report.html => dom/base/test/csp/file_csp_report.html rename : content/base/test/csp/file_csp_testserver.sjs => dom/base/test/csp/file_csp_testserver.sjs rename : content/base/test/csp/file_hash_source.html => dom/base/test/csp/file_hash_source.html rename : content/base/test/csp/file_hash_source.html^headers^ => dom/base/test/csp/file_hash_source.html^headers^ rename : content/base/test/csp/file_leading_wildcard.html => dom/base/test/csp/file_leading_wildcard.html rename : content/base/test/csp/file_multi_policy_injection_bypass.html => dom/base/test/csp/file_multi_policy_injection_bypass.html rename : content/base/test/csp/file_multi_policy_injection_bypass.html^headers^ => dom/base/test/csp/file_multi_policy_injection_bypass.html^headers^ rename : content/base/test/csp/file_multi_policy_injection_bypass_2.html => dom/base/test/csp/file_multi_policy_injection_bypass_2.html rename : content/base/test/csp/file_multi_policy_injection_bypass_2.html^headers^ => dom/base/test/csp/file_multi_policy_injection_bypass_2.html^headers^ rename : content/base/test/csp/file_nonce_source.html => dom/base/test/csp/file_nonce_source.html rename : content/base/test/csp/file_nonce_source.html^headers^ => dom/base/test/csp/file_nonce_source.html^headers^ rename : content/base/test/csp/file_policyuri_regression_from_multipolicy.html => dom/base/test/csp/file_policyuri_regression_from_multipolicy.html rename : content/base/test/csp/file_policyuri_regression_from_multipolicy.html^headers^ => dom/base/test/csp/file_policyuri_regression_from_multipolicy.html^headers^ rename : content/base/test/csp/file_policyuri_regression_from_multipolicy_policy => dom/base/test/csp/file_policyuri_regression_from_multipolicy_policy rename : content/base/test/csp/file_redirect_content.sjs => dom/base/test/csp/file_redirect_content.sjs rename : content/base/test/csp/file_redirect_report.sjs => dom/base/test/csp/file_redirect_report.sjs rename : content/base/test/csp/file_report_uri_missing_in_report_only_header.html => dom/base/test/csp/file_report_uri_missing_in_report_only_header.html rename : content/base/test/csp/file_report_uri_missing_in_report_only_header.html^headers^ => dom/base/test/csp/file_report_uri_missing_in_report_only_header.html^headers^ rename : content/base/test/csp/file_self_none_as_hostname_confusion.html => dom/base/test/csp/file_self_none_as_hostname_confusion.html rename : content/base/test/csp/file_self_none_as_hostname_confusion.html^headers^ => dom/base/test/csp/file_self_none_as_hostname_confusion.html^headers^ rename : content/base/test/csp/file_subframe_run_js_if_allowed.html => dom/base/test/csp/file_subframe_run_js_if_allowed.html rename : content/base/test/csp/file_subframe_run_js_if_allowed.html^headers^ => dom/base/test/csp/file_subframe_run_js_if_allowed.html^headers^ rename : content/base/test/csp/mochitest.ini => dom/base/test/csp/mochitest.ini rename : content/base/test/csp/test_301_redirect.html => dom/base/test/csp/test_301_redirect.html rename : content/base/test/csp/test_302_redirect.html => dom/base/test/csp/test_302_redirect.html rename : content/base/test/csp/test_303_redirect.html => dom/base/test/csp/test_303_redirect.html rename : content/base/test/csp/test_307_redirect.html => dom/base/test/csp/test_307_redirect.html rename : content/base/test/csp/test_CSP.html => dom/base/test/csp/test_CSP.html rename : content/base/test/csp/test_CSP_bug663567.html => dom/base/test/csp/test_CSP_bug663567.html rename : content/base/test/csp/test_CSP_bug802872.html => dom/base/test/csp/test_CSP_bug802872.html rename : content/base/test/csp/test_CSP_bug885433.html => dom/base/test/csp/test_CSP_bug885433.html rename : content/base/test/csp/test_CSP_bug888172.html => dom/base/test/csp/test_CSP_bug888172.html rename : content/base/test/csp/test_CSP_bug909029.html => dom/base/test/csp/test_CSP_bug909029.html rename : content/base/test/csp/test_CSP_bug910139.html => dom/base/test/csp/test_CSP_bug910139.html rename : content/base/test/csp/test_CSP_bug941404.html => dom/base/test/csp/test_CSP_bug941404.html rename : content/base/test/csp/test_CSP_evalscript.html => dom/base/test/csp/test_CSP_evalscript.html rename : content/base/test/csp/test_CSP_frameancestors.html => dom/base/test/csp/test_CSP_frameancestors.html rename : content/base/test/csp/test_CSP_inlinescript.html => dom/base/test/csp/test_CSP_inlinescript.html rename : content/base/test/csp/test_CSP_inlinestyle.html => dom/base/test/csp/test_CSP_inlinestyle.html rename : content/base/test/csp/test_base-uri.html => dom/base/test/csp/test_base-uri.html rename : content/base/test/csp/test_bug836922_npolicies.html => dom/base/test/csp/test_bug836922_npolicies.html rename : content/base/test/csp/test_bug886164.html => dom/base/test/csp/test_bug886164.html rename : content/base/test/csp/test_bug949549.html => dom/base/test/csp/test_bug949549.html rename : content/base/test/csp/test_connect-src.html => dom/base/test/csp/test_connect-src.html rename : content/base/test/csp/test_csp_bug768029.html => dom/base/test/csp/test_csp_bug768029.html rename : content/base/test/csp/test_csp_bug773891.html => dom/base/test/csp/test_csp_bug773891.html rename : content/base/test/csp/test_csp_invalid_source_expression.html => dom/base/test/csp/test_csp_invalid_source_expression.html rename : content/base/test/csp/test_csp_path_matching.html => dom/base/test/csp/test_csp_path_matching.html rename : content/base/test/csp/test_csp_path_matching_redirect.html => dom/base/test/csp/test_csp_path_matching_redirect.html rename : content/base/test/csp/test_csp_redirects.html => dom/base/test/csp/test_csp_redirects.html rename : content/base/test/csp/test_csp_report.html => dom/base/test/csp/test_csp_report.html rename : content/base/test/csp/test_hash_source.html => dom/base/test/csp/test_hash_source.html rename : content/base/test/csp/test_leading_wildcard.html => dom/base/test/csp/test_leading_wildcard.html rename : content/base/test/csp/test_multi_policy_injection_bypass.html => dom/base/test/csp/test_multi_policy_injection_bypass.html rename : content/base/test/csp/test_nonce_source.html => dom/base/test/csp/test_nonce_source.html rename : content/base/test/csp/test_policyuri_regression_from_multipolicy.html => dom/base/test/csp/test_policyuri_regression_from_multipolicy.html rename : content/base/test/csp/test_report_uri_missing_in_report_only_header.html => dom/base/test/csp/test_report_uri_missing_in_report_only_header.html rename : content/base/test/csp/test_self_none_as_hostname_confusion.html => dom/base/test/csp/test_self_none_as_hostname_confusion.html rename : content/base/test/csp/test_subframe_run_js_if_allowed.html => dom/base/test/csp/test_subframe_run_js_if_allowed.html rename : content/base/test/delayedServerEvents.sjs => dom/base/test/delayedServerEvents.sjs rename : content/base/test/eventsource.resource => dom/base/test/eventsource.resource rename : content/base/test/eventsource.resource^headers^ => dom/base/test/eventsource.resource^headers^ rename : content/base/test/eventsource_redirect.resource => dom/base/test/eventsource_redirect.resource rename : content/base/test/eventsource_redirect.resource^headers^ => dom/base/test/eventsource_redirect.resource^headers^ rename : content/base/test/eventsource_redirect_to.resource => dom/base/test/eventsource_redirect_to.resource rename : content/base/test/eventsource_redirect_to.resource^headers^ => dom/base/test/eventsource_redirect_to.resource^headers^ rename : content/base/test/fake_plugin.tst => dom/base/test/fake_plugin.tst rename : content/base/test/file_CrossSiteXHR_cache_server.sjs => dom/base/test/file_CrossSiteXHR_cache_server.sjs rename : content/base/test/file_CrossSiteXHR_inner.html => dom/base/test/file_CrossSiteXHR_inner.html rename : content/base/test/file_CrossSiteXHR_inner.jar => dom/base/test/file_CrossSiteXHR_inner.jar rename : content/base/test/file_CrossSiteXHR_inner_data.sjs => dom/base/test/file_CrossSiteXHR_inner_data.sjs rename : content/base/test/file_CrossSiteXHR_server.sjs => dom/base/test/file_CrossSiteXHR_server.sjs rename : content/base/test/file_XHRDocURI.html => dom/base/test/file_XHRDocURI.html rename : content/base/test/file_XHRDocURI.html^headers^ => dom/base/test/file_XHRDocURI.html^headers^ rename : content/base/test/file_XHRDocURI.sjs => dom/base/test/file_XHRDocURI.sjs rename : content/base/test/file_XHRDocURI.text => dom/base/test/file_XHRDocURI.text rename : content/base/test/file_XHRDocURI.text^headers^ => dom/base/test/file_XHRDocURI.text^headers^ rename : content/base/test/file_XHRDocURI.xml => dom/base/test/file_XHRDocURI.xml rename : content/base/test/file_XHRDocURI.xml^headers^ => dom/base/test/file_XHRDocURI.xml^headers^ rename : content/base/test/file_XHRResponseURL.js => dom/base/test/file_XHRResponseURL.js rename : content/base/test/file_XHRResponseURL.sjs => dom/base/test/file_XHRResponseURL.sjs rename : content/base/test/file_XHRResponseURL.text => dom/base/test/file_XHRResponseURL.text rename : content/base/test/file_XHRResponseURL.text^headers^ => dom/base/test/file_XHRResponseURL.text^headers^ rename : content/base/test/file_XHRResponseURL_nocors.text => dom/base/test/file_XHRResponseURL_nocors.text rename : content/base/test/file_XHRSendData.sjs => dom/base/test/file_XHRSendData.sjs rename : content/base/test/file_XHRSendData_doc.xml => dom/base/test/file_XHRSendData_doc.xml rename : content/base/test/file_XHRSendData_doc.xml^headers^ => dom/base/test/file_XHRSendData_doc.xml^headers^ rename : content/base/test/file_XHR_anon.sjs => dom/base/test/file_XHR_anon.sjs rename : content/base/test/file_XHR_binary1.bin => dom/base/test/file_XHR_binary1.bin rename : content/base/test/file_XHR_binary1.bin^headers^ => dom/base/test/file_XHR_binary1.bin^headers^ rename : content/base/test/file_XHR_binary2.bin => dom/base/test/file_XHR_binary2.bin rename : content/base/test/file_XHR_fail1.txt => dom/base/test/file_XHR_fail1.txt rename : content/base/test/file_XHR_fail1.txt^headers^ => dom/base/test/file_XHR_fail1.txt^headers^ rename : content/base/test/file_XHR_fail1b.txt => dom/base/test/file_XHR_fail1b.txt rename : content/base/test/file_XHR_header.sjs => dom/base/test/file_XHR_header.sjs rename : content/base/test/file_XHR_pass1.xml => dom/base/test/file_XHR_pass1.xml rename : content/base/test/file_XHR_pass2.txt => dom/base/test/file_XHR_pass2.txt rename : content/base/test/file_XHR_pass3.txt => dom/base/test/file_XHR_pass3.txt rename : content/base/test/file_XHR_pass3.txt^headers^ => dom/base/test/file_XHR_pass3.txt^headers^ rename : content/base/test/file_XHR_system_redirect.html => dom/base/test/file_XHR_system_redirect.html rename : content/base/test/file_XHR_system_redirect.html^headers^ => dom/base/test/file_XHR_system_redirect.html^headers^ rename : content/base/test/file_XHR_timeout.sjs => dom/base/test/file_XHR_timeout.sjs rename : content/base/test/file_base_xbl.xml => dom/base/test/file_base_xbl.xml rename : content/base/test/file_bug1008126_worker.js => dom/base/test/file_bug1008126_worker.js rename : content/base/test/file_bug1011748_OK.sjs => dom/base/test/file_bug1011748_OK.sjs rename : content/base/test/file_bug1011748_redirect.sjs => dom/base/test/file_bug1011748_redirect.sjs rename : content/base/test/file_bug28293.sjs => dom/base/test/file_bug28293.sjs rename : content/base/test/file_bug326337.xml => dom/base/test/file_bug326337.xml rename : content/base/test/file_bug326337_inner.html => dom/base/test/file_bug326337_inner.html rename : content/base/test/file_bug326337_outer.html => dom/base/test/file_bug326337_outer.html rename : content/base/test/file_bug416317.xhtml => dom/base/test/file_bug416317.xhtml rename : content/base/test/file_bug426646-1.html => dom/base/test/file_bug426646-1.html rename : content/base/test/file_bug426646-2.html => dom/base/test/file_bug426646-2.html rename : content/base/test/file_bug428847-1.xhtml => dom/base/test/file_bug428847-1.xhtml rename : content/base/test/file_bug428847-2.xhtml => dom/base/test/file_bug428847-2.xhtml rename : content/base/test/file_bug498897.css => dom/base/test/file_bug498897.css rename : content/base/test/file_bug498897.html => dom/base/test/file_bug498897.html rename : content/base/test/file_bug498897.html^headers^ => dom/base/test/file_bug498897.html^headers^ rename : content/base/test/file_bug503473-frame.sjs => dom/base/test/file_bug503473-frame.sjs rename : content/base/test/file_bug503481.sjs => dom/base/test/file_bug503481.sjs rename : content/base/test/file_bug503481b_inner.html => dom/base/test/file_bug503481b_inner.html rename : content/base/test/file_bug541937.html => dom/base/test/file_bug541937.html rename : content/base/test/file_bug541937.xhtml => dom/base/test/file_bug541937.xhtml rename : content/base/test/file_bug557892.html => dom/base/test/file_bug557892.html rename : content/base/test/file_bug562137.txt => dom/base/test/file_bug562137.txt rename : content/base/test/file_bug590812-ref.xhtml => dom/base/test/file_bug590812-ref.xhtml rename : content/base/test/file_bug590812.xml => dom/base/test/file_bug590812.xml rename : content/base/test/file_bug590870.html => dom/base/test/file_bug590870.html rename : content/base/test/file_bug601803a.html => dom/base/test/file_bug601803a.html rename : content/base/test/file_bug601803b.html => dom/base/test/file_bug601803b.html rename : content/base/test/file_bug604660-1.xml => dom/base/test/file_bug604660-1.xml rename : content/base/test/file_bug604660-2.xsl => dom/base/test/file_bug604660-2.xsl rename : content/base/test/file_bug604660-3.js => dom/base/test/file_bug604660-3.js rename : content/base/test/file_bug604660-4.js => dom/base/test/file_bug604660-4.js rename : content/base/test/file_bug604660-5.xml => dom/base/test/file_bug604660-5.xml rename : content/base/test/file_bug604660-6.xsl => dom/base/test/file_bug604660-6.xsl rename : content/base/test/file_bug622088.sjs => dom/base/test/file_bug622088.sjs rename : content/base/test/file_bug622088_inner.html => dom/base/test/file_bug622088_inner.html rename : content/base/test/file_bug675121.sjs => dom/base/test/file_bug675121.sjs rename : content/base/test/file_bug687859-16.js => dom/base/test/file_bug687859-16.js rename : content/base/test/file_bug687859-16.js^headers^ => dom/base/test/file_bug687859-16.js^headers^ rename : content/base/test/file_bug687859-bom.js => dom/base/test/file_bug687859-bom.js rename : content/base/test/file_bug687859-bom.js^headers^ => dom/base/test/file_bug687859-bom.js^headers^ rename : content/base/test/file_bug687859-charset.js => dom/base/test/file_bug687859-charset.js rename : content/base/test/file_bug687859-http.js => dom/base/test/file_bug687859-http.js rename : content/base/test/file_bug687859-http.js^headers^ => dom/base/test/file_bug687859-http.js^headers^ rename : content/base/test/file_bug687859-inherit.js => dom/base/test/file_bug687859-inherit.js rename : content/base/test/file_bug692434.xml => dom/base/test/file_bug692434.xml rename : content/base/test/file_bug707142_baseline.json => dom/base/test/file_bug707142_baseline.json rename : content/base/test/file_bug707142_bom.json => dom/base/test/file_bug707142_bom.json rename : content/base/test/file_bug707142_utf-16.json => dom/base/test/file_bug707142_utf-16.json rename : content/base/test/file_bug708620-2.html => dom/base/test/file_bug708620-2.html rename : content/base/test/file_bug708620.html => dom/base/test/file_bug708620.html rename : content/base/test/file_bug782342.txt => dom/base/test/file_bug782342.txt rename : content/base/test/file_bug787778.sjs => dom/base/test/file_bug787778.sjs rename : content/base/test/file_bug804395.jar => dom/base/test/file_bug804395.jar rename : content/base/test/file_bug869432.eventsource => dom/base/test/file_bug869432.eventsource rename : content/base/test/file_bug869432.eventsource^headers^ => dom/base/test/file_bug869432.eventsource^headers^ rename : content/base/test/file_bug902350.html => dom/base/test/file_bug902350.html rename : content/base/test/file_bug902350_frame.html => dom/base/test/file_bug902350_frame.html rename : content/base/test/file_bug907892.html => dom/base/test/file_bug907892.html rename : content/base/test/file_bug945152.jar => dom/base/test/file_bug945152.jar rename : content/base/test/file_bug945152_worker.js => dom/base/test/file_bug945152_worker.js rename : content/base/test/file_general_document.html => dom/base/test/file_general_document.html rename : content/base/test/file_html_in_xhr.html => dom/base/test/file_html_in_xhr.html rename : content/base/test/file_html_in_xhr.sjs => dom/base/test/file_html_in_xhr.sjs rename : content/base/test/file_html_in_xhr2.html => dom/base/test/file_html_in_xhr2.html rename : content/base/test/file_html_in_xhr3.html => dom/base/test/file_html_in_xhr3.html rename : content/base/test/file_htmlserializer_1.html => dom/base/test/file_htmlserializer_1.html rename : content/base/test/file_htmlserializer_1_bodyonly.html => dom/base/test/file_htmlserializer_1_bodyonly.html rename : content/base/test/file_htmlserializer_1_format.html => dom/base/test/file_htmlserializer_1_format.html rename : content/base/test/file_htmlserializer_1_linebreak.html => dom/base/test/file_htmlserializer_1_linebreak.html rename : content/base/test/file_htmlserializer_1_links.html => dom/base/test/file_htmlserializer_1_links.html rename : content/base/test/file_htmlserializer_1_nested_body.html => dom/base/test/file_htmlserializer_1_nested_body.html rename : content/base/test/file_htmlserializer_1_no_body.html => dom/base/test/file_htmlserializer_1_no_body.html rename : content/base/test/file_htmlserializer_1_noflag.html => dom/base/test/file_htmlserializer_1_noflag.html rename : content/base/test/file_htmlserializer_1_noformatpre.html => dom/base/test/file_htmlserializer_1_noformatpre.html rename : content/base/test/file_htmlserializer_1_raw.html => dom/base/test/file_htmlserializer_1_raw.html rename : content/base/test/file_htmlserializer_1_sibling_body.html => dom/base/test/file_htmlserializer_1_sibling_body.html rename : content/base/test/file_htmlserializer_1_sibling_body_only_body.html => dom/base/test/file_htmlserializer_1_sibling_body_only_body.html rename : content/base/test/file_htmlserializer_1_wrap.html => dom/base/test/file_htmlserializer_1_wrap.html rename : content/base/test/file_htmlserializer_2.html => dom/base/test/file_htmlserializer_2.html rename : content/base/test/file_htmlserializer_2_basic.html => dom/base/test/file_htmlserializer_2_basic.html rename : content/base/test/file_htmlserializer_2_enthtml.html => dom/base/test/file_htmlserializer_2_enthtml.html rename : content/base/test/file_htmlserializer_2_entw3c.html => dom/base/test/file_htmlserializer_2_entw3c.html rename : content/base/test/file_htmlserializer_2_latin1.html => dom/base/test/file_htmlserializer_2_latin1.html rename : content/base/test/file_htmlserializer_ipv6.html => dom/base/test/file_htmlserializer_ipv6.html rename : content/base/test/file_htmlserializer_ipv6_out.html => dom/base/test/file_htmlserializer_ipv6_out.html rename : content/base/test/file_mixed_content_frameNavigation.html => dom/base/test/file_mixed_content_frameNavigation.html rename : content/base/test/file_mixed_content_frameNavigation_blankTarget.html => dom/base/test/file_mixed_content_frameNavigation_blankTarget.html rename : content/base/test/file_mixed_content_frameNavigation_grandchild.html => dom/base/test/file_mixed_content_frameNavigation_grandchild.html rename : content/base/test/file_mixed_content_frameNavigation_innermost.html => dom/base/test/file_mixed_content_frameNavigation_innermost.html rename : content/base/test/file_mixed_content_frameNavigation_secure.html => dom/base/test/file_mixed_content_frameNavigation_secure.html rename : content/base/test/file_mixed_content_frameNavigation_secure_grandchild.html => dom/base/test/file_mixed_content_frameNavigation_secure_grandchild.html rename : content/base/test/file_mixed_content_main.html => dom/base/test/file_mixed_content_main.html rename : content/base/test/file_mixed_content_main_bug803225.html => dom/base/test/file_mixed_content_main_bug803225.html rename : content/base/test/file_mixed_content_main_bug803225_websocket_wsh.py => dom/base/test/file_mixed_content_main_bug803225_websocket_wsh.py rename : content/base/test/file_mixed_content_server.sjs => dom/base/test/file_mixed_content_server.sjs rename : content/base/test/file_mozfiledataurl_audio.ogg => dom/base/test/file_mozfiledataurl_audio.ogg rename : content/base/test/file_mozfiledataurl_doc.html => dom/base/test/file_mozfiledataurl_doc.html rename : content/base/test/file_mozfiledataurl_img.jpg => dom/base/test/file_mozfiledataurl_img.jpg rename : content/base/test/file_mozfiledataurl_inner.html => dom/base/test/file_mozfiledataurl_inner.html rename : content/base/test/file_mozfiledataurl_text.txt => dom/base/test/file_mozfiledataurl_text.txt rename : content/base/test/file_restrictedEventSource.sjs => dom/base/test/file_restrictedEventSource.sjs rename : content/base/test/file_websocket_basic_wsh.py => dom/base/test/file_websocket_basic_wsh.py rename : content/base/test/file_websocket_hello_wsh.py => dom/base/test/file_websocket_hello_wsh.py rename : content/base/test/file_websocket_http_resource.txt => dom/base/test/file_websocket_http_resource.txt rename : content/base/test/file_websocket_wsh.py => dom/base/test/file_websocket_wsh.py rename : content/base/test/file_x-frame-options_main.html => dom/base/test/file_x-frame-options_main.html rename : content/base/test/file_x-frame-options_page.sjs => dom/base/test/file_x-frame-options_page.sjs rename : content/base/test/file_xhtmlserializer_1.xhtml => dom/base/test/file_xhtmlserializer_1.xhtml rename : content/base/test/file_xhtmlserializer_1_bodyonly.xhtml => dom/base/test/file_xhtmlserializer_1_bodyonly.xhtml rename : content/base/test/file_xhtmlserializer_1_format.xhtml => dom/base/test/file_xhtmlserializer_1_format.xhtml rename : content/base/test/file_xhtmlserializer_1_linebreak.xhtml => dom/base/test/file_xhtmlserializer_1_linebreak.xhtml rename : content/base/test/file_xhtmlserializer_1_links.xhtml => dom/base/test/file_xhtmlserializer_1_links.xhtml rename : content/base/test/file_xhtmlserializer_1_nested_body.xhtml => dom/base/test/file_xhtmlserializer_1_nested_body.xhtml rename : content/base/test/file_xhtmlserializer_1_no_body.xhtml => dom/base/test/file_xhtmlserializer_1_no_body.xhtml rename : content/base/test/file_xhtmlserializer_1_noflag.xhtml => dom/base/test/file_xhtmlserializer_1_noflag.xhtml rename : content/base/test/file_xhtmlserializer_1_noformatpre.xhtml => dom/base/test/file_xhtmlserializer_1_noformatpre.xhtml rename : content/base/test/file_xhtmlserializer_1_raw.xhtml => dom/base/test/file_xhtmlserializer_1_raw.xhtml rename : content/base/test/file_xhtmlserializer_1_sibling_body.xhtml => dom/base/test/file_xhtmlserializer_1_sibling_body.xhtml rename : content/base/test/file_xhtmlserializer_1_sibling_body_only_body.xhtml => dom/base/test/file_xhtmlserializer_1_sibling_body_only_body.xhtml rename : content/base/test/file_xhtmlserializer_1_wrap.xhtml => dom/base/test/file_xhtmlserializer_1_wrap.xhtml rename : content/base/test/file_xhtmlserializer_2.xhtml => dom/base/test/file_xhtmlserializer_2.xhtml rename : content/base/test/file_xhtmlserializer_2_basic.xhtml => dom/base/test/file_xhtmlserializer_2_basic.xhtml rename : content/base/test/file_xhtmlserializer_2_enthtml.xhtml => dom/base/test/file_xhtmlserializer_2_enthtml.xhtml rename : content/base/test/file_xhtmlserializer_2_entw3c.xhtml => dom/base/test/file_xhtmlserializer_2_entw3c.xhtml rename : content/base/test/file_xhtmlserializer_2_latin1.xhtml => dom/base/test/file_xhtmlserializer_2_latin1.xhtml rename : content/base/test/fileutils.js => dom/base/test/fileutils.js rename : content/base/test/forRemoval.resource => dom/base/test/forRemoval.resource rename : content/base/test/forRemoval.resource^headers^ => dom/base/test/forRemoval.resource^headers^ rename : content/base/test/formReset.html => dom/base/test/formReset.html rename : content/base/test/invalid_accesscontrol.resource => dom/base/test/invalid_accesscontrol.resource rename : content/base/test/invalid_accesscontrol.resource^headers^ => dom/base/test/invalid_accesscontrol.resource^headers^ rename : content/base/test/mochitest-child-permissions.ini => dom/base/test/mochitest-child-permissions.ini rename : content/base/test/moz.build => dom/base/test/moz.build rename : content/base/test/mutationobserver_dialog.html => dom/base/test/mutationobserver_dialog.html rename : content/base/test/progressserver.sjs => dom/base/test/progressserver.sjs rename : content/base/test/reftest/mixed-bmp-png.ico => dom/base/test/reftest/mixed-bmp-png.ico rename : content/base/test/reftest/reftest.list => dom/base/test/reftest/reftest.list rename : content/base/test/reftest/test_bug920877-ref.html => dom/base/test/reftest/test_bug920877-ref.html rename : content/base/test/reftest/test_bug920877.html => dom/base/test/reftest/test_bug920877.html rename : content/base/test/responseIdentical.sjs => dom/base/test/responseIdentical.sjs rename : content/base/test/script-1_bug597345.sjs => dom/base/test/script-1_bug597345.sjs rename : content/base/test/script-2_bug597345.js => dom/base/test/script-2_bug597345.js rename : content/base/test/script_bug602838.sjs => dom/base/test/script_bug602838.sjs rename : content/base/test/send_gzip_content.sjs => dom/base/test/send_gzip_content.sjs rename : content/base/test/somedatas.resource => dom/base/test/somedatas.resource rename : content/base/test/somedatas.resource^headers^ => dom/base/test/somedatas.resource^headers^ rename : content/base/test/test_CrossSiteXHR.html => dom/base/test/test_CrossSiteXHR.html rename : content/base/test/test_CrossSiteXHR_cache.html => dom/base/test/test_CrossSiteXHR_cache.html rename : content/base/test/test_CrossSiteXHR_origin.html => dom/base/test/test_CrossSiteXHR_origin.html rename : content/base/test/test_DOMException.html => dom/base/test/test_DOMException.html rename : content/base/test/test_EventSource_redirects.html => dom/base/test/test_EventSource_redirects.html rename : content/base/test/test_NodeIterator_basics_filters.xhtml => dom/base/test/test_NodeIterator_basics_filters.xhtml rename : content/base/test/test_NodeIterator_mutations_1.xhtml => dom/base/test/test_NodeIterator_mutations_1.xhtml rename : content/base/test/test_NodeIterator_mutations_2.html => dom/base/test/test_NodeIterator_mutations_2.html rename : content/base/test/test_NodeIterator_mutations_3.html => dom/base/test/test_NodeIterator_mutations_3.html rename : content/base/test/test_XHR.html => dom/base/test/test_XHR.html rename : content/base/test/test_XHRDocURI.html => dom/base/test/test_XHRDocURI.html rename : content/base/test/test_XHRResponseURL.html => dom/base/test/test_XHRResponseURL.html rename : content/base/test/test_XHRSendData.html => dom/base/test/test_XHRSendData.html rename : content/base/test/test_XHR_anon.html => dom/base/test/test_XHR_anon.html rename : content/base/test/test_XHR_header.html => dom/base/test/test_XHR_header.html rename : content/base/test/test_XHR_onuploadprogress.html => dom/base/test/test_XHR_onuploadprogress.html rename : content/base/test/test_XHR_parameters.html => dom/base/test/test_XHR_parameters.html rename : content/base/test/test_XHR_system.html => dom/base/test/test_XHR_system.html rename : content/base/test/test_XHR_timeout.html => dom/base/test/test_XHR_timeout.html rename : content/base/test/test_XHR_timeout.js => dom/base/test/test_XHR_timeout.js rename : content/base/test/test_base.xhtml => dom/base/test/test_base.xhtml rename : content/base/test/test_blobconstructor.html => dom/base/test/test_blobconstructor.html rename : content/base/test/test_bug1008126.html => dom/base/test/test_bug1008126.html rename : content/base/test/test_bug1011748.html => dom/base/test/test_bug1011748.html rename : content/base/test/test_bug1025933.html => dom/base/test/test_bug1025933.html rename : content/base/test/test_bug1057176.html => dom/base/test/test_bug1057176.html rename : content/base/test/test_bug1081686.html => dom/base/test/test_bug1081686.html rename : content/base/test/test_bug166235.html => dom/base/test/test_bug166235.html rename : content/base/test/test_bug199959.html => dom/base/test/test_bug199959.html rename : content/base/test/test_bug218236.html => dom/base/test/test_bug218236.html rename : content/base/test/test_bug218277.html => dom/base/test/test_bug218277.html rename : content/base/test/test_bug238409.html => dom/base/test/test_bug238409.html rename : content/base/test/test_bug254337.html => dom/base/test/test_bug254337.html rename : content/base/test/test_bug270145.xhtml => dom/base/test/test_bug270145.xhtml rename : content/base/test/test_bug276037-1.html => dom/base/test/test_bug276037-1.html rename : content/base/test/test_bug276037-2.xhtml => dom/base/test/test_bug276037-2.xhtml rename : content/base/test/test_bug282547.html => dom/base/test/test_bug282547.html rename : content/base/test/test_bug28293.html => dom/base/test/test_bug28293.html rename : content/base/test/test_bug28293.xhtml => dom/base/test/test_bug28293.xhtml rename : content/base/test/test_bug298064.html => dom/base/test/test_bug298064.html rename : content/base/test/test_bug300992.html => dom/base/test/test_bug300992.html rename : content/base/test/test_bug311681.xml => dom/base/test/test_bug311681.xml rename : content/base/test/test_bug313646.html => dom/base/test/test_bug313646.html rename : content/base/test/test_bug320799.html => dom/base/test/test_bug320799.html rename : content/base/test/test_bug322317.html => dom/base/test/test_bug322317.html rename : content/base/test/test_bug326337.html => dom/base/test/test_bug326337.html rename : content/base/test/test_bug330925.xhtml => dom/base/test/test_bug330925.xhtml rename : content/base/test/test_bug331959.html => dom/base/test/test_bug331959.html rename : content/base/test/test_bug333198.html => dom/base/test/test_bug333198.html rename : content/base/test/test_bug333673.html => dom/base/test/test_bug333673.html rename : content/base/test/test_bug337631.html => dom/base/test/test_bug337631.html rename : content/base/test/test_bug338541.xhtml => dom/base/test/test_bug338541.xhtml rename : content/base/test/test_bug338583.html => dom/base/test/test_bug338583.html rename : content/base/test/test_bug338679.html => dom/base/test/test_bug338679.html rename : content/base/test/test_bug339494.html => dom/base/test/test_bug339494.html rename : content/base/test/test_bug339494.xhtml => dom/base/test/test_bug339494.xhtml rename : content/base/test/test_bug340571.html => dom/base/test/test_bug340571.html rename : content/base/test/test_bug343596.html => dom/base/test/test_bug343596.html rename : content/base/test/test_bug345339.html => dom/base/test/test_bug345339.html rename : content/base/test/test_bug346485.html => dom/base/test/test_bug346485.html rename : content/base/test/test_bug352728.html => dom/base/test/test_bug352728.html rename : content/base/test/test_bug352728.xhtml => dom/base/test/test_bug352728.xhtml rename : content/base/test/test_bug353334.html => dom/base/test/test_bug353334.html rename : content/base/test/test_bug355026.html => dom/base/test/test_bug355026.html rename : content/base/test/test_bug357450.html => dom/base/test/test_bug357450.html rename : content/base/test/test_bug357450.js => dom/base/test/test_bug357450.js rename : content/base/test/test_bug357450.xhtml => dom/base/test/test_bug357450.xhtml rename : content/base/test/test_bug357450_svg.xhtml => dom/base/test/test_bug357450_svg.xhtml rename : content/base/test/test_bug357509.html => dom/base/test/test_bug357509.html rename : content/base/test/test_bug358660.html => dom/base/test/test_bug358660.html rename : content/base/test/test_bug362391.xhtml => dom/base/test/test_bug362391.xhtml rename : content/base/test/test_bug364092.xhtml => dom/base/test/test_bug364092.xhtml rename : content/base/test/test_bug364413.xhtml => dom/base/test/test_bug364413.xhtml rename : content/base/test/test_bug366944.html => dom/base/test/test_bug366944.html rename : content/base/test/test_bug366946.html => dom/base/test/test_bug366946.html rename : content/base/test/test_bug367164.html => dom/base/test/test_bug367164.html rename : content/base/test/test_bug368972.html => dom/base/test/test_bug368972.html rename : content/base/test/test_bug371576-2.html => dom/base/test/test_bug371576-2.html rename : content/base/test/test_bug371576-3.html => dom/base/test/test_bug371576-3.html rename : content/base/test/test_bug371576-4.html => dom/base/test/test_bug371576-4.html rename : content/base/test/test_bug371576-5.html => dom/base/test/test_bug371576-5.html rename : content/base/test/test_bug372086.html => dom/base/test/test_bug372086.html rename : content/base/test/test_bug372964-2.html => dom/base/test/test_bug372964-2.html rename : content/base/test/test_bug372964.html => dom/base/test/test_bug372964.html rename : content/base/test/test_bug373181.xhtml => dom/base/test/test_bug373181.xhtml rename : content/base/test/test_bug375314.html => dom/base/test/test_bug375314.html rename : content/base/test/test_bug378969.html => dom/base/test/test_bug378969.html rename : content/base/test/test_bug380418.html => dom/base/test/test_bug380418.html rename : content/base/test/test_bug380418.html^headers^ => dom/base/test/test_bug380418.html^headers^ rename : content/base/test/test_bug382113.html => dom/base/test/test_bug382113.html rename : content/base/test/test_bug382871.html => dom/base/test/test_bug382871.html rename : content/base/test/test_bug384003.xhtml => dom/base/test/test_bug384003.xhtml rename : content/base/test/test_bug390219.html => dom/base/test/test_bug390219.html rename : content/base/test/test_bug390735.html => dom/base/test/test_bug390735.html rename : content/base/test/test_bug392318.html => dom/base/test/test_bug392318.html rename : content/base/test/test_bug392511.html => dom/base/test/test_bug392511.html rename : content/base/test/test_bug393968.html => dom/base/test/test_bug393968.html rename : content/base/test/test_bug395915.html => dom/base/test/test_bug395915.html rename : content/base/test/test_bug397234.html => dom/base/test/test_bug397234.html rename : content/base/test/test_bug398243.html => dom/base/test/test_bug398243.html rename : content/base/test/test_bug401662.html => dom/base/test/test_bug401662.html rename : content/base/test/test_bug402150.html => dom/base/test/test_bug402150.html rename : content/base/test/test_bug402150.html^headers^ => dom/base/test/test_bug402150.html^headers^ rename : content/base/test/test_bug403841.html => dom/base/test/test_bug403841.html rename : content/base/test/test_bug403852.html => dom/base/test/test_bug403852.html rename : content/base/test/test_bug403868.xml => dom/base/test/test_bug403868.xml rename : content/base/test/test_bug405182.html => dom/base/test/test_bug405182.html rename : content/base/test/test_bug409380.html => dom/base/test/test_bug409380.html rename : content/base/test/test_bug410229.html => dom/base/test/test_bug410229.html rename : content/base/test/test_bug413974.html => dom/base/test/test_bug413974.html rename : content/base/test/test_bug414190.html => dom/base/test/test_bug414190.html rename : content/base/test/test_bug415860.html => dom/base/test/test_bug415860.html rename : content/base/test/test_bug416317-1.html => dom/base/test/test_bug416317-1.html rename : content/base/test/test_bug416317-2.html => dom/base/test/test_bug416317-2.html rename : content/base/test/test_bug416383.html => dom/base/test/test_bug416383.html rename : content/base/test/test_bug417255.html => dom/base/test/test_bug417255.html rename : content/base/test/test_bug417384.html => dom/base/test/test_bug417384.html rename : content/base/test/test_bug418214.html => dom/base/test/test_bug418214.html rename : content/base/test/test_bug419132.html => dom/base/test/test_bug419132.html rename : content/base/test/test_bug419527.xhtml => dom/base/test/test_bug419527.xhtml rename : content/base/test/test_bug420609.xhtml => dom/base/test/test_bug420609.xhtml rename : content/base/test/test_bug420700.html => dom/base/test/test_bug420700.html rename : content/base/test/test_bug421602.html => dom/base/test/test_bug421602.html rename : content/base/test/test_bug422403-1.html => dom/base/test/test_bug422403-1.html rename : content/base/test/test_bug422403-2.xhtml => dom/base/test/test_bug422403-2.xhtml rename : content/base/test/test_bug422537.html => dom/base/test/test_bug422537.html rename : content/base/test/test_bug424212.html => dom/base/test/test_bug424212.html rename : content/base/test/test_bug424359-1.html => dom/base/test/test_bug424359-1.html rename : content/base/test/test_bug424359-2.html => dom/base/test/test_bug424359-2.html rename : content/base/test/test_bug425013.html => dom/base/test/test_bug425013.html rename : content/base/test/test_bug426308.html => dom/base/test/test_bug426308.html rename : content/base/test/test_bug426646.html => dom/base/test/test_bug426646.html rename : content/base/test/test_bug428847.html => dom/base/test/test_bug428847.html rename : content/base/test/test_bug429157.html => dom/base/test/test_bug429157.html rename : content/base/test/test_bug431082.html => dom/base/test/test_bug431082.html rename : content/base/test/test_bug431701.html => dom/base/test/test_bug431701.html rename : content/base/test/test_bug431833.html => dom/base/test/test_bug431833.html rename : content/base/test/test_bug433533.html => dom/base/test/test_bug433533.html rename : content/base/test/test_bug433662.html => dom/base/test/test_bug433662.html rename : content/base/test/test_bug435425.html => dom/base/test/test_bug435425.html rename : content/base/test/test_bug438519.html => dom/base/test/test_bug438519.html rename : content/base/test/test_bug444030.xhtml => dom/base/test/test_bug444030.xhtml rename : content/base/test/test_bug444322.html => dom/base/test/test_bug444322.html rename : content/base/test/test_bug444546.html => dom/base/test/test_bug444546.html rename : content/base/test/test_bug444722.html => dom/base/test/test_bug444722.html rename : content/base/test/test_bug448993.html => dom/base/test/test_bug448993.html rename : content/base/test/test_bug450160.html => dom/base/test/test_bug450160.html rename : content/base/test/test_bug451376.html => dom/base/test/test_bug451376.html rename : content/base/test/test_bug453521.html => dom/base/test/test_bug453521.html rename : content/base/test/test_bug453736.html => dom/base/test/test_bug453736.html rename : content/base/test/test_bug454325.html => dom/base/test/test_bug454325.html rename : content/base/test/test_bug454326.html => dom/base/test/test_bug454326.html rename : content/base/test/test_bug455472.html => dom/base/test/test_bug455472.html rename : content/base/test/test_bug455629.html => dom/base/test/test_bug455629.html rename : content/base/test/test_bug456262.html => dom/base/test/test_bug456262.html rename : content/base/test/test_bug457746.html => dom/base/test/test_bug457746.html rename : content/base/test/test_bug459424.html => dom/base/test/test_bug459424.html rename : content/base/test/test_bug461555.html => dom/base/test/test_bug461555.html rename : content/base/test/test_bug461735.html => dom/base/test/test_bug461735.html rename : content/base/test/test_bug465767.html => dom/base/test/test_bug465767.html rename : content/base/test/test_bug466080.html => dom/base/test/test_bug466080.html rename : content/base/test/test_bug466409.html => dom/base/test/test_bug466409.html rename : content/base/test/test_bug466751.xhtml => dom/base/test/test_bug466751.xhtml rename : content/base/test/test_bug469020.html => dom/base/test/test_bug469020.html rename : content/base/test/test_bug469304.html => dom/base/test/test_bug469304.html rename : content/base/test/test_bug473162-1.html => dom/base/test/test_bug473162-1.html rename : content/base/test/test_bug473162-2.html => dom/base/test/test_bug473162-2.html rename : content/base/test/test_bug475156.html => dom/base/test/test_bug475156.html rename : content/base/test/test_bug482935.html => dom/base/test/test_bug482935.html rename : content/base/test/test_bug484396.html => dom/base/test/test_bug484396.html rename : content/base/test/test_bug493881.html => dom/base/test/test_bug493881.html rename : content/base/test/test_bug493881.js => dom/base/test/test_bug493881.js rename : content/base/test/test_bug498240.html => dom/base/test/test_bug498240.html rename : content/base/test/test_bug498433.html => dom/base/test/test_bug498433.html rename : content/base/test/test_bug498897.html => dom/base/test/test_bug498897.html rename : content/base/test/test_bug499656.html => dom/base/test/test_bug499656.html rename : content/base/test/test_bug499656.xhtml => dom/base/test/test_bug499656.xhtml rename : content/base/test/test_bug500937.html => dom/base/test/test_bug500937.html rename : content/base/test/test_bug503473.html => dom/base/test/test_bug503473.html rename : content/base/test/test_bug503481.html => dom/base/test/test_bug503481.html rename : content/base/test/test_bug503481b.html => dom/base/test/test_bug503481b.html rename : content/base/test/test_bug505783.html => dom/base/test/test_bug505783.html rename : content/base/test/test_bug51034.html => dom/base/test/test_bug51034.html rename : content/base/test/test_bug513194.html => dom/base/test/test_bug513194.html rename : content/base/test/test_bug5141.html => dom/base/test/test_bug5141.html rename : content/base/test/test_bug514487.html => dom/base/test/test_bug514487.html rename : content/base/test/test_bug515401.html => dom/base/test/test_bug515401.html rename : content/base/test/test_bug518104.html => dom/base/test/test_bug518104.html rename : content/base/test/test_bug527896.html => dom/base/test/test_bug527896.html rename : content/base/test/test_bug540854.html => dom/base/test/test_bug540854.html rename : content/base/test/test_bug541937.html => dom/base/test/test_bug541937.html rename : content/base/test/test_bug544642.html => dom/base/test/test_bug544642.html rename : content/base/test/test_bug545644.html => dom/base/test/test_bug545644.html rename : content/base/test/test_bug545644.xhtml => dom/base/test/test_bug545644.xhtml rename : content/base/test/test_bug548463.html => dom/base/test/test_bug548463.html rename : content/base/test/test_bug553896.xhtml => dom/base/test/test_bug553896.xhtml rename : content/base/test/test_bug557892.html => dom/base/test/test_bug557892.html rename : content/base/test/test_bug558726.html => dom/base/test/test_bug558726.html rename : content/base/test/test_bug559526.html => dom/base/test/test_bug559526.html rename : content/base/test/test_bug560780.html => dom/base/test/test_bug560780.html rename : content/base/test/test_bug562137.html => dom/base/test/test_bug562137.html rename : content/base/test/test_bug562169-1.html => dom/base/test/test_bug562169-1.html rename : content/base/test/test_bug562169-2.html => dom/base/test/test_bug562169-2.html rename : content/base/test/test_bug562652.html => dom/base/test/test_bug562652.html rename : content/base/test/test_bug564047.html => dom/base/test/test_bug564047.html rename : content/base/test/test_bug564863.xhtml => dom/base/test/test_bug564863.xhtml rename : content/base/test/test_bug567350.html => dom/base/test/test_bug567350.html rename : content/base/test/test_bug578096.html => dom/base/test/test_bug578096.html rename : content/base/test/test_bug585978.html => dom/base/test/test_bug585978.html rename : content/base/test/test_bug587931.html => dom/base/test/test_bug587931.html rename : content/base/test/test_bug588990.html => dom/base/test/test_bug588990.html rename : content/base/test/test_bug590812.html => dom/base/test/test_bug590812.html rename : content/base/test/test_bug590870.html => dom/base/test/test_bug590870.html rename : content/base/test/test_bug592366.html => dom/base/test/test_bug592366.html rename : content/base/test/test_bug592829.html => dom/base/test/test_bug592829.html rename : content/base/test/test_bug597345.html => dom/base/test/test_bug597345.html rename : content/base/test/test_bug599588.html => dom/base/test/test_bug599588.html rename : content/base/test/test_bug601803.html => dom/base/test/test_bug601803.html rename : content/base/test/test_bug602838.html => dom/base/test/test_bug602838.html rename : content/base/test/test_bug604592.html => dom/base/test/test_bug604592.html rename : content/base/test/test_bug604660.html => dom/base/test/test_bug604660.html rename : content/base/test/test_bug605982.html => dom/base/test/test_bug605982.html rename : content/base/test/test_bug606729.html => dom/base/test/test_bug606729.html rename : content/base/test/test_bug614058.html => dom/base/test/test_bug614058.html rename : content/base/test/test_bug614583.html => dom/base/test/test_bug614583.html rename : content/base/test/test_bug622088.html => dom/base/test/test_bug622088.html rename : content/base/test/test_bug622117.html => dom/base/test/test_bug622117.html rename : content/base/test/test_bug622246.html => dom/base/test/test_bug622246.html rename : content/base/test/test_bug625722.html => dom/base/test/test_bug625722.html rename : content/base/test/test_bug626262.html => dom/base/test/test_bug626262.html rename : content/base/test/test_bug628938.html => dom/base/test/test_bug628938.html rename : content/base/test/test_bug631615.html => dom/base/test/test_bug631615.html rename : content/base/test/test_bug638112.html => dom/base/test/test_bug638112.html rename : content/base/test/test_bug647518.html => dom/base/test/test_bug647518.html rename : content/base/test/test_bug650001.html => dom/base/test/test_bug650001.html rename : content/base/test/test_bug656283.html => dom/base/test/test_bug656283.html rename : content/base/test/test_bug664916.html => dom/base/test/test_bug664916.html rename : content/base/test/test_bug666604.html => dom/base/test/test_bug666604.html rename : content/base/test/test_bug675121.html => dom/base/test/test_bug675121.html rename : content/base/test/test_bug675166.html => dom/base/test/test_bug675166.html rename : content/base/test/test_bug682463.html => dom/base/test/test_bug682463.html rename : content/base/test/test_bug682554.html => dom/base/test/test_bug682554.html rename : content/base/test/test_bug682592.html => dom/base/test/test_bug682592.html rename : content/base/test/test_bug684671.html => dom/base/test/test_bug684671.html rename : content/base/test/test_bug685798.html => dom/base/test/test_bug685798.html rename : content/base/test/test_bug686449.xhtml => dom/base/test/test_bug686449.xhtml rename : content/base/test/test_bug687859.html => dom/base/test/test_bug687859.html rename : content/base/test/test_bug690056.html => dom/base/test/test_bug690056.html rename : content/base/test/test_bug692434.html => dom/base/test/test_bug692434.html rename : content/base/test/test_bug693615.html => dom/base/test/test_bug693615.html rename : content/base/test/test_bug693875.html => dom/base/test/test_bug693875.html rename : content/base/test/test_bug694754.xhtml => dom/base/test/test_bug694754.xhtml rename : content/base/test/test_bug696301-1.html => dom/base/test/test_bug696301-1.html rename : content/base/test/test_bug696301-2.html => dom/base/test/test_bug696301-2.html rename : content/base/test/test_bug698381.html => dom/base/test/test_bug698381.html rename : content/base/test/test_bug698384.html => dom/base/test/test_bug698384.html rename : content/base/test/test_bug704063.html => dom/base/test/test_bug704063.html rename : content/base/test/test_bug707142.html => dom/base/test/test_bug707142.html rename : content/base/test/test_bug708620.html => dom/base/test/test_bug708620.html rename : content/base/test/test_bug711047.html => dom/base/test/test_bug711047.html rename : content/base/test/test_bug711180.html => dom/base/test/test_bug711180.html rename : content/base/test/test_bug719533.html => dom/base/test/test_bug719533.html rename : content/base/test/test_bug726364.html => dom/base/test/test_bug726364.html rename : content/base/test/test_bug737087.html => dom/base/test/test_bug737087.html rename : content/base/test/test_bug737565.html => dom/base/test/test_bug737565.html rename : content/base/test/test_bug737612.html => dom/base/test/test_bug737612.html rename : content/base/test/test_bug738108.html => dom/base/test/test_bug738108.html rename : content/base/test/test_bug744830.html => dom/base/test/test_bug744830.html rename : content/base/test/test_bug749367.html => dom/base/test/test_bug749367.html rename : content/base/test/test_bug753278.html => dom/base/test/test_bug753278.html rename : content/base/test/test_bug761120.html => dom/base/test/test_bug761120.html rename : content/base/test/test_bug782342.html => dom/base/test/test_bug782342.html rename : content/base/test/test_bug787778.html => dom/base/test/test_bug787778.html rename : content/base/test/test_bug789856.html => dom/base/test/test_bug789856.html rename : content/base/test/test_bug804395.html => dom/base/test/test_bug804395.html rename : content/base/test/test_bug809003.html => dom/base/test/test_bug809003.html rename : content/base/test/test_bug810494.html => dom/base/test/test_bug810494.html rename : content/base/test/test_bug811701.html => dom/base/test/test_bug811701.html rename : content/base/test/test_bug811701.xhtml => dom/base/test/test_bug811701.xhtml rename : content/base/test/test_bug813919.html => dom/base/test/test_bug813919.html rename : content/base/test/test_bug814576.html => dom/base/test/test_bug814576.html rename : content/base/test/test_bug819051.html => dom/base/test/test_bug819051.html rename : content/base/test/test_bug820909.html => dom/base/test/test_bug820909.html rename : content/base/test/test_bug827160.html => dom/base/test/test_bug827160.html rename : content/base/test/test_bug840098.html => dom/base/test/test_bug840098.html rename : content/base/test/test_bug864595.html => dom/base/test/test_bug864595.html rename : content/base/test/test_bug868999.html => dom/base/test/test_bug868999.html rename : content/base/test/test_bug869000.html => dom/base/test/test_bug869000.html rename : content/base/test/test_bug869002.html => dom/base/test/test_bug869002.html rename : content/base/test/test_bug869006.html => dom/base/test/test_bug869006.html rename : content/base/test/test_bug876282.html => dom/base/test/test_bug876282.html rename : content/base/test/test_bug890580.html => dom/base/test/test_bug890580.html rename : content/base/test/test_bug891952.html => dom/base/test/test_bug891952.html rename : content/base/test/test_bug894874.html => dom/base/test/test_bug894874.html rename : content/base/test/test_bug895239.html => dom/base/test/test_bug895239.html rename : content/base/test/test_bug895974.html => dom/base/test/test_bug895974.html rename : content/base/test/test_bug902847.html => dom/base/test/test_bug902847.html rename : content/base/test/test_bug907892.html => dom/base/test/test_bug907892.html rename : content/base/test/test_bug922681.html => dom/base/test/test_bug922681.html rename : content/base/test/test_bug927196.html => dom/base/test/test_bug927196.html rename : content/base/test/test_bug945152.html => dom/base/test/test_bug945152.html rename : content/base/test/test_bug982153.html => dom/base/test/test_bug982153.html rename : content/base/test/test_caretPositionFromPoint.html => dom/base/test/test_caretPositionFromPoint.html rename : content/base/test/test_child_process_shutdown_message.html => dom/base/test/test_child_process_shutdown_message.html rename : content/base/test/test_classList.html => dom/base/test/test_classList.html rename : content/base/test/test_copyimage.html => dom/base/test/test_copyimage.html rename : content/base/test/test_copypaste.html => dom/base/test/test_copypaste.html rename : content/base/test/test_copypaste.xhtml => dom/base/test/test_copypaste.xhtml rename : content/base/test/test_copypaste.xul => dom/base/test/test_copypaste.xul rename : content/base/test/test_createHTMLDocument.html => dom/base/test/test_createHTMLDocument.html rename : content/base/test/test_declare_stylesheet_obsolete.html => dom/base/test/test_declare_stylesheet_obsolete.html rename : content/base/test/test_document_constructor.html => dom/base/test/test_document_constructor.html rename : content/base/test/test_domparser_null_char.html => dom/base/test/test_domparser_null_char.html rename : content/base/test/test_domparsing.html => dom/base/test/test_domparsing.html rename : content/base/test/test_element.matches.html => dom/base/test/test_element.matches.html rename : content/base/test/test_elementTraversal.html => dom/base/test/test_elementTraversal.html rename : content/base/test/test_element_closest.html => dom/base/test/test_element_closest.html rename : content/base/test/test_encodeToStringWithMaxLength.html => dom/base/test/test_encodeToStringWithMaxLength.html rename : content/base/test/test_file_from_blob.html => dom/base/test/test_file_from_blob.html rename : content/base/test/test_fileapi.html => dom/base/test/test_fileapi.html rename : content/base/test/test_fileapi_slice.html => dom/base/test/test_fileapi_slice.html rename : content/base/test/test_getElementById.html => dom/base/test/test_getElementById.html rename : content/base/test/test_html_colors_quirks.html => dom/base/test/test_html_colors_quirks.html rename : content/base/test/test_html_colors_standards.html => dom/base/test/test_html_colors_standards.html rename : content/base/test/test_html_in_xhr.html => dom/base/test/test_html_in_xhr.html rename : content/base/test/test_htmlcopyencoder.html => dom/base/test/test_htmlcopyencoder.html rename : content/base/test/test_htmlcopyencoder.xhtml => dom/base/test/test_htmlcopyencoder.xhtml rename : content/base/test/test_ipc_messagemanager_blob.html => dom/base/test/test_ipc_messagemanager_blob.html rename : content/base/test/test_messagemanager_assertpermission.html => dom/base/test/test_messagemanager_assertpermission.html rename : content/base/test/test_messagemanager_principal.html => dom/base/test/test_messagemanager_principal.html rename : content/base/test/test_messagemanager_send_principal.html => dom/base/test/test_messagemanager_send_principal.html rename : content/base/test/test_meta_viewport0.html => dom/base/test/test_meta_viewport0.html rename : content/base/test/test_meta_viewport1.html => dom/base/test/test_meta_viewport1.html rename : content/base/test/test_meta_viewport2.html => dom/base/test/test_meta_viewport2.html rename : content/base/test/test_meta_viewport3.html => dom/base/test/test_meta_viewport3.html rename : content/base/test/test_meta_viewport4.html => dom/base/test/test_meta_viewport4.html rename : content/base/test/test_meta_viewport5.html => dom/base/test/test_meta_viewport5.html rename : content/base/test/test_meta_viewport6.html => dom/base/test/test_meta_viewport6.html rename : content/base/test/test_mixed_content_blocker.html => dom/base/test/test_mixed_content_blocker.html rename : content/base/test/test_mixed_content_blocker_bug803225.html => dom/base/test/test_mixed_content_blocker_bug803225.html rename : content/base/test/test_mixed_content_blocker_frameNavigation.html => dom/base/test/test_mixed_content_blocker_frameNavigation.html rename : content/base/test/test_mozMatchesSelector.html => dom/base/test/test_mozMatchesSelector.html rename : content/base/test/test_mozfiledataurl.html => dom/base/test/test_mozfiledataurl.html rename : content/base/test/test_mutationobservers.html => dom/base/test/test_mutationobservers.html rename : content/base/test/test_nodelist_holes.html => dom/base/test/test_nodelist_holes.html rename : content/base/test/test_object.html => dom/base/test/test_object.html rename : content/base/test/test_plugin_freezing.html => dom/base/test/test_plugin_freezing.html rename : content/base/test/test_processing_instruction_update_stylesheet.xhtml => dom/base/test/test_processing_instruction_update_stylesheet.xhtml rename : content/base/test/test_progress_events_for_gzip_data.html => dom/base/test/test_progress_events_for_gzip_data.html rename : content/base/test/test_range_bounds.html => dom/base/test/test_range_bounds.html rename : content/base/test/test_reentrant_flush.html => dom/base/test/test_reentrant_flush.html rename : content/base/test/test_sync_xhr_timer.xhtml => dom/base/test/test_sync_xhr_timer.xhtml rename : content/base/test/test_text_wholeText.html => dom/base/test/test_text_wholeText.html rename : content/base/test/test_textnode_normalize_in_selection.html => dom/base/test/test_textnode_normalize_in_selection.html rename : content/base/test/test_textnode_split_in_selection.html => dom/base/test/test_textnode_split_in_selection.html rename : content/base/test/test_title.html => dom/base/test/test_title.html rename : content/base/test/test_treewalker_nextsibling.xml => dom/base/test/test_treewalker_nextsibling.xml rename : content/base/test/test_user_select.html => dom/base/test/test_user_select.html rename : content/base/test/test_viewport_scroll.html => dom/base/test/test_viewport_scroll.html rename : content/base/test/test_viewsource_forbidden_in_object.html => dom/base/test/test_viewsource_forbidden_in_object.html rename : content/base/test/test_w3element_traversal.html => dom/base/test/test_w3element_traversal.html rename : content/base/test/test_w3element_traversal.xhtml => dom/base/test/test_w3element_traversal.xhtml rename : content/base/test/test_w3element_traversal_svg.html => dom/base/test/test_w3element_traversal_svg.html rename : content/base/test/test_warning_for_blocked_cross_site_request.html => dom/base/test/test_warning_for_blocked_cross_site_request.html rename : content/base/test/test_websocket.html => dom/base/test/test_websocket.html rename : content/base/test/test_websocket_basic.html => dom/base/test/test_websocket_basic.html rename : content/base/test/test_websocket_hello.html => dom/base/test/test_websocket_hello.html rename : content/base/test/test_x-frame-options.html => dom/base/test/test_x-frame-options.html rename : content/base/test/test_xbl_userdata.xhtml => dom/base/test/test_xbl_userdata.xhtml rename : content/base/test/test_xhr_abort_after_load.html => dom/base/test/test_xhr_abort_after_load.html rename : content/base/test/test_xhr_forbidden_headers.html => dom/base/test/test_xhr_forbidden_headers.html rename : content/base/test/test_xhr_progressevents.html => dom/base/test/test_xhr_progressevents.html rename : content/base/test/test_xhr_send_readystate.html => dom/base/test/test_xhr_send_readystate.html rename : content/base/test/test_xhr_withCredentials.html => dom/base/test/test_xhr_withCredentials.html rename : content/base/test/unit/1_original.xml => dom/base/test/unit/1_original.xml rename : content/base/test/unit/1_result.xml => dom/base/test/unit/1_result.xml rename : content/base/test/unit/2_original.xml => dom/base/test/unit/2_original.xml rename : content/base/test/unit/2_result_1.xml => dom/base/test/unit/2_result_1.xml rename : content/base/test/unit/2_result_2.xml => dom/base/test/unit/2_result_2.xml rename : content/base/test/unit/2_result_3.xml => dom/base/test/unit/2_result_3.xml rename : content/base/test/unit/2_result_4.xml => dom/base/test/unit/2_result_4.xml rename : content/base/test/unit/3_original.xml => dom/base/test/unit/3_original.xml rename : content/base/test/unit/3_result.xml => dom/base/test/unit/3_result.xml rename : content/base/test/unit/3_result_2.xml => dom/base/test/unit/3_result_2.xml rename : content/base/test/unit/4_original.xml => dom/base/test/unit/4_original.xml rename : content/base/test/unit/4_result_1.xml => dom/base/test/unit/4_result_1.xml rename : content/base/test/unit/4_result_2.xml => dom/base/test/unit/4_result_2.xml rename : content/base/test/unit/4_result_3.xml => dom/base/test/unit/4_result_3.xml rename : content/base/test/unit/4_result_4.xml => dom/base/test/unit/4_result_4.xml rename : content/base/test/unit/4_result_5.xml => dom/base/test/unit/4_result_5.xml rename : content/base/test/unit/4_result_6.xml => dom/base/test/unit/4_result_6.xml rename : content/base/test/unit/head_utilities.js => dom/base/test/unit/head_utilities.js rename : content/base/test/unit/test_bug553888.js => dom/base/test/unit/test_bug553888.js rename : content/base/test/unit/test_bug737966.js => dom/base/test/unit/test_bug737966.js rename : content/base/test/unit/test_cspreports.js => dom/base/test/unit/test_cspreports.js rename : content/base/test/unit/test_error_codes.js => dom/base/test/unit/test_error_codes.js rename : content/base/test/unit/test_thirdpartyutil.js => dom/base/test/unit/test_thirdpartyutil.js rename : content/base/test/unit/test_xhr_document.js => dom/base/test/unit/test_xhr_document.js rename : content/base/test/unit/test_xhr_standalone.js => dom/base/test/unit/test_xhr_standalone.js rename : content/base/test/unit/test_xmlserializer.js => dom/base/test/unit/test_xmlserializer.js rename : content/base/test/unit/xpcshell.ini => dom/base/test/unit/xpcshell.ini rename : content/base/test/unit_ipc/test_bug553888_wrap.js => dom/base/test/unit_ipc/test_bug553888_wrap.js rename : content/base/test/unit_ipc/test_xhr_document_ipc.js => dom/base/test/unit_ipc/test_xhr_document_ipc.js rename : content/base/test/unit_ipc/xpcshell.ini => dom/base/test/unit_ipc/xpcshell.ini rename : content/base/test/variable_style_sheet.sjs => dom/base/test/variable_style_sheet.sjs rename : content/base/test/viewport_helpers.js => dom/base/test/viewport_helpers.js rename : content/base/test/w3element_traversal.svg => dom/base/test/w3element_traversal.svg rename : content/base/test/websocket_hybi/file_binary-frames_wsh.py => dom/base/test/websocket_hybi/file_binary-frames_wsh.py rename : content/base/test/websocket_hybi/file_check-binary-messages_wsh.py => dom/base/test/websocket_hybi/file_check-binary-messages_wsh.py rename : content/base/test/websocket_hybi/mochitest.ini => dom/base/test/websocket_hybi/mochitest.ini rename : content/base/test/websocket_hybi/test_receive-arraybuffer.html => dom/base/test/websocket_hybi/test_receive-arraybuffer.html rename : content/base/test/websocket_hybi/test_receive-blob.html => dom/base/test/websocket_hybi/test_receive-blob.html rename : content/base/test/websocket_hybi/test_send-arraybuffer.html => dom/base/test/websocket_hybi/test_send-arraybuffer.html rename : content/base/test/websocket_hybi/test_send-blob.html => dom/base/test/websocket_hybi/test_send-blob.html rename : content/base/test/wholeTexty-helper.xml => dom/base/test/wholeTexty-helper.xml
3686 lines
116 KiB
C++
3686 lines
116 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
// vim:set et cin sw=2 sts=2:
|
|
/* 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/. */
|
|
/*
|
|
* A base class implementing nsIObjectLoadingContent for use by
|
|
* various content nodes that want to provide plugin/document/image
|
|
* loading functionality (eg <embed>, <object>, <applet>, etc).
|
|
*/
|
|
|
|
// Interface headers
|
|
#include "imgLoader.h"
|
|
#include "nsIContent.h"
|
|
#include "nsIContentInlines.h"
|
|
#include "nsIDocShell.h"
|
|
#include "nsIDocument.h"
|
|
#include "nsIDOMCustomEvent.h"
|
|
#include "nsIDOMDocument.h"
|
|
#include "nsIDOMHTMLObjectElement.h"
|
|
#include "nsIDOMHTMLAppletElement.h"
|
|
#include "nsIExternalProtocolHandler.h"
|
|
#include "nsIObjectFrame.h"
|
|
#include "nsIPermissionManager.h"
|
|
#include "nsPluginHost.h"
|
|
#include "nsPluginInstanceOwner.h"
|
|
#include "nsJSNPRuntime.h"
|
|
#include "nsINestedURI.h"
|
|
#include "nsIPresShell.h"
|
|
#include "nsScriptSecurityManager.h"
|
|
#include "nsIScriptSecurityManager.h"
|
|
#include "nsIStreamConverterService.h"
|
|
#include "nsIURILoader.h"
|
|
#include "nsIURL.h"
|
|
#include "nsIWebNavigation.h"
|
|
#include "nsIWebNavigationInfo.h"
|
|
#include "nsIScriptChannel.h"
|
|
#include "nsIBlocklistService.h"
|
|
#include "nsIAsyncVerifyRedirectCallback.h"
|
|
#include "nsIAppShell.h"
|
|
|
|
#include "nsError.h"
|
|
|
|
// Util headers
|
|
#include "prenv.h"
|
|
#include "prlog.h"
|
|
|
|
#include "nsAutoPtr.h"
|
|
#include "nsCURILoader.h"
|
|
#include "nsContentPolicyUtils.h"
|
|
#include "nsContentUtils.h"
|
|
#include "nsDocShellCID.h"
|
|
#include "nsGkAtoms.h"
|
|
#include "nsThreadUtils.h"
|
|
#include "nsNetUtil.h"
|
|
#include "nsMimeTypes.h"
|
|
#include "nsStyleUtil.h"
|
|
#include "nsUnicharUtils.h"
|
|
#include "mozilla/Preferences.h"
|
|
#include "nsSandboxFlags.h"
|
|
|
|
// Concrete classes
|
|
#include "nsFrameLoader.h"
|
|
|
|
#include "nsObjectLoadingContent.h"
|
|
#include "mozAutoDocUpdate.h"
|
|
#include "nsIContentSecurityPolicy.h"
|
|
#include "GeckoProfiler.h"
|
|
#include "nsPluginFrame.h"
|
|
#include "nsDOMClassInfo.h"
|
|
#include "nsWrapperCacheInlines.h"
|
|
#include "nsDOMJSUtils.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
|
#include "nsContentCID.h"
|
|
#include "mozilla/BasicEvents.h"
|
|
#include "mozilla/dom/BindingUtils.h"
|
|
#include "mozilla/dom/Element.h"
|
|
#include "mozilla/dom/Event.h"
|
|
#include "mozilla/dom/ScriptSettings.h"
|
|
#include "mozilla/EventDispatcher.h"
|
|
#include "mozilla/EventStates.h"
|
|
#include "mozilla/Telemetry.h"
|
|
#include "mozilla/dom/HTMLObjectElementBinding.h"
|
|
|
|
#ifdef XP_WIN
|
|
// Thanks so much, Microsoft! :(
|
|
#ifdef CreateEvent
|
|
#undef CreateEvent
|
|
#endif
|
|
#endif // XP_WIN
|
|
|
|
static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
|
|
|
|
static const char *kPrefJavaMIME = "plugin.java.mime";
|
|
|
|
using namespace mozilla;
|
|
using namespace mozilla::dom;
|
|
|
|
#ifdef PR_LOGGING
|
|
static PRLogModuleInfo*
|
|
GetObjectLog()
|
|
{
|
|
static PRLogModuleInfo *sLog;
|
|
if (!sLog)
|
|
sLog = PR_NewLogModule("objlc");
|
|
return sLog;
|
|
}
|
|
#endif
|
|
|
|
#define LOG(args) PR_LOG(GetObjectLog(), PR_LOG_DEBUG, args)
|
|
#define LOG_ENABLED() PR_LOG_TEST(GetObjectLog(), PR_LOG_DEBUG)
|
|
|
|
static bool
|
|
InActiveDocument(nsIContent *aContent)
|
|
{
|
|
if (!aContent->IsInDoc()) {
|
|
return false;
|
|
}
|
|
nsIDocument *doc = aContent->OwnerDoc();
|
|
return (doc && doc->IsActive());
|
|
}
|
|
|
|
///
|
|
/// Runnables and helper classes
|
|
///
|
|
|
|
class nsAsyncInstantiateEvent : public nsRunnable {
|
|
public:
|
|
explicit nsAsyncInstantiateEvent(nsObjectLoadingContent* aContent)
|
|
: mContent(aContent) {}
|
|
|
|
~nsAsyncInstantiateEvent() {}
|
|
|
|
NS_IMETHOD Run();
|
|
|
|
private:
|
|
nsCOMPtr<nsIObjectLoadingContent> mContent;
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
nsAsyncInstantiateEvent::Run()
|
|
{
|
|
nsObjectLoadingContent *objLC =
|
|
static_cast<nsObjectLoadingContent *>(mContent.get());
|
|
|
|
// If objLC is no longer tracking this event, we've been canceled or
|
|
// superseded
|
|
if (objLC->mPendingInstantiateEvent != this) {
|
|
return NS_OK;
|
|
}
|
|
objLC->mPendingInstantiateEvent = nullptr;
|
|
|
|
return objLC->SyncStartPluginInstance();
|
|
}
|
|
|
|
// Checks to see if the content for a plugin instance should be unloaded
|
|
// (outside an active document) or stopped (in a document but unrendered). This
|
|
// is used to allow scripts to move a plugin around the document hierarchy
|
|
// without re-instantiating it.
|
|
class CheckPluginStopEvent : public nsRunnable {
|
|
public:
|
|
explicit CheckPluginStopEvent(nsObjectLoadingContent* aContent)
|
|
: mContent(aContent) {}
|
|
|
|
~CheckPluginStopEvent() {}
|
|
|
|
NS_IMETHOD Run();
|
|
|
|
private:
|
|
nsCOMPtr<nsIObjectLoadingContent> mContent;
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
CheckPluginStopEvent::Run()
|
|
{
|
|
nsObjectLoadingContent *objLC =
|
|
static_cast<nsObjectLoadingContent *>(mContent.get());
|
|
|
|
// If objLC is no longer tracking this event, we've been canceled or
|
|
// superseded. We clear this before we finish - either by calling
|
|
// UnloadObject/StopPluginInstance, or directly if we took no action.
|
|
if (objLC->mPendingCheckPluginStopEvent != this) {
|
|
return NS_OK;
|
|
}
|
|
|
|
// CheckPluginStopEvent is queued when we either lose our frame, are removed
|
|
// from the document, or the document goes inactive. To avoid stopping the
|
|
// plugin when script is reparenting us or layout is rebuilding, we wait until
|
|
// this event to decide to stop.
|
|
|
|
nsCOMPtr<nsIContent> content =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent *>(objLC));
|
|
if (!InActiveDocument(content)) {
|
|
LOG(("OBJLC [%p]: Unloading plugin outside of document", this));
|
|
objLC->StopPluginInstance();
|
|
return NS_OK;
|
|
}
|
|
|
|
if (content->GetPrimaryFrame()) {
|
|
LOG(("OBJLC [%p]: CheckPluginStopEvent - in active document with frame"
|
|
", no action", this));
|
|
objLC->mPendingCheckPluginStopEvent = nullptr;
|
|
return NS_OK;
|
|
}
|
|
|
|
// In an active document, but still no frame. Flush layout to see if we can
|
|
// regain a frame now.
|
|
LOG(("OBJLC [%p]: CheckPluginStopEvent - No frame, flushing layout", this));
|
|
nsIDocument* composedDoc = content->GetComposedDoc();
|
|
if (composedDoc) {
|
|
composedDoc->FlushPendingNotifications(Flush_Layout);
|
|
if (objLC->mPendingCheckPluginStopEvent != this) {
|
|
LOG(("OBJLC [%p]: CheckPluginStopEvent - superseded in layout flush",
|
|
this));
|
|
return NS_OK;
|
|
} else if (content->GetPrimaryFrame()) {
|
|
LOG(("OBJLC [%p]: CheckPluginStopEvent - frame gained in layout flush",
|
|
this));
|
|
objLC->mPendingCheckPluginStopEvent = nullptr;
|
|
return NS_OK;
|
|
}
|
|
}
|
|
|
|
// Still no frame, suspend plugin. HasNewFrame will restart us when we
|
|
// become rendered again
|
|
LOG(("OBJLC [%p]: Stopping plugin that lost frame", this));
|
|
objLC->StopPluginInstance();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
/**
|
|
* Helper task for firing simple events
|
|
*/
|
|
class nsSimplePluginEvent : public nsRunnable {
|
|
public:
|
|
nsSimplePluginEvent(nsIContent* aTarget, const nsAString &aEvent)
|
|
: mTarget(aTarget)
|
|
, mDocument(aTarget->GetComposedDoc())
|
|
, mEvent(aEvent)
|
|
{
|
|
MOZ_ASSERT(aTarget && mDocument);
|
|
}
|
|
|
|
nsSimplePluginEvent(nsIDocument* aTarget, const nsAString& aEvent)
|
|
: mTarget(aTarget)
|
|
, mDocument(aTarget)
|
|
, mEvent(aEvent)
|
|
{
|
|
MOZ_ASSERT(aTarget);
|
|
}
|
|
|
|
nsSimplePluginEvent(nsIContent* aTarget,
|
|
nsIDocument* aDocument,
|
|
const nsAString& aEvent)
|
|
: mTarget(aTarget)
|
|
, mDocument(aDocument)
|
|
, mEvent(aEvent)
|
|
{
|
|
MOZ_ASSERT(aTarget && aDocument);
|
|
}
|
|
|
|
~nsSimplePluginEvent() {}
|
|
|
|
NS_IMETHOD Run();
|
|
|
|
private:
|
|
nsCOMPtr<nsISupports> mTarget;
|
|
nsCOMPtr<nsIDocument> mDocument;
|
|
nsString mEvent;
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
nsSimplePluginEvent::Run()
|
|
{
|
|
if (mDocument && mDocument->IsActive()) {
|
|
LOG(("OBJLC [%p]: nsSimplePluginEvent firing event \"%s\"", mTarget.get(),
|
|
NS_ConvertUTF16toUTF8(mEvent).get()));
|
|
nsContentUtils::DispatchTrustedEvent(mDocument, mTarget,
|
|
mEvent, true, true);
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
/**
|
|
* A task for firing PluginCrashed DOM Events.
|
|
*/
|
|
class nsPluginCrashedEvent : public nsRunnable {
|
|
public:
|
|
nsCOMPtr<nsIContent> mContent;
|
|
nsString mPluginDumpID;
|
|
nsString mBrowserDumpID;
|
|
nsString mPluginName;
|
|
nsString mPluginFilename;
|
|
bool mSubmittedCrashReport;
|
|
|
|
nsPluginCrashedEvent(nsIContent* aContent,
|
|
const nsAString& aPluginDumpID,
|
|
const nsAString& aBrowserDumpID,
|
|
const nsAString& aPluginName,
|
|
const nsAString& aPluginFilename,
|
|
bool submittedCrashReport)
|
|
: mContent(aContent),
|
|
mPluginDumpID(aPluginDumpID),
|
|
mBrowserDumpID(aBrowserDumpID),
|
|
mPluginName(aPluginName),
|
|
mPluginFilename(aPluginFilename),
|
|
mSubmittedCrashReport(submittedCrashReport)
|
|
{}
|
|
|
|
~nsPluginCrashedEvent() {}
|
|
|
|
NS_IMETHOD Run();
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
nsPluginCrashedEvent::Run()
|
|
{
|
|
LOG(("OBJLC [%p]: Firing plugin crashed event\n",
|
|
mContent.get()));
|
|
|
|
nsCOMPtr<nsIDocument> doc = mContent->GetComposedDoc();
|
|
if (!doc) {
|
|
NS_WARNING("Couldn't get document for PluginCrashed event!");
|
|
return NS_OK;
|
|
}
|
|
|
|
ErrorResult rv;
|
|
nsRefPtr<Event> event =
|
|
doc->CreateEvent(NS_LITERAL_STRING("customevent"), rv);
|
|
nsCOMPtr<nsIDOMCustomEvent> customEvent(do_QueryObject(event));
|
|
if (!customEvent) {
|
|
NS_WARNING("Couldn't QI event for PluginCrashed event!");
|
|
return NS_OK;
|
|
}
|
|
|
|
nsCOMPtr<nsIWritableVariant> variant;
|
|
variant = do_CreateInstance("@mozilla.org/variant;1");
|
|
if (!variant) {
|
|
NS_WARNING("Couldn't create detail variant for PluginCrashed event!");
|
|
return NS_OK;
|
|
}
|
|
customEvent->InitCustomEvent(NS_LITERAL_STRING("PluginCrashed"),
|
|
true, true, variant);
|
|
event->SetTrusted(true);
|
|
event->GetInternalNSEvent()->mFlags.mOnlyChromeDispatch = true;
|
|
|
|
nsCOMPtr<nsIWritablePropertyBag2> propBag;
|
|
propBag = do_CreateInstance("@mozilla.org/hash-property-bag;1");
|
|
if (!propBag) {
|
|
NS_WARNING("Couldn't create a property bag for PluginCrashed event!");
|
|
return NS_OK;
|
|
}
|
|
|
|
// add a "pluginDumpID" property to this event
|
|
propBag->SetPropertyAsAString(NS_LITERAL_STRING("pluginDumpID"),
|
|
mPluginDumpID);
|
|
|
|
// add a "browserDumpID" property to this event
|
|
propBag->SetPropertyAsAString(NS_LITERAL_STRING("browserDumpID"),
|
|
mBrowserDumpID);
|
|
|
|
// add a "pluginName" property to this event
|
|
propBag->SetPropertyAsAString(NS_LITERAL_STRING("pluginName"),
|
|
mPluginName);
|
|
|
|
// add a "pluginFilename" property to this event
|
|
propBag->SetPropertyAsAString(NS_LITERAL_STRING("pluginFilename"),
|
|
mPluginFilename);
|
|
|
|
// add a "submittedCrashReport" property to this event
|
|
propBag->SetPropertyAsBool(NS_LITERAL_STRING("submittedCrashReport"),
|
|
mSubmittedCrashReport);
|
|
|
|
variant->SetAsISupports(propBag);
|
|
|
|
EventDispatcher::DispatchDOMEvent(mContent, nullptr, event, nullptr, nullptr);
|
|
return NS_OK;
|
|
}
|
|
|
|
class nsStopPluginRunnable : public nsRunnable, public nsITimerCallback
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
nsStopPluginRunnable(nsPluginInstanceOwner* aInstanceOwner,
|
|
nsObjectLoadingContent* aContent)
|
|
: mInstanceOwner(aInstanceOwner)
|
|
, mContent(aContent)
|
|
{
|
|
NS_ASSERTION(aInstanceOwner, "need an owner");
|
|
NS_ASSERTION(aContent, "need a nsObjectLoadingContent");
|
|
}
|
|
|
|
// nsRunnable
|
|
NS_IMETHOD Run();
|
|
|
|
// nsITimerCallback
|
|
NS_IMETHOD Notify(nsITimer *timer);
|
|
|
|
protected:
|
|
virtual ~nsStopPluginRunnable() {}
|
|
|
|
private:
|
|
nsCOMPtr<nsITimer> mTimer;
|
|
nsRefPtr<nsPluginInstanceOwner> mInstanceOwner;
|
|
nsCOMPtr<nsIObjectLoadingContent> mContent;
|
|
};
|
|
|
|
NS_IMPL_ISUPPORTS_INHERITED(nsStopPluginRunnable, nsRunnable, nsITimerCallback)
|
|
|
|
NS_IMETHODIMP
|
|
nsStopPluginRunnable::Notify(nsITimer *aTimer)
|
|
{
|
|
return Run();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsStopPluginRunnable::Run()
|
|
{
|
|
// InitWithCallback calls Release before AddRef so we need to hold a
|
|
// strong ref on 'this' since we fall through to this scope if it fails.
|
|
nsCOMPtr<nsITimerCallback> kungFuDeathGrip = this;
|
|
nsCOMPtr<nsIAppShell> appShell = do_GetService(kAppShellCID);
|
|
if (appShell) {
|
|
uint32_t currentLevel = 0;
|
|
appShell->GetEventloopNestingLevel(¤tLevel);
|
|
if (currentLevel > mInstanceOwner->GetLastEventloopNestingLevel()) {
|
|
if (!mTimer)
|
|
mTimer = do_CreateInstance("@mozilla.org/timer;1");
|
|
if (mTimer) {
|
|
// Fire 100ms timer to try to tear down this plugin as quickly as
|
|
// possible once the nesting level comes back down.
|
|
nsresult rv = mTimer->InitWithCallback(this, 100,
|
|
nsITimer::TYPE_ONE_SHOT);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
return rv;
|
|
}
|
|
}
|
|
NS_ERROR("Failed to setup a timer to stop the plugin later (at a safe "
|
|
"time). Stopping the plugin now, this might crash.");
|
|
}
|
|
}
|
|
|
|
mTimer = nullptr;
|
|
|
|
static_cast<nsObjectLoadingContent*>(mContent.get())->
|
|
DoStopPlugin(mInstanceOwner, false, true);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
// You can't take the address of bitfield members, so we have two separate
|
|
// classes for these :-/
|
|
|
|
// Sets a object's mInstantiating bit to false when destroyed
|
|
class AutoSetInstantiatingToFalse {
|
|
public:
|
|
explicit AutoSetInstantiatingToFalse(nsObjectLoadingContent* aContent)
|
|
: mContent(aContent) {}
|
|
~AutoSetInstantiatingToFalse() { mContent->mInstantiating = false; }
|
|
private:
|
|
nsObjectLoadingContent* mContent;
|
|
};
|
|
|
|
// Sets a object's mInstantiating bit to false when destroyed
|
|
class AutoSetLoadingToFalse {
|
|
public:
|
|
explicit AutoSetLoadingToFalse(nsObjectLoadingContent* aContent)
|
|
: mContent(aContent) {}
|
|
~AutoSetLoadingToFalse() { mContent->mIsLoading = false; }
|
|
private:
|
|
nsObjectLoadingContent* mContent;
|
|
};
|
|
|
|
///
|
|
/// Helper functions
|
|
///
|
|
|
|
static bool
|
|
IsSuccessfulRequest(nsIRequest* aRequest)
|
|
{
|
|
nsresult status;
|
|
nsresult rv = aRequest->GetStatus(&status);
|
|
if (NS_FAILED(rv) || NS_FAILED(status)) {
|
|
return false;
|
|
}
|
|
|
|
// This may still be an error page or somesuch
|
|
nsCOMPtr<nsIHttpChannel> httpChan(do_QueryInterface(aRequest));
|
|
if (httpChan) {
|
|
bool success;
|
|
rv = httpChan->GetRequestSucceeded(&success);
|
|
if (NS_FAILED(rv) || !success) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Otherwise, the request is successful
|
|
return true;
|
|
}
|
|
|
|
static bool
|
|
CanHandleURI(nsIURI* aURI)
|
|
{
|
|
nsAutoCString scheme;
|
|
if (NS_FAILED(aURI->GetScheme(scheme))) {
|
|
return false;
|
|
}
|
|
|
|
nsIIOService* ios = nsContentUtils::GetIOService();
|
|
if (!ios)
|
|
return false;
|
|
|
|
nsCOMPtr<nsIProtocolHandler> handler;
|
|
ios->GetProtocolHandler(scheme.get(), getter_AddRefs(handler));
|
|
if (!handler) {
|
|
return false;
|
|
}
|
|
|
|
nsCOMPtr<nsIExternalProtocolHandler> extHandler =
|
|
do_QueryInterface(handler);
|
|
// We can handle this URI if its protocol handler is not the external one
|
|
return extHandler == nullptr;
|
|
}
|
|
|
|
// Helper for tedious URI equality syntax when one or both arguments may be
|
|
// null and URIEquals(null, null) should be true
|
|
static bool inline
|
|
URIEquals(nsIURI *a, nsIURI *b)
|
|
{
|
|
bool equal;
|
|
return (!a && !b) || (a && b && NS_SUCCEEDED(a->Equals(b, &equal)) && equal);
|
|
}
|
|
|
|
static bool
|
|
IsSupportedImage(const nsCString& aMimeType)
|
|
{
|
|
return imgLoader::SupportImageWithMimeType(aMimeType.get());
|
|
}
|
|
|
|
static void
|
|
GetExtensionFromURI(nsIURI* uri, nsCString& ext)
|
|
{
|
|
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
|
|
if (url) {
|
|
url->GetFileExtension(ext);
|
|
} else {
|
|
nsCString spec;
|
|
uri->GetSpec(spec);
|
|
|
|
int32_t offset = spec.RFindChar('.');
|
|
if (offset != kNotFound) {
|
|
ext = Substring(spec, offset + 1, spec.Length());
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks whether a plugin exists and is enabled for the extension
|
|
* in the given URI. The MIME type is returned in the mimeType out parameter.
|
|
*/
|
|
bool
|
|
IsPluginEnabledByExtension(nsIURI* uri, nsCString& mimeType)
|
|
{
|
|
nsAutoCString ext;
|
|
GetExtensionFromURI(uri, ext);
|
|
|
|
if (ext.IsEmpty()) {
|
|
return false;
|
|
}
|
|
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
|
|
if (!pluginHost) {
|
|
NS_NOTREACHED("No pluginhost");
|
|
return false;
|
|
}
|
|
|
|
const char* typeFromExt;
|
|
nsresult rv = pluginHost->IsPluginEnabledForExtension(ext.get(), typeFromExt);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
mimeType = typeFromExt;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
PluginExistsForType(const char* aMIMEType)
|
|
{
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
|
|
if (!pluginHost) {
|
|
NS_NOTREACHED("No pluginhost");
|
|
return false;
|
|
}
|
|
|
|
return pluginHost->PluginExistsForType(aMIMEType);
|
|
}
|
|
|
|
///
|
|
/// Member Functions
|
|
///
|
|
|
|
// Helper to queue a CheckPluginStopEvent for a OBJLC object
|
|
void
|
|
nsObjectLoadingContent::QueueCheckPluginStopEvent()
|
|
{
|
|
nsCOMPtr<nsIRunnable> event = new CheckPluginStopEvent(this);
|
|
mPendingCheckPluginStopEvent = event;
|
|
|
|
nsCOMPtr<nsIAppShell> appShell = do_GetService(kAppShellCID);
|
|
if (appShell) {
|
|
appShell->RunInStableState(event);
|
|
}
|
|
}
|
|
|
|
// Tedious syntax to create a plugin stream listener with checks and put it in
|
|
// mFinalListener
|
|
bool
|
|
nsObjectLoadingContent::MakePluginListener()
|
|
{
|
|
if (!mInstanceOwner) {
|
|
NS_NOTREACHED("expecting a spawned plugin");
|
|
return false;
|
|
}
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
if (!pluginHost) {
|
|
NS_NOTREACHED("No pluginHost");
|
|
return false;
|
|
}
|
|
NS_ASSERTION(!mFinalListener, "overwriting a final listener");
|
|
nsresult rv;
|
|
nsRefPtr<nsNPAPIPluginInstance> inst;
|
|
nsCOMPtr<nsIStreamListener> finalListener;
|
|
rv = mInstanceOwner->GetInstance(getter_AddRefs(inst));
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
rv = pluginHost->NewPluginStreamListener(mURI, inst,
|
|
getter_AddRefs(finalListener));
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
mFinalListener = finalListener;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool
|
|
nsObjectLoadingContent::IsSupportedDocument(const nsCString& aMimeType)
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "must be a content");
|
|
|
|
nsCOMPtr<nsIWebNavigationInfo> info(
|
|
do_GetService(NS_WEBNAVIGATION_INFO_CONTRACTID));
|
|
if (!info) {
|
|
return false;
|
|
}
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav;
|
|
nsIDocument* currentDoc = thisContent->GetComposedDoc();
|
|
if (currentDoc) {
|
|
webNav = do_GetInterface(currentDoc->GetWindow());
|
|
}
|
|
|
|
uint32_t supported;
|
|
nsresult rv = info->IsTypeSupported(aMimeType, webNav, &supported);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
return false;
|
|
}
|
|
|
|
if (supported != nsIWebNavigationInfo::UNSUPPORTED) {
|
|
// Don't want to support plugins as documents
|
|
return supported != nsIWebNavigationInfo::PLUGIN;
|
|
}
|
|
|
|
// Try a stream converter
|
|
// NOTE: We treat any type we can convert from as a supported type. If a
|
|
// type is not actually supported, the URI loader will detect that and
|
|
// return an error, and we'll fallback.
|
|
nsCOMPtr<nsIStreamConverterService> convServ =
|
|
do_GetService("@mozilla.org/streamConverters;1");
|
|
bool canConvert = false;
|
|
if (convServ) {
|
|
rv = convServ->CanConvert(aMimeType.get(), "*/*", &canConvert);
|
|
}
|
|
return NS_SUCCEEDED(rv) && canConvert;
|
|
}
|
|
|
|
nsresult
|
|
nsObjectLoadingContent::BindToTree(nsIDocument* aDocument,
|
|
nsIContent* aParent,
|
|
nsIContent* aBindingParent,
|
|
bool aCompileEventHandlers)
|
|
{
|
|
nsImageLoadingContent::BindToTree(aDocument, aParent, aBindingParent,
|
|
aCompileEventHandlers);
|
|
|
|
if (aDocument) {
|
|
return aDocument->AddPlugin(this);
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::UnbindFromTree(bool aDeep, bool aNullParent)
|
|
{
|
|
nsImageLoadingContent::UnbindFromTree(aDeep, aNullParent);
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIObjectLoadingContent*>(this));
|
|
MOZ_ASSERT(thisContent);
|
|
nsIDocument* ownerDoc = thisContent->OwnerDoc();
|
|
ownerDoc->RemovePlugin(this);
|
|
|
|
if (mType == eType_Plugin && (mInstanceOwner || mInstantiating)) {
|
|
// we'll let the plugin continue to run at least until we get back to
|
|
// the event loop. If we get back to the event loop and the node
|
|
// has still not been added back to the document then we tear down the
|
|
// plugin
|
|
QueueCheckPluginStopEvent();
|
|
} else if (mType != eType_Image) {
|
|
// nsImageLoadingContent handles the image case.
|
|
// Reset state and clear pending events
|
|
/// XXX(johns): The implementation for GenericFrame notes that ideally we
|
|
/// would keep the docshell around, but trash the frameloader
|
|
UnloadObject();
|
|
}
|
|
nsIDocument* doc = thisContent->GetComposedDoc();
|
|
if (doc && doc->IsActive()) {
|
|
nsCOMPtr<nsIRunnable> ev = new nsSimplePluginEvent(doc,
|
|
NS_LITERAL_STRING("PluginRemoved"));
|
|
NS_DispatchToCurrentThread(ev);
|
|
}
|
|
}
|
|
|
|
nsObjectLoadingContent::nsObjectLoadingContent()
|
|
: mType(eType_Loading)
|
|
, mFallbackType(eFallbackAlternate)
|
|
, mChannelLoaded(false)
|
|
, mInstantiating(false)
|
|
, mNetworkCreated(true)
|
|
, mActivated(false)
|
|
, mPlayPreviewCanceled(false)
|
|
, mIsStopping(false)
|
|
, mIsLoading(false)
|
|
, mScriptRequested(false) {}
|
|
|
|
nsObjectLoadingContent::~nsObjectLoadingContent()
|
|
{
|
|
// Should have been unbound from the tree at this point, and
|
|
// CheckPluginStopEvent keeps us alive
|
|
if (mFrameLoader) {
|
|
NS_NOTREACHED("Should not be tearing down frame loaders at this point");
|
|
mFrameLoader->Destroy();
|
|
}
|
|
if (mInstanceOwner || mInstantiating) {
|
|
// This is especially bad as delayed stop will try to hold on to this
|
|
// object...
|
|
NS_NOTREACHED("Should not be tearing down a plugin at this point!");
|
|
StopPluginInstance();
|
|
}
|
|
DestroyImageLoadingContent();
|
|
}
|
|
|
|
nsresult
|
|
nsObjectLoadingContent::InstantiatePluginInstance(bool aIsLoading)
|
|
{
|
|
if (mInstanceOwner || mType != eType_Plugin || (mIsLoading != aIsLoading) ||
|
|
mInstantiating) {
|
|
// If we hit this assertion it's probably because LoadObject re-entered :(
|
|
//
|
|
// XXX(johns): This hackiness will go away in bug 767635
|
|
NS_ASSERTION(mIsLoading || !aIsLoading,
|
|
"aIsLoading should only be true inside LoadObject");
|
|
return NS_OK;
|
|
}
|
|
|
|
mInstantiating = true;
|
|
AutoSetInstantiatingToFalse autoInstantiating(this);
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent *>(this));
|
|
|
|
nsCOMPtr<nsIDocument> doc = thisContent->GetComposedDoc();
|
|
if (!doc || !InActiveDocument(thisContent)) {
|
|
NS_ERROR("Shouldn't be calling "
|
|
"InstantiatePluginInstance without an active document");
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// Instantiating an instance can result in script execution, which
|
|
// can destroy this DOM object. Don't allow that for the scope
|
|
// of this method.
|
|
nsCOMPtr<nsIObjectLoadingContent> kungFuDeathGrip = this;
|
|
|
|
// Flush layout so that the frame is created if possible and the plugin is
|
|
// initialized with the latest information.
|
|
doc->FlushPendingNotifications(Flush_Layout);
|
|
// Flushing layout may have re-entered and loaded something underneath us
|
|
NS_ENSURE_TRUE(mInstantiating, NS_OK);
|
|
|
|
if (!thisContent->GetPrimaryFrame()) {
|
|
LOG(("OBJLC [%p]: Not instantiating plugin with no frame", this));
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult rv = NS_ERROR_FAILURE;
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
|
|
if (!pluginHost) {
|
|
NS_NOTREACHED("No pluginhost");
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// If you add early return(s), be sure to balance this call to
|
|
// appShell->SuspendNative() with additional call(s) to
|
|
// appShell->ReturnNative().
|
|
nsCOMPtr<nsIAppShell> appShell = do_GetService(kAppShellCID);
|
|
if (appShell) {
|
|
appShell->SuspendNative();
|
|
}
|
|
|
|
nsRefPtr<nsPluginInstanceOwner> newOwner;
|
|
rv = pluginHost->InstantiatePluginInstance(mContentType.get(),
|
|
mURI.get(), this,
|
|
getter_AddRefs(newOwner));
|
|
|
|
// XXX(johns): We don't suspend native inside stopping plugins...
|
|
if (appShell) {
|
|
appShell->ResumeNative();
|
|
}
|
|
|
|
if (!mInstantiating || NS_FAILED(rv)) {
|
|
LOG(("OBJLC [%p]: Plugin instantiation failed or re-entered, "
|
|
"killing old instance", this));
|
|
// XXX(johns): This needs to be de-duplicated with DoStopPlugin, but we
|
|
// don't want to touch the protochain or delayed stop.
|
|
// (Bug 767635)
|
|
if (newOwner) {
|
|
nsRefPtr<nsNPAPIPluginInstance> inst;
|
|
newOwner->GetInstance(getter_AddRefs(inst));
|
|
newOwner->SetFrame(nullptr);
|
|
if (inst) {
|
|
pluginHost->StopPluginInstance(inst);
|
|
}
|
|
newOwner->Destroy();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
mInstanceOwner = newOwner;
|
|
|
|
// Ensure the frame did not change during instantiation re-entry (common).
|
|
// HasNewFrame would not have mInstanceOwner yet, so the new frame would be
|
|
// dangling. (Bug 854082)
|
|
nsIFrame* frame = thisContent->GetPrimaryFrame();
|
|
if (frame && mInstanceOwner) {
|
|
mInstanceOwner->SetFrame(static_cast<nsPluginFrame*>(frame));
|
|
|
|
// Bug 870216 - Adobe Reader renders with incorrect dimensions until it gets
|
|
// a second SetWindow call. This is otherwise redundant.
|
|
mInstanceOwner->CallSetWindow();
|
|
}
|
|
|
|
// Set up scripting interfaces.
|
|
NotifyContentObjectWrapper();
|
|
|
|
nsRefPtr<nsNPAPIPluginInstance> pluginInstance;
|
|
GetPluginInstance(getter_AddRefs(pluginInstance));
|
|
if (pluginInstance) {
|
|
nsCOMPtr<nsIPluginTag> pluginTag;
|
|
pluginHost->GetPluginTagForInstance(pluginInstance,
|
|
getter_AddRefs(pluginTag));
|
|
|
|
nsCOMPtr<nsIBlocklistService> blocklist =
|
|
do_GetService("@mozilla.org/extensions/blocklist;1");
|
|
if (blocklist) {
|
|
uint32_t blockState = nsIBlocklistService::STATE_NOT_BLOCKED;
|
|
blocklist->GetPluginBlocklistState(pluginTag, EmptyString(),
|
|
EmptyString(), &blockState);
|
|
if (blockState == nsIBlocklistService::STATE_OUTDATED) {
|
|
// Fire plugin outdated event if necessary
|
|
LOG(("OBJLC [%p]: Dispatching plugin outdated event for content %p\n",
|
|
this));
|
|
nsCOMPtr<nsIRunnable> ev = new nsSimplePluginEvent(thisContent,
|
|
NS_LITERAL_STRING("PluginOutdated"));
|
|
nsresult rv = NS_DispatchToCurrentThread(ev);
|
|
if (NS_FAILED(rv)) {
|
|
NS_WARNING("failed to dispatch nsSimplePluginEvent");
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we have a URI but didn't open a channel yet (eAllowPluginSkipChannel)
|
|
// or we did load with a channel but are re-instantiating, re-open the
|
|
// channel. OpenChannel() performs security checks, and this plugin has
|
|
// already passed content policy in LoadObject.
|
|
if ((mURI && !mChannelLoaded) || (mChannelLoaded && !aIsLoading)) {
|
|
NS_ASSERTION(!mChannel, "should not have an existing channel here");
|
|
// We intentionally ignore errors here, leaving it up to the plugin to
|
|
// deal with not having an initial stream.
|
|
OpenChannel();
|
|
}
|
|
}
|
|
|
|
nsCOMPtr<nsIRunnable> ev = \
|
|
new nsSimplePluginEvent(thisContent,
|
|
doc,
|
|
NS_LITERAL_STRING("PluginInstantiated"));
|
|
NS_DispatchToCurrentThread(ev);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::GetPluginAttributes(nsTArray<MozPluginParameter>& aAttributes)
|
|
{
|
|
aAttributes = mCachedAttributes;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::GetPluginParameters(nsTArray<MozPluginParameter>& aParameters)
|
|
{
|
|
aParameters = mCachedParameters;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::GetNestedParams(nsTArray<MozPluginParameter>& aParams,
|
|
bool aIgnoreCodebase)
|
|
{
|
|
nsCOMPtr<nsIDOMElement> domElement =
|
|
do_QueryInterface(static_cast<nsIObjectLoadingContent*>(this));
|
|
|
|
nsCOMPtr<nsIDOMHTMLCollection> allParams;
|
|
NS_NAMED_LITERAL_STRING(xhtml_ns, "http://www.w3.org/1999/xhtml");
|
|
domElement->GetElementsByTagNameNS(xhtml_ns,
|
|
NS_LITERAL_STRING("param"), getter_AddRefs(allParams));
|
|
|
|
if (!allParams)
|
|
return;
|
|
|
|
uint32_t numAllParams;
|
|
allParams->GetLength(&numAllParams);
|
|
for (uint32_t i = 0; i < numAllParams; i++) {
|
|
nsCOMPtr<nsIDOMNode> pNode;
|
|
allParams->Item(i, getter_AddRefs(pNode));
|
|
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(pNode);
|
|
|
|
if (!element)
|
|
continue;
|
|
|
|
nsAutoString name;
|
|
element->GetAttribute(NS_LITERAL_STRING("name"), name);
|
|
|
|
if (name.IsEmpty())
|
|
continue;
|
|
|
|
nsCOMPtr<nsIDOMNode> parent;
|
|
nsCOMPtr<nsIDOMHTMLObjectElement> domObject;
|
|
nsCOMPtr<nsIDOMHTMLAppletElement> domApplet;
|
|
pNode->GetParentNode(getter_AddRefs(parent));
|
|
while (!(domObject || domApplet) && parent) {
|
|
domObject = do_QueryInterface(parent);
|
|
domApplet = do_QueryInterface(parent);
|
|
nsCOMPtr<nsIDOMNode> temp;
|
|
parent->GetParentNode(getter_AddRefs(temp));
|
|
parent = temp;
|
|
}
|
|
|
|
if (domApplet) {
|
|
parent = do_QueryInterface(domApplet);
|
|
} else if (domObject) {
|
|
parent = do_QueryInterface(domObject);
|
|
} else {
|
|
continue;
|
|
}
|
|
|
|
nsCOMPtr<nsIDOMNode> domNode = do_QueryInterface(domElement);
|
|
if (parent == domNode) {
|
|
MozPluginParameter param;
|
|
element->GetAttribute(NS_LITERAL_STRING("name"), param.mName);
|
|
element->GetAttribute(NS_LITERAL_STRING("value"), param.mValue);
|
|
|
|
param.mName.Trim(" \n\r\t\b", true, true, false);
|
|
param.mValue.Trim(" \n\r\t\b", true, true, false);
|
|
|
|
// ignore codebase param if it was already added in the attributes array.
|
|
if (aIgnoreCodebase && param.mName.EqualsIgnoreCase("codebase")) {
|
|
continue;
|
|
}
|
|
|
|
aParams.AppendElement(param);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::BuildParametersArray()
|
|
{
|
|
if (mCachedAttributes.Length() || mCachedParameters.Length()) {
|
|
MOZ_ASSERT(false, "Parameters array should be empty.");
|
|
return;
|
|
}
|
|
|
|
nsCOMPtr<nsIContent> content =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
int32_t start = 0, end = content->GetAttrCount(), step = 1;
|
|
// HTML attributes are stored in reverse order.
|
|
if (content->IsHTML() && content->IsInHTMLDocument()) {
|
|
start = end - 1;
|
|
end = -1;
|
|
step = -1;
|
|
}
|
|
|
|
for (int32_t i = start; i != end; i += step) {
|
|
MozPluginParameter param;
|
|
const nsAttrName* attrName = content->GetAttrNameAt(i);
|
|
nsIAtom* atom = attrName->LocalName();
|
|
content->GetAttr(attrName->NamespaceID(), atom, param.mValue);
|
|
atom->ToString(param.mName);
|
|
mCachedAttributes.AppendElement(param);
|
|
}
|
|
|
|
bool isJava = nsPluginHost::IsJavaMIMEType(mContentType.get());
|
|
|
|
nsCString codebase;
|
|
if (isJava) {
|
|
mBaseURI->GetSpec(codebase);
|
|
}
|
|
|
|
nsAdoptingCString wmodeOverride = Preferences::GetCString("plugins.force.wmode");
|
|
#if defined(XP_WIN) || defined(XP_LINUX)
|
|
// Bug 923745 (/Bug 1061995) - Until we support windowed mode plugins in
|
|
// content processes, force flash to use a windowless rendering mode. This
|
|
// hack should go away when bug 923746 lands. (OS X plugins always use some
|
|
// native widgets, so unfortunately this does not help there)
|
|
if (wmodeOverride.IsEmpty() &&
|
|
XRE_GetProcessType() == GeckoProcessType_Content) {
|
|
wmodeOverride.AssignLiteral("transparent");
|
|
}
|
|
#endif
|
|
|
|
for (uint32_t i = 0; i < mCachedAttributes.Length(); i++) {
|
|
if (!wmodeOverride.IsEmpty() && mCachedAttributes[i].mName.EqualsIgnoreCase("wmode")) {
|
|
CopyASCIItoUTF16(wmodeOverride, mCachedAttributes[i].mValue);
|
|
wmodeOverride.Truncate();
|
|
} else if (!codebase.IsEmpty() && mCachedAttributes[i].mName.EqualsIgnoreCase("codebase")) {
|
|
CopyASCIItoUTF16(codebase, mCachedAttributes[i].mValue);
|
|
codebase.Truncate();
|
|
}
|
|
}
|
|
|
|
if (!wmodeOverride.IsEmpty()) {
|
|
MozPluginParameter param;
|
|
param.mName = NS_LITERAL_STRING("wmode");
|
|
CopyASCIItoUTF16(wmodeOverride, param.mValue);
|
|
mCachedAttributes.AppendElement(param);
|
|
}
|
|
|
|
if (!codebase.IsEmpty()) {
|
|
MozPluginParameter param;
|
|
param.mName = NS_LITERAL_STRING("codebase");
|
|
CopyASCIItoUTF16(codebase, param.mValue);
|
|
mCachedAttributes.AppendElement(param);
|
|
}
|
|
|
|
// Some plugins were never written to understand the "data" attribute of the OBJECT tag.
|
|
// Real and WMP will not play unless they find a "src" attribute, see bug 152334.
|
|
// Nav 4.x would simply replace the "data" with "src". Because some plugins correctly
|
|
// look for "data", lets instead copy the "data" attribute and add another entry
|
|
// to the bottom of the array if there isn't already a "src" specified.
|
|
if (content->Tag() == nsGkAtoms::object &&
|
|
!content->HasAttr(kNameSpaceID_None, nsGkAtoms::src)) {
|
|
MozPluginParameter param;
|
|
content->GetAttr(kNameSpaceID_None, nsGkAtoms::data, param.mValue);
|
|
if (!param.mValue.IsEmpty()) {
|
|
param.mName = NS_LITERAL_STRING("SRC");
|
|
mCachedAttributes.AppendElement(param);
|
|
}
|
|
}
|
|
|
|
GetNestedParams(mCachedParameters, isJava);
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::NotifyOwnerDocumentActivityChanged()
|
|
{
|
|
// XXX(johns): We cannot touch plugins or run arbitrary script from this call,
|
|
// as nsDocument is in a non-reentrant state.
|
|
|
|
// If we have a plugin we want to queue an event to stop it unless we are
|
|
// moved into an active document before returning to the event loop.
|
|
if (mInstanceOwner || mInstantiating) {
|
|
QueueCheckPluginStopEvent();
|
|
}
|
|
}
|
|
|
|
// nsIRequestObserver
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::OnStartRequest(nsIRequest *aRequest,
|
|
nsISupports *aContext)
|
|
{
|
|
PROFILER_LABEL("nsObjectLoadingContent", "OnStartRequest",
|
|
js::ProfileEntry::Category::NETWORK);
|
|
|
|
LOG(("OBJLC [%p]: Channel OnStartRequest", this));
|
|
|
|
if (aRequest != mChannel || !aRequest) {
|
|
// happens when a new load starts before the previous one got here
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
|
|
// If we already switched to type plugin, this channel can just be passed to
|
|
// the final listener.
|
|
if (mType == eType_Plugin) {
|
|
if (!mInstanceOwner) {
|
|
// We drop mChannel when stopping plugins, so something is wrong
|
|
NS_NOTREACHED("Opened a channel in plugin mode, but don't have a plugin");
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
if (MakePluginListener()) {
|
|
return mFinalListener->OnStartRequest(aRequest, nullptr);
|
|
} else {
|
|
NS_NOTREACHED("Failed to create PluginStreamListener, aborting channel");
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
}
|
|
|
|
// Otherwise we should be state loading, and call LoadObject with the channel
|
|
if (mType != eType_Loading) {
|
|
NS_NOTREACHED("Should be type loading at this point");
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
NS_ASSERTION(!mChannelLoaded, "mChannelLoaded set already?");
|
|
NS_ASSERTION(!mFinalListener, "mFinalListener exists already?");
|
|
|
|
mChannelLoaded = true;
|
|
|
|
nsCOMPtr<nsIChannel> chan(do_QueryInterface(aRequest));
|
|
NS_ASSERTION(chan, "Why is our request not a channel?");
|
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
if (IsSuccessfulRequest(aRequest)) {
|
|
chan->GetURI(getter_AddRefs(uri));
|
|
}
|
|
|
|
if (!uri) {
|
|
LOG(("OBJLC [%p]: OnStartRequest: Request failed\n", this));
|
|
// If the request fails, we still call LoadObject() to handle fallback
|
|
// content and notifying of failure. (mChannelLoaded && !mChannel) indicates
|
|
// the bad state.
|
|
mChannel = nullptr;
|
|
LoadObject(true, false);
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return LoadObject(true, false, aRequest);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::OnStopRequest(nsIRequest *aRequest,
|
|
nsISupports *aContext,
|
|
nsresult aStatusCode)
|
|
{
|
|
PROFILER_LABEL("nsObjectLoadingContent", "OnStopRequest",
|
|
js::ProfileEntry::Category::NETWORK);
|
|
|
|
// Handle object not loading error because source was a tracking URL.
|
|
// We make a note of this object node by including it in a dedicated
|
|
// array of blocked tracking nodes under its parent document.
|
|
if (aStatusCode == NS_ERROR_TRACKING_URI) {
|
|
nsCOMPtr<nsIContent> thisNode =
|
|
do_QueryInterface(static_cast<nsIObjectLoadingContent*>(this));
|
|
if (thisNode && thisNode->IsInComposedDoc()) {
|
|
thisNode->GetComposedDoc()->AddBlockedTrackingNode(thisNode);
|
|
}
|
|
}
|
|
|
|
NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE);
|
|
|
|
if (aRequest != mChannel) {
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
|
|
mChannel = nullptr;
|
|
|
|
if (mFinalListener) {
|
|
// This may re-enter in the case of plugin listeners
|
|
nsCOMPtr<nsIStreamListener> listenerGrip(mFinalListener);
|
|
mFinalListener = nullptr;
|
|
listenerGrip->OnStopRequest(aRequest, aContext, aStatusCode);
|
|
}
|
|
|
|
// Return value doesn't matter
|
|
return NS_OK;
|
|
}
|
|
|
|
|
|
// nsIStreamListener
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::OnDataAvailable(nsIRequest *aRequest,
|
|
nsISupports *aContext,
|
|
nsIInputStream *aInputStream,
|
|
uint64_t aOffset, uint32_t aCount)
|
|
{
|
|
NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE);
|
|
|
|
if (aRequest != mChannel) {
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
|
|
if (mFinalListener) {
|
|
// This may re-enter in the case of plugin listeners
|
|
nsCOMPtr<nsIStreamListener> listenerGrip(mFinalListener);
|
|
return listenerGrip->OnDataAvailable(aRequest, aContext, aInputStream,
|
|
aOffset, aCount);
|
|
}
|
|
|
|
// We shouldn't have a connected channel with no final listener
|
|
NS_NOTREACHED("Got data for channel with no connected final listener");
|
|
mChannel = nullptr;
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
|
|
// nsIFrameLoaderOwner
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetFrameLoader(nsIFrameLoader** aFrameLoader)
|
|
{
|
|
NS_IF_ADDREF(*aFrameLoader = mFrameLoader);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP_(already_AddRefed<nsFrameLoader>)
|
|
nsObjectLoadingContent::GetFrameLoader()
|
|
{
|
|
nsRefPtr<nsFrameLoader> loader = mFrameLoader;
|
|
return loader.forget();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::SwapFrameLoaders(nsIFrameLoaderOwner* aOtherLoader)
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetActualType(nsACString& aType)
|
|
{
|
|
aType = mContentType;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetDisplayedType(uint32_t* aType)
|
|
{
|
|
*aType = DisplayedType();
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::HasNewFrame(nsIObjectFrame* aFrame)
|
|
{
|
|
if (mType != eType_Plugin) {
|
|
return NS_OK;
|
|
}
|
|
|
|
if (!aFrame) {
|
|
// Lost our frame. If we aren't going to be getting a new frame, e.g. we've
|
|
// become display:none, we'll want to stop the plugin. Queue a
|
|
// CheckPluginStopEvent
|
|
if (mInstanceOwner || mInstantiating) {
|
|
if (mInstanceOwner) {
|
|
mInstanceOwner->SetFrame(nullptr);
|
|
}
|
|
QueueCheckPluginStopEvent();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
// Have a new frame
|
|
|
|
if (!mInstanceOwner) {
|
|
// We are successfully setup as type plugin, but have not spawned an
|
|
// instance due to a lack of a frame.
|
|
AsyncStartPluginInstance();
|
|
return NS_OK;
|
|
}
|
|
|
|
// Otherwise, we're just changing frames
|
|
// Set up relationship between instance owner and frame.
|
|
nsPluginFrame *objFrame = static_cast<nsPluginFrame*>(aFrame);
|
|
mInstanceOwner->SetFrame(objFrame);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetPluginInstance(nsNPAPIPluginInstance** aInstance)
|
|
{
|
|
*aInstance = nullptr;
|
|
|
|
if (!mInstanceOwner) {
|
|
return NS_OK;
|
|
}
|
|
|
|
return mInstanceOwner->GetInstance(aInstance);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetContentTypeForMIMEType(const nsACString& aMIMEType,
|
|
uint32_t* aType)
|
|
{
|
|
*aType = GetTypeOfContent(PromiseFlatCString(aMIMEType));
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetBaseURI(nsIURI **aResult)
|
|
{
|
|
NS_IF_ADDREF(*aResult = mBaseURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
// nsIInterfaceRequestor
|
|
// We use a shim class to implement this so that JS consumers still
|
|
// see an interface requestor even though WebIDL bindings don't expose
|
|
// that stuff.
|
|
class ObjectInterfaceRequestorShim MOZ_FINAL : public nsIInterfaceRequestor,
|
|
public nsIChannelEventSink,
|
|
public nsIStreamListener
|
|
{
|
|
public:
|
|
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
|
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(ObjectInterfaceRequestorShim,
|
|
nsIInterfaceRequestor)
|
|
NS_DECL_NSIINTERFACEREQUESTOR
|
|
// nsRefPtr<nsObjectLoadingContent> fails due to ambiguous AddRef/Release,
|
|
// hence the ugly static cast :(
|
|
NS_FORWARD_NSICHANNELEVENTSINK(static_cast<nsObjectLoadingContent *>
|
|
(mContent.get())->)
|
|
NS_FORWARD_NSISTREAMLISTENER (static_cast<nsObjectLoadingContent *>
|
|
(mContent.get())->)
|
|
NS_FORWARD_NSIREQUESTOBSERVER (static_cast<nsObjectLoadingContent *>
|
|
(mContent.get())->)
|
|
|
|
explicit ObjectInterfaceRequestorShim(nsIObjectLoadingContent* aContent)
|
|
: mContent(aContent)
|
|
{}
|
|
|
|
protected:
|
|
~ObjectInterfaceRequestorShim() {}
|
|
nsCOMPtr<nsIObjectLoadingContent> mContent;
|
|
};
|
|
|
|
NS_IMPL_CYCLE_COLLECTION(ObjectInterfaceRequestorShim, mContent)
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ObjectInterfaceRequestorShim)
|
|
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
|
|
NS_INTERFACE_MAP_ENTRY(nsIChannelEventSink)
|
|
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
|
|
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIInterfaceRequestor)
|
|
NS_INTERFACE_MAP_END
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(ObjectInterfaceRequestorShim)
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(ObjectInterfaceRequestorShim)
|
|
|
|
NS_IMETHODIMP
|
|
ObjectInterfaceRequestorShim::GetInterface(const nsIID & aIID, void **aResult)
|
|
{
|
|
if (aIID.Equals(NS_GET_IID(nsIChannelEventSink))) {
|
|
nsIChannelEventSink* sink = this;
|
|
*aResult = sink;
|
|
NS_ADDREF(sink);
|
|
return NS_OK;
|
|
}
|
|
return NS_NOINTERFACE;
|
|
}
|
|
|
|
// nsIChannelEventSink
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::AsyncOnChannelRedirect(nsIChannel *aOldChannel,
|
|
nsIChannel *aNewChannel,
|
|
uint32_t aFlags,
|
|
nsIAsyncVerifyRedirectCallback *cb)
|
|
{
|
|
// If we're already busy with a new load, or have no load at all,
|
|
// cancel the redirect.
|
|
if (!mChannel || aOldChannel != mChannel) {
|
|
return NS_BINDING_ABORTED;
|
|
}
|
|
|
|
mChannel = aNewChannel;
|
|
cb->OnRedirectVerifyCallback(NS_OK);
|
|
return NS_OK;
|
|
}
|
|
|
|
// <public>
|
|
EventStates
|
|
nsObjectLoadingContent::ObjectState() const
|
|
{
|
|
switch (mType) {
|
|
case eType_Loading:
|
|
return NS_EVENT_STATE_LOADING;
|
|
case eType_Image:
|
|
return ImageState();
|
|
case eType_Plugin:
|
|
case eType_Document:
|
|
// These are OK. If documents start to load successfully, they display
|
|
// something, and are thus not broken in this sense. The same goes for
|
|
// plugins.
|
|
return EventStates();
|
|
case eType_Null:
|
|
switch (mFallbackType) {
|
|
case eFallbackSuppressed:
|
|
return NS_EVENT_STATE_SUPPRESSED;
|
|
case eFallbackUserDisabled:
|
|
return NS_EVENT_STATE_USERDISABLED;
|
|
case eFallbackClickToPlay:
|
|
return NS_EVENT_STATE_TYPE_CLICK_TO_PLAY;
|
|
case eFallbackPlayPreview:
|
|
return NS_EVENT_STATE_TYPE_PLAY_PREVIEW;
|
|
case eFallbackDisabled:
|
|
return NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_HANDLER_DISABLED;
|
|
case eFallbackBlocklisted:
|
|
return NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_HANDLER_BLOCKED;
|
|
case eFallbackCrashed:
|
|
return NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_HANDLER_CRASHED;
|
|
case eFallbackUnsupported: {
|
|
// Check to see if plugins are blocked on this platform.
|
|
char* pluginsBlocked = PR_GetEnv("MOZ_PLUGINS_BLOCKED");
|
|
if (pluginsBlocked && pluginsBlocked[0] == '1') {
|
|
return NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_TYPE_UNSUPPORTED_PLATFORM;
|
|
} else {
|
|
return NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_TYPE_UNSUPPORTED;
|
|
}
|
|
}
|
|
case eFallbackOutdated:
|
|
case eFallbackAlternate:
|
|
return NS_EVENT_STATE_BROKEN;
|
|
case eFallbackVulnerableUpdatable:
|
|
return NS_EVENT_STATE_VULNERABLE_UPDATABLE;
|
|
case eFallbackVulnerableNoUpdate:
|
|
return NS_EVENT_STATE_VULNERABLE_NO_UPDATE;
|
|
}
|
|
};
|
|
NS_NOTREACHED("unknown type?");
|
|
return NS_EVENT_STATE_LOADING;
|
|
}
|
|
|
|
// Returns false if mBaseURI is not acceptable for java applets.
|
|
bool
|
|
nsObjectLoadingContent::CheckJavaCodebase()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
nsCOMPtr<nsIScriptSecurityManager> secMan =
|
|
nsContentUtils::GetSecurityManager();
|
|
nsCOMPtr<nsINetUtil> netutil = do_GetNetUtil();
|
|
NS_ASSERTION(thisContent && secMan && netutil, "expected interfaces");
|
|
|
|
|
|
// Note that mBaseURI is this tag's requested base URI, not the codebase of
|
|
// the document for security purposes
|
|
nsresult rv = secMan->CheckLoadURIWithPrincipal(thisContent->NodePrincipal(),
|
|
mBaseURI, 0);
|
|
if (NS_FAILED(rv)) {
|
|
LOG(("OBJLC [%p]: Java codebase check failed", this));
|
|
return false;
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> principalBaseURI;
|
|
rv = thisContent->NodePrincipal()->GetURI(getter_AddRefs(principalBaseURI));
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("Failed to URI from node principal?");
|
|
return false;
|
|
}
|
|
// We currently allow java's codebase to be non-same-origin, with
|
|
// the exception of URIs that represent local files
|
|
if (NS_URIIsLocalFile(mBaseURI) &&
|
|
nsScriptSecurityManager::GetStrictFileOriginPolicy() &&
|
|
!NS_RelaxStrictFileOriginPolicy(mBaseURI, principalBaseURI, true)) {
|
|
LOG(("OBJLC [%p]: Java failed RelaxStrictFileOriginPolicy for file URI",
|
|
this));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
nsObjectLoadingContent::CheckLoadPolicy(int16_t *aContentPolicy)
|
|
{
|
|
if (!aContentPolicy || !mURI) {
|
|
NS_NOTREACHED("Doing it wrong");
|
|
return false;
|
|
}
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "Must be an instance of content");
|
|
|
|
nsIDocument* doc = thisContent->OwnerDoc();
|
|
|
|
*aContentPolicy = nsIContentPolicy::ACCEPT;
|
|
nsresult rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_OBJECT,
|
|
mURI,
|
|
doc->NodePrincipal(),
|
|
thisContent,
|
|
mContentType,
|
|
nullptr, //extra
|
|
aContentPolicy,
|
|
nsContentUtils::GetContentPolicy(),
|
|
nsContentUtils::GetSecurityManager());
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
if (NS_CP_REJECTED(*aContentPolicy)) {
|
|
nsAutoCString uri;
|
|
nsAutoCString baseUri;
|
|
mURI->GetSpec(uri);
|
|
mURI->GetSpec(baseUri);
|
|
LOG(("OBJLC [%p]: Content policy denied load of %s (base %s)",
|
|
this, uri.get(), baseUri.get()));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
nsObjectLoadingContent::CheckProcessPolicy(int16_t *aContentPolicy)
|
|
{
|
|
if (!aContentPolicy) {
|
|
NS_NOTREACHED("Null out variable");
|
|
return false;
|
|
}
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "Must be an instance of content");
|
|
|
|
nsIDocument* doc = thisContent->OwnerDoc();
|
|
|
|
int32_t objectType;
|
|
switch (mType) {
|
|
case eType_Image:
|
|
objectType = nsIContentPolicy::TYPE_IMAGE;
|
|
break;
|
|
case eType_Document:
|
|
objectType = nsIContentPolicy::TYPE_DOCUMENT;
|
|
break;
|
|
case eType_Plugin:
|
|
objectType = nsIContentPolicy::TYPE_OBJECT;
|
|
break;
|
|
default:
|
|
NS_NOTREACHED("Calling checkProcessPolicy with a unloadable type");
|
|
return false;
|
|
}
|
|
|
|
*aContentPolicy = nsIContentPolicy::ACCEPT;
|
|
nsresult rv =
|
|
NS_CheckContentProcessPolicy(objectType,
|
|
mURI ? mURI : mBaseURI,
|
|
doc->NodePrincipal(),
|
|
static_cast<nsIImageLoadingContent*>(this),
|
|
mContentType,
|
|
nullptr, //extra
|
|
aContentPolicy,
|
|
nsContentUtils::GetContentPolicy(),
|
|
nsContentUtils::GetSecurityManager());
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
|
|
if (NS_CP_REJECTED(*aContentPolicy)) {
|
|
LOG(("OBJLC [%p]: CheckContentProcessPolicy rejected load", this));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
nsObjectLoadingContent::ParameterUpdateFlags
|
|
nsObjectLoadingContent::UpdateObjectParameters(bool aJavaURI)
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "Must be an instance of content");
|
|
|
|
uint32_t caps = GetCapabilities();
|
|
LOG(("OBJLC [%p]: Updating object parameters", this));
|
|
|
|
nsresult rv;
|
|
nsAutoCString newMime;
|
|
nsAutoString typeAttr;
|
|
nsCOMPtr<nsIURI> newURI;
|
|
nsCOMPtr<nsIURI> newBaseURI;
|
|
ObjectType newType;
|
|
bool isJava = false;
|
|
// Set if this state can't be used to load anything, forces eType_Null
|
|
bool stateInvalid = false;
|
|
// Indicates what parameters changed.
|
|
// eParamChannelChanged - means parameters that affect channel opening
|
|
// decisions changed
|
|
// eParamStateChanged - means anything that affects what content we load
|
|
// changed, even if the channel we'd open remains the
|
|
// same.
|
|
//
|
|
// State changes outside of the channel parameters only matter if we've
|
|
// already opened a channel or tried to instantiate content, whereas channel
|
|
// parameter changes require re-opening the channel even if we haven't gotten
|
|
// that far.
|
|
nsObjectLoadingContent::ParameterUpdateFlags retval = eParamNoChange;
|
|
|
|
///
|
|
/// Initial MIME Type
|
|
///
|
|
|
|
if (aJavaURI || thisContent->NodeInfo()->Equals(nsGkAtoms::applet)) {
|
|
nsAdoptingCString javaMIME = Preferences::GetCString(kPrefJavaMIME);
|
|
newMime = javaMIME;
|
|
NS_ASSERTION(nsPluginHost::IsJavaMIMEType(newMime.get()),
|
|
"plugin.mime.java should be recognized by IsJavaMIMEType");
|
|
isJava = true;
|
|
} else {
|
|
nsAutoString rawTypeAttr;
|
|
thisContent->GetAttr(kNameSpaceID_None, nsGkAtoms::type, rawTypeAttr);
|
|
if (!rawTypeAttr.IsEmpty()) {
|
|
typeAttr = rawTypeAttr;
|
|
CopyUTF16toUTF8(rawTypeAttr, newMime);
|
|
isJava = nsPluginHost::IsJavaMIMEType(newMime.get());
|
|
}
|
|
}
|
|
|
|
///
|
|
/// classID
|
|
///
|
|
|
|
if (caps & eSupportClassID) {
|
|
nsAutoString classIDAttr;
|
|
thisContent->GetAttr(kNameSpaceID_None, nsGkAtoms::classid, classIDAttr);
|
|
if (!classIDAttr.IsEmpty()) {
|
|
// Our classid support is limited to 'java:' ids
|
|
nsAdoptingCString javaMIME = Preferences::GetCString(kPrefJavaMIME);
|
|
NS_ASSERTION(nsPluginHost::IsJavaMIMEType(javaMIME.get()),
|
|
"plugin.mime.java should be recognized by IsJavaMIMEType");
|
|
if (StringBeginsWith(classIDAttr, NS_LITERAL_STRING("java:")) &&
|
|
PluginExistsForType(javaMIME)) {
|
|
newMime = javaMIME;
|
|
isJava = true;
|
|
} else {
|
|
// XXX(johns): Our de-facto behavior since forever was to refuse to load
|
|
// Objects who don't have a classid we support, regardless of other type
|
|
// or uri info leads to a valid plugin.
|
|
newMime.Truncate();
|
|
stateInvalid = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
///
|
|
/// Codebase
|
|
///
|
|
|
|
nsAutoString codebaseStr;
|
|
nsCOMPtr<nsIURI> docBaseURI = thisContent->GetBaseURI();
|
|
bool hasCodebase = thisContent->HasAttr(kNameSpaceID_None, nsGkAtoms::codebase);
|
|
if (hasCodebase)
|
|
thisContent->GetAttr(kNameSpaceID_None, nsGkAtoms::codebase, codebaseStr);
|
|
|
|
|
|
// Java wants the codebase attribute even if it occurs in <param> tags
|
|
if (isJava) {
|
|
// Find all <param> tags that are nested beneath us, but not beneath another
|
|
// object/applet tag.
|
|
nsTArray<MozPluginParameter> params;
|
|
GetNestedParams(params, false);
|
|
for (uint32_t i = 0; i < params.Length(); i++) {
|
|
if (params[i].mName.EqualsIgnoreCase("codebase")) {
|
|
hasCodebase = true;
|
|
codebaseStr = params[i].mValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isJava && hasCodebase && codebaseStr.IsEmpty()) {
|
|
// Java treats codebase="" as "/"
|
|
codebaseStr.Assign('/');
|
|
// XXX(johns): This doesn't cover the case of "https:" which java would
|
|
// interpret as "https:///" but we interpret as this document's
|
|
// URI but with a changed scheme.
|
|
} else if (isJava && !hasCodebase) {
|
|
// Java expects a directory as the codebase, or else it will construct
|
|
// relative URIs incorrectly :(
|
|
codebaseStr.Assign('.');
|
|
}
|
|
|
|
if (!codebaseStr.IsEmpty()) {
|
|
rv = nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(newBaseURI),
|
|
codebaseStr,
|
|
thisContent->OwnerDoc(),
|
|
docBaseURI);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
NS_TryToSetImmutable(newBaseURI);
|
|
} else {
|
|
// Malformed URI
|
|
LOG(("OBJLC [%p]: Could not parse plugin's codebase as a URI, "
|
|
"will use document baseURI instead", this));
|
|
}
|
|
}
|
|
|
|
// If we failed to build a valid URI, use the document's base URI
|
|
if (!newBaseURI) {
|
|
newBaseURI = docBaseURI;
|
|
}
|
|
|
|
///
|
|
/// URI
|
|
///
|
|
|
|
nsAutoString uriStr;
|
|
// Different elements keep this in various locations
|
|
if (isJava) {
|
|
// Applet tags and embed/object with explicit java MIMEs have src/data
|
|
// attributes that are not meant to be parsed as URIs or opened by the
|
|
// browser -- act as if they are null. (Setting these attributes triggers a
|
|
// force-load, so tracking the old value to determine if they have changed
|
|
// is not necessary.)
|
|
} else if (thisContent->NodeInfo()->Equals(nsGkAtoms::object)) {
|
|
thisContent->GetAttr(kNameSpaceID_None, nsGkAtoms::data, uriStr);
|
|
} else if (thisContent->NodeInfo()->Equals(nsGkAtoms::embed)) {
|
|
thisContent->GetAttr(kNameSpaceID_None, nsGkAtoms::src, uriStr);
|
|
} else {
|
|
// Applet tags should always have a java MIME type at this point
|
|
NS_NOTREACHED("Unrecognized plugin-loading tag");
|
|
}
|
|
|
|
// Note that the baseURI changing could affect the newURI, even if uriStr did
|
|
// not change.
|
|
if (!uriStr.IsEmpty()) {
|
|
rv = nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(newURI),
|
|
uriStr,
|
|
thisContent->OwnerDoc(),
|
|
newBaseURI);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
NS_TryToSetImmutable(newURI);
|
|
} else {
|
|
stateInvalid = true;
|
|
}
|
|
}
|
|
|
|
// For eAllowPluginSkipChannel tags, if we have a non-plugin type, but can get
|
|
// a plugin type from the extension, prefer that to falling back to a channel.
|
|
if (GetTypeOfContent(newMime) != eType_Plugin && newURI &&
|
|
(caps & eAllowPluginSkipChannel) &&
|
|
IsPluginEnabledByExtension(newURI, newMime)) {
|
|
LOG(("OBJLC [%p]: Using extension as type hint (%s)", this, newMime.get()));
|
|
if (!isJava && nsPluginHost::IsJavaMIMEType(newMime.get())) {
|
|
return UpdateObjectParameters(true);
|
|
}
|
|
}
|
|
|
|
///
|
|
/// Check if the original (pre-channel) content-type or URI changed, and
|
|
/// record mOriginal{ContentType,URI}
|
|
///
|
|
|
|
if ((mOriginalContentType != newMime) || !URIEquals(mOriginalURI, newURI)) {
|
|
// These parameters changing requires re-opening the channel, so don't
|
|
// consider the currently-open channel below
|
|
// XXX(johns): Changing the mime type might change our decision on whether
|
|
// or not we load a channel, so we count changes to it as a
|
|
// channel parameter change for the sake of simplicity.
|
|
retval = (ParameterUpdateFlags)(retval | eParamChannelChanged);
|
|
LOG(("OBJLC [%p]: Channel parameters changed", this));
|
|
}
|
|
mOriginalContentType = newMime;
|
|
mOriginalURI = newURI;
|
|
|
|
///
|
|
/// If we have a channel, see if its MIME type should take precendence and
|
|
/// check the final (redirected) URL
|
|
///
|
|
|
|
// If we have a loaded channel and channel parameters did not change, use it
|
|
// to determine what we would load.
|
|
bool useChannel = mChannelLoaded && !(retval & eParamChannelChanged);
|
|
// If we have a channel and are type loading, as opposed to having an existing
|
|
// channel for a previous load.
|
|
bool newChannel = useChannel && mType == eType_Loading;
|
|
|
|
if (newChannel && mChannel) {
|
|
nsCString channelType;
|
|
rv = mChannel->GetContentType(channelType);
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("GetContentType failed");
|
|
stateInvalid = true;
|
|
channelType.Truncate();
|
|
}
|
|
|
|
LOG(("OBJLC [%p]: Channel has a content type of %s", this, channelType.get()));
|
|
|
|
bool binaryChannelType = false;
|
|
if (channelType.EqualsASCII(APPLICATION_GUESS_FROM_EXT)) {
|
|
channelType = APPLICATION_OCTET_STREAM;
|
|
mChannel->SetContentType(channelType);
|
|
binaryChannelType = true;
|
|
} else if (channelType.EqualsASCII(APPLICATION_OCTET_STREAM)
|
|
|| channelType.EqualsASCII(BINARY_OCTET_STREAM)) {
|
|
binaryChannelType = true;
|
|
}
|
|
|
|
// Channel can change our URI through redirection
|
|
rv = NS_GetFinalChannelURI(mChannel, getter_AddRefs(newURI));
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("NS_GetFinalChannelURI failure");
|
|
stateInvalid = true;
|
|
}
|
|
|
|
ObjectType typeHint = newMime.IsEmpty() ?
|
|
eType_Null : GetTypeOfContent(newMime);
|
|
|
|
//
|
|
// In order of preference:
|
|
//
|
|
// 1) Perform typemustmatch check.
|
|
// If check is sucessful use type without further checks.
|
|
// If check is unsuccessful set stateInvalid to true
|
|
// 2) Use our type hint if it matches a plugin
|
|
// 3) If we have eAllowPluginSkipChannel, use the uri file extension if
|
|
// it matches a plugin
|
|
// 4) If the channel returns a binary stream type:
|
|
// 4a) If we have a type non-null non-document type hint, use that
|
|
// 4b) If the uri file extension matches a plugin type, use that
|
|
// 5) Use the channel type
|
|
|
|
bool overrideChannelType = false;
|
|
if (thisContent->HasAttr(kNameSpaceID_None, nsGkAtoms::typemustmatch)) {
|
|
if (!typeAttr.LowerCaseEqualsASCII(channelType.get())) {
|
|
stateInvalid = true;
|
|
}
|
|
} else if (typeHint == eType_Plugin) {
|
|
LOG(("OBJLC [%p]: Using plugin type hint in favor of any channel type",
|
|
this));
|
|
overrideChannelType = true;
|
|
} else if ((caps & eAllowPluginSkipChannel) &&
|
|
IsPluginEnabledByExtension(newURI, newMime)) {
|
|
LOG(("OBJLC [%p]: Using extension as type hint for "
|
|
"eAllowPluginSkipChannel tag (%s)", this, newMime.get()));
|
|
overrideChannelType = true;
|
|
} else if (binaryChannelType &&
|
|
typeHint != eType_Null && typeHint != eType_Document) {
|
|
LOG(("OBJLC [%p]: Using type hint in favor of binary channel type",
|
|
this));
|
|
overrideChannelType = true;
|
|
} else if (binaryChannelType &&
|
|
IsPluginEnabledByExtension(newURI, newMime)) {
|
|
LOG(("OBJLC [%p]: Using extension as type hint for binary channel (%s)",
|
|
this, newMime.get()));
|
|
overrideChannelType = true;
|
|
}
|
|
|
|
if (overrideChannelType) {
|
|
// Set the type we'll use for dispatch on the channel. Otherwise we could
|
|
// end up trying to dispatch to a nsFrameLoader, which will complain that
|
|
// it couldn't find a way to handle application/octet-stream
|
|
nsAutoCString parsedMime, dummy;
|
|
NS_ParseContentType(newMime, parsedMime, dummy);
|
|
if (!parsedMime.IsEmpty()) {
|
|
mChannel->SetContentType(parsedMime);
|
|
}
|
|
} else {
|
|
newMime = channelType;
|
|
if (nsPluginHost::IsJavaMIMEType(newMime.get())) {
|
|
// Java does not load with a channel, and being java retroactively
|
|
// changes how we may have interpreted the codebase to construct this
|
|
// URI above. Because the behavior here is more or less undefined, play
|
|
// it safe and reject the load.
|
|
LOG(("OBJLC [%p]: Refusing to load with channel with java MIME",
|
|
this));
|
|
stateInvalid = true;
|
|
}
|
|
}
|
|
} else if (newChannel) {
|
|
LOG(("OBJLC [%p]: We failed to open a channel, marking invalid", this));
|
|
stateInvalid = true;
|
|
}
|
|
|
|
///
|
|
/// Determine final type
|
|
///
|
|
// In order of preference:
|
|
// 1) If we have attempted channel load, or set stateInvalid above, the type
|
|
// is always null (fallback)
|
|
// 2) If we have a loaded channel, we grabbed its mimeType above, use that
|
|
// type.
|
|
// 3) If we have a plugin type and no URI, use that type.
|
|
// 4) If we have a plugin type and eAllowPluginSkipChannel, use that type.
|
|
// 5) if we have a URI, set type to loading to indicate we'd need a channel
|
|
// to proceed.
|
|
// 6) Otherwise, type null to indicate unloadable content (fallback)
|
|
//
|
|
|
|
if (stateInvalid) {
|
|
newType = eType_Null;
|
|
newMime.Truncate();
|
|
} else if (newChannel) {
|
|
// If newChannel is set above, we considered it in setting newMime
|
|
newType = GetTypeOfContent(newMime);
|
|
LOG(("OBJLC [%p]: Using channel type", this));
|
|
} else if (((caps & eAllowPluginSkipChannel) || !newURI) &&
|
|
GetTypeOfContent(newMime) == eType_Plugin) {
|
|
newType = eType_Plugin;
|
|
LOG(("OBJLC [%p]: Plugin type with no URI, skipping channel load", this));
|
|
} else if (newURI) {
|
|
// We could potentially load this if we opened a channel on mURI, indicate
|
|
// This by leaving type as loading
|
|
newType = eType_Loading;
|
|
} else {
|
|
// Unloadable - no URI, and no plugin type. Non-plugin types (images,
|
|
// documents) always load with a channel.
|
|
newType = eType_Null;
|
|
}
|
|
|
|
///
|
|
/// Handle existing channels
|
|
///
|
|
|
|
if (useChannel && newType == eType_Loading) {
|
|
// We decided to use a channel, and also that the previous channel is still
|
|
// usable, so re-use the existing values.
|
|
newType = mType;
|
|
newMime = mContentType;
|
|
newURI = mURI;
|
|
} else if (useChannel && !newChannel) {
|
|
// We have an existing channel, but did not decide to use one.
|
|
retval = (ParameterUpdateFlags)(retval | eParamChannelChanged);
|
|
useChannel = false;
|
|
}
|
|
|
|
///
|
|
/// Update changed values
|
|
///
|
|
|
|
if (newType != mType) {
|
|
retval = (ParameterUpdateFlags)(retval | eParamStateChanged);
|
|
LOG(("OBJLC [%p]: Type changed from %u -> %u", this, mType, newType));
|
|
mType = newType;
|
|
}
|
|
|
|
if (!URIEquals(mBaseURI, newBaseURI)) {
|
|
if (isJava) {
|
|
// Java bases its class loading on the base URI, so we consider the state
|
|
// to have changed if this changes. If the object is using a relative URI,
|
|
// mURI will have changed below regardless
|
|
retval = (ParameterUpdateFlags)(retval | eParamStateChanged);
|
|
}
|
|
LOG(("OBJLC [%p]: Object effective baseURI changed", this));
|
|
mBaseURI = newBaseURI;
|
|
}
|
|
|
|
if (!URIEquals(newURI, mURI)) {
|
|
retval = (ParameterUpdateFlags)(retval | eParamStateChanged);
|
|
LOG(("OBJLC [%p]: Object effective URI changed", this));
|
|
mURI = newURI;
|
|
}
|
|
|
|
// We don't update content type when loading, as the type is not final and we
|
|
// don't want to superfluously change between mOriginalContentType ->
|
|
// mContentType when doing |obj.data = obj.data| with a channel and differing
|
|
// type.
|
|
if (mType != eType_Loading && mContentType != newMime) {
|
|
retval = (ParameterUpdateFlags)(retval | eParamStateChanged);
|
|
retval = (ParameterUpdateFlags)(retval | eParamContentTypeChanged);
|
|
LOG(("OBJLC [%p]: Object effective mime type changed (%s -> %s)",
|
|
this, mContentType.get(), newMime.get()));
|
|
mContentType = newMime;
|
|
}
|
|
|
|
// If we decided to keep using info from an old channel, but also that state
|
|
// changed, we need to invalidate it.
|
|
if (useChannel && !newChannel && (retval & eParamStateChanged)) {
|
|
mType = eType_Loading;
|
|
retval = (ParameterUpdateFlags)(retval | eParamChannelChanged);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
// Used by PluginDocument to kick off our initial load from the already-opened
|
|
// channel.
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::InitializeFromChannel(nsIRequest *aChannel)
|
|
{
|
|
LOG(("OBJLC [%p] InitializeFromChannel: %p", this, aChannel));
|
|
if (mType != eType_Loading || mChannel) {
|
|
// We could technically call UnloadObject() here, if consumers have a valid
|
|
// reason for wanting to call this on an already-loaded tag.
|
|
NS_NOTREACHED("Should not have begun loading at this point");
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
|
|
// Because we didn't open this channel from an initial LoadObject, we'll
|
|
// update our parameters now, so the OnStartRequest->LoadObject doesn't
|
|
// believe our src/type suddenly changed.
|
|
UpdateObjectParameters();
|
|
// But we always want to load from a channel, in this case.
|
|
mType = eType_Loading;
|
|
mChannel = do_QueryInterface(aChannel);
|
|
NS_ASSERTION(mChannel, "passed a request that is not a channel");
|
|
|
|
// OnStartRequest will now see we have a channel in the loading state, and
|
|
// call into LoadObject. There's a possibility LoadObject will decide not to
|
|
// load anything from a channel - it will call CloseChannel() in that case.
|
|
return NS_OK;
|
|
}
|
|
|
|
// Only OnStartRequest should be passing the channel parameter
|
|
nsresult
|
|
nsObjectLoadingContent::LoadObject(bool aNotify,
|
|
bool aForceLoad)
|
|
{
|
|
return LoadObject(aNotify, aForceLoad, nullptr);
|
|
}
|
|
|
|
nsresult
|
|
nsObjectLoadingContent::LoadObject(bool aNotify,
|
|
bool aForceLoad,
|
|
nsIRequest *aLoadingChannel)
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "must be a content");
|
|
nsIDocument* doc = thisContent->OwnerDoc();
|
|
nsresult rv = NS_OK;
|
|
|
|
// Sanity check
|
|
if (!InActiveDocument(thisContent)) {
|
|
NS_NOTREACHED("LoadObject called while not bound to an active document");
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
|
|
// XXX(johns): In these cases, we refuse to touch our content and just
|
|
// remain unloaded, as per legacy behavior. It would make more sense to
|
|
// load fallback content initially and refuse to ever change state again.
|
|
if (doc->IsBeingUsedAsImage() || doc->IsLoadedAsData()) {
|
|
return NS_OK;
|
|
}
|
|
|
|
LOG(("OBJLC [%p]: LoadObject called, notify %u, forceload %u, channel %p",
|
|
this, aNotify, aForceLoad, aLoadingChannel));
|
|
|
|
// We can't re-use an already open channel, but aForceLoad may make us try
|
|
// to load a plugin without any changes in channel state.
|
|
if (aForceLoad && mChannelLoaded) {
|
|
CloseChannel();
|
|
mChannelLoaded = false;
|
|
}
|
|
|
|
// Save these for NotifyStateChanged();
|
|
EventStates oldState = ObjectState();
|
|
ObjectType oldType = mType;
|
|
|
|
ParameterUpdateFlags stateChange = UpdateObjectParameters();
|
|
|
|
if (!stateChange && !aForceLoad) {
|
|
return NS_OK;
|
|
}
|
|
|
|
///
|
|
/// State has changed, unload existing content and attempt to load new type
|
|
///
|
|
LOG(("OBJLC [%p]: LoadObject - plugin state changed (%u)",
|
|
this, stateChange));
|
|
|
|
// Setup fallback info. We may also change type to fallback below in case of
|
|
// sanity/OOM/etc. errors. We default to showing alternate content
|
|
// NOTE LoadFallback can override this in some cases
|
|
FallbackType fallbackType = eFallbackAlternate;
|
|
|
|
// mType can differ with GetTypeOfContent(mContentType) if we support this
|
|
// type, but the parameters are invalid e.g. a embed tag with type "image/png"
|
|
// but no URI -- don't show a plugin error or unknown type error in that case.
|
|
if (mType == eType_Null && GetTypeOfContent(mContentType) == eType_Null) {
|
|
fallbackType = eFallbackUnsupported;
|
|
}
|
|
|
|
// Explicit user activation should reset if the object changes content types
|
|
if (mActivated && (stateChange & eParamContentTypeChanged)) {
|
|
LOG(("OBJLC [%p]: Content type changed, clearing activation state", this));
|
|
mActivated = false;
|
|
}
|
|
|
|
// We synchronously start/stop plugin instances below, which may spin the
|
|
// event loop. Re-entering into the load is fine, but at that point the
|
|
// original load call needs to abort when unwinding
|
|
// NOTE this is located *after* the state change check, a subseqent load
|
|
// with no subsequently changed state will be a no-op.
|
|
if (mIsLoading) {
|
|
LOG(("OBJLC [%p]: Re-entering into LoadObject", this));
|
|
}
|
|
mIsLoading = true;
|
|
AutoSetLoadingToFalse reentryCheck(this);
|
|
|
|
// Unload existing content, keeping in mind stopping plugins might spin the
|
|
// event loop. Note that we check for still-open channels below
|
|
UnloadObject(false); // Don't reset state
|
|
if (!mIsLoading) {
|
|
// The event loop must've spun and re-entered into LoadObject, which
|
|
// finished the load
|
|
LOG(("OBJLC [%p]: Re-entered into LoadObject, aborting outer load", this));
|
|
return NS_OK;
|
|
}
|
|
|
|
// Determine what's going on with our channel.
|
|
if (stateChange & eParamChannelChanged) {
|
|
// If the channel params changed, throw away the channel, but unset
|
|
// mChannelLoaded so we'll still try to open a new one for this load if
|
|
// necessary
|
|
CloseChannel();
|
|
mChannelLoaded = false;
|
|
} else if (mType == eType_Null && mChannel) {
|
|
// If we opened a channel but then failed to find a loadable state, throw it
|
|
// away. mChannelLoaded will indicate that we tried to load a channel at one
|
|
// point so we wont recurse
|
|
CloseChannel();
|
|
} else if (mType == eType_Loading && mChannel) {
|
|
// We're still waiting on a channel load, already opened one, and
|
|
// channel parameters didn't change
|
|
return NS_OK;
|
|
} else if (mChannelLoaded && mChannel != aLoadingChannel) {
|
|
// The only time we should have a loaded channel with a changed state is
|
|
// when the channel has just opened -- in which case this call should
|
|
// have originated from OnStartRequest
|
|
NS_NOTREACHED("Loading with a channel, but state doesn't make sense");
|
|
return NS_OK;
|
|
}
|
|
|
|
//
|
|
// Security checks
|
|
//
|
|
|
|
if (mType != eType_Null) {
|
|
bool allowLoad = true;
|
|
if (nsPluginHost::IsJavaMIMEType(mContentType.get())) {
|
|
allowLoad = CheckJavaCodebase();
|
|
}
|
|
int16_t contentPolicy = nsIContentPolicy::ACCEPT;
|
|
// If mChannelLoaded is set we presumably already passed load policy
|
|
if (allowLoad && mURI && !mChannelLoaded) {
|
|
allowLoad = CheckLoadPolicy(&contentPolicy);
|
|
}
|
|
// If we're loading a type now, check ProcessPolicy. Note that we may check
|
|
// both now in the case of plugins whose type is determined before opening a
|
|
// channel.
|
|
if (allowLoad && mType != eType_Loading) {
|
|
allowLoad = CheckProcessPolicy(&contentPolicy);
|
|
}
|
|
|
|
// Content policy implementations can mutate the DOM, check for re-entry
|
|
if (!mIsLoading) {
|
|
LOG(("OBJLC [%p]: We re-entered in content policy, leaving original load",
|
|
this));
|
|
return NS_OK;
|
|
}
|
|
|
|
// Load denied, switch to fallback and set disabled/suppressed if applicable
|
|
if (!allowLoad) {
|
|
LOG(("OBJLC [%p]: Load denied by policy", this));
|
|
mType = eType_Null;
|
|
if (contentPolicy == nsIContentPolicy::REJECT_TYPE) {
|
|
// XXX(johns) This is assuming that we were rejected by
|
|
// nsContentBlocker, which rejects by type if permissions
|
|
// reject plugins
|
|
fallbackType = eFallbackUserDisabled;
|
|
} else {
|
|
fallbackType = eFallbackSuppressed;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Don't allow view-source scheme.
|
|
// view-source is the only scheme to which this applies at the moment due to
|
|
// potential timing attacks to read data from cross-origin documents. If this
|
|
// widens we should add a protocol flag for whether the scheme is only allowed
|
|
// in top and use something like nsNetUtil::NS_URIChainHasFlags.
|
|
if (mType != eType_Null) {
|
|
nsCOMPtr<nsIURI> tempURI = mURI;
|
|
nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(tempURI);
|
|
while (nestedURI) {
|
|
// view-source should always be an nsINestedURI, loop and check the
|
|
// scheme on this and all inner URIs that are also nested URIs.
|
|
bool isViewSource = false;
|
|
rv = tempURI->SchemeIs("view-source", &isViewSource);
|
|
if (NS_FAILED(rv) || isViewSource) {
|
|
LOG(("OBJLC [%p]: Blocking as effective URI has view-source scheme",
|
|
this));
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
|
|
nestedURI->GetInnerURI(getter_AddRefs(tempURI));
|
|
nestedURI = do_QueryInterface(tempURI);
|
|
}
|
|
}
|
|
|
|
// If we're a plugin but shouldn't start yet, load fallback with
|
|
// reason click-to-play instead. Items resolved as Image/Document
|
|
// will not be checked for previews, as well as invalid plugins
|
|
// (they will not have the mContentType set).
|
|
FallbackType clickToPlayReason;
|
|
if (!mActivated && (mType == eType_Null || mType == eType_Plugin) &&
|
|
!ShouldPlay(clickToPlayReason, false)) {
|
|
LOG(("OBJLC [%p]: Marking plugin as click-to-play", this));
|
|
mType = eType_Null;
|
|
fallbackType = clickToPlayReason;
|
|
}
|
|
|
|
if (!mActivated && mType == eType_Plugin) {
|
|
// Object passed ShouldPlay, so it should be considered
|
|
// activated until it changes content type
|
|
LOG(("OBJLC [%p]: Object implicitly activated", this));
|
|
mActivated = true;
|
|
}
|
|
|
|
// Sanity check: We shouldn't have any loaded resources, pending events, or
|
|
// a final listener at this point
|
|
if (mFrameLoader || mPendingInstantiateEvent || mInstanceOwner ||
|
|
mPendingCheckPluginStopEvent || mFinalListener)
|
|
{
|
|
NS_NOTREACHED("Trying to load new plugin with existing content");
|
|
rv = NS_ERROR_UNEXPECTED;
|
|
return NS_OK;
|
|
}
|
|
|
|
// More sanity-checking:
|
|
// If mChannel is set, mChannelLoaded should be set, and vice-versa
|
|
if (mType != eType_Null && !!mChannel != mChannelLoaded) {
|
|
NS_NOTREACHED("Trying to load with bad channel state");
|
|
rv = NS_ERROR_UNEXPECTED;
|
|
return NS_OK;
|
|
}
|
|
|
|
///
|
|
/// Attempt to load new type
|
|
///
|
|
|
|
|
|
// Cache the current attributes and parameters.
|
|
if (mType == eType_Plugin || mType == eType_Null) {
|
|
BuildParametersArray();
|
|
}
|
|
|
|
// We don't set mFinalListener until OnStartRequest has been called, to
|
|
// prevent re-entry ugliness with CloseChannel()
|
|
nsCOMPtr<nsIStreamListener> finalListener;
|
|
// If we decide to synchronously spawn a plugin, we do it after firing
|
|
// notifications to avoid re-entry causing notifications to fire out of order.
|
|
bool doSpawnPlugin = false;
|
|
switch (mType) {
|
|
case eType_Image:
|
|
if (!mChannel) {
|
|
// We have a LoadImage() call, but UpdateObjectParameters requires a
|
|
// channel for images, so this is not a valid state.
|
|
NS_NOTREACHED("Attempting to load image without a channel?");
|
|
rv = NS_ERROR_UNEXPECTED;
|
|
break;
|
|
}
|
|
rv = LoadImageWithChannel(mChannel, getter_AddRefs(finalListener));
|
|
// finalListener will receive OnStartRequest below
|
|
break;
|
|
case eType_Plugin:
|
|
{
|
|
if (mChannel) {
|
|
// Force a sync state change now, we need the frame created
|
|
NotifyStateChanged(oldType, oldState, true, aNotify);
|
|
oldType = mType;
|
|
oldState = ObjectState();
|
|
|
|
if (!thisContent->GetPrimaryFrame()) {
|
|
// We're un-rendered, and can't instantiate a plugin. HasNewFrame will
|
|
// re-start us when we can proceed.
|
|
LOG(("OBJLC [%p]: Aborting load - plugin-type, but no frame", this));
|
|
CloseChannel();
|
|
break;
|
|
}
|
|
|
|
// We'll handle this below
|
|
doSpawnPlugin = true;
|
|
} else {
|
|
rv = AsyncStartPluginInstance();
|
|
}
|
|
}
|
|
break;
|
|
case eType_Document:
|
|
{
|
|
if (!mChannel) {
|
|
// We could mFrameLoader->LoadURI(mURI), but UpdateObjectParameters
|
|
// requires documents have a channel, so this is not a valid state.
|
|
NS_NOTREACHED("Attempting to load a document without a channel");
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
|
|
mFrameLoader = nsFrameLoader::Create(thisContent->AsElement(),
|
|
mNetworkCreated);
|
|
if (!mFrameLoader) {
|
|
NS_NOTREACHED("nsFrameLoader::Create failed");
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
|
|
rv = mFrameLoader->CheckForRecursiveLoad(mURI);
|
|
if (NS_FAILED(rv)) {
|
|
LOG(("OBJLC [%p]: Aborting recursive load", this));
|
|
mFrameLoader->Destroy();
|
|
mFrameLoader = nullptr;
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
|
|
// We're loading a document, so we have to set LOAD_DOCUMENT_URI
|
|
// (especially important for firing onload)
|
|
nsLoadFlags flags = 0;
|
|
mChannel->GetLoadFlags(&flags);
|
|
flags |= nsIChannel::LOAD_DOCUMENT_URI;
|
|
mChannel->SetLoadFlags(flags);
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
rv = mFrameLoader->GetDocShell(getter_AddRefs(docShell));
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("Could not get DocShell from mFrameLoader?");
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
|
|
nsCOMPtr<nsIInterfaceRequestor> req(do_QueryInterface(docShell));
|
|
NS_ASSERTION(req, "Docshell must be an ifreq");
|
|
|
|
nsCOMPtr<nsIURILoader>
|
|
uriLoader(do_GetService(NS_URI_LOADER_CONTRACTID, &rv));
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("Failed to get uriLoader service");
|
|
mType = eType_Null;
|
|
break;
|
|
}
|
|
rv = uriLoader->OpenChannel(mChannel, nsIURILoader::DONT_RETARGET, req,
|
|
getter_AddRefs(finalListener));
|
|
// finalListener will receive OnStartRequest below
|
|
}
|
|
break;
|
|
case eType_Loading:
|
|
// If our type remains Loading, we need a channel to proceed
|
|
rv = OpenChannel();
|
|
if (NS_FAILED(rv)) {
|
|
LOG(("OBJLC [%p]: OpenChannel returned failure (%u)", this, rv));
|
|
}
|
|
break;
|
|
case eType_Null:
|
|
// Handled below, silence compiler warnings
|
|
break;
|
|
};
|
|
|
|
//
|
|
// Loaded, handle notifications and fallback
|
|
//
|
|
if (NS_FAILED(rv)) {
|
|
// If we failed in the loading hunk above, switch to fallback
|
|
LOG(("OBJLC [%p]: Loading failed, switching to fallback", this));
|
|
mType = eType_Null;
|
|
}
|
|
|
|
// If we didn't load anything, handle switching to fallback state
|
|
if (mType == eType_Null) {
|
|
LOG(("OBJLC [%p]: Loading fallback, type %u", this, fallbackType));
|
|
NS_ASSERTION(!mFrameLoader && !mInstanceOwner,
|
|
"switched to type null but also loaded something");
|
|
|
|
if (mChannel) {
|
|
// If we were loading with a channel but then failed over, throw it away
|
|
CloseChannel();
|
|
}
|
|
|
|
// Don't try to initialize plugins or final listener below
|
|
doSpawnPlugin = false;
|
|
finalListener = nullptr;
|
|
|
|
// Don't notify, as LoadFallback doesn't know of our previous state
|
|
// (so really this is just setting mFallbackType)
|
|
LoadFallback(fallbackType, false);
|
|
}
|
|
|
|
// Notify of our final state
|
|
NotifyStateChanged(oldType, oldState, false, aNotify);
|
|
NS_ENSURE_TRUE(mIsLoading, NS_OK);
|
|
|
|
|
|
//
|
|
// Spawning plugins and dispatching to the final listener may re-enter, so are
|
|
// delayed until after we fire a notification, to prevent missing
|
|
// notifications or firing them out of order.
|
|
//
|
|
// Note that we ensured that we entered into LoadObject() from
|
|
// ::OnStartRequest above when loading with a channel.
|
|
//
|
|
|
|
rv = NS_OK;
|
|
if (doSpawnPlugin) {
|
|
rv = InstantiatePluginInstance(true);
|
|
NS_ENSURE_TRUE(mIsLoading, NS_OK);
|
|
// Create the final listener if we're loading with a channel. We can't do
|
|
// this in the loading block above as it requires an instance.
|
|
if (aLoadingChannel && NS_SUCCEEDED(rv)) {
|
|
if (NS_SUCCEEDED(rv) && MakePluginListener()) {
|
|
rv = mFinalListener->OnStartRequest(mChannel, nullptr);
|
|
if (NS_FAILED(rv)) {
|
|
// Plugins can reject their initial stream, but continue to run.
|
|
CloseChannel();
|
|
NS_ENSURE_TRUE(mIsLoading, NS_OK);
|
|
rv = NS_OK;
|
|
}
|
|
}
|
|
}
|
|
} else if (finalListener) {
|
|
NS_ASSERTION(mType != eType_Null && mType != eType_Loading,
|
|
"We should not have a final listener with a non-loaded type");
|
|
mFinalListener = finalListener;
|
|
rv = finalListener->OnStartRequest(mChannel, nullptr);
|
|
}
|
|
|
|
if (NS_FAILED(rv) && mIsLoading) {
|
|
// Since we've already notified of our transition, we can just Unload and
|
|
// call LoadFallback (which will notify again)
|
|
mType = eType_Null;
|
|
UnloadObject(false);
|
|
NS_ENSURE_TRUE(mIsLoading, NS_OK);
|
|
CloseChannel();
|
|
LoadFallback(fallbackType, true);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
// This call can re-enter when dealing with plugin listeners
|
|
nsresult
|
|
nsObjectLoadingContent::CloseChannel()
|
|
{
|
|
if (mChannel) {
|
|
LOG(("OBJLC [%p]: Closing channel\n", this));
|
|
// Null the values before potentially-reentering, and ensure they survive
|
|
// the call
|
|
nsCOMPtr<nsIChannel> channelGrip(mChannel);
|
|
nsCOMPtr<nsIStreamListener> listenerGrip(mFinalListener);
|
|
mChannel = nullptr;
|
|
mFinalListener = nullptr;
|
|
channelGrip->Cancel(NS_BINDING_ABORTED);
|
|
if (listenerGrip) {
|
|
// mFinalListener is only set by LoadObject after OnStartRequest, or
|
|
// by OnStartRequest in the case of late-opened plugin streams
|
|
listenerGrip->OnStopRequest(channelGrip, nullptr, NS_BINDING_ABORTED);
|
|
}
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsObjectLoadingContent::OpenChannel()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
nsCOMPtr<nsIScriptSecurityManager> secMan =
|
|
nsContentUtils::GetSecurityManager();
|
|
NS_ASSERTION(thisContent, "must be a content");
|
|
nsIDocument* doc = thisContent->OwnerDoc();
|
|
NS_ASSERTION(doc, "No owner document?");
|
|
|
|
nsresult rv;
|
|
mChannel = nullptr;
|
|
|
|
// E.g. mms://
|
|
if (!mURI || !CanHandleURI(mURI)) {
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
rv = secMan->CheckLoadURIWithPrincipal(thisContent->NodePrincipal(), mURI, 0);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
nsCOMPtr<nsILoadGroup> group = doc->GetDocumentLoadGroup();
|
|
nsCOMPtr<nsIChannel> chan;
|
|
nsRefPtr<ObjectInterfaceRequestorShim> shim =
|
|
new ObjectInterfaceRequestorShim(this);
|
|
|
|
bool isSandBoxed = doc->GetSandboxFlags() & SANDBOXED_ORIGIN;
|
|
bool inherit = nsContentUtils::ChannelShouldInheritPrincipal(thisContent->NodePrincipal(),
|
|
mURI,
|
|
true, // aInheritForAboutBlank
|
|
false); // aForceInherit
|
|
nsSecurityFlags securityFlags = nsILoadInfo::SEC_NORMAL;
|
|
if (inherit) {
|
|
securityFlags |= nsILoadInfo::SEC_FORCE_INHERIT_PRINCIPAL;
|
|
}
|
|
if (isSandBoxed) {
|
|
securityFlags |= nsILoadInfo::SEC_SANDBOXED;
|
|
}
|
|
|
|
rv = NS_NewChannel(getter_AddRefs(chan),
|
|
mURI,
|
|
thisContent,
|
|
securityFlags,
|
|
nsIContentPolicy::TYPE_OBJECT,
|
|
group, // aLoadGroup
|
|
shim, // aCallbacks
|
|
nsIChannel::LOAD_CALL_CONTENT_SNIFFERS |
|
|
nsIChannel::LOAD_CLASSIFY_URI);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
// Referrer
|
|
nsCOMPtr<nsIHttpChannel> httpChan(do_QueryInterface(chan));
|
|
if (httpChan) {
|
|
httpChan->SetReferrer(doc->GetDocumentURI());
|
|
|
|
// Set the initiator type
|
|
nsCOMPtr<nsITimedChannel> timedChannel(do_QueryInterface(httpChan));
|
|
if (timedChannel) {
|
|
timedChannel->SetInitiatorType(thisContent->LocalName());
|
|
}
|
|
}
|
|
|
|
nsCOMPtr<nsIScriptChannel> scriptChannel = do_QueryInterface(chan);
|
|
if (scriptChannel) {
|
|
// Allow execution against our context if the principals match
|
|
scriptChannel->SetExecutionPolicy(nsIScriptChannel::EXECUTE_NORMAL);
|
|
}
|
|
|
|
// AsyncOpen can fail if a file does not exist.
|
|
rv = chan->AsyncOpen(shim, nullptr);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
LOG(("OBJLC [%p]: Channel opened", this));
|
|
mChannel = chan;
|
|
return NS_OK;
|
|
}
|
|
|
|
uint32_t
|
|
nsObjectLoadingContent::GetCapabilities() const
|
|
{
|
|
return eSupportImages |
|
|
eSupportPlugins |
|
|
eSupportDocuments |
|
|
eSupportSVG;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::DestroyContent()
|
|
{
|
|
if (mFrameLoader) {
|
|
mFrameLoader->Destroy();
|
|
mFrameLoader = nullptr;
|
|
}
|
|
|
|
if (mInstanceOwner || mInstantiating) {
|
|
QueueCheckPluginStopEvent();
|
|
}
|
|
}
|
|
|
|
/* static */
|
|
void
|
|
nsObjectLoadingContent::Traverse(nsObjectLoadingContent *tmp,
|
|
nsCycleCollectionTraversalCallback &cb)
|
|
{
|
|
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mFrameLoader");
|
|
cb.NoteXPCOMChild(static_cast<nsIFrameLoader*>(tmp->mFrameLoader));
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::UnloadObject(bool aResetState)
|
|
{
|
|
// Don't notify in CancelImageRequests until we transition to a new loaded
|
|
// state
|
|
CancelImageRequests(false);
|
|
if (mFrameLoader) {
|
|
mFrameLoader->Destroy();
|
|
mFrameLoader = nullptr;
|
|
}
|
|
|
|
if (aResetState) {
|
|
if (mType != eType_Plugin) {
|
|
// This can re-enter when dealing with plugins, and StopPluginInstance
|
|
// will handle it
|
|
CloseChannel();
|
|
}
|
|
mChannelLoaded = false;
|
|
mType = eType_Loading;
|
|
mURI = mOriginalURI = mBaseURI = nullptr;
|
|
mContentType.Truncate();
|
|
mOriginalContentType.Truncate();
|
|
}
|
|
|
|
// InstantiatePluginInstance checks this after re-entrant calls and aborts if
|
|
// it was cleared from under it
|
|
mInstantiating = false;
|
|
|
|
mScriptRequested = false;
|
|
|
|
if (mIsStopping) {
|
|
// The protochain is normally thrown out after a plugin stops, but if we
|
|
// re-enter while stopping a plugin and try to load something new, we need
|
|
// to throw away the old protochain in the nested unload.
|
|
TeardownProtoChain();
|
|
mIsStopping = false;
|
|
}
|
|
|
|
mCachedAttributes.Clear();
|
|
mCachedParameters.Clear();
|
|
|
|
// This call should be last as it may re-enter
|
|
StopPluginInstance();
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::NotifyStateChanged(ObjectType aOldType,
|
|
EventStates aOldState,
|
|
bool aSync,
|
|
bool aNotify)
|
|
{
|
|
LOG(("OBJLC [%p]: Notifying about state change: (%u, %llx) -> (%u, %llx)"
|
|
" (sync %i, notify %i)", this, aOldType, aOldState.GetInternalValue(),
|
|
mType, ObjectState().GetInternalValue(), aSync, aNotify));
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "must be a content");
|
|
|
|
NS_ASSERTION(thisContent->IsElement(), "Not an element?");
|
|
|
|
// XXX(johns): A good bit of the code below replicates UpdateState(true)
|
|
|
|
// Unfortunately, we do some state changes without notifying
|
|
// (e.g. in Fallback when canceling image requests), so we have to
|
|
// manually notify object state changes.
|
|
thisContent->AsElement()->UpdateState(false);
|
|
|
|
if (!aNotify) {
|
|
// We're done here
|
|
return;
|
|
}
|
|
|
|
nsIDocument* doc = thisContent->GetComposedDoc();
|
|
if (!doc) {
|
|
return; // Nothing to do
|
|
}
|
|
|
|
EventStates newState = ObjectState();
|
|
|
|
if (newState != aOldState) {
|
|
// This will trigger frame construction
|
|
NS_ASSERTION(InActiveDocument(thisContent), "Something is confused");
|
|
EventStates changedBits = aOldState ^ newState;
|
|
|
|
{
|
|
nsAutoScriptBlocker scriptBlocker;
|
|
doc->ContentStateChanged(thisContent, changedBits);
|
|
}
|
|
if (aSync) {
|
|
// Make sure that frames are actually constructed immediately.
|
|
doc->FlushPendingNotifications(Flush_Frames);
|
|
}
|
|
} else if (aOldType != mType) {
|
|
// If our state changed, then we already recreated frames
|
|
// Otherwise, need to do that here
|
|
nsCOMPtr<nsIPresShell> shell = doc->GetShell();
|
|
if (shell) {
|
|
shell->RecreateFramesFor(thisContent);
|
|
}
|
|
}
|
|
}
|
|
|
|
nsObjectLoadingContent::ObjectType
|
|
nsObjectLoadingContent::GetTypeOfContent(const nsCString& aMIMEType)
|
|
{
|
|
if (aMIMEType.IsEmpty()) {
|
|
return eType_Null;
|
|
}
|
|
|
|
uint32_t caps = GetCapabilities();
|
|
|
|
if ((caps & eSupportImages) && IsSupportedImage(aMIMEType)) {
|
|
return eType_Image;
|
|
}
|
|
|
|
// SVGs load as documents, but are their own capability
|
|
bool isSVG = aMIMEType.LowerCaseEqualsLiteral("image/svg+xml");
|
|
Capabilities supportType = isSVG ? eSupportSVG : eSupportDocuments;
|
|
if ((caps & supportType) && IsSupportedDocument(aMIMEType)) {
|
|
return eType_Document;
|
|
}
|
|
|
|
if (caps & eSupportPlugins && PluginExistsForType(aMIMEType.get())) {
|
|
// ShouldPlay will handle checking for disabled plugins
|
|
return eType_Plugin;
|
|
}
|
|
|
|
return eType_Null;
|
|
}
|
|
|
|
nsPluginFrame*
|
|
nsObjectLoadingContent::GetExistingFrame()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent = do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
nsIFrame* frame = thisContent->GetPrimaryFrame();
|
|
nsIObjectFrame* objFrame = do_QueryFrame(frame);
|
|
return static_cast<nsPluginFrame*>(objFrame);
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::CreateStaticClone(nsObjectLoadingContent* aDest) const
|
|
{
|
|
nsImageLoadingContent::CreateStaticImageClone(aDest);
|
|
|
|
aDest->mType = mType;
|
|
nsObjectLoadingContent* thisObj = const_cast<nsObjectLoadingContent*>(this);
|
|
if (thisObj->mPrintFrame.IsAlive()) {
|
|
aDest->mPrintFrame = thisObj->mPrintFrame;
|
|
} else {
|
|
aDest->mPrintFrame = const_cast<nsObjectLoadingContent*>(this)->GetExistingFrame();
|
|
}
|
|
|
|
if (mFrameLoader) {
|
|
nsCOMPtr<nsIContent> content =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(aDest));
|
|
nsFrameLoader* fl = nsFrameLoader::Create(content->AsElement(), false);
|
|
if (fl) {
|
|
aDest->mFrameLoader = fl;
|
|
mFrameLoader->CreateStaticClone(fl);
|
|
}
|
|
}
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetPrintFrame(nsIFrame** aFrame)
|
|
{
|
|
*aFrame = mPrintFrame.GetFrame();
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::PluginDestroyed()
|
|
{
|
|
// Called when our plugin is destroyed from under us, usually when reloading
|
|
// plugins in plugin host. Invalidate instance owner / prototype but otherwise
|
|
// don't take any action.
|
|
TeardownProtoChain();
|
|
mInstanceOwner->Destroy();
|
|
mInstanceOwner = nullptr;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::PluginCrashed(nsIPluginTag* aPluginTag,
|
|
const nsAString& pluginDumpID,
|
|
const nsAString& browserDumpID,
|
|
bool submittedCrashReport)
|
|
{
|
|
LOG(("OBJLC [%p]: Plugin Crashed, queuing crash event", this));
|
|
NS_ASSERTION(mType == eType_Plugin, "PluginCrashed at non-plugin type");
|
|
|
|
PluginDestroyed();
|
|
|
|
// Switch to fallback/crashed state, notify
|
|
LoadFallback(eFallbackCrashed, true);
|
|
|
|
// send nsPluginCrashedEvent
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
// Note that aPluginTag in invalidated after we're called, so copy
|
|
// out any data we need now.
|
|
nsAutoCString pluginName;
|
|
aPluginTag->GetName(pluginName);
|
|
nsAutoCString pluginFilename;
|
|
aPluginTag->GetFilename(pluginFilename);
|
|
|
|
nsCOMPtr<nsIRunnable> ev =
|
|
new nsPluginCrashedEvent(thisContent,
|
|
pluginDumpID,
|
|
browserDumpID,
|
|
NS_ConvertUTF8toUTF16(pluginName),
|
|
NS_ConvertUTF8toUTF16(pluginFilename),
|
|
submittedCrashReport);
|
|
nsresult rv = NS_DispatchToCurrentThread(ev);
|
|
if (NS_FAILED(rv)) {
|
|
NS_WARNING("failed to dispatch nsPluginCrashedEvent");
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsObjectLoadingContent::ScriptRequestPluginInstance(JSContext* aCx,
|
|
nsNPAPIPluginInstance **aResult)
|
|
{
|
|
// The below methods pull the cx off the stack, so make sure they match.
|
|
//
|
|
// NB: Sometimes there's a null cx on the stack, in which case |cx| is the
|
|
// safe JS context. But in that case, IsCallerChrome() will return true,
|
|
// so the ensuing expression is short-circuited.
|
|
MOZ_ASSERT_IF(nsContentUtils::GetCurrentJSContext(),
|
|
aCx == nsContentUtils::GetCurrentJSContext());
|
|
bool callerIsContentJS = (!nsContentUtils::IsCallerChrome() &&
|
|
!nsContentUtils::IsCallerContentXBL() &&
|
|
js::IsContextRunningJS(aCx));
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
*aResult = nullptr;
|
|
|
|
// The first time content script attempts to access placeholder content, fire
|
|
// an event. Fallback types >= eFallbackClickToPlay are plugin-replacement
|
|
// types, see header.
|
|
if (callerIsContentJS && !mScriptRequested &&
|
|
InActiveDocument(thisContent) && mType == eType_Null &&
|
|
mFallbackType >= eFallbackClickToPlay) {
|
|
nsCOMPtr<nsIRunnable> ev =
|
|
new nsSimplePluginEvent(thisContent,
|
|
NS_LITERAL_STRING("PluginScripted"));
|
|
nsresult rv = NS_DispatchToCurrentThread(ev);
|
|
if (NS_FAILED(rv)) {
|
|
NS_NOTREACHED("failed to dispatch PluginScripted event");
|
|
}
|
|
mScriptRequested = true;
|
|
} else if (callerIsContentJS && mType == eType_Plugin && !mInstanceOwner &&
|
|
nsContentUtils::IsSafeToRunScript() &&
|
|
InActiveDocument(thisContent)) {
|
|
// If we're configured as a plugin in an active document and it's safe to
|
|
// run scripts right now, try spawning synchronously
|
|
SyncStartPluginInstance();
|
|
}
|
|
|
|
if (mInstanceOwner) {
|
|
return mInstanceOwner->GetInstance(aResult);
|
|
}
|
|
|
|
// Note that returning a null plugin is expected (and happens often)
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::SyncStartPluginInstance()
|
|
{
|
|
NS_ASSERTION(nsContentUtils::IsSafeToRunScript(),
|
|
"Must be able to run script in order to instantiate a plugin instance!");
|
|
|
|
// Don't even attempt to start an instance unless the content is in
|
|
// the document and active
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
if (!InActiveDocument(thisContent)) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> kungFuURIGrip(mURI);
|
|
nsCString contentType(mContentType);
|
|
return InstantiatePluginInstance();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::AsyncStartPluginInstance()
|
|
{
|
|
// OK to have an instance already or a pending spawn.
|
|
if (mInstanceOwner || mPendingInstantiateEvent) {
|
|
return NS_OK;
|
|
}
|
|
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
nsIDocument* doc = thisContent->OwnerDoc();
|
|
if (doc->IsStaticDocument() || doc->IsBeingUsedAsImage()) {
|
|
return NS_OK;
|
|
}
|
|
|
|
nsCOMPtr<nsIRunnable> event = new nsAsyncInstantiateEvent(this);
|
|
if (!event) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
nsresult rv = NS_DispatchToCurrentThread(event);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
// Track pending events
|
|
mPendingInstantiateEvent = event;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetSrcURI(nsIURI** aURI)
|
|
{
|
|
NS_IF_ADDREF(*aURI = GetSrcURI());
|
|
return NS_OK;
|
|
}
|
|
|
|
static bool
|
|
DoDelayedStop(nsPluginInstanceOwner* aInstanceOwner,
|
|
nsObjectLoadingContent* aContent,
|
|
bool aDelayedStop)
|
|
{
|
|
// Don't delay stopping QuickTime (bug 425157), Flip4Mac (bug 426524),
|
|
// XStandard (bug 430219), CMISS Zinc (bug 429604).
|
|
if (aDelayedStop
|
|
#if !(defined XP_WIN || defined MOZ_X11)
|
|
&& !aInstanceOwner->MatchPluginName("QuickTime")
|
|
&& !aInstanceOwner->MatchPluginName("Flip4Mac")
|
|
&& !aInstanceOwner->MatchPluginName("XStandard plugin")
|
|
&& !aInstanceOwner->MatchPluginName("CMISS Zinc Plugin")
|
|
#endif
|
|
) {
|
|
nsCOMPtr<nsIRunnable> evt =
|
|
new nsStopPluginRunnable(aInstanceOwner, aContent);
|
|
NS_DispatchToCurrentThread(evt);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::LoadFallback(FallbackType aType, bool aNotify) {
|
|
EventStates oldState = ObjectState();
|
|
ObjectType oldType = mType;
|
|
|
|
NS_ASSERTION(!mInstanceOwner && !mFrameLoader && !mChannel,
|
|
"LoadFallback called with loaded content");
|
|
|
|
//
|
|
// Fixup mFallbackType
|
|
//
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
NS_ASSERTION(thisContent, "must be a content");
|
|
|
|
if (!thisContent->IsHTML() || mContentType.IsEmpty()) {
|
|
// Don't let custom fallback handlers run outside HTML, tags without a
|
|
// determined type should always just be alternate content
|
|
aType = eFallbackAlternate;
|
|
}
|
|
|
|
if (thisContent->Tag() == nsGkAtoms::object &&
|
|
(aType == eFallbackUnsupported ||
|
|
aType == eFallbackDisabled ||
|
|
aType == eFallbackBlocklisted))
|
|
{
|
|
// Show alternate content instead, if it exists
|
|
for (nsIContent* child = thisContent->GetFirstChild();
|
|
child; child = child->GetNextSibling()) {
|
|
if (!child->IsHTML(nsGkAtoms::param) &&
|
|
nsStyleUtil::IsSignificantChild(child, true, false)) {
|
|
aType = eFallbackAlternate;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
mType = eType_Null;
|
|
mFallbackType = aType;
|
|
|
|
// Notify
|
|
if (!aNotify) {
|
|
return; // done
|
|
}
|
|
|
|
NotifyStateChanged(oldType, oldState, false, true);
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::DoStopPlugin(nsPluginInstanceOwner* aInstanceOwner,
|
|
bool aDelayedStop,
|
|
bool aForcedReentry)
|
|
{
|
|
// DoStopPlugin can process events -- There may be pending
|
|
// CheckPluginStopEvent events which can drop in underneath us and destroy the
|
|
// instance we are about to destroy. We prevent that with the mPluginStopping
|
|
// flag. (aForcedReentry is only true from the callback of an earlier delayed
|
|
// stop)
|
|
if (mIsStopping && !aForcedReentry) {
|
|
return;
|
|
}
|
|
mIsStopping = true;
|
|
|
|
nsRefPtr<nsPluginInstanceOwner> kungFuDeathGrip(aInstanceOwner);
|
|
nsRefPtr<nsNPAPIPluginInstance> inst;
|
|
aInstanceOwner->GetInstance(getter_AddRefs(inst));
|
|
if (inst) {
|
|
if (DoDelayedStop(aInstanceOwner, this, aDelayedStop)) {
|
|
return;
|
|
}
|
|
|
|
#if defined(XP_MACOSX)
|
|
aInstanceOwner->HidePluginWindow();
|
|
#endif
|
|
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
NS_ASSERTION(pluginHost, "No plugin host?");
|
|
pluginHost->StopPluginInstance(inst);
|
|
}
|
|
|
|
aInstanceOwner->Destroy();
|
|
|
|
// If we re-enter in plugin teardown UnloadObject will tear down the
|
|
// protochain -- the current protochain could be from a new, unrelated, load.
|
|
if (!mIsStopping) {
|
|
LOG(("OBJLC [%p]: Re-entered in plugin teardown", this));
|
|
return;
|
|
}
|
|
|
|
TeardownProtoChain();
|
|
mIsStopping = false;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::StopPluginInstance()
|
|
{
|
|
// Clear any pending events
|
|
mPendingInstantiateEvent = nullptr;
|
|
mPendingCheckPluginStopEvent = nullptr;
|
|
|
|
// If we're currently instantiating, clearing this will cause
|
|
// InstantiatePluginInstance's re-entrance check to destroy the created plugin
|
|
mInstantiating = false;
|
|
|
|
if (!mInstanceOwner) {
|
|
return NS_OK;
|
|
}
|
|
|
|
if (mChannel) {
|
|
// The plugin has already used data from this channel, we'll need to
|
|
// re-open it to handle instantiating again, even if we don't invalidate
|
|
// our loaded state.
|
|
/// XXX(johns): Except currently, we don't, just leaving re-opening channels
|
|
/// to plugins...
|
|
LOG(("OBJLC [%p]: StopPluginInstance - Closing used channel", this));
|
|
CloseChannel();
|
|
}
|
|
|
|
// We detach the instance owner's frame before destruction, but don't destroy
|
|
// the instance owner until the plugin is stopped.
|
|
mInstanceOwner->SetFrame(nullptr);
|
|
|
|
bool delayedStop = false;
|
|
#ifdef XP_WIN
|
|
// Force delayed stop for Real plugin only; see bug 420886, 426852.
|
|
nsRefPtr<nsNPAPIPluginInstance> inst;
|
|
mInstanceOwner->GetInstance(getter_AddRefs(inst));
|
|
if (inst) {
|
|
const char* mime = nullptr;
|
|
if (NS_SUCCEEDED(inst->GetMIMEType(&mime)) && mime) {
|
|
if (strcmp(mime, "audio/x-pn-realaudio-plugin") == 0) {
|
|
delayedStop = true;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
nsRefPtr<nsPluginInstanceOwner> ownerGrip(mInstanceOwner);
|
|
mInstanceOwner = nullptr;
|
|
|
|
// This can/will re-enter
|
|
DoStopPlugin(ownerGrip, delayedStop);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::NotifyContentObjectWrapper()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
AutoJSAPI jsapi;
|
|
jsapi.Init();
|
|
JSContext* cx = jsapi.cx();
|
|
|
|
JS::Rooted<JSObject*> obj(cx, thisContent->GetWrapper());
|
|
if (!obj) {
|
|
// Nothing to do here if there's no wrapper for mContent. The proto
|
|
// chain will be fixed appropriately when the wrapper is created.
|
|
return;
|
|
}
|
|
|
|
SetupProtoChain(cx, obj);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::PlayPlugin()
|
|
{
|
|
if (!nsContentUtils::IsCallerChrome())
|
|
return NS_OK;
|
|
|
|
if (!mActivated) {
|
|
mActivated = true;
|
|
LOG(("OBJLC [%p]: Activated by user", this));
|
|
}
|
|
|
|
// If we're in a click-to-play or play preview state, we need to reload
|
|
// Fallback types >= eFallbackClickToPlay are plugin-replacement types, see
|
|
// header
|
|
if (mType == eType_Null && mFallbackType >= eFallbackClickToPlay) {
|
|
return LoadObject(true, true);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::Reload(bool aClearActivation)
|
|
{
|
|
if (aClearActivation) {
|
|
mActivated = false;
|
|
mPlayPreviewCanceled = false;
|
|
}
|
|
|
|
return LoadObject(true, true);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetActivated(bool *aActivated)
|
|
{
|
|
*aActivated = Activated();
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetPluginFallbackType(uint32_t* aPluginFallbackType)
|
|
{
|
|
NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE);
|
|
*aPluginFallbackType = mFallbackType;
|
|
return NS_OK;
|
|
}
|
|
|
|
uint32_t
|
|
nsObjectLoadingContent::DefaultFallbackType()
|
|
{
|
|
FallbackType reason;
|
|
bool go = ShouldPlay(reason, true);
|
|
if (go) {
|
|
return PLUGIN_ACTIVE;
|
|
}
|
|
return reason;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::GetHasRunningPlugin(bool *aHasPlugin)
|
|
{
|
|
NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE);
|
|
*aHasPlugin = HasRunningPlugin();
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::CancelPlayPreview()
|
|
{
|
|
if (!nsContentUtils::IsCallerChrome())
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
mPlayPreviewCanceled = true;
|
|
|
|
// If we're in play preview state already, reload
|
|
if (mType == eType_Null && mFallbackType == eFallbackPlayPreview) {
|
|
return LoadObject(true, true);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
static bool sPrefsInitialized;
|
|
static uint32_t sSessionTimeoutMinutes;
|
|
static uint32_t sPersistentTimeoutDays;
|
|
|
|
bool
|
|
nsObjectLoadingContent::ShouldPlay(FallbackType &aReason, bool aIgnoreCurrentType)
|
|
{
|
|
nsresult rv;
|
|
|
|
if (!sPrefsInitialized) {
|
|
Preferences::AddUintVarCache(&sSessionTimeoutMinutes,
|
|
"plugin.sessionPermissionNow.intervalInMinutes", 60);
|
|
Preferences::AddUintVarCache(&sPersistentTimeoutDays,
|
|
"plugin.persistentPermissionAlways.intervalInDays", 90);
|
|
sPrefsInitialized = true;
|
|
}
|
|
|
|
nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
|
|
nsCOMPtr<nsIPluginPlayPreviewInfo> playPreviewInfo;
|
|
bool isPlayPreviewSpecified = NS_SUCCEEDED(pluginHost->GetPlayPreviewInfo(
|
|
mContentType, getter_AddRefs(playPreviewInfo)));
|
|
bool ignoreCTP = false;
|
|
if (isPlayPreviewSpecified) {
|
|
playPreviewInfo->GetIgnoreCTP(&ignoreCTP);
|
|
}
|
|
if (isPlayPreviewSpecified && !mPlayPreviewCanceled &&
|
|
ignoreCTP) {
|
|
// play preview in ignoreCTP mode is shown even if the native plugin
|
|
// is not present/installed
|
|
aReason = eFallbackPlayPreview;
|
|
return false;
|
|
}
|
|
// at this point if it's not a plugin, we let it play/fallback
|
|
if (!aIgnoreCurrentType && mType != eType_Plugin) {
|
|
return true;
|
|
}
|
|
|
|
// Order of checks:
|
|
// * Assume a default of click-to-play
|
|
// * If globally disabled, per-site permissions cannot override.
|
|
// * If blocklisted, override the reason with the blocklist reason
|
|
// * If not blocklisted but playPreview, override the reason with the
|
|
// playPreview reason.
|
|
// * Check per-site permissions and follow those if specified.
|
|
// * Honor per-plugin disabled permission
|
|
// * Blocklisted plugins are forced to CtP
|
|
// * Check per-plugin permission and follow that.
|
|
|
|
aReason = eFallbackClickToPlay;
|
|
|
|
uint32_t enabledState = nsIPluginTag::STATE_DISABLED;
|
|
pluginHost->GetStateForType(mContentType, &enabledState);
|
|
if (nsIPluginTag::STATE_DISABLED == enabledState) {
|
|
aReason = eFallbackDisabled;
|
|
return false;
|
|
}
|
|
|
|
// Before we check permissions, get the blocklist state of this plugin to set
|
|
// the fallback reason correctly.
|
|
uint32_t blocklistState = nsIBlocklistService::STATE_NOT_BLOCKED;
|
|
pluginHost->GetBlocklistStateForType(mContentType.get(), &blocklistState);
|
|
if (blocklistState == nsIBlocklistService::STATE_BLOCKED) {
|
|
// no override possible
|
|
aReason = eFallbackBlocklisted;
|
|
return false;
|
|
}
|
|
|
|
if (blocklistState == nsIBlocklistService::STATE_VULNERABLE_UPDATE_AVAILABLE) {
|
|
aReason = eFallbackVulnerableUpdatable;
|
|
}
|
|
else if (blocklistState == nsIBlocklistService::STATE_VULNERABLE_NO_UPDATE) {
|
|
aReason = eFallbackVulnerableNoUpdate;
|
|
}
|
|
|
|
if (aReason == eFallbackClickToPlay && isPlayPreviewSpecified &&
|
|
!mPlayPreviewCanceled && !ignoreCTP) {
|
|
// play preview in click-to-play mode is shown instead of standard CTP UI
|
|
aReason = eFallbackPlayPreview;
|
|
}
|
|
|
|
// Check the permission manager for permission based on the principal of
|
|
// the toplevel content.
|
|
|
|
nsCOMPtr<nsIContent> thisContent = do_QueryInterface(static_cast<nsIObjectLoadingContent*>(this));
|
|
MOZ_ASSERT(thisContent);
|
|
nsIDocument* ownerDoc = thisContent->OwnerDoc();
|
|
|
|
nsCOMPtr<nsIDOMWindow> window = ownerDoc->GetWindow();
|
|
if (!window) {
|
|
return false;
|
|
}
|
|
nsCOMPtr<nsIDOMWindow> topWindow;
|
|
rv = window->GetTop(getter_AddRefs(topWindow));
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
nsCOMPtr<nsIDOMDocument> topDocument;
|
|
rv = topWindow->GetDocument(getter_AddRefs(topDocument));
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
nsCOMPtr<nsIDocument> topDoc = do_QueryInterface(topDocument);
|
|
|
|
nsCOMPtr<nsIPermissionManager> permissionManager = services::GetPermissionManager();
|
|
NS_ENSURE_TRUE(permissionManager, false);
|
|
|
|
// For now we always say that the system principal uses click-to-play since
|
|
// that maintains current behavior and we have tests that expect this.
|
|
// What we really should do is disable plugins entirely in pages that use
|
|
// the system principal, i.e. in chrome pages. That way the click-to-play
|
|
// code here wouldn't matter at all. Bug 775301 is tracking this.
|
|
if (!nsContentUtils::IsSystemPrincipal(topDoc->NodePrincipal())) {
|
|
nsAutoCString permissionString;
|
|
rv = pluginHost->GetPermissionStringForType(mContentType, permissionString);
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
uint32_t permission;
|
|
rv = permissionManager->TestPermissionFromPrincipal(topDoc->NodePrincipal(),
|
|
permissionString.Data(),
|
|
&permission);
|
|
NS_ENSURE_SUCCESS(rv, false);
|
|
if (permission != nsIPermissionManager::UNKNOWN_ACTION) {
|
|
uint64_t nowms = PR_Now() / 1000;
|
|
permissionManager->UpdateExpireTime(
|
|
topDoc->NodePrincipal(), permissionString.Data(), false,
|
|
nowms + sSessionTimeoutMinutes * 60 * 1000,
|
|
nowms / 1000 + uint64_t(sPersistentTimeoutDays) * 24 * 60 * 60 * 1000);
|
|
}
|
|
switch (permission) {
|
|
case nsIPermissionManager::ALLOW_ACTION:
|
|
return true;
|
|
case nsIPermissionManager::DENY_ACTION:
|
|
aReason = eFallbackDisabled;
|
|
return false;
|
|
case nsIPermissionManager::PROMPT_ACTION:
|
|
return false;
|
|
case nsIPermissionManager::UNKNOWN_ACTION:
|
|
break;
|
|
default:
|
|
MOZ_ASSERT(false);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// No site-specific permissions. Vulnerable plugins are automatically CtP
|
|
if (blocklistState == nsIBlocklistService::STATE_VULNERABLE_UPDATE_AVAILABLE ||
|
|
blocklistState == nsIBlocklistService::STATE_VULNERABLE_NO_UPDATE) {
|
|
return false;
|
|
}
|
|
|
|
switch (enabledState) {
|
|
case nsIPluginTag::STATE_ENABLED:
|
|
return true;
|
|
case nsIPluginTag::STATE_CLICKTOPLAY:
|
|
return false;
|
|
}
|
|
MOZ_CRASH("Unexpected enabledState");
|
|
}
|
|
|
|
nsIDocument*
|
|
nsObjectLoadingContent::GetContentDocument()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
if (!thisContent->IsInDoc()) {
|
|
return nullptr;
|
|
}
|
|
|
|
// XXXbz should this use GetComposedDoc()? sXBL/XBL2 issue!
|
|
nsIDocument *sub_doc = thisContent->OwnerDoc()->GetSubDocumentFor(thisContent);
|
|
if (!sub_doc) {
|
|
return nullptr;
|
|
}
|
|
|
|
// Return null for cross-origin contentDocument.
|
|
if (!nsContentUtils::SubjectPrincipal()->SubsumesConsideringDomain(sub_doc->NodePrincipal())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return sub_doc;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::LegacyCall(JSContext* aCx,
|
|
JS::Handle<JS::Value> aThisVal,
|
|
const Sequence<JS::Value>& aArguments,
|
|
JS::MutableHandle<JS::Value> aRetval,
|
|
ErrorResult& aRv)
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
JS::Rooted<JSObject*> obj(aCx, thisContent->GetWrapper());
|
|
MOZ_ASSERT(obj, "How did we get called?");
|
|
|
|
// Make sure we're not dealing with an Xray. Our DoCall code can't handle
|
|
// random cross-compartment wrappers, so we're going to have to wrap
|
|
// everything up into our compartment, but that means we need to check that
|
|
// this is not an Xray situation by hand.
|
|
if (!JS_WrapObject(aCx, &obj)) {
|
|
aRv.Throw(NS_ERROR_UNEXPECTED);
|
|
return;
|
|
}
|
|
|
|
if (nsDOMClassInfo::ObjectIsNativeWrapper(aCx, obj)) {
|
|
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
|
return;
|
|
}
|
|
|
|
obj = thisContent->GetWrapper();
|
|
// Now wrap things up into the compartment of "obj"
|
|
JSAutoCompartment ac(aCx, obj);
|
|
JS::AutoValueVector args(aCx);
|
|
if (!args.append(aArguments.Elements(), aArguments.Length())) {
|
|
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
|
return;
|
|
}
|
|
|
|
for (size_t i = 0; i < args.length(); i++) {
|
|
if (!JS_WrapValue(aCx, args[i])) {
|
|
aRv.Throw(NS_ERROR_UNEXPECTED);
|
|
return;
|
|
}
|
|
}
|
|
|
|
JS::Rooted<JS::Value> thisVal(aCx, aThisVal);
|
|
if (!JS_WrapValue(aCx, &thisVal)) {
|
|
aRv.Throw(NS_ERROR_UNEXPECTED);
|
|
return;
|
|
}
|
|
|
|
nsRefPtr<nsNPAPIPluginInstance> pi;
|
|
nsresult rv = ScriptRequestPluginInstance(aCx, getter_AddRefs(pi));
|
|
if (NS_FAILED(rv)) {
|
|
aRv.Throw(rv);
|
|
return;
|
|
}
|
|
|
|
// if there's no plugin around for this object, throw.
|
|
if (!pi) {
|
|
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
|
return;
|
|
}
|
|
|
|
JS::Rooted<JSObject*> pi_obj(aCx);
|
|
JS::Rooted<JSObject*> pi_proto(aCx);
|
|
|
|
rv = GetPluginJSObject(aCx, obj, pi, &pi_obj, &pi_proto);
|
|
if (NS_FAILED(rv)) {
|
|
aRv.Throw(rv);
|
|
return;
|
|
}
|
|
|
|
if (!pi_obj) {
|
|
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
|
return;
|
|
}
|
|
|
|
bool ok = JS::Call(aCx, thisVal, pi_obj, args, aRetval);
|
|
if (!ok) {
|
|
aRv.Throw(NS_ERROR_FAILURE);
|
|
return;
|
|
}
|
|
|
|
Telemetry::Accumulate(Telemetry::PLUGIN_CALLED_DIRECTLY, true);
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::SetupProtoChain(JSContext* aCx,
|
|
JS::Handle<JSObject*> aObject)
|
|
{
|
|
if (mType != eType_Plugin) {
|
|
return;
|
|
}
|
|
|
|
if (!nsContentUtils::IsSafeToRunScript()) {
|
|
nsRefPtr<SetupProtoChainRunner> runner = new SetupProtoChainRunner(this);
|
|
nsContentUtils::AddScriptRunner(runner);
|
|
return;
|
|
}
|
|
|
|
// We get called on random compartments here for some reason
|
|
// (perhaps because WrapObject can happen on a random compartment?)
|
|
// so make sure to enter the compartment of aObject.
|
|
MOZ_ASSERT(aCx == nsContentUtils::GetCurrentJSContext());
|
|
|
|
JSAutoCompartment ac(aCx, aObject);
|
|
|
|
nsRefPtr<nsNPAPIPluginInstance> pi;
|
|
nsresult rv = ScriptRequestPluginInstance(aCx, getter_AddRefs(pi));
|
|
if (NS_FAILED(rv)) {
|
|
return;
|
|
}
|
|
|
|
if (!pi) {
|
|
// No plugin around for this object.
|
|
return;
|
|
}
|
|
|
|
JS::Rooted<JSObject*> pi_obj(aCx); // XPConnect-wrapped peer object, when we get it.
|
|
JS::Rooted<JSObject*> pi_proto(aCx); // 'pi.__proto__'
|
|
|
|
rv = GetPluginJSObject(aCx, aObject, pi, &pi_obj, &pi_proto);
|
|
if (NS_FAILED(rv)) {
|
|
return;
|
|
}
|
|
|
|
if (!pi_obj) {
|
|
// Didn't get a plugin instance JSObject, nothing we can do then.
|
|
return;
|
|
}
|
|
|
|
// If we got an xpconnect-wrapped plugin object, set obj's
|
|
// prototype's prototype to the scriptable plugin.
|
|
|
|
JS::Rooted<JSObject*> global(aCx, JS_GetGlobalForObject(aCx, aObject));
|
|
JS::Handle<JSObject*> my_proto = GetDOMClass(aObject)->mGetProto(aCx, global);
|
|
MOZ_ASSERT(my_proto);
|
|
|
|
// Set 'this.__proto__' to pi
|
|
if (!::JS_SetPrototype(aCx, aObject, pi_obj)) {
|
|
return;
|
|
}
|
|
|
|
if (pi_proto && js::GetObjectClass(pi_proto) != js::ObjectClassPtr) {
|
|
// The plugin wrapper has a proto that's not Object.prototype, set
|
|
// 'pi.__proto__.__proto__' to the original 'this.__proto__'
|
|
if (pi_proto != my_proto && !::JS_SetPrototype(aCx, pi_proto, my_proto)) {
|
|
return;
|
|
}
|
|
} else {
|
|
// 'pi' didn't have a prototype, or pi's proto was
|
|
// 'Object.prototype' (i.e. pi is an NPRuntime wrapped JS object)
|
|
// set 'pi.__proto__' to the original 'this.__proto__'
|
|
if (!::JS_SetPrototype(aCx, pi_obj, my_proto)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Before this proto dance the objects involved looked like this:
|
|
//
|
|
// this.__proto__.__proto__
|
|
// ^ ^ ^
|
|
// | | |__ Object.prototype
|
|
// | |
|
|
// | |__ WebIDL prototype (shared)
|
|
// |
|
|
// |__ WebIDL object
|
|
//
|
|
// pi.__proto__
|
|
// ^ ^
|
|
// | |__ Object.prototype or some other object
|
|
// |
|
|
// |__ Plugin NPRuntime JS object wrapper
|
|
//
|
|
// Now, after the above prototype setup the prototype chain should
|
|
// look like this if pi.__proto__ was Object.prototype:
|
|
//
|
|
// this.__proto__.__proto__.__proto__
|
|
// ^ ^ ^ ^
|
|
// | | | |__ Object.prototype
|
|
// | | |
|
|
// | | |__ WebIDL prototype (shared)
|
|
// | |
|
|
// | |__ Plugin NPRuntime JS object wrapper
|
|
// |
|
|
// |__ WebIDL object
|
|
//
|
|
// or like this if pi.__proto__ was some other object:
|
|
//
|
|
// this.__proto__.__proto__.__proto__.__proto__
|
|
// ^ ^ ^ ^ ^
|
|
// | | | | |__ Object.prototype
|
|
// | | | |
|
|
// | | | |__ WebIDL prototype (shared)
|
|
// | | |
|
|
// | | |__ old pi.__proto__
|
|
// | |
|
|
// | |__ Plugin NPRuntime JS object wrapper
|
|
// |
|
|
// |__ WebIDL object
|
|
//
|
|
}
|
|
|
|
// static
|
|
nsresult
|
|
nsObjectLoadingContent::GetPluginJSObject(JSContext *cx,
|
|
JS::Handle<JSObject*> obj,
|
|
nsNPAPIPluginInstance *plugin_inst,
|
|
JS::MutableHandle<JSObject*> plugin_obj,
|
|
JS::MutableHandle<JSObject*> plugin_proto)
|
|
{
|
|
// NB: We need an AutoEnterCompartment because we can be called from
|
|
// nsPluginFrame when the plugin loads after the JS object for our content
|
|
// node has been created.
|
|
JSAutoCompartment ac(cx, obj);
|
|
|
|
if (plugin_inst) {
|
|
plugin_inst->GetJSObject(cx, plugin_obj.address());
|
|
if (plugin_obj) {
|
|
if (!::JS_GetPrototype(cx, plugin_obj, plugin_proto)) {
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
}
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::TeardownProtoChain()
|
|
{
|
|
nsCOMPtr<nsIContent> thisContent =
|
|
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
|
|
|
|
// Use the safe JSContext here as we're not always able to find the
|
|
// JSContext associated with the NPP any more.
|
|
AutoSafeJSContext cx;
|
|
JS::Rooted<JSObject*> obj(cx, thisContent->GetWrapper());
|
|
NS_ENSURE_TRUE(obj, /* void */);
|
|
|
|
JS::Rooted<JSObject*> proto(cx);
|
|
JSAutoCompartment ac(cx, obj);
|
|
|
|
// Loop over the DOM element's JS object prototype chain and remove
|
|
// all JS objects of the class sNPObjectJSWrapperClass
|
|
DebugOnly<bool> removed = false;
|
|
while (obj) {
|
|
if (!::JS_GetPrototype(cx, obj, &proto)) {
|
|
return;
|
|
}
|
|
if (!proto) {
|
|
break;
|
|
}
|
|
// Unwrap while checking the jsclass - if the prototype is a wrapper for
|
|
// an NP object, that counts too.
|
|
if (JS_GetClass(js::UncheckedUnwrap(proto)) == &sNPObjectJSWrapperClass) {
|
|
// We found an NPObject on the proto chain, get its prototype...
|
|
if (!::JS_GetPrototype(cx, proto, &proto)) {
|
|
return;
|
|
}
|
|
|
|
MOZ_ASSERT(!removed, "more than one NPObject in prototype chain");
|
|
removed = true;
|
|
|
|
// ... and pull it out of the chain.
|
|
::JS_SetPrototype(cx, obj, proto);
|
|
}
|
|
|
|
obj = proto;
|
|
}
|
|
}
|
|
|
|
bool
|
|
nsObjectLoadingContent::DoNewResolve(JSContext* aCx, JS::Handle<JSObject*> aObject,
|
|
JS::Handle<jsid> aId,
|
|
JS::MutableHandle<JSPropertyDescriptor> aDesc)
|
|
{
|
|
// We don't resolve anything; we just try to make sure we're instantiated.
|
|
// This purposefully does not fire for chrome/xray resolves, see bug 967694
|
|
|
|
nsRefPtr<nsNPAPIPluginInstance> pi;
|
|
nsresult rv = ScriptRequestPluginInstance(aCx, getter_AddRefs(pi));
|
|
if (NS_FAILED(rv)) {
|
|
return mozilla::dom::Throw(aCx, rv);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void
|
|
nsObjectLoadingContent::GetOwnPropertyNames(JSContext* aCx,
|
|
nsTArray<nsString>& /* unused */,
|
|
ErrorResult& aRv)
|
|
{
|
|
// Just like DoNewResolve, just make sure we're instantiated. That will do
|
|
// the work our Enumerate hook needs to do. This purposefully does not fire
|
|
// for xray resolves, see bug 967694
|
|
nsRefPtr<nsNPAPIPluginInstance> pi;
|
|
aRv = ScriptRequestPluginInstance(aCx, getter_AddRefs(pi));
|
|
}
|
|
|
|
|
|
// SetupProtoChainRunner implementation
|
|
nsObjectLoadingContent::SetupProtoChainRunner::SetupProtoChainRunner(
|
|
nsObjectLoadingContent* aContent)
|
|
: mContent(aContent)
|
|
{
|
|
}
|
|
|
|
nsObjectLoadingContent::SetupProtoChainRunner::~SetupProtoChainRunner()
|
|
{
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsObjectLoadingContent::SetupProtoChainRunner::Run()
|
|
{
|
|
AutoJSAPI jsapi;
|
|
jsapi.Init();
|
|
JSContext* cx = jsapi.cx();
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
CallQueryInterface(mContent.get(), getter_AddRefs(content));
|
|
JS::Rooted<JSObject*> obj(cx, content->GetWrapper());
|
|
if (!obj) {
|
|
// No need to set up our proto chain if we don't even have an object
|
|
return NS_OK;
|
|
}
|
|
nsObjectLoadingContent* objectLoadingContent =
|
|
static_cast<nsObjectLoadingContent*>(mContent.get());
|
|
objectLoadingContent->SetupProtoChain(cx, obj);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMPL_ISUPPORTS(nsObjectLoadingContent::SetupProtoChainRunner, nsIRunnable)
|
|
|