diff --git a/build/mac/build_scripts/MozillaBuildList.pm b/build/mac/build_scripts/MozillaBuildList.pm index 1ebebff500e..e3417e16e26 100644 --- a/build/mac/build_scripts/MozillaBuildList.pm +++ b/build/mac/build_scripts/MozillaBuildList.pm @@ -238,6 +238,9 @@ sub InstallNonChromeResources() my($html_dir) = "$resource_dir" . "html:"; InstallResources(":mozilla:layout:html:base:src:MANIFEST_RES", "$html_dir"); + my($xml_dir) = "$resource_dir" . "xml:"; + InstallResources(":mozilla:content:xml:document:resources:MANIFEST_RES", "$xml_dir"); + my($throbber_dir) = "$resource_dir" . "throbber:"; BuildFolderResourceAliases(":mozilla:webshell:tests:viewer:throbber:", "$throbber_dir"); diff --git a/content/base/public/nsContentUtils.h b/content/base/public/nsContentUtils.h index 8b751990c1b..8b67d3b31bf 100644 --- a/content/base/public/nsContentUtils.h +++ b/content/base/public/nsContentUtils.h @@ -186,6 +186,10 @@ public: static void GetDocShellFromCaller(nsIDocShell** aDocShell); + // Check if a node is in the document prolog, i.e. before the document + // element. + static PRBool InProlog(nsIDOMNode *aNode); + private: static nsresult doReparentContentWrapper(nsIContent *aChild, nsIDocument *aNewDocument, diff --git a/content/base/public/nsINameSpaceManager.h b/content/base/public/nsINameSpaceManager.h index 57375fd954d..477c4c17c67 100644 --- a/content/base/public/nsINameSpaceManager.h +++ b/content/base/public/nsINameSpaceManager.h @@ -102,6 +102,9 @@ public: NS_IMETHOD GetElementFactory(PRInt32 aNameSpaceID, nsIElementFactory **aElementFactory) = 0; + + NS_IMETHOD HasRegisteredFactory(PRInt32 aNameSpaceID, + PRBool* aHasFactory) = 0; }; nsresult diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 17ab41dcfb5..3b45b5b3220 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -591,6 +591,46 @@ nsContentUtils::CanCallerAccess(nsIDOMNode *aNode) return NS_SUCCEEDED(rv); } +//static +PRBool +nsContentUtils::InProlog(nsIDOMNode *aNode) +{ + NS_PRECONDITION(aNode, "missing node to nsContentUtils::InProlog"); + + // Check that there is an ancestor and that it is a document + nsCOMPtr parent; + aNode->GetParentNode(getter_AddRefs(parent)); + if (!parent) { + return PR_FALSE; + } + + PRUint16 type; + parent->GetNodeType(&type); + if (type != nsIDOMNode::DOCUMENT_NODE) { + return PR_FALSE; + } + + nsCOMPtr doc = do_QueryInterface(parent); + NS_ASSERTION(doc, "document doesn't implement nsIDocument"); + nsCOMPtr cont = do_QueryInterface(aNode); + NS_ASSERTION(cont, "node doesn't implement nsIContent"); + + // Check that there are no elements before aNode to make sure we are not + // in the epilog + PRInt32 pos, i; + doc->IndexOf(cont, pos); + while (pos > 0) { + --pos; + nsCOMPtr sibl; + doc->ChildAt(pos, *getter_AddRefs(sibl)); + if (sibl->IsContentOfType(nsIContent::eELEMENT)) { + return PR_FALSE; + } + } + + return PR_TRUE; +} + // static nsresult nsContentUtils::doReparentContentWrapper(nsIContent *aChild, diff --git a/content/base/src/nsNameSpaceManager.cpp b/content/base/src/nsNameSpaceManager.cpp index b1115ff160e..365a8d3e842 100644 --- a/content/base/src/nsNameSpaceManager.cpp +++ b/content/base/src/nsNameSpaceManager.cpp @@ -62,10 +62,11 @@ static const char kMathMLNameSpaceURI[] = "http://www.w3.org/1998/Math/MathML"; //----------------------------------------------------------- // Name Space ID table support -static PRBool gNameSpaceManagerIsInitialized = PR_FALSE; -static nsHashtable* gURIToIDTable; -static nsVoidArray* gURIArray; -static nsISupportsArray* gElementFactoryArray; +static PRBool gNameSpaceManagerIsInitialized = PR_FALSE; +static nsHashtable* gURIToIDTable; +static nsVoidArray* gURIArray; +static nsISupportsArray* gElementFactoryArray; +static nsIElementFactory* gDefaultElementFactory; #ifdef NS_DEBUG static PRBool gNameSpaceManagerWasShutDown = PR_FALSE; @@ -116,6 +117,7 @@ static void InitializeNameSpaceManager() gURIToIDTable->Put(&mathmlKey, NS_INT32_TO_PTR(kNameSpaceID_MathML)); NS_NewISupportsArray(&gElementFactoryArray); + NS_NewXMLElementFactory(&gDefaultElementFactory); NS_ASSERTION(gURIToIDTable, "no URI table"); NS_ASSERTION(gURIArray, "no URI array"); @@ -137,6 +139,7 @@ void NS_NameSpaceManagerShutdown() gURIArray = nsnull; NS_IF_RELEASE(gElementFactoryArray); + NS_IF_RELEASE(gDefaultElementFactory); #ifdef NS_DEBUG gNameSpaceManagerWasShutDown = PR_TRUE; @@ -393,6 +396,8 @@ public: PRInt32& aNameSpaceID); NS_IMETHOD GetElementFactory(PRInt32 aNameSpaceID, nsIElementFactory **aElementFactory); + NS_IMETHOD HasRegisteredFactory(PRInt32 aNameSpaceID, + PRBool* aHasFactory); private: // These are not supported and are not implemented! NameSpaceManagerImpl(const NameSpaceManagerImpl& aCopy); @@ -530,11 +535,7 @@ NameSpaceManagerImpl::GetElementFactory(PRInt32 aNameSpaceID, } if (!ef) { - nsresult rv = NS_NewXMLElementFactory(getter_AddRefs(ef)); - - if (NS_FAILED(rv)) { - return rv; - } + ef = gDefaultElementFactory; } PRUint32 count = 0; @@ -560,6 +561,18 @@ NameSpaceManagerImpl::GetElementFactory(PRInt32 aNameSpaceID, return NS_OK; } +NS_IMETHODIMP +NameSpaceManagerImpl::HasRegisteredFactory(PRInt32 aNameSpaceID, + PRBool* aHasFactory) +{ + *aHasFactory = PR_FALSE; + nsCOMPtr ef; + GetElementFactory(aNameSpaceID, getter_AddRefs(ef)); + NS_ENSURE_TRUE(gDefaultElementFactory, NS_ERROR_FAILURE); + *aHasFactory = ef != gDefaultElementFactory; + return NS_OK; +} + nsresult NS_NewNameSpaceManager(nsINameSpaceManager** aInstancePtrResult) { diff --git a/content/shared/public/nsLayoutAtomList.h b/content/shared/public/nsLayoutAtomList.h index eec15f68874..3ff67b7b4a6 100644 --- a/content/shared/public/nsLayoutAtomList.h +++ b/content/shared/public/nsLayoutAtomList.h @@ -211,6 +211,8 @@ LAYOUT_ATOM(Korean, "ko") // other LAYOUT_ATOM(wildcard, "*") LAYOUT_ATOM(mozdirty, "_moz_dirty") +LAYOUT_ATOM(stylesheet, "stylesheet") +LAYOUT_ATOM(transform, "transform") #ifdef IBMBIDI LAYOUT_ATOM(directionalFrame, "DirectionalFrame") diff --git a/content/xbl/src/nsXBLContentSink.cpp b/content/xbl/src/nsXBLContentSink.cpp index ae36ea083ab..9a024751421 100644 --- a/content/xbl/src/nsXBLContentSink.cpp +++ b/content/xbl/src/nsXBLContentSink.cpp @@ -87,6 +87,7 @@ nsXBLContentSink::nsXBLContentSink() mProperty = nsnull; mMethod = nsnull; mField = nsnull; + mPrettyPrintXML = PR_FALSE; } nsXBLContentSink::~nsXBLContentSink() diff --git a/content/xml/content/public/nsIXMLContent.h b/content/xml/content/public/nsIXMLContent.h index 4ab64899e02..a387831658b 100644 --- a/content/xml/content/public/nsIXMLContent.h +++ b/content/xml/content/public/nsIXMLContent.h @@ -102,6 +102,10 @@ NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, const nsAString& aTarget, const nsAString& aData); +extern nsresult +NS_NewXMLStylesheetProcessingInstruction(nsIContent** aInstancePtrResult, + const nsAString& aData); + extern nsresult NS_NewXMLEntity(nsIContent** aInstancePtrResult, const nsAString& aName, diff --git a/content/xml/content/src/Makefile.in b/content/xml/content/src/Makefile.in index 24097b6d634..f7ed0c05348 100644 --- a/content/xml/content/src/Makefile.in +++ b/content/xml/content/src/Makefile.in @@ -52,6 +52,7 @@ CPPSRCS = \ nsXMLEntity.cpp \ nsXMLNotation.cpp \ nsXMLNamedNodeMap.cpp \ + nsXMLStylesheetPI.cpp \ $(NULL) # we don't want the shared lib, but we want to force the creation of a static lib. diff --git a/content/xml/content/src/nsXMLProcessingInstruction.cpp b/content/xml/content/src/nsXMLProcessingInstruction.cpp index be1c114bdd7..5d148b015a2 100644 --- a/content/xml/content/src/nsXMLProcessingInstruction.cpp +++ b/content/xml/content/src/nsXMLProcessingInstruction.cpp @@ -36,173 +36,20 @@ * * ***** END LICENSE BLOCK ***** */ - -#include "nsIDOMProcessingInstruction.h" -#include "nsIDOMLinkStyle.h" -#include "nsIDOMStyleSheet.h" -#include "nsIDocument.h" -#include "nsIStyleSheet.h" -#include "nsIURI.h" -#include "nsGenericDOMDataNode.h" #include "nsGenericElement.h" #include "nsLayoutAtoms.h" -#include "nsHTMLAtoms.h" -#include "nsAString.h" -#include "nsXPIDLString.h" #include "nsUnicharUtils.h" -#include "nsStyleLinkElement.h" +#include "nsXMLProcessingInstruction.h" #include "nsParserUtils.h" -#include "nsNetUtil.h" - - -class nsXMLProcessingInstruction : public nsGenericDOMDataNode, - public nsIDOMProcessingInstruction, - public nsStyleLinkElement -{ -public: - nsXMLProcessingInstruction(const nsAString& aTarget, - const nsAString& aData); - virtual ~nsXMLProcessingInstruction(); - - // nsISupports - NS_DECL_ISUPPORTS_INHERITED - - // nsIDOMNode - NS_IMETHOD GetNodeName(nsAString& aNodeName); - NS_IMETHOD GetLocalName(nsAString& aLocalName) { - return nsGenericDOMDataNode::GetLocalName(aLocalName); - } - NS_IMETHOD GetNodeValue(nsAString& aNodeValue) { - return nsGenericDOMDataNode::GetNodeValue(aNodeValue); - } - NS_IMETHOD SetNodeValue(const nsAString& aNodeValue) { - nsresult rv = nsGenericDOMDataNode::SetNodeValue(aNodeValue); - if (NS_SUCCEEDED(rv)) { - UpdateStyleSheet(); - } - return rv; - } - NS_IMETHOD GetNodeType(PRUint16* aNodeType); - NS_IMETHOD GetParentNode(nsIDOMNode** aParentNode) { - return nsGenericDOMDataNode::GetParentNode(aParentNode); - } - NS_IMETHOD GetChildNodes(nsIDOMNodeList** aChildNodes) { - return nsGenericDOMDataNode::GetChildNodes(aChildNodes); - } - NS_IMETHOD HasChildNodes(PRBool* aHasChildNodes) { - return nsGenericDOMDataNode::HasChildNodes(aHasChildNodes); - } - NS_IMETHOD HasAttributes(PRBool* aHasAttributes) { - return nsGenericDOMDataNode::HasAttributes(aHasAttributes); - } - NS_IMETHOD GetFirstChild(nsIDOMNode** aFirstChild) { - return nsGenericDOMDataNode::GetFirstChild(aFirstChild); - } - NS_IMETHOD GetLastChild(nsIDOMNode** aLastChild) { - return nsGenericDOMDataNode::GetLastChild(aLastChild); - } - NS_IMETHOD GetPreviousSibling(nsIDOMNode** aPreviousSibling) { - return nsGenericDOMDataNode::GetPreviousSibling(aPreviousSibling); - } - NS_IMETHOD GetNextSibling(nsIDOMNode** aNextSibling) { - return nsGenericDOMDataNode::GetNextSibling(aNextSibling); - } - NS_IMETHOD GetAttributes(nsIDOMNamedNodeMap** aAttributes) { - return nsGenericDOMDataNode::GetAttributes(aAttributes); - } - NS_IMETHOD InsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild, - nsIDOMNode** aReturn) { - return nsGenericDOMDataNode::InsertBefore(aNewChild, aRefChild, aReturn); - } - NS_IMETHOD AppendChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn) { - return nsGenericDOMDataNode::AppendChild(aOldChild, aReturn); - } - NS_IMETHOD ReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild, - nsIDOMNode** aReturn) { - return nsGenericDOMDataNode::ReplaceChild(aNewChild, aOldChild, aReturn); - } - NS_IMETHOD RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn) { - return nsGenericDOMDataNode::RemoveChild(aOldChild, aReturn); - } - NS_IMETHOD GetOwnerDocument(nsIDOMDocument** aOwnerDocument) { - return nsGenericDOMDataNode::GetOwnerDocument(aOwnerDocument); - } - NS_IMETHOD GetNamespaceURI(nsAString& aNamespaceURI) { - return nsGenericDOMDataNode::GetNamespaceURI(aNamespaceURI); - } - NS_IMETHOD GetPrefix(nsAString& aPrefix) { - return nsGenericDOMDataNode::GetPrefix(aPrefix); - } - NS_IMETHOD SetPrefix(const nsAString& aPrefix) { - return nsGenericDOMDataNode::SetPrefix(aPrefix); - } - NS_IMETHOD Normalize() { - return NS_OK; - } - NS_IMETHOD IsSupported(const nsAString& aFeature, - const nsAString& aVersion, - PRBool* aReturn) { - return nsGenericDOMDataNode::IsSupported(aFeature, aVersion, aReturn); - } - NS_IMETHOD GetBaseURI(nsAString& aURI) { - return nsGenericDOMDataNode::GetBaseURI(aURI); - } - NS_IMETHOD LookupNamespacePrefix(const nsAString& aNamespaceURI, - nsAString& aPrefix) { - return nsGenericDOMDataNode::LookupNamespacePrefix(aNamespaceURI, aPrefix); - } - NS_IMETHOD LookupNamespaceURI(const nsAString& aNamespacePrefix, - nsAString& aNamespaceURI) { - return nsGenericDOMDataNode::LookupNamespaceURI(aNamespacePrefix, - aNamespaceURI); - } - - NS_IMETHOD CloneNode(PRBool aDeep, nsIDOMNode** aReturn); - - // nsIDOMProcessingInstruction - NS_DECL_NSIDOMPROCESSINGINSTRUCTION - - // nsIContent - NS_IMETHOD SetDocument(nsIDocument* aDocument, PRBool aDeep, - PRBool aCompileEventHandlers) - { - nsCOMPtr oldDoc = mDocument; - nsresult rv = nsGenericDOMDataNode::SetDocument(aDocument, aDeep, - aCompileEventHandlers); - if (NS_SUCCEEDED(rv)) { - UpdateStyleSheet(oldDoc); - } - return rv; - } - NS_IMETHOD GetTag(nsIAtom*& aResult) const; - -#ifdef DEBUG - NS_IMETHOD List(FILE* out, PRInt32 aIndent) const; - NS_IMETHOD DumpContent(FILE* out, PRInt32 aIndent, PRBool aDumpAll) const; - NS_IMETHOD SizeOf(nsISizeOfHandler* aSizer, PRUint32* aResult) const; -#endif - - // nsStyleLinkElement - NS_IMETHOD GetCharset(nsAString& aCharset); - -protected: - void GetStyleSheetURL(PRBool* aIsInline, - nsAString& aUrl); - void GetStyleSheetInfo(nsAString& aTitle, - nsAString& aType, - nsAString& aMedia, - PRBool* aIsAlternate); - - PRBool GetAttrValue(const nsAString& aAttr, nsAString& aValue); - - nsAutoString mTarget; -}; nsresult NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, const nsAString& aTarget, const nsAString& aData) { + if (aTarget.Equals(NS_LITERAL_STRING("xml-stylesheet"))) { + return NS_NewXMLStylesheetProcessingInstruction(aInstancePtrResult, aData); + } *aInstancePtrResult = new nsXMLProcessingInstruction(aTarget, aData); NS_ENSURE_TRUE(*aInstancePtrResult, NS_ERROR_OUT_OF_MEMORY); @@ -227,8 +74,6 @@ nsXMLProcessingInstruction::~nsXMLProcessingInstruction() NS_INTERFACE_MAP_BEGIN(nsXMLProcessingInstruction) NS_INTERFACE_MAP_ENTRY(nsIDOMNode) NS_INTERFACE_MAP_ENTRY(nsIDOMProcessingInstruction) - NS_INTERFACE_MAP_ENTRY(nsIDOMLinkStyle) - NS_INTERFACE_MAP_ENTRY(nsIStyleSheetLinkingElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(ProcessingInstruction) NS_INTERFACE_MAP_END_INHERITING(nsGenericDOMDataNode) @@ -248,11 +93,7 @@ nsXMLProcessingInstruction::GetTarget(nsAString& aTarget) NS_IMETHODIMP nsXMLProcessingInstruction::SetData(const nsAString& aData) { - nsresult rv = nsGenericDOMDataNode::SetData(aData); - if (NS_SUCCEEDED(rv)) { - UpdateStyleSheet(); - } - return rv; + return SetNodeValue(aData); } NS_IMETHODIMP @@ -348,126 +189,3 @@ nsXMLProcessingInstruction::SizeOf(nsISizeOfHandler* aSizer, return NS_OK; } #endif - -static PRBool InProlog(nsIDOMNode *aThis) -{ - // Check that there are no ancestor elements - // Typically this should loop once - nsCOMPtr current = aThis; - for(;;) { - nsCOMPtr parent; - current->GetParentNode(getter_AddRefs(parent)); - if (!parent) - break; - PRUint16 type; - parent->GetNodeType(&type); - if (type == nsIDOMNode::ELEMENT_NODE) - return PR_FALSE; - current = parent; - } - - // Check that there are no elements before - // Makes sure we are not in epilog - current = aThis; - for(;;) { - nsCOMPtr prev; - current->GetPreviousSibling(getter_AddRefs(prev)); - if (!prev) - break; - PRUint16 type; - prev->GetNodeType(&type); - if (type == nsIDOMNode::ELEMENT_NODE) - return PR_FALSE; - current = prev; - } - - return PR_TRUE; -} - -NS_IMETHODIMP -nsXMLProcessingInstruction::GetCharset(nsAString& aCharset) -{ - if (!GetAttrValue(NS_LITERAL_STRING("charset"), aCharset)) { - return NS_ERROR_FAILURE; - } - - return NS_OK; -} - -void -nsXMLProcessingInstruction::GetStyleSheetURL(PRBool* aIsInline, - nsAString& aUrl) -{ - *aIsInline = PR_FALSE; - aUrl.Truncate(); - - nsAutoString href; - GetAttrValue(NS_LITERAL_STRING("href"), href); - if (href.IsEmpty()) { - return; - } - - nsCOMPtr url, baseURL; - if (mDocument) { - mDocument->GetBaseURL(*getter_AddRefs(baseURL)); - } - NS_MakeAbsoluteURI(aUrl, href, baseURL); -} - -void -nsXMLProcessingInstruction::GetStyleSheetInfo(nsAString& aTitle, - nsAString& aType, - nsAString& aMedia, - PRBool* aIsAlternate) -{ - aTitle.Truncate(); - aType.Truncate(); - aMedia.Truncate(); - *aIsAlternate = PR_FALSE; - - if (!mTarget.Equals(NS_LITERAL_STRING("xml-stylesheet"))) { - return; - } - - // xml-stylesheet PI is special only in prolog - if (!InProlog(this)) { - return; - } - - nsAutoString title, type, media, alternate; - - GetAttrValue(NS_LITERAL_STRING("title"), title); - title.CompressWhitespace(); - aTitle.Assign(title); - - GetAttrValue(NS_LITERAL_STRING("alternate"), alternate); - - // if alternate, does it have title? - if (alternate.Equals(NS_LITERAL_STRING("yes"))) { - if (aTitle.IsEmpty()) { // alternates must have title - return; - } else { - *aIsAlternate = PR_TRUE; - } - } - - GetAttrValue(NS_LITERAL_STRING("media"), media); - aMedia.Assign(media); - ToLowerCase(aMedia); // case sensitivity? - - GetAttrValue(NS_LITERAL_STRING("type"), type); - - nsAutoString mimeType; - nsAutoString notUsed; - nsParserUtils::SplitMimeType(type, mimeType, notUsed); - if (!mimeType.IsEmpty() && !mimeType.EqualsIgnoreCase("text/css")) { - aType.Assign(type); - return; - } - - // If we get here we assume that we're loading a css file, so set the - // type to 'text/css' - aType.Assign(NS_LITERAL_STRING("text/css")); - - return; -} diff --git a/content/xml/content/src/nsXMLProcessingInstruction.h b/content/xml/content/src/nsXMLProcessingInstruction.h new file mode 100644 index 00000000000..b504621a67b --- /dev/null +++ b/content/xml/content/src/nsXMLProcessingInstruction.h @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jonas Sicking (original author) + * + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsIXMLProcessingInstruction_h___ +#define nsIXMLProcessingInstruction_h___ + +#include "nsIDOMProcessingInstruction.h" +#include "nsIDocument.h" +#include "nsGenericDOMDataNode.h" +#include "nsAString.h" + + +class nsXMLProcessingInstruction : public nsGenericDOMDataNode, + public nsIDOMProcessingInstruction +{ +public: + nsXMLProcessingInstruction(const nsAString& aTarget, + const nsAString& aData); + virtual ~nsXMLProcessingInstruction(); + + // nsISupports + NS_DECL_ISUPPORTS_INHERITED + + // nsIDOMNode + NS_IMPL_NSIDOMNODE_USING_GENERIC_DOM_DATA + + // nsIDOMProcessingInstruction + NS_DECL_NSIDOMPROCESSINGINSTRUCTION + + // nsIContent + NS_IMETHOD GetTag(nsIAtom*& aResult) const; + +#ifdef DEBUG + NS_IMETHOD List(FILE* out, PRInt32 aIndent) const; + NS_IMETHOD DumpContent(FILE* out, PRInt32 aIndent, PRBool aDumpAll) const; + NS_IMETHOD SizeOf(nsISizeOfHandler* aSizer, PRUint32* aResult) const; +#endif + +protected: + PRBool GetAttrValue(const nsAString& aAttr, nsAString& aValue); + + nsAutoString mTarget; +}; + +#endif //nsIXMLProcessingInstruction_h___ diff --git a/content/xml/content/src/nsXMLStylesheetPI.cpp b/content/xml/content/src/nsXMLStylesheetPI.cpp new file mode 100644 index 00000000000..de75248ba4e --- /dev/null +++ b/content/xml/content/src/nsXMLStylesheetPI.cpp @@ -0,0 +1,244 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jonas Sicking (original author) + * + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsIDOMLinkStyle.h" +#include "nsIDOMStyleSheet.h" +#include "nsIDocument.h" +#include "nsIStyleSheet.h" +#include "nsIURI.h" +#include "nsStyleLinkElement.h" +#include "nsNetUtil.h" +#include "nsXMLProcessingInstruction.h" +#include "nsUnicharUtils.h" +#include "nsParserUtils.h" + +class nsXMLStylesheetPI : public nsXMLProcessingInstruction, + public nsStyleLinkElement +{ +public: + nsXMLStylesheetPI(const nsAString& aData); + virtual ~nsXMLStylesheetPI(); + + // nsISupports + NS_DECL_ISUPPORTS_INHERITED + + // nsIDOMNode + NS_IMETHOD SetNodeValue(const nsAString& aData); + NS_IMETHOD CloneNode(PRBool aDeep, nsIDOMNode** aReturn); + + // nsIContent + NS_IMETHOD SetDocument(nsIDocument* aDocument, PRBool aDeep, + PRBool aCompileEventHandlers); + + // nsStyleLinkElement + NS_IMETHOD GetCharset(nsAString& aCharset); + +protected: + void GetStyleSheetURL(PRBool* aIsInline, + nsAString& aUrl); + void GetStyleSheetInfo(nsAString& aTitle, + nsAString& aType, + nsAString& aMedia, + PRBool* aIsAlternate); +}; + +// nsISupports implementation + +NS_INTERFACE_MAP_BEGIN(nsXMLStylesheetPI) + NS_INTERFACE_MAP_ENTRY(nsIDOMLinkStyle) + NS_INTERFACE_MAP_ENTRY(nsIStyleSheetLinkingElement) + NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(XMLStylesheetProcessingInstruction) +NS_INTERFACE_MAP_END_INHERITING(nsXMLProcessingInstruction) + +NS_IMPL_ADDREF_INHERITED(nsXMLStylesheetPI, nsXMLProcessingInstruction) +NS_IMPL_RELEASE_INHERITED(nsXMLStylesheetPI, nsXMLProcessingInstruction) + + +nsXMLStylesheetPI::nsXMLStylesheetPI(const nsAString& aData) : + nsXMLProcessingInstruction(NS_LITERAL_STRING("xml-stylesheet"), aData) +{ +} + +nsXMLStylesheetPI::~nsXMLStylesheetPI() +{ +} + +// nsIContent + +NS_IMETHODIMP +nsXMLStylesheetPI::SetDocument(nsIDocument* aDocument, PRBool aDeep, + PRBool aCompileEventHandlers) +{ + nsCOMPtr oldDoc = mDocument; + nsresult rv = nsXMLProcessingInstruction::SetDocument(aDocument, aDeep, + aCompileEventHandlers); + if (NS_SUCCEEDED(rv)) { + UpdateStyleSheet(oldDoc); + } + return rv; +} + + +// nsIDOMNode + +NS_IMETHODIMP +nsXMLStylesheetPI::SetNodeValue(const nsAString& aNodeValue) +{ + nsresult rv = nsGenericDOMDataNode::SetNodeValue(aNodeValue); + if (NS_SUCCEEDED(rv)) { + UpdateStyleSheet(); + } + return rv; +} + +NS_IMETHODIMP +nsXMLStylesheetPI::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) +{ + nsAutoString data; + GetData(data); + + *aReturn = new nsXMLStylesheetPI(data); + if (!*aReturn) { + return NS_ERROR_OUT_OF_MEMORY; + } + + NS_ADDREF(*aReturn); + + return NS_OK; +} + +// nsStyleLinkElement + +NS_IMETHODIMP +nsXMLStylesheetPI::GetCharset(nsAString& aCharset) +{ + if (!GetAttrValue(NS_LITERAL_STRING("charset"), aCharset)) { + return NS_ERROR_FAILURE; + } + + return NS_OK; +} + +void +nsXMLStylesheetPI::GetStyleSheetURL(PRBool* aIsInline, + nsAString& aUrl) +{ + *aIsInline = PR_FALSE; + aUrl.Truncate(); + + nsAutoString href; + GetAttrValue(NS_LITERAL_STRING("href"), href); + if (href.IsEmpty()) { + return; + } + + nsCOMPtr url, baseURL; + if (mDocument) { + mDocument->GetBaseURL(*getter_AddRefs(baseURL)); + } + NS_MakeAbsoluteURI(aUrl, href, baseURL); +} + +void +nsXMLStylesheetPI::GetStyleSheetInfo(nsAString& aTitle, + nsAString& aType, + nsAString& aMedia, + PRBool* aIsAlternate) +{ + aTitle.Truncate(); + aType.Truncate(); + aMedia.Truncate(); + *aIsAlternate = PR_FALSE; + + // xml-stylesheet PI is special only in prolog + if (!nsContentUtils::InProlog(this)) { + return; + } + + nsAutoString title, type, media, alternate; + + GetAttrValue(NS_LITERAL_STRING("title"), title); + title.CompressWhitespace(); + aTitle.Assign(title); + + GetAttrValue(NS_LITERAL_STRING("alternate"), alternate); + + // if alternate, does it have title? + if (alternate.Equals(NS_LITERAL_STRING("yes"))) { + if (aTitle.IsEmpty()) { // alternates must have title + return; + } else { + *aIsAlternate = PR_TRUE; + } + } + + GetAttrValue(NS_LITERAL_STRING("media"), media); + aMedia.Assign(media); + ToLowerCase(aMedia); // case sensitivity? + + GetAttrValue(NS_LITERAL_STRING("type"), type); + + nsAutoString mimeType; + nsAutoString notUsed; + nsParserUtils::SplitMimeType(type, mimeType, notUsed); + if (!mimeType.IsEmpty() && !mimeType.EqualsIgnoreCase("text/css")) { + aType.Assign(type); + return; + } + + // If we get here we assume that we're loading a css file, so set the + // type to 'text/css' + aType.Assign(NS_LITERAL_STRING("text/css")); + + return; +} + +nsresult +NS_NewXMLStylesheetProcessingInstruction(nsIContent** aInstancePtrResult, + const nsAString& aData) +{ + *aInstancePtrResult = new nsXMLStylesheetPI(aData); + if (!*aInstancePtrResult) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*aInstancePtrResult); + + return NS_OK; +} + diff --git a/content/xml/document/Makefile.in b/content/xml/document/Makefile.in index 8e79579887a..3b2782aea7e 100644 --- a/content/xml/document/Makefile.in +++ b/content/xml/document/Makefile.in @@ -26,7 +26,7 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk -DIRS = public src +DIRS = public resources src include $(topsrcdir)/config/rules.mk diff --git a/content/xml/document/resources/MANIFEST_RES b/content/xml/document/resources/MANIFEST_RES new file mode 100644 index 00000000000..4a0e314068e --- /dev/null +++ b/content/xml/document/resources/MANIFEST_RES @@ -0,0 +1,7 @@ +# +# This is a list of local files which get copied to the mozilla:dist:bin:res:xml +# + +XMLPrettyPrint.bmp +XMLPrettyPrint.css +XMLPrettyPrint.xsl diff --git a/content/xml/document/resources/Makefile.in b/content/xml/document/resources/Makefile.in new file mode 100644 index 00000000000..46b148f28fb --- /dev/null +++ b/content/xml/document/resources/Makefile.in @@ -0,0 +1,41 @@ +# +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +DEPTH = ../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +include $(topsrcdir)/config/rules.mk + +EXPORT_RESOURCE_CONTENT = \ + $(srcdir)/XMLPrettyPrint.xsl \ + $(srcdir)/XMLPrettyPrint.xml \ + $(srcdir)/XMLPrettyPrint.bmp \ + $(srcdir)/XMLPrettyPrint.css \ + $(NULL) +libs:: + $(INSTALL) $(EXPORT_RESOURCE_CONTENT) $(DIST)/bin/res/xml + +install:: + $(SYSINSTALL) $(IFLAGS1) $(EXPORT_RESOURCE_CONTENT) $(DESTDIR)$(mozappdir)/res/xml diff --git a/content/xml/document/resources/XMLPrettyPrint.css b/content/xml/document/resources/XMLPrettyPrint.css new file mode 100644 index 00000000000..ad061eaef19 --- /dev/null +++ b/content/xml/document/resources/XMLPrettyPrint.css @@ -0,0 +1,119 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jonas Sicking (Original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +body { + font-family: 'Verdana', sans-serif; + width: 100%; + margin: 0; + padding: 0; +} + +html { + width: 100%; + margin: 0; + padding: 0; +} + +#header { + background-color: #ccc; + border-bottom: 3px solid black; + padding: 0.5em; + margin-bottom: 1em; +} + +img { + float: left; + margin: 0.5em; +} + +table { + border-spacing: 0; + margin: 0; +} + +td { + padding: 0; +} + +.markup { + color: blue +} + +.elemname { + color: red; +} + +.attrname { + color: #f88; +} + +.attrvalue { + color: black; +} + +.text { + color: black; + font-weight: bold; +} + +.indent { + margin-left: 1em; +} + +.comment { + color: green; + font-style: italic; +} + +.pi { + color: blue; +} + +.expander > div { + width: 1em; +} + +.expander { + cursor: default; + -moz-user-select: none; + vertical-align: top; + text-align: center; +} + +.expander-closed .expander-content { + display: none; +} diff --git a/content/xml/document/resources/XMLPrettyPrint.xsl b/content/xml/document/resources/XMLPrettyPrint.xsl new file mode 100644 index 00000000000..f1b0418e856 --- /dev/null +++ b/content/xml/document/resources/XMLPrettyPrint.xsl @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + +
+ < + + + /> +
+
+ + +
+ < + + + > + + + + </ + + > +
+
+ + + + + + + +
-
+ < + + + > + +
+ + </ + + > +
+
+ + + + + =" + + " + + + + +
+
+
+ + +
+ <? + + ?> +
+
+ + + + + + + +
-
+ <? +
+ ?> +
+
+ + +
+ <!-- + + --> +
+
+ + + + + + + +
-
+ <!-- +
+ --> +
+
+ +
diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index 450a918e55b..d42b117abdf 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -107,6 +107,13 @@ #include "nsIPrincipal.h" #include "nsIAggregatePrincipal.h" #include "nsICodebasePrincipal.h" +#include "nsIDOMDocumentView.h" +#include "nsIDOMAbstractView.h" +#include "nsIDOMCSSStyleDeclaration.h" +#include "nsIDOMViewCSS.h" +#include "nsXBLAtoms.h" +#include "nsIPref.h" +#include "nsIDOMDocumentXBL.h" // XXX misnamed header file, but oh well #include "nsHTMLTokens.h" @@ -183,6 +190,9 @@ nsXMLContentSink::nsXMLContentSink() mStyleSheetCount = 0; mCSSLoader = nsnull; mNeedToBlockParser = PR_FALSE; + mPrettyPrintXML = PR_TRUE; + mPrettyPrintHasSpecialRoot = PR_FALSE; + mPrettyPrintHasFactoredElements = PR_FALSE; } nsXMLContentSink::~nsXMLContentSink() @@ -234,7 +244,10 @@ nsXMLContentSink::Init(nsIDocument* aDoc, mDocumentBaseURL = aURL; NS_ADDREF(aURL); mWebShell = aContainer; - NS_IF_ADDREF(aContainer); + NS_IF_ADDREF(mWebShell); + if (!mWebShell) { + mPrettyPrintXML = PR_FALSE; + } nsCOMPtr loader; nsresult rv = mDocument->GetScriptLoader(getter_AddRefs(loader)); @@ -333,9 +346,82 @@ nsXMLContentSink::ScrollToRef() } } +PRBool +nsXMLContentSink::ShouldPrettyPrint() +{ + if (!mPrettyPrintXML || (mPrettyPrintHasFactoredElements && + !mPrettyPrintHasSpecialRoot)) { + mPrettyPrintXML = PR_FALSE; + + return PR_FALSE; + } + + // Check for correct load-command or if we're in a display:none iframe + nsAutoString command; + mParser->GetCommand(command); + if (!command.Equals(NS_LITERAL_STRING("view")) || + !mDocument->GetNumberOfShells()) { + mPrettyPrintXML = PR_FALSE; + + return PR_FALSE; + } + + // check if we're in an invisible iframe + nsCOMPtr sgo; + mDocument->GetScriptGlobalObject(getter_AddRefs(sgo)); + nsCOMPtr internalWin = do_QueryInterface(sgo); + nsCOMPtr frameElem; + if (internalWin) { + internalWin->GetFrameElement(getter_AddRefs(frameElem)); + } + + if (frameElem) { + nsCOMPtr computedStyle; + nsCOMPtr frameOwnerDoc; + frameElem->GetOwnerDocument(getter_AddRefs(frameOwnerDoc)); + nsCOMPtr docView = do_QueryInterface(frameOwnerDoc); + if (docView) { + nsCOMPtr defaultView; + docView->GetDefaultView(getter_AddRefs(defaultView)); + nsCOMPtr defaultCSSView = do_QueryInterface(defaultView); + if (defaultCSSView) { + defaultCSSView->GetComputedStyle(frameElem, NS_LITERAL_STRING(""), + getter_AddRefs(computedStyle)); + } + } + + if (computedStyle) { + nsAutoString visibility; + computedStyle->GetPropertyValue(NS_LITERAL_STRING("visibility"), visibility); + if (!visibility.Equals(NS_LITERAL_STRING("visible"))) { + mPrettyPrintXML = PR_FALSE; + + return PR_FALSE; + } + } + } + + // check the pref + nsCOMPtr prefs = do_GetService(NS_PREF_CONTRACTID); + if (prefs) { + PRBool pref = PR_FALSE; + prefs->GetBoolPref("layout.xml.prettyprint", &pref); + if (!pref) { + mPrettyPrintXML = PR_FALSE; + + return PR_FALSE; + } + } + + return PR_TRUE; +} + + NS_IMETHODIMP nsXMLContentSink::DidBuildModel(PRInt32 aQualityLevel) { + nsresult rv = NS_OK; + // XXX this is silly; who cares? PRInt32 i, ns = mDocument->GetNumberOfShells(); for (i = 0; i < ns; i++) { @@ -359,7 +445,17 @@ nsXMLContentSink::DidBuildModel(PRInt32 aQualityLevel) mDocument->SetRootContent(mDocElement); - nsresult rv = NS_OK; + // Check if we want to prettyprint + if (ShouldPrettyPrint()) { + NS_ASSERTION(!mXSLTransformMediator, "Prettyprinting an XSLT styled document"); + + nsCOMPtr uri; + rv = NS_NewURI(getter_AddRefs(uri), + NS_LITERAL_STRING("resource:///res/xml/XMLPrettyPrint.xsl")); + NS_ENSURE_SUCCESS(rv, rv); + LoadXSLStyleSheet(uri); + } + if (mXSLTransformMediator) { rv = SetupTransformMediator(); } @@ -567,18 +663,30 @@ nsresult nsXMLContentSink::CreateElement(const PRUnichar** aAtts, PRUint32 aAttsCount, PRInt32 aNameSpaceID, nsINodeInfo* aNodeInfo, nsIContent** aResult) { + nsresult rv = NS_OK; // The first step here is to see if someone has provided their // own content element implementation (e.g., XUL or MathML). // This is done based off a contractid/namespace scheme. nsCOMPtr elementFactory; - GetElementFactory(aNameSpaceID, getter_AddRefs(elementFactory)); - if (elementFactory) + gNameSpaceManager->GetElementFactory(aNameSpaceID, + getter_AddRefs(elementFactory)); + if (elementFactory) { // Create the content element using the element factory. elementFactory->CreateInstanceByTag(aNodeInfo, aResult); + } else { NS_NewXMLElement(aResult, aNodeInfo); } + // If we care, find out if we just used a special factory. + if (!mPrettyPrintHasFactoredElements && !mPrettyPrintHasSpecialRoot && + mPrettyPrintXML) { + PRBool hasFactory = PR_FALSE; + rv = gNameSpaceManager->HasRegisteredFactory(aNameSpaceID, &hasFactory); + NS_ENSURE_SUCCESS(rv, rv); + mPrettyPrintHasFactoredElements = hasFactory; + } + return NS_OK; } @@ -674,6 +782,7 @@ nsXMLContentSink::ProcessStyleLink(nsIContent* aElement, const nsString& aMedia) { nsresult rv = NS_OK; + mPrettyPrintXML = PR_FALSE; if (aType.EqualsIgnoreCase(kXSLType) || aType.EqualsIgnoreCase(kXMLTextContentType) || @@ -937,6 +1046,9 @@ nsXMLContentSink::ProcessHeaderData(nsIAtom* aHeader,const nsAString& aValue,nsI // XXX necko isn't going to process headers coming in from the parser //NS_WARNING("need to fix how necko adds mime headers (in HTMLContentSink::ProcessMETATag)"); + // If we add support for linking scripts here then we have to remember to + // turn off prettyprinting + mDocument->SetHeaderData(aHeader, aValue); // see if we have a refresh "header". @@ -1548,13 +1660,6 @@ MathMLElementFactoryImpl::CreateInstanceByTag(nsINodeInfo* aNodeInfo, //////////////////////////////////////////////////////////////////////// -void -nsXMLContentSink::GetElementFactory(PRInt32 aNameSpaceID, - nsIElementFactory** aResult) -{ - gNameSpaceManager->GetElementFactory(aNameSpaceID, aResult); -} - NS_IMETHODIMP nsXMLContentSink::HandleStartElement(const PRUnichar *aName, const PRUnichar **aAtts, @@ -1600,6 +1705,7 @@ nsXMLContentSink::HandleStartElement(const PRUnichar *aName, const PRBool isXHTML = nameSpaceID == kNameSpaceID_XHTML; if (isXHTML) { + mPrettyPrintHasFactoredElements = PR_TRUE; if (tagAtom.get() == nsHTMLAtoms::script) { result = ProcessStartSCRIPTTag(aLineNumber); // Don't append the content to the tree until we're all @@ -1651,6 +1757,17 @@ nsXMLContentSink::HandleStartElement(const PRUnichar *aName, if (NS_OK == result) { // If this is the document element if (!mDocElement) { + + // check for root elements that needs special handling for + // prettyprinting + if ((nameSpaceID == kNameSpaceID_XBL && + tagAtom == nsXBLAtoms::bindings) || + (nameSpaceID == kNameSpaceID_XSLT && + (tagAtom == nsLayoutAtoms::stylesheet || + tagAtom == nsLayoutAtoms::transform))) { + mPrettyPrintHasSpecialRoot = PR_TRUE; + } + mDocElement = content; NS_ADDREF(mDocElement); @@ -1908,6 +2025,7 @@ nsXMLContentSink::HandleProcessingInstruction(const PRUnichar *aTarget, if (ssle) { ssle->InitStyleLinkElement(mParser, PR_FALSE); ssle->SetEnableUpdates(PR_FALSE); + mPrettyPrintXML = PR_FALSE; } result = AddContentAsLeaf(node); diff --git a/content/xml/document/src/nsXMLContentSink.h b/content/xml/document/src/nsXMLContentSink.h index f2b4c1c17ed..662dea15ee4 100644 --- a/content/xml/document/src/nsXMLContentSink.h +++ b/content/xml/document/src/nsXMLContentSink.h @@ -173,6 +173,8 @@ protected: void ScrollToRef(); + PRBool ShouldPrettyPrint(); + static nsINameSpaceManager* gNameSpaceManager; static PRUint32 gRefCnt; @@ -200,6 +202,9 @@ protected: PRPackedBool mConstrainSize; PRPackedBool mInTitle; PRPackedBool mNeedToBlockParser; + PRPackedBool mPrettyPrintXML; + PRPackedBool mPrettyPrintHasSpecialRoot; + PRPackedBool mPrettyPrintHasFactoredElements; nsCOMPtr mContentStack; nsCOMPtr mNodeInfoManager; diff --git a/dom/public/nsIDOMClassInfo.h b/dom/public/nsIDOMClassInfo.h index 10b8291df01..26767c95aff 100644 --- a/dom/public/nsIDOMClassInfo.h +++ b/dom/public/nsIDOMClassInfo.h @@ -261,6 +261,9 @@ enum nsDOMClassInfoID { // ContentList object used for various live NodeLists eDOMClassInfo_ContentList_id, + // Processing-instruction with target "xml-stylesheet" + eDOMClassInfo_XMLStylesheetProcessingInstruction_id, + // This one better be the last one in this list eDOMClassInfoIDCount }; diff --git a/dom/src/base/nsDOMClassInfo.cpp b/dom/src/base/nsDOMClassInfo.cpp index d0c25f4361f..e5079f477f4 100644 --- a/dom/src/base/nsDOMClassInfo.cpp +++ b/dom/src/base/nsDOMClassInfo.cpp @@ -803,6 +803,9 @@ static nsDOMClassInfoData sClassInfoData[] = { nsContentListSH, ARRAY_SCRIPTABLE_FLAGS | nsIXPCScriptable::WANT_PRECREATE) + + NS_DEFINE_CLASSINFO_DATA(XMLStylesheetProcessingInstruction, nsNodeSH, + NODE_SCRIPTABLE_FLAGS) }; nsIXPConnect *nsDOMClassInfo::sXPConnect = nsnull; @@ -1358,7 +1361,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(ProcessingInstruction, nsIDOMProcessingInstruction) DOM_CLASSINFO_MAP_ENTRY(nsIDOMProcessingInstruction) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMLinkStyle) DOM_CLASSINFO_MAP_ENTRY(nsIDOMEventTarget) DOM_CLASSINFO_MAP_END @@ -1896,6 +1898,12 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMPkcs11) DOM_CLASSINFO_MAP_END + DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(XMLStylesheetProcessingInstruction, nsIDOMProcessingInstruction) + DOM_CLASSINFO_MAP_ENTRY(nsIDOMProcessingInstruction) + DOM_CLASSINFO_MAP_ENTRY(nsIDOMLinkStyle) + DOM_CLASSINFO_MAP_ENTRY(nsIDOMEventTarget) + DOM_CLASSINFO_MAP_END + #ifdef MOZ_SVG #define DOM_CLASSINFO_SVG_ELEMENT_MAP_ENTRIES \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGElement) \ diff --git a/layout/base/nsLayoutAtomList.h b/layout/base/nsLayoutAtomList.h index eec15f68874..3ff67b7b4a6 100644 --- a/layout/base/nsLayoutAtomList.h +++ b/layout/base/nsLayoutAtomList.h @@ -211,6 +211,8 @@ LAYOUT_ATOM(Korean, "ko") // other LAYOUT_ATOM(wildcard, "*") LAYOUT_ATOM(mozdirty, "_moz_dirty") +LAYOUT_ATOM(stylesheet, "stylesheet") +LAYOUT_ATOM(transform, "transform") #ifdef IBMBIDI LAYOUT_ATOM(directionalFrame, "DirectionalFrame")