mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 04:17:31 +09:00
Issue #1221: Pass the original element into
nsXMLContentSerializer::CheckElementEnd so that we can properly determine whether it has children. This resolves #1221
This commit is contained in:
parent
90f6b97ecc
commit
f34f8ca034
10 changed files with 46 additions and 13 deletions
|
|
@ -82,7 +82,9 @@ protected:
|
||||||
nsAString& aStr,
|
nsAString& aStr,
|
||||||
bool aDontSerializeRoot,
|
bool aDontSerializeRoot,
|
||||||
uint32_t aMaxLength = 0);
|
uint32_t aMaxLength = 0);
|
||||||
nsresult SerializeNodeEnd(nsINode* aNode, nsAString& aStr);
|
nsresult SerializeNodeEnd(nsINode* aOriginalNode,
|
||||||
|
nsAString& aStr,
|
||||||
|
nsINode* aFixupNode = nullptr);
|
||||||
// This serializes the content of aNode.
|
// This serializes the content of aNode.
|
||||||
nsresult SerializeToStringIterative(nsINode* aNode,
|
nsresult SerializeToStringIterative(nsINode* aNode,
|
||||||
nsAString& aStr);
|
nsAString& aStr);
|
||||||
|
|
@ -405,14 +407,37 @@ nsDocumentEncoder::SerializeNodeStart(nsINode* aNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsDocumentEncoder::SerializeNodeEnd(nsINode* aNode,
|
nsDocumentEncoder::SerializeNodeEnd(nsINode* aOriginalNode,
|
||||||
nsAString& aStr)
|
nsAString& aStr,
|
||||||
|
nsINode* aFixupNode)
|
||||||
{
|
{
|
||||||
if (!IsVisibleNode(aNode))
|
if (!IsVisibleNode(aOriginalNode))
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
if (aNode->IsElement()) {
|
nsINode* node = nullptr;
|
||||||
mSerializer->AppendElementEnd(aNode->AsElement(), aStr);
|
nsCOMPtr<nsINode> fixedNodeKungfuDeathGrip;
|
||||||
|
|
||||||
|
// Caller didn't do fixup, so we'll do it ourselves
|
||||||
|
if (!aFixupNode) {
|
||||||
|
aFixupNode = aOriginalNode;
|
||||||
|
if (mNodeFixup) {
|
||||||
|
bool dummy;
|
||||||
|
nsCOMPtr<nsIDOMNode> domNodeIn = do_QueryInterface(aOriginalNode);
|
||||||
|
nsCOMPtr<nsIDOMNode> domNodeOut;
|
||||||
|
mNodeFixup->FixupNode(domNodeIn, &dummy, getter_AddRefs(domNodeOut));
|
||||||
|
fixedNodeKungfuDeathGrip = do_QueryInterface(domNodeOut);
|
||||||
|
node = fixedNodeKungfuDeathGrip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back to original node if needed.
|
||||||
|
if (!node)
|
||||||
|
node = aOriginalNode;
|
||||||
|
|
||||||
|
if (node->IsElement()) {
|
||||||
|
mSerializer->AppendElementEnd(node->AsElement(),
|
||||||
|
aOriginalNode->AsElement(),
|
||||||
|
aStr);
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -481,7 +506,7 @@ nsDocumentEncoder::SerializeToStringRecursive(nsINode* aNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aDontSerializeRoot) {
|
if (!aDontSerializeRoot) {
|
||||||
rv = SerializeNodeEnd(maybeFixedNode, aStr);
|
rv = SerializeNodeEnd(aNode, aStr, maybeFixedNode);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -301,6 +301,7 @@ nsHTMLContentSerializer::AppendElementStart(Element* aElement,
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLContentSerializer::AppendElementEnd(Element* aElement,
|
nsHTMLContentSerializer::AppendElementEnd(Element* aElement,
|
||||||
|
Element* aOriginalElement /* unused */,
|
||||||
nsAString& aStr)
|
nsAString& aStr)
|
||||||
{
|
{
|
||||||
NS_ENSURE_ARG(aElement);
|
NS_ENSURE_ARG(aElement);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ class nsHTMLContentSerializer final : public nsXHTMLContentSerializer {
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
|
NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ class nsIContentSerializer : public nsISupports {
|
||||||
nsAString& aStr) = 0;
|
nsAString& aStr) = 0;
|
||||||
|
|
||||||
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
nsAString& aStr) = 0;
|
nsAString& aStr) = 0;
|
||||||
|
|
||||||
NS_IMETHOD Flush(nsAString& aStr) = 0;
|
NS_IMETHOD Flush(nsAString& aStr) = 0;
|
||||||
|
|
|
||||||
|
|
@ -390,6 +390,7 @@ nsPlainTextSerializer::AppendElementStart(Element* aElement,
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsPlainTextSerializer::AppendElementEnd(Element* aElement,
|
nsPlainTextSerializer::AppendElementEnd(Element* aElement,
|
||||||
|
Element* aOriginalElement /* unused */,
|
||||||
nsAString& aStr)
|
nsAString& aStr)
|
||||||
{
|
{
|
||||||
NS_ENSURE_ARG(aElement);
|
NS_ENSURE_ARG(aElement);
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ public:
|
||||||
mozilla::dom::Element* aOriginalElement,
|
mozilla::dom::Element* aOriginalElement,
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
NS_IMETHOD Flush(nsAString& aStr) override;
|
NS_IMETHOD Flush(nsAString& aStr) override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -514,6 +514,7 @@ nsXHTMLContentSerializer::CheckElementStart(nsIContent * aContent,
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nsXHTMLContentSerializer::CheckElementEnd(mozilla::dom::Element* aElement,
|
nsXHTMLContentSerializer::CheckElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
bool& aForceFormat,
|
bool& aForceFormat,
|
||||||
nsAString& aStr)
|
nsAString& aStr)
|
||||||
{
|
{
|
||||||
|
|
@ -532,7 +533,7 @@ nsXHTMLContentSerializer::CheckElementEnd(mozilla::dom::Element* aElement,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dummyFormat;
|
bool dummyFormat;
|
||||||
return nsXMLContentSerializer::CheckElementEnd(aElement, dummyFormat, aStr);
|
return nsXMLContentSerializer::CheckElementEnd(aElement, aOriginalElement, dummyFormat, aStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ class nsXHTMLContentSerializer : public nsXMLContentSerializer {
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
virtual bool CheckElementEnd(mozilla::dom::Element* aContent,
|
virtual bool CheckElementEnd(mozilla::dom::Element* aContent,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
bool& aForceFormat,
|
bool& aForceFormat,
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1028,6 +1028,7 @@ nsXMLContentSerializer::AppendEndOfElementStart(Element* aElement,
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSerializer::AppendElementEnd(Element* aElement,
|
nsXMLContentSerializer::AppendElementEnd(Element* aElement,
|
||||||
|
Element* aOriginalElement,
|
||||||
nsAString& aStr)
|
nsAString& aStr)
|
||||||
{
|
{
|
||||||
NS_ENSURE_ARG(aElement);
|
NS_ENSURE_ARG(aElement);
|
||||||
|
|
@ -1035,7 +1036,7 @@ nsXMLContentSerializer::AppendElementEnd(Element* aElement,
|
||||||
nsIContent* content = aElement;
|
nsIContent* content = aElement;
|
||||||
|
|
||||||
bool forceFormat = false, outputElementEnd;
|
bool forceFormat = false, outputElementEnd;
|
||||||
outputElementEnd = CheckElementEnd(aElement, forceFormat, aStr);
|
outputElementEnd = CheckElementEnd(aElement, aOriginalElement, forceFormat, aStr);
|
||||||
|
|
||||||
nsIAtom *name = content->NodeInfo()->NameAtom();
|
nsIAtom *name = content->NodeInfo()->NameAtom();
|
||||||
|
|
||||||
|
|
@ -1161,16 +1162,14 @@ nsXMLContentSerializer::CheckElementStart(nsIContent * aContent,
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nsXMLContentSerializer::CheckElementEnd(Element* aElement,
|
nsXMLContentSerializer::CheckElementEnd(Element* aElement,
|
||||||
|
Element* aOriginalElement,
|
||||||
bool& aForceFormat,
|
bool& aForceFormat,
|
||||||
nsAString& aStr)
|
nsAString& aStr)
|
||||||
{
|
{
|
||||||
// We don't output a separate end tag for empty element
|
// We don't output a separate end tag for empty element
|
||||||
aForceFormat = false;
|
aForceFormat = false;
|
||||||
|
|
||||||
// XXXbz this is a bit messed up, but by now we don't have our fixed-up
|
return ElementNeedsSeparateEndTag(aElement, aOriginalElement);
|
||||||
// version of aElement anymore. Let's hope fixup never changes the localName
|
|
||||||
// or namespace...
|
|
||||||
return ElementNeedsSeparateEndTag(aElement, aElement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
nsAString& aStr) override;
|
nsAString& aStr) override;
|
||||||
|
|
||||||
NS_IMETHOD Flush(nsAString& aStr) override { return NS_OK; }
|
NS_IMETHOD Flush(nsAString& aStr) override { return NS_OK; }
|
||||||
|
|
@ -263,6 +264,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
|
||||||
* @return boolean true if the element can be output
|
* @return boolean true if the element can be output
|
||||||
*/
|
*/
|
||||||
virtual bool CheckElementEnd(mozilla::dom::Element* aElement,
|
virtual bool CheckElementEnd(mozilla::dom::Element* aElement,
|
||||||
|
mozilla::dom::Element* aOriginalElement,
|
||||||
bool& aForceFormat,
|
bool& aForceFormat,
|
||||||
nsAString& aStr);
|
nsAString& aStr);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue