2015-05-03 22:32:37 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2006-03-31 12:41:49 +04:00
|
|
|
/*
|
|
|
|
* nsIContentSerializer implementation that can be used with an
|
|
|
|
* nsIDocumentEncoder to convert an XML DOM to an XML string that
|
|
|
|
* could be parsed into more or less the original DOM.
|
|
|
|
*/
|
|
|
|
|
2000-09-10 23:36:22 +04:00
|
|
|
#ifndef nsXMLContentSerializer_h__
|
|
|
|
#define nsXMLContentSerializer_h__
|
|
|
|
|
2013-05-30 00:43:41 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2000-09-10 06:17:54 +04:00
|
|
|
#include "nsIContentSerializer.h"
|
|
|
|
#include "nsISupportsUtils.h"
|
|
|
|
#include "nsCOMPtr.h"
|
2009-03-20 11:15:35 +03:00
|
|
|
#include "nsTArray.h"
|
|
|
|
#include "nsString.h"
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
#define kIndentStr u" "_ns
|
|
|
|
#define kEndTag u"</"_ns
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2017-10-03 01:05:19 +03:00
|
|
|
class nsAtom;
|
2013-03-22 04:05:20 +04:00
|
|
|
class nsINode;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2017-04-27 13:27:03 +03:00
|
|
|
namespace mozilla {
|
|
|
|
class Encoding;
|
|
|
|
}
|
|
|
|
|
2000-09-10 06:17:54 +04:00
|
|
|
class nsXMLContentSerializer : public nsIContentSerializer {
|
|
|
|
public:
|
|
|
|
nsXMLContentSerializer();
|
|
|
|
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
2017-04-27 13:27:03 +03:00
|
|
|
NS_IMETHOD Init(uint32_t flags, uint32_t aWrapColumn,
|
|
|
|
const mozilla::Encoding* aEncoding, bool aIsCopying,
|
2017-06-12 22:20:44 +03:00
|
|
|
bool aRewriteEncodingDeclaration,
|
2019-08-28 14:54:49 +03:00
|
|
|
bool* aNeedsPreformatScanning, nsAString& aOutput) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
NS_IMETHOD AppendText(nsIContent* aText, int32_t aStartOffset,
|
2019-08-28 14:54:49 +03:00
|
|
|
int32_t aEndOffset) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2010-05-04 17:19:54 +04:00
|
|
|
NS_IMETHOD AppendCDATASection(nsIContent* aCDATASection, int32_t aStartOffset,
|
2019-08-28 14:54:49 +03:00
|
|
|
int32_t aEndOffset) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2018-03-19 22:15:39 +03:00
|
|
|
NS_IMETHOD AppendProcessingInstruction(
|
|
|
|
mozilla::dom::ProcessingInstruction* aPI, int32_t aStartOffset,
|
2019-08-28 14:54:49 +03:00
|
|
|
int32_t aEndOffset) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2018-03-19 22:15:39 +03:00
|
|
|
NS_IMETHOD AppendComment(mozilla::dom::Comment* aComment,
|
2019-08-28 14:54:49 +03:00
|
|
|
int32_t aStartOffset, int32_t aEndOffset) override;
|
2017-07-06 15:00:35 +03:00
|
|
|
|
2019-08-28 14:54:49 +03:00
|
|
|
NS_IMETHOD AppendDoctype(mozilla::dom::DocumentType* aDoctype) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2019-08-28 14:54:49 +03:00
|
|
|
NS_IMETHOD AppendElementStart(
|
|
|
|
mozilla::dom::Element* aElement,
|
|
|
|
mozilla::dom::Element* aOriginalElement) override;
|
2010-10-23 01:25:22 +04:00
|
|
|
|
|
|
|
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
|
2019-08-28 14:54:49 +03:00
|
|
|
mozilla::dom::Element* aOriginalElement) override;
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2019-08-28 14:54:49 +03:00
|
|
|
NS_IMETHOD FlushAndFinish() override { return NS_OK; }
|
Checking in for bug 50742, this change removes the use of XIF in mozilla and replaces the XIF converter with a HTML (and XML) serializer.
Contextual information added to HTML copy and intelligence added to HTML paste in the editor (fixes bugs 47014, 50568 and 46554, and partly (at least) fixes bug 53188).
Code written by vidur, jfrancis, jst, akkana. Tested by jfrancis, akkana, vidur, jst, kin. Reviwed (and super reviewed) by waterson, vidur, kin, jfrancis, jst
2000-10-07 14:57:30 +04:00
|
|
|
|
2019-08-28 14:54:49 +03:00
|
|
|
NS_IMETHOD Finish() override;
|
|
|
|
|
|
|
|
NS_IMETHOD GetOutputLength(uint32_t& aLength) const override;
|
|
|
|
|
|
|
|
NS_IMETHOD AppendDocumentStart(mozilla::dom::Document* aDocument) override;
|
2002-08-13 22:41:16 +04:00
|
|
|
|
2017-06-12 22:20:44 +03:00
|
|
|
NS_IMETHOD ScanElementForPreformat(mozilla::dom::Element* aElement) override {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
NS_IMETHOD ForgetElementForPreformat(
|
|
|
|
mozilla::dom::Element* aElement) override {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-09-10 06:17:54 +04:00
|
|
|
protected:
|
2014-06-25 06:09:15 +04:00
|
|
|
virtual ~nsXMLContentSerializer();
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
2014-01-04 19:02:17 +04:00
|
|
|
* Appends a char16_t character and increments the column position
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendToString(const char16_t aChar,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a nsAString string and increments the column position
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendToString(const nsAString& aStr,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a string by replacing all line-endings
|
|
|
|
* by mLineBreak, except in the case of raw output.
|
|
|
|
* It increments the column position.
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendToStringConvertLF(const nsAString& aStr,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a string by wrapping it when necessary.
|
|
|
|
* It updates the column position.
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendToStringWrapped(const nsAString& aStr,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a string by formating and wrapping it when necessary
|
|
|
|
* It updates the column position.
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendToStringFormatedWrapped(const nsAString& aStr,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// used by AppendToStringWrapped
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendWrapped_WhitespaceSequence(
|
2017-06-20 12:18:17 +03:00
|
|
|
nsAString::const_char_iterator& aPos,
|
|
|
|
const nsAString::const_char_iterator aEnd,
|
|
|
|
const nsAString::const_char_iterator aSequenceStart,
|
2009-04-25 13:00:14 +04:00
|
|
|
nsAString& aOutputStr);
|
|
|
|
|
|
|
|
// used by AppendToStringFormatedWrapped
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendFormatedWrapped_WhitespaceSequence(
|
2017-06-20 12:18:17 +03:00
|
|
|
nsAString::const_char_iterator& aPos,
|
|
|
|
const nsAString::const_char_iterator aEnd,
|
|
|
|
const nsAString::const_char_iterator aSequenceStart,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool& aMayIgnoreStartOfLineWhitespaceSequence, nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// used by AppendToStringWrapped and AppendToStringFormatedWrapped
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendWrapped_NonWhitespaceSequence(
|
2017-06-20 12:18:17 +03:00
|
|
|
nsAString::const_char_iterator& aPos,
|
|
|
|
const nsAString::const_char_iterator aEnd,
|
|
|
|
const nsAString::const_char_iterator aSequenceStart,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool& aMayIgnoreStartOfLineWhitespaceSequence,
|
|
|
|
bool& aSequenceStartAfterAWhiteSpace, nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* add mLineBreak to the string
|
|
|
|
* It updates the column position and other flags.
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendNewLineToString(nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a string by translating entities
|
|
|
|
* It doesn't increment the column position
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] virtual bool AppendAndTranslateEntities(const nsAString& aStr,
|
|
|
|
nsAString& aOutputStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2018-11-28 11:11:08 +03:00
|
|
|
/**
|
|
|
|
* Helper for virtual AppendAndTranslateEntities that does the actualy work.
|
|
|
|
*
|
|
|
|
* Do not call this directly. Call it via the template helper below.
|
|
|
|
*/
|
|
|
|
private:
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] static bool AppendAndTranslateEntities(
|
|
|
|
const nsAString& aStr, nsAString& aOutputStr,
|
|
|
|
const uint8_t aEntityTable[], uint16_t aMaxTableIndex,
|
|
|
|
const char* const aStringTable[]);
|
2018-11-28 11:11:08 +03:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
* Helper for calling AppendAndTranslateEntities in a way that guarantees we
|
|
|
|
* don't mess up our aEntityTable sizing. This is a bit more complicated than
|
|
|
|
* it could be, becaue sometimes we don't want to use all of aEntityTable, so
|
|
|
|
* we have to allow passing the amount to use independently. But we can
|
|
|
|
* statically ensure it's not too big.
|
|
|
|
*
|
|
|
|
* The first integer template argument, which callers need to specify
|
|
|
|
* explicitly, is the index of the last entry in aEntityTable that should be
|
|
|
|
* considered for encoding as an entity reference. The second integer
|
|
|
|
* argument will be deduced from the actual table passed in.
|
|
|
|
*
|
|
|
|
* aEntityTable contains as values indices into aStringTable. Those represent
|
|
|
|
* the strings that should be used to replace the characters that are used to
|
|
|
|
* index into aEntityTable. aStringTable[0] should be nullptr, and characters
|
|
|
|
* that do not need replacement should map to 0 in aEntityTable.
|
|
|
|
*/
|
|
|
|
template <uint16_t LargestIndex, uint16_t TableLength>
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendAndTranslateEntities(
|
2018-11-28 11:11:08 +03:00
|
|
|
const nsAString& aStr, nsAString& aOutputStr,
|
|
|
|
const uint8_t (&aEntityTable)[TableLength],
|
|
|
|
const char* const aStringTable[]) {
|
|
|
|
static_assert(LargestIndex < TableLength,
|
|
|
|
"Largest allowed index must be smaller than table length");
|
|
|
|
return AppendAndTranslateEntities(aStr, aOutputStr, aEntityTable,
|
|
|
|
LargestIndex, aStringTable);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Max index that can be used with some of our entity tables.
|
|
|
|
*/
|
|
|
|
static const uint16_t kGTVal = 62;
|
|
|
|
|
2009-04-25 13:00:14 +04:00
|
|
|
/**
|
|
|
|
* retrieve the text content of the node and append it to the given string
|
|
|
|
* It doesn't increment the column position
|
|
|
|
*/
|
2010-05-04 17:19:54 +04:00
|
|
|
nsresult AppendTextData(nsIContent* aNode, int32_t aStartOffset,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aEndOffset, nsAString& aStr,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aTranslateEntities);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2002-03-24 02:54:46 +03:00
|
|
|
virtual nsresult PushNameSpaceDecl(const nsAString& aPrefix,
|
|
|
|
const nsAString& aURI, nsIContent* aOwner);
|
2010-05-04 17:19:54 +04:00
|
|
|
void PopNameSpaceDeclsFor(nsIContent* aOwner);
|
2004-10-13 05:16:06 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The problem that ConfirmPrefix fixes is that anyone can insert nodes
|
|
|
|
* through the DOM that have a namespace URI and a random or empty or
|
|
|
|
* previously existing prefix that's totally unrelated to the prefixes
|
|
|
|
* declared at that point through xmlns attributes. So what ConfirmPrefix
|
|
|
|
* does is ensure that we can map aPrefix to the namespace URI aURI (for
|
|
|
|
* example, that the prefix is not already mapped to some other namespace).
|
|
|
|
* aPrefix will be adjusted, if necessary, so the value of the prefix
|
|
|
|
* _after_ this call is what should be serialized.
|
|
|
|
* @param aPrefix the prefix that may need adjusting
|
|
|
|
* @param aURI the namespace URI we want aPrefix to point to
|
|
|
|
* @param aElement the element we're working with (needed for proper default
|
|
|
|
* namespace handling)
|
2011-10-17 18:59:28 +04:00
|
|
|
* @param aIsAttribute true if we're confirming a prefix for an attribute.
|
|
|
|
* @return true if we need to push the (prefix, uri) pair on the namespace
|
2004-10-13 05:16:06 +04:00
|
|
|
* stack (note that this can happen even if the prefix is
|
|
|
|
* empty).
|
|
|
|
*/
|
2011-09-29 10:19:26 +04:00
|
|
|
bool ConfirmPrefix(nsAString& aPrefix, const nsAString& aURI,
|
2010-05-04 17:19:54 +04:00
|
|
|
nsIContent* aElement, bool aIsAttribute);
|
2004-10-13 05:16:06 +04:00
|
|
|
/**
|
|
|
|
* GenerateNewPrefix generates a new prefix and writes it to aPrefix
|
|
|
|
*/
|
|
|
|
void GenerateNewPrefix(nsAString& aPrefix);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2017-12-05 20:05:51 +03:00
|
|
|
uint32_t ScanNamespaceDeclarations(mozilla::dom::Element* aContent,
|
|
|
|
mozilla::dom::Element* aOriginalElement,
|
2009-04-25 13:00:14 +04:00
|
|
|
const nsAString& aTagNamespaceURI);
|
|
|
|
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] virtual bool SerializeAttributes(
|
|
|
|
mozilla::dom::Element* aContent, mozilla::dom::Element* aOriginalElement,
|
|
|
|
nsAString& aTagPrefix, const nsAString& aTagNamespaceURI,
|
|
|
|
nsAtom* aTagName, nsAString& aStr, uint32_t aSkipAttr, bool aAddNSAttr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool SerializeAttr(const nsAString& aPrefix,
|
|
|
|
const nsAString& aName,
|
|
|
|
const nsAString& aValue, nsAString& aStr,
|
|
|
|
bool aDoEscapeEntities);
|
2000-09-10 06:17:54 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool IsJavaScript(nsIContent* aContent, nsAtom* aAttrNameAtom,
|
2010-07-19 14:35:02 +04:00
|
|
|
int32_t aAttrNamespaceID, const nsAString& aValueString);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This method can be redefined to check if the element can be serialized.
|
|
|
|
* It is called when the serialization of the start tag is asked
|
|
|
|
* (AppendElementStart)
|
|
|
|
* In this method you can also force the formating
|
2011-10-17 18:59:28 +04:00
|
|
|
* by setting aForceFormat to true.
|
|
|
|
* @return boolean true if the element can be output
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2018-01-08 17:07:16 +03:00
|
|
|
virtual bool CheckElementStart(mozilla::dom::Element* aElement,
|
2017-12-05 20:05:51 +03:00
|
|
|
bool& aForceFormat, nsAString& aStr,
|
|
|
|
nsresult& aResult);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
2016-01-14 05:36:25 +03:00
|
|
|
* This method is responsible for appending the '>' at the end of the start
|
|
|
|
* tag, possibly preceded by '/' and maybe a ' ' before that too.
|
|
|
|
*
|
|
|
|
* aElement and aOriginalElement are the same as the corresponding arguments
|
|
|
|
* to AppendElementStart.
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendEndOfElementStart(
|
|
|
|
mozilla::dom::Element* aEleemnt, mozilla::dom::Element* aOriginalElement,
|
|
|
|
nsAString& aStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This method can be redefine to serialize additional things just after
|
2021-01-06 07:54:51 +03:00
|
|
|
* the serialization of the start tag.
|
2009-04-25 13:00:14 +04:00
|
|
|
* (called at the end of AppendElementStart)
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] virtual bool AfterElementStart(nsIContent* aContent,
|
|
|
|
nsIContent* aOriginalElement,
|
|
|
|
nsAString& aStr) {
|
2015-03-17 11:55:22 +03:00
|
|
|
return true;
|
|
|
|
};
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This method can be redefined to check if the element can be serialized.
|
|
|
|
* It is called when the serialization of the end tag is asked
|
|
|
|
* (AppendElementEnd)
|
|
|
|
* In this method you can also force the formating
|
2011-10-17 18:59:28 +04:00
|
|
|
* by setting aForceFormat to true.
|
|
|
|
* @return boolean true if the element can be output
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2016-01-14 05:36:25 +03:00
|
|
|
virtual bool CheckElementEnd(mozilla::dom::Element* aElement,
|
2019-08-27 23:33:46 +03:00
|
|
|
mozilla::dom::Element* aOriginalElement,
|
2016-01-14 05:36:25 +03:00
|
|
|
bool& aForceFormat, nsAString& aStr);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This method can be redefine to serialize additional things just after
|
2021-01-06 07:54:51 +03:00
|
|
|
* the serialization of the end tag.
|
2009-04-25 13:00:14 +04:00
|
|
|
* (called at the end of AppendElementStart)
|
|
|
|
*/
|
|
|
|
virtual void AfterElementEnd(nsIContent* aContent, nsAString& aStr){};
|
|
|
|
|
|
|
|
/**
|
2011-10-17 18:59:28 +04:00
|
|
|
* Returns true if a line break should be inserted before an element open tag
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual bool LineBreakBeforeOpen(int32_t aNamespaceID, nsAtom* aName);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
2011-10-17 18:59:28 +04:00
|
|
|
* Returns true if a line break should be inserted after an element open tag
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual bool LineBreakAfterOpen(int32_t aNamespaceID, nsAtom* aName);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
2011-10-17 18:59:28 +04:00
|
|
|
* Returns true if a line break should be inserted after an element close tag
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual bool LineBreakBeforeClose(int32_t aNamespaceID, nsAtom* aName);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
2011-10-17 18:59:28 +04:00
|
|
|
* Returns true if a line break should be inserted after an element close tag
|
2009-04-25 13:00:14 +04:00
|
|
|
*/
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual bool LineBreakAfterClose(int32_t aNamespaceID, nsAtom* aName);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* add intendation. Call only in the case of formating and if the current
|
|
|
|
* position is at 0. It updates the column position.
|
|
|
|
*/
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool AppendIndentation(nsAString& aStr);
|
2015-03-17 11:55:22 +03:00
|
|
|
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool IncrIndentation(nsAtom* aName);
|
2017-10-03 01:05:19 +03:00
|
|
|
void DecrIndentation(nsAtom* aName);
|
2008-10-22 00:30:09 +04:00
|
|
|
|
2003-10-24 02:24:21 +04:00
|
|
|
// Functions to check for newlines that needs to be added between nodes in
|
2009-04-25 13:00:14 +04:00
|
|
|
// the root of a document. See mAddNewlineForRootNode
|
2021-03-10 11:19:25 +03:00
|
|
|
[[nodiscard]] bool MaybeAddNewlineForRootNode(nsAString& aStr);
|
2010-05-04 17:19:54 +04:00
|
|
|
void MaybeFlagNewlineForRootNode(nsINode* aNode);
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// Functions to check if we enter in or leave from a preformated content
|
|
|
|
virtual void MaybeEnterInPreContent(nsIContent* aNode);
|
|
|
|
virtual void MaybeLeaveFromPreContent(nsIContent* aNode);
|
2003-10-24 02:24:21 +04:00
|
|
|
|
2015-01-12 19:41:10 +03:00
|
|
|
bool ShouldMaintainPreLevel() const;
|
|
|
|
int32_t PreLevel() const {
|
|
|
|
MOZ_ASSERT(ShouldMaintainPreLevel());
|
|
|
|
return mPreLevel;
|
|
|
|
}
|
|
|
|
int32_t& PreLevel() {
|
|
|
|
MOZ_ASSERT(ShouldMaintainPreLevel());
|
|
|
|
return mPreLevel;
|
|
|
|
}
|
|
|
|
|
2018-06-28 14:22:58 +03:00
|
|
|
bool MaybeSerializeIsValue(mozilla::dom::Element* aElement, nsAString& aStr);
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t mPrefixIndex;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2009-03-26 11:29:49 +03:00
|
|
|
struct NameSpaceDecl {
|
|
|
|
nsString mPrefix;
|
|
|
|
nsString mURI;
|
2010-05-04 17:19:54 +04:00
|
|
|
nsIContent* mOwner;
|
2009-03-26 11:29:49 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
nsTArray<NameSpaceDecl> mNameSpaceStack;
|
2006-11-28 07:01:46 +03:00
|
|
|
|
2008-10-22 00:30:09 +04:00
|
|
|
// nsIDocumentEncoder flags
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR uint32_t mFlags;
|
2008-10-22 00:30:09 +04:00
|
|
|
|
|
|
|
// characters to use for line break
|
|
|
|
nsString mLineBreak;
|
|
|
|
|
2006-11-28 07:01:46 +03:00
|
|
|
// The charset that was passed to Init()
|
|
|
|
nsCString mCharset;
|
2017-07-06 15:00:35 +03:00
|
|
|
|
2009-04-25 13:00:14 +04:00
|
|
|
// current column position on the current line
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t mColPos;
|
2008-10-22 00:30:09 +04:00
|
|
|
|
2009-04-25 13:00:14 +04:00
|
|
|
// true = pretty formating should be done (OutputFormated flag)
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR bool mDoFormat;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// true = no formatting,(OutputRaw flag)
|
|
|
|
// no newline convertion and no rewrap long lines even if OutputWrap is set.
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR bool mDoRaw;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// true = wrapping should be done (OutputWrap flag)
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR bool mDoWrap;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2015-11-27 17:27:00 +03:00
|
|
|
// true = we can break lines (OutputDisallowLineBreaking flag)
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR bool mAllowLineBreaking;
|
2015-11-27 17:27:00 +03:00
|
|
|
|
2009-04-25 13:00:14 +04:00
|
|
|
// number of maximum column in a line, in the wrap mode
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR uint32_t mMaxColumn;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// current indent value
|
|
|
|
nsString mIndent;
|
|
|
|
|
|
|
|
// this is the indentation level after the indentation reached
|
|
|
|
// the maximum length of indentation
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t mIndentOverflow;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// says if the indentation has been already added on the current line
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mIsIndentationAddedOnCurrentLine;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// the string which is currently added is in an attribute
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mInAttribute;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// true = a newline character should be added. It's only
|
|
|
|
// useful when serializing root nodes. see MaybeAddNewlineForRootNode and
|
|
|
|
// MaybeFlagNewlineForRootNode
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mAddNewlineForRootNode;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// Indicates that a space will be added if and only if content is
|
|
|
|
// continued on the same line while serializing source. Otherwise,
|
|
|
|
// the newline character acts as the whitespace and no space is needed.
|
|
|
|
// used when mDoFormat = true
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mAddSpace;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
|
|
|
// says that if the next string to add contains a newline character at the
|
|
|
|
// begining, then this newline character should be ignored, because a
|
|
|
|
// such character has already been added into the output string
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mMayIgnoreLineBreakSequence;
|
2009-04-25 13:00:14 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mBodyOnly;
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t mInBody;
|
2010-07-19 14:35:02 +04:00
|
|
|
|
2019-08-28 14:54:49 +03:00
|
|
|
// Non-owning.
|
|
|
|
nsAString* mOutput;
|
|
|
|
|
2015-01-12 19:41:10 +03:00
|
|
|
private:
|
2009-04-25 13:00:14 +04:00
|
|
|
// number of nested elements which have preformated content
|
2016-07-27 15:41:55 +03:00
|
|
|
MOZ_INIT_OUTSIDE_CTOR int32_t mPreLevel;
|
2020-11-29 18:58:13 +03:00
|
|
|
|
|
|
|
static const uint8_t kEntities[];
|
|
|
|
static const uint8_t kAttrEntities[];
|
|
|
|
static const char* const kEntityStrings[];
|
2000-09-10 06:17:54 +04:00
|
|
|
};
|
2000-09-10 23:36:22 +04:00
|
|
|
|
2003-03-05 18:08:41 +03:00
|
|
|
nsresult NS_NewXMLContentSerializer(nsIContentSerializer** aSerializer);
|
2000-09-10 23:36:22 +04:00
|
|
|
|
|
|
|
#endif
|