Bug 1244437 - part 1: Make HTMLEditUtils::IsFormatNode check same tags as Chromium does r=m_kato

I realized that our `HTMLEditUtils::IsFormatNode` is not maintained different
from the other browsers.  Therefore, only we do not check new elements defined
after HTML 4.01.  This patch aligns the list of the format elements to the
others [1].

Then, this also changes some expectations of `editing/run/formatblock.html`
to align common behavior of the browsers.

Note that we mapped `formatBlock` of `execCommand` to `cmd_paragraphState`,
and the XUL command handles `<blockquote>` in a different path [2] and the
behavior is pretty different from the other formatBlock command implementations.
Therefore, this patch creates new command for `formatBlock` and makes
`HTMLEditor` switch behavior in any places.

1. ba50f40fc4:third_party/WebKit/WebCore/editing/FormatBlockCommand.cpp;l=114-134
2. https://searchfox.org/mozilla-central/rev/6602bdf9fff5020fbc8e248c963ddddf09a77b1b/editor/libeditor/HTMLEditor.cpp#2461-2474

Differential Revision: https://phabricator.services.mozilla.com/D190900
This commit is contained in:
Masayuki Nakano 2023-10-26 03:45:17 +00:00
parent 89c28e8c37
commit e302445217
15 changed files with 669 additions and 900 deletions

View file

@ -4912,10 +4912,10 @@ void Document::EnsureInitializeInternalCommandDataHashtable() {
sInternalCommandDataHashtable->InsertOrUpdate(
u"formatblock"_ns,
InternalCommandData(
"cmd_paragraphState",
"cmd_formatBlock",
Command::FormatBlock,
ExecCommandParam::String,
ParagraphStateCommand::GetInstance,
FormatBlockStateCommand::GetInstance,
CommandOnTextEditor::Disabled));
sInternalCommandDataHashtable->InsertOrUpdate(
u"styleWithCSS"_ns,
@ -5114,19 +5114,27 @@ Document::InternalCommandData Document::ConvertToInternalCommand(
static const nsStaticAtom* kFormattableBlockTags[] = {
// clang-format off
nsGkAtoms::address,
nsGkAtoms::article,
nsGkAtoms::aside,
nsGkAtoms::blockquote,
nsGkAtoms::dd,
nsGkAtoms::div,
nsGkAtoms::dl,
nsGkAtoms::dt,
nsGkAtoms::footer,
nsGkAtoms::h1,
nsGkAtoms::h2,
nsGkAtoms::h3,
nsGkAtoms::h4,
nsGkAtoms::h5,
nsGkAtoms::h6,
nsGkAtoms::header,
nsGkAtoms::hgroup,
nsGkAtoms::main,
nsGkAtoms::nav,
nsGkAtoms::p,
nsGkAtoms::pre,
nsGkAtoms::section,
// clang-format on
};
nsAutoString value(nsDependentSubstring(start, end));

View file

@ -237,6 +237,7 @@ class EditorCommand : public nsIControllerCommand {
return EditorCommandParamType::None;
// ParagraphStateCommand
case Command::FormatBlock:
case Command::ParagraphState:
return EditorCommandParamType::CString |
EditorCommandParamType::String |
EditorCommandParamType::StateAttribute;
@ -729,6 +730,30 @@ class MultiStateCommandBase : public EditorCommand {
nsIPrincipal* aPrincipal) const = 0;
};
/**
* The command class for Document.execCommand("formatBlock"),
* Document.queryCommandValue("formatBlock") etc.
*/
class FormatBlockStateCommand final : public MultiStateCommandBase {
public:
NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(FormatBlockStateCommand)
protected:
FormatBlockStateCommand() = default;
virtual ~FormatBlockStateCommand() = default;
MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
const nsAString& aNewState,
nsIPrincipal* aPrincipal) const final;
};
/**
* The command class for the legacy XUL edit command, cmd_paragraphState.
* This command treats only <p>, <pre>, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>,
* <address> as a format node.
*/
class ParagraphStateCommand final : public MultiStateCommandBase {
public:
NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(ParagraphStateCommand)

View file

@ -1993,11 +1993,17 @@ HTMLEditor::InsertParagraphSeparatorAsSubAction(const Element& aEditingHost) {
separator != ParagraphSeparator::br) {
MOZ_ASSERT(separator == ParagraphSeparator::div ||
separator == ParagraphSeparator::p);
// FIXME: If there is no splittable block element, the other browsers wrap
// the right nodes into new paragraph, but keep the left node as-is.
// We should follow them to make here simpler and better compatibility.
Result<RefPtr<Element>, nsresult> suggestBlockElementToPutCaretOrError =
FormatBlockContainerWithTransaction(
selectionRanges,
MOZ_KnownLive(HTMLEditor::ToParagraphSeparatorTagName(separator)),
aEditingHost);
// For keeping the traditional behavior at insertParagraph command,
// let's use the XUL paragraph state command targets even if we're
// handling HTML insertParagraph command.
FormatBlockMode::XULParagraphStateCommand, aEditingHost);
if (MOZ_UNLIKELY(suggestBlockElementToPutCaretOrError.isErr())) {
NS_WARNING("HTMLEditor::FormatBlockContainerWithTransaction() failed");
return suggestBlockElementToPutCaretOrError.propagateErr();
@ -4577,8 +4583,8 @@ nsresult HTMLEditor::RemoveListAtSelectionAsSubAction(
Result<RefPtr<Element>, nsresult>
HTMLEditor::FormatBlockContainerWithTransaction(
AutoRangeArray& aSelectionRanges, nsAtom& blockType,
const Element& aEditingHost) {
AutoRangeArray& aSelectionRanges, const nsStaticAtom& aNewFormatTagName,
FormatBlockMode aFormatBlockMode, const Element& aEditingHost) {
MOZ_ASSERT(IsTopLevelEditSubActionDataAvailable());
// XXX Why do we do this only when there is only one selection range?
@ -4654,7 +4660,8 @@ HTMLEditor::FormatBlockContainerWithTransaction(
auto pointToInsertBlock =
aSelectionRanges.GetFirstRangeStartPoint<EditorDOMPoint>();
if (&blockType == nsGkAtoms::normal || &blockType == nsGkAtoms::_empty) {
if (&aNewFormatTagName == nsGkAtoms::normal ||
&aNewFormatTagName == nsGkAtoms::_empty) {
if (!pointToInsertBlock.IsInContentNode()) {
NS_WARNING(
"HTMLEditor::FormatBlockContainerWithTransaction() couldn't find "
@ -4673,7 +4680,10 @@ HTMLEditor::FormatBlockContainerWithTransaction(
"block parent");
return Err(NS_ERROR_FAILURE);
}
if (!HTMLEditUtils::IsFormatNode(editableBlockElement)) {
if (editableBlockElement->IsAnyOfHTMLElements(
nsGkAtoms::dd, nsGkAtoms::dl, nsGkAtoms::dt) ||
!HTMLEditor::IsFormatElement(aFormatBlockMode,
*editableBlockElement)) {
return RefPtr<Element>();
}
@ -4743,14 +4753,14 @@ HTMLEditor::FormatBlockContainerWithTransaction(
// Make sure we can put a block here.
Result<CreateElementResult, nsresult> createNewBlockElementResult =
InsertElementWithSplittingAncestorsWithTransaction(
blockType, pointToInsertBlock, BRElementNextToSplitPoint::Keep,
aEditingHost);
aNewFormatTagName, pointToInsertBlock,
BRElementNextToSplitPoint::Keep, aEditingHost);
if (MOZ_UNLIKELY(createNewBlockElementResult.isErr())) {
NS_WARNING(
nsPrintfCString(
"HTMLEditor::InsertElementWithSplittingAncestorsWithTransaction("
"%s) failed",
nsAtomCString(&blockType).get())
nsAtomCString(&aNewFormatTagName).get())
.get());
return createNewBlockElementResult.propagateErr();
}
@ -4784,7 +4794,7 @@ HTMLEditor::FormatBlockContainerWithTransaction(
// Okay, now go through all the nodes and make the right kind of blocks, or
// whatever is appropriate.
// Note: blockquote is handled a little differently.
if (&blockType == nsGkAtoms::blockquote) {
if (&aNewFormatTagName == nsGkAtoms::blockquote) {
Result<CreateElementResult, nsresult>
wrapContentsInBlockquoteElementsResult =
WrapContentsInBlockquoteElementsWithTransaction(arrayOfContents,
@ -4799,10 +4809,12 @@ HTMLEditor::FormatBlockContainerWithTransaction(
.IgnoreCaretPointSuggestion();
return wrapContentsInBlockquoteElementsResult.unwrap().UnwrapNewNode();
}
if (&blockType == nsGkAtoms::normal || &blockType == nsGkAtoms::_empty) {
if (&aNewFormatTagName == nsGkAtoms::normal ||
&aNewFormatTagName == nsGkAtoms::_empty) {
Result<EditorDOMPoint, nsresult> removeBlockContainerElementsResult =
RemoveBlockContainerElementsWithTransaction(
arrayOfContents, BlockInlineCheck::UseHTMLDefaultStyle);
arrayOfContents, aFormatBlockMode,
BlockInlineCheck::UseHTMLDefaultStyle);
if (MOZ_UNLIKELY(removeBlockContainerElementsResult.isErr())) {
NS_WARNING(
"HTMLEditor::RemoveBlockContainerElementsWithTransaction() failed");
@ -4811,10 +4823,10 @@ HTMLEditor::FormatBlockContainerWithTransaction(
return RefPtr<Element>();
}
Result<CreateElementResult, nsresult> wrapContentsInBlockElementResult =
CreateOrChangeBlockContainerElement(arrayOfContents, blockType,
aEditingHost);
CreateOrChangeFormatContainerElement(arrayOfContents, aNewFormatTagName,
aFormatBlockMode, aEditingHost);
if (MOZ_UNLIKELY(wrapContentsInBlockElementResult.isErr())) {
NS_WARNING("HTMLEditor::CreateOrChangeBlockContainerElement() failed");
NS_WARNING("HTMLEditor::CreateOrChangeFormatContainerElement() failed");
return wrapContentsInBlockElementResult.propagateErr();
}
wrapContentsInBlockElementResult.inspect().IgnoreCaretPointSuggestion();
@ -9008,7 +9020,7 @@ HTMLEditor::WrapContentsInBlockquoteElementsWithTransaction(
Result<EditorDOMPoint, nsresult>
HTMLEditor::RemoveBlockContainerElementsWithTransaction(
const nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
BlockInlineCheck aBlockInlineCheck) {
FormatBlockMode aFormatBlockMode, BlockInlineCheck aBlockInlineCheck) {
MOZ_ASSERT(IsEditActionDataAvailable());
// Intent of this routine is to be used for converting to/from headers,
@ -9018,8 +9030,10 @@ HTMLEditor::RemoveBlockContainerElementsWithTransaction(
nsCOMPtr<nsIContent> firstContent, lastContent;
EditorDOMPoint pointToPutCaret;
for (const auto& content : aArrayOfContents) {
// If curNode is an <address>, <p>, <hn>, or <pre>, remove it.
if (HTMLEditUtils::IsFormatNode(content)) {
// If the current node is a format element, remove it.
if (!content->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) &&
HTMLEditor::IsFormatElement(aFormatBlockMode, content)) {
// Process any partial progress saved
if (blockElement) {
Result<SplitRangeOffFromNodeResult, nsresult> unwrapBlockElementResult =
@ -9079,8 +9093,8 @@ HTMLEditor::RemoveBlockContainerElementsWithTransaction(
AutoTArray<OwningNonNull<nsIContent>, 24> childContents;
HTMLEditUtils::CollectAllChildren(*content, childContents);
Result<EditorDOMPoint, nsresult> removeBlockContainerElementsResult =
RemoveBlockContainerElementsWithTransaction(childContents,
aBlockInlineCheck);
RemoveBlockContainerElementsWithTransaction(
childContents, aFormatBlockMode, aBlockInlineCheck);
if (MOZ_UNLIKELY(removeBlockContainerElementsResult.isErr())) {
NS_WARNING(
"HTMLEditor::RemoveBlockContainerElementsWithTransaction() failed");
@ -9120,7 +9134,10 @@ HTMLEditor::RemoveBlockContainerElementsWithTransaction(
blockElement = HTMLEditUtils::GetAncestorElement(
content, HTMLEditUtils::ClosestEditableBlockElement,
aBlockInlineCheck);
if (!blockElement || !HTMLEditUtils::IsFormatNode(blockElement) ||
if (!blockElement ||
blockElement->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) ||
!HTMLEditor::IsFormatElement(aFormatBlockMode, *blockElement) ||
!HTMLEditUtils::IsRemovableNode(*blockElement)) {
// Not a block kind that we care about.
blockElement = nullptr;
@ -9167,8 +9184,9 @@ HTMLEditor::RemoveBlockContainerElementsWithTransaction(
}
Result<CreateElementResult, nsresult>
HTMLEditor::CreateOrChangeBlockContainerElement(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents, nsAtom& aBlockTag,
HTMLEditor::CreateOrChangeFormatContainerElement(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
const nsStaticAtom& aNewFormatTagName, FormatBlockMode aFormatBlockMode,
const Element& aEditingHost) {
MOZ_ASSERT(IsTopLevelEditSubActionDataAvailable());
@ -9189,7 +9207,7 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
}
// Is it already the right kind of block, or an uneditable block?
if (content->IsHTMLElement(&aBlockTag) ||
if (content->IsHTMLElement(&aNewFormatTagName) ||
(!EditorUtils::IsEditableContent(content, EditorType::HTML) &&
HTMLEditUtils::IsBlockElement(
content, BlockInlineCheck::UseHTMLDefaultStyle))) {
@ -9203,12 +9221,14 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
// new block of correct type.
// XXX: pre can't hold everything the others can
if (HTMLEditUtils::IsMozDiv(content) ||
HTMLEditUtils::IsFormatNode(content)) {
(!content->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) &&
HTMLEditor::IsFormatElement(aFormatBlockMode, content))) {
// Forget any previous block used for previous inline nodes
curBlock = nullptr;
Result<CreateElementResult, nsresult> replaceWithNewBlockElementResult =
ReplaceContainerAndCloneAttributesWithTransaction(
MOZ_KnownLive(*content->AsElement()), aBlockTag);
MOZ_KnownLive(*content->AsElement()), aNewFormatTagName);
if (MOZ_UNLIKELY(replaceWithNewBlockElementResult.isErr())) {
NS_WARNING(
"EditorBase::ReplaceContainerAndCloneAttributesWithTransaction() "
@ -9242,11 +9262,12 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
HTMLEditUtils::CollectAllChildren(*content, childContents);
if (!childContents.IsEmpty()) {
Result<CreateElementResult, nsresult> wrapChildrenInBlockElementResult =
CreateOrChangeBlockContainerElement(childContents, aBlockTag,
aEditingHost);
CreateOrChangeFormatContainerElement(
childContents, aNewFormatTagName, aFormatBlockMode,
aEditingHost);
if (MOZ_UNLIKELY(wrapChildrenInBlockElementResult.isErr())) {
NS_WARNING(
"HTMLEditor::CreateOrChangeBlockContainerElement() failed");
"HTMLEditor::CreateOrChangeFormatContainerElement() failed");
return wrapChildrenInBlockElementResult;
}
CreateElementResult unwrappedWrapChildrenInBlockElementResult =
@ -9263,14 +9284,14 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
// Make sure we can put a block here
Result<CreateElementResult, nsresult> createNewBlockElementResult =
InsertElementWithSplittingAncestorsWithTransaction(
aBlockTag, atContent, BRElementNextToSplitPoint::Keep,
aNewFormatTagName, atContent, BRElementNextToSplitPoint::Keep,
aEditingHost);
if (MOZ_UNLIKELY(createNewBlockElementResult.isErr())) {
NS_WARNING(
nsPrintfCString(
"HTMLEditor::"
"InsertElementWithSplittingAncestorsWithTransaction(%s) failed",
nsAtomCString(&aBlockTag).get())
nsAtomCString(&aNewFormatTagName).get())
.get());
return createNewBlockElementResult;
}
@ -9304,14 +9325,14 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
// block for it.
Result<CreateElementResult, nsresult> createNewBlockElementResult =
InsertElementWithSplittingAncestorsWithTransaction(
aBlockTag, atContent, BRElementNextToSplitPoint::Keep,
aNewFormatTagName, atContent, BRElementNextToSplitPoint::Keep,
aEditingHost);
if (MOZ_UNLIKELY(createNewBlockElementResult.isErr())) {
NS_WARNING(
nsPrintfCString(
"HTMLEditor::"
"InsertElementWithSplittingAncestorsWithTransaction(%s) failed",
nsAtomCString(&aBlockTag).get())
nsAtomCString(&aNewFormatTagName).get())
.get());
return createNewBlockElementResult;
}
@ -9348,7 +9369,7 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
// added here if that should change
//
// If content is a non editable, drop it if we are going to <pre>.
if (&aBlockTag == nsGkAtoms::pre &&
if (&aNewFormatTagName == nsGkAtoms::pre &&
!EditorUtils::IsEditableContent(content, EditorType::HTML)) {
// Do nothing to this block
continue;
@ -9358,13 +9379,13 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
if (!curBlock) {
Result<CreateElementResult, nsresult> createNewBlockElementResult =
InsertElementWithSplittingAncestorsWithTransaction(
aBlockTag, atContent, BRElementNextToSplitPoint::Keep,
aNewFormatTagName, atContent, BRElementNextToSplitPoint::Keep,
aEditingHost);
if (MOZ_UNLIKELY(createNewBlockElementResult.isErr())) {
NS_WARNING(nsPrintfCString("HTMLEditor::"
"InsertElementWithSplittingAncestorsWithTr"
"ansaction(%s) failed",
nsAtomCString(&aBlockTag).get())
"InsertElementWithSplittingAncestorsWith"
"Transaction(%s) failed",
nsAtomCString(&aNewFormatTagName).get())
.get());
return createNewBlockElementResult;
}
@ -9414,7 +9435,7 @@ HTMLEditor::CreateOrChangeBlockContainerElement(
Result<SplitNodeResult, nsresult>
HTMLEditor::MaybeSplitAncestorsForInsertWithTransaction(
nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode,
const nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode,
const Element& aEditingHost) {
MOZ_ASSERT(IsEditActionDataAvailable());
@ -9465,7 +9486,7 @@ HTMLEditor::MaybeSplitAncestorsForInsertWithTransaction(
Result<CreateElementResult, nsresult>
HTMLEditor::InsertElementWithSplittingAncestorsWithTransaction(
nsAtom& aTagName, const EditorDOMPoint& aPointToInsert,
const nsAtom& aTagName, const EditorDOMPoint& aPointToInsert,
BRElementNextToSplitPoint aBRElementNextToSplitPoint,
const Element& aEditingHost,
const InitializeInsertingElement& aInitializer) {
@ -10382,7 +10403,7 @@ nsresult HTMLEditor::RemoveEmptyNodesIn(const EditorDOMRange& aRange) {
// Only consider certain nodes to be empty for purposes of removal
return true;
}
if (HTMLEditUtils::IsFormatNode(content) ||
if (HTMLEditUtils::IsFormatElementForFormatBlockCommand(*content) ||
HTMLEditUtils::IsListItem(content) ||
content->IsHTMLElement(nsGkAtoms::blockquote)) {
// These node types are candidates if selection is not in them. If

View file

@ -403,16 +403,6 @@ bool HTMLEditUtils::IsRemovableInlineStyleElement(Element& aElement) {
return tagName.LowerCaseEqualsASCII("blink");
}
/**
* IsFormatNode() returns true if aNode is a format node.
*/
bool HTMLEditUtils::IsFormatNode(const nsINode* aNode) {
MOZ_ASSERT(aNode);
return aNode->IsAnyOfHTMLElements(
nsGkAtoms::p, nsGkAtoms::pre, nsGkAtoms::h1, nsGkAtoms::h2, nsGkAtoms::h3,
nsGkAtoms::h4, nsGkAtoms::h5, nsGkAtoms::h6, nsGkAtoms::address);
}
/**
* IsNodeThatCanOutdent() returns true if aNode is a list, list item or
* blockquote.

View file

@ -213,7 +213,90 @@ class HTMLEditUtils final {
* styles.
*/
static bool IsRemovableInlineStyleElement(Element& aElement);
static bool IsFormatNode(const nsINode* aNode);
/**
* Return true if aTagName is one of the format element name of
* Document.execCommand("formatBlock").
*/
[[nodiscard]] static bool IsFormatTagForFormatBlockCommand(
const nsStaticAtom& aTagName) {
return
// clang-format off
&aTagName == nsGkAtoms::address ||
&aTagName == nsGkAtoms::article ||
&aTagName == nsGkAtoms::aside ||
&aTagName == nsGkAtoms::blockquote ||
&aTagName == nsGkAtoms::dd ||
&aTagName == nsGkAtoms::div ||
&aTagName == nsGkAtoms::dl ||
&aTagName == nsGkAtoms::dt ||
&aTagName == nsGkAtoms::footer ||
&aTagName == nsGkAtoms::h1 ||
&aTagName == nsGkAtoms::h2 ||
&aTagName == nsGkAtoms::h3 ||
&aTagName == nsGkAtoms::h4 ||
&aTagName == nsGkAtoms::h5 ||
&aTagName == nsGkAtoms::h6 ||
&aTagName == nsGkAtoms::header ||
&aTagName == nsGkAtoms::hgroup ||
&aTagName == nsGkAtoms::main ||
&aTagName == nsGkAtoms::nav ||
&aTagName == nsGkAtoms::p ||
&aTagName == nsGkAtoms::pre ||
&aTagName == nsGkAtoms::section;
// clang-format on
}
/**
* Return true if aContent is a format element of
* Document.execCommand("formatBlock").
*/
[[nodiscard]] static bool IsFormatElementForFormatBlockCommand(
const nsIContent& aContent) {
if (!aContent.IsHTMLElement() ||
!aContent.NodeInfo()->NameAtom()->IsStatic()) {
return false;
}
const nsStaticAtom* tagName = aContent.NodeInfo()->NameAtom()->AsStatic();
return IsFormatTagForFormatBlockCommand(*tagName);
}
/**
* Return true if aTagName is one of the format element name of
* cmd_paragraphState.
*/
[[nodiscard]] static bool IsFormatTagForParagraphStateCommand(
const nsStaticAtom& aTagName) {
return
// clang-format off
&aTagName == nsGkAtoms::address ||
&aTagName == nsGkAtoms::dd ||
&aTagName == nsGkAtoms::dl ||
&aTagName == nsGkAtoms::dt ||
&aTagName == nsGkAtoms::h1 ||
&aTagName == nsGkAtoms::h2 ||
&aTagName == nsGkAtoms::h3 ||
&aTagName == nsGkAtoms::h4 ||
&aTagName == nsGkAtoms::h5 ||
&aTagName == nsGkAtoms::h6 ||
&aTagName == nsGkAtoms::p ||
&aTagName == nsGkAtoms::pre;
// clang-format on
}
/**
* Return true if aContent is a format element of cmd_paragraphState.
*/
[[nodiscard]] static bool IsFormatElementForParagraphStateCommand(
const nsIContent& aContent) {
if (!aContent.IsHTMLElement() ||
!aContent.NodeInfo()->NameAtom()->IsStatic()) {
return false;
}
const nsStaticAtom* tagName = aContent.NodeInfo()->NameAtom()->AsStatic();
return IsFormatTagForParagraphStateCommand(*tagName);
}
static bool IsNodeThatCanOutdent(nsINode* aNode);
static bool IsHeader(nsINode& aNode);
static bool IsListItem(const nsINode* aNode);
@ -243,7 +326,8 @@ class HTMLEditUtils final {
return false;
}
static bool CanNodeContain(const nsINode& aParent, nsAtom& aChildNodeName) {
static bool CanNodeContain(const nsINode& aParent,
const nsAtom& aChildNodeName) {
switch (aParent.NodeType()) {
case nsINode::ELEMENT_NODE:
case nsINode::DOCUMENT_FRAGMENT_NODE:
@ -253,7 +337,7 @@ class HTMLEditUtils final {
return false;
}
static bool CanNodeContain(nsAtom& aParentNodeName,
static bool CanNodeContain(const nsAtom& aParentNodeName,
const nsIContent& aChild) {
switch (aChild.NodeType()) {
case nsINode::TEXT_NODE:
@ -269,7 +353,8 @@ class HTMLEditUtils final {
// XXX Only this overload does not check the node type. Therefore, only this
// handle Document and ProcessingInstructionTagName.
static bool CanNodeContain(nsAtom& aParentNodeName, nsAtom& aChildNodeName) {
static bool CanNodeContain(const nsAtom& aParentNodeName,
const nsAtom& aChildNodeName) {
nsHTMLTag childTagEnum;
if (&aChildNodeName == nsGkAtoms::textTagName) {
childTagEnum = eHTMLTag_text;
@ -277,10 +362,12 @@ class HTMLEditUtils final {
&aChildNodeName == nsGkAtoms::cdataTagName) {
childTagEnum = eHTMLTag_comment;
} else {
childTagEnum = nsHTMLTags::AtomTagToId(&aChildNodeName);
childTagEnum =
nsHTMLTags::AtomTagToId(const_cast<nsAtom*>(&aChildNodeName));
}
nsHTMLTag parentTagEnum = nsHTMLTags::AtomTagToId(&aParentNodeName);
nsHTMLTag parentTagEnum =
nsHTMLTags::AtomTagToId(const_cast<nsAtom*>(&aParentNodeName));
return HTMLEditUtils::CanNodeContain(parentTagEnum, childTagEnum);
}
@ -313,7 +400,7 @@ class HTMLEditUtils final {
*/
template <typename EditorDOMPointType>
static EditorDOMPoint GetInsertionPointInInclusiveAncestor(
nsAtom& aTagName, const EditorDOMPointType& aPoint,
const nsAtom& aTagName, const EditorDOMPointType& aPoint,
const Element* aAncestorLimit = nullptr) {
if (MOZ_UNLIKELY(!aPoint.IsInContentNode())) {
return EditorDOMPoint();

View file

@ -2437,7 +2437,53 @@ nsresult HTMLEditor::ClearSelection() {
return error.StealNSResult();
}
nsresult HTMLEditor::SetParagraphFormatAsAction(
nsresult HTMLEditor::FormatBlockAsAction(const nsAString& aParagraphFormat,
nsIPrincipal* aPrincipal) {
AutoEditActionDataSetter editActionData(
*this, EditAction::eInsertBlockElement, aPrincipal);
nsresult rv = editActionData.CanHandleAndMaybeDispatchBeforeInputEvent();
if (NS_FAILED(rv)) {
NS_WARNING_ASSERTION(rv == NS_ERROR_EDITOR_ACTION_CANCELED,
"CanHandleAndMaybeDispatchBeforeInputEvent(), failed");
return EditorBase::ToGenericNSResult(rv);
}
if (NS_WARN_IF(aParagraphFormat.IsEmpty())) {
return NS_ERROR_INVALID_ARG;
}
RefPtr<nsAtom> tagName = NS_Atomize(aParagraphFormat);
MOZ_ASSERT(tagName);
if (NS_WARN_IF(!tagName->IsStatic()) ||
NS_WARN_IF(!HTMLEditUtils::IsFormatTagForFormatBlockCommand(
*tagName->AsStatic()))) {
return NS_ERROR_INVALID_ARG;
}
if (tagName == nsGkAtoms::dd || tagName == nsGkAtoms::dt) {
// MOZ_KnownLive(tagName->AsStatic()) because nsStaticAtom instances live
// while the process is running.
Result<EditActionResult, nsresult> result =
MakeOrChangeListAndListItemAsSubAction(
MOZ_KnownLive(*tagName->AsStatic()), u""_ns,
SelectAllOfCurrentList::No);
if (MOZ_UNLIKELY(result.isErr())) {
NS_WARNING(
"HTMLEditor::MakeOrChangeListAndListItemAsSubAction("
"SelectAllOfCurrentList::No) failed");
return EditorBase::ToGenericNSResult(result.unwrapErr());
}
return NS_OK;
}
rv = FormatBlockContainerAsSubAction(MOZ_KnownLive(*tagName->AsStatic()),
FormatBlockMode::HTMLFormatBlockCommand);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"HTMLEditor::FormatBlockContainerAsSubAction() failed");
return EditorBase::ToGenericNSResult(rv);
}
nsresult HTMLEditor::SetParagraphStateAsAction(
const nsAString& aParagraphFormat, nsIPrincipal* aPrincipal) {
AutoEditActionDataSetter editActionData(
*this, EditAction::eInsertBlockElement, aPrincipal);
@ -2458,6 +2504,9 @@ nsresult HTMLEditor::SetParagraphFormatAsAction(
ToLowerCase(lowerCaseTagName);
RefPtr<nsAtom> tagName = NS_Atomize(lowerCaseTagName);
MOZ_ASSERT(tagName);
if (NS_WARN_IF(!tagName->IsStatic())) {
return NS_ERROR_INVALID_ARG;
}
if (tagName == nsGkAtoms::dd || tagName == nsGkAtoms::dt) {
// MOZ_KnownLive(tagName->AsStatic()) because nsStaticAtom instances live
// while the process is running.
@ -2474,12 +2523,23 @@ nsresult HTMLEditor::SetParagraphFormatAsAction(
return NS_OK;
}
rv = FormatBlockContainerAsSubAction(*tagName);
rv = FormatBlockContainerAsSubAction(
MOZ_KnownLive(*tagName->AsStatic()),
FormatBlockMode::XULParagraphStateCommand);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"HTMLEditor::FormatBlockContainerAsSubAction() failed");
return EditorBase::ToGenericNSResult(rv);
}
// static
bool HTMLEditor::IsFormatElement(FormatBlockMode aFormatBlockMode,
const nsIContent& aContent) {
// FYI: Optimize for HTML command because it may run too many times.
return MOZ_LIKELY(aFormatBlockMode == FormatBlockMode::HTMLFormatBlockCommand)
? HTMLEditUtils::IsFormatElementForFormatBlockCommand(aContent)
: HTMLEditUtils::IsFormatElementForParagraphStateCommand(aContent);
}
NS_IMETHODIMP HTMLEditor::GetParagraphState(bool* aMixed,
nsAString& aFirstParagraphState) {
if (NS_WARN_IF(!aMixed)) {
@ -2490,7 +2550,8 @@ NS_IMETHODIMP HTMLEditor::GetParagraphState(bool* aMixed,
}
ErrorResult error;
ParagraphStateAtSelection paragraphState(*this, error);
ParagraphStateAtSelection paragraphState(
*this, FormatBlockMode::XULParagraphStateCommand, error);
if (error.Failed()) {
NS_WARNING("ParagraphStateAtSelection failed");
return error.StealNSResult();
@ -2902,7 +2963,8 @@ nsresult HTMLEditor::RemoveListAsAction(const nsAString& aListType,
return rv;
}
nsresult HTMLEditor::FormatBlockContainerAsSubAction(nsAtom& aTagName) {
nsresult HTMLEditor::FormatBlockContainerAsSubAction(
const nsStaticAtom& aTagName, FormatBlockMode aFormatBlockMode) {
MOZ_ASSERT(IsEditActionDataAvailable());
if (NS_WARN_IF(!mInitSucceeded)) {
@ -2976,7 +3038,7 @@ nsresult HTMLEditor::FormatBlockContainerAsSubAction(nsAtom& aTagName) {
AutoRangeArray selectionRanges(SelectionRef());
Result<RefPtr<Element>, nsresult> suggestBlockElementToPutCaretOrError =
FormatBlockContainerWithTransaction(selectionRanges, aTagName,
*editingHost);
aFormatBlockMode, *editingHost);
if (suggestBlockElementToPutCaretOrError.isErr()) {
NS_WARNING("HTMLEditor::FormatBlockContainerWithTransaction() failed");
return suggestBlockElementToPutCaretOrError.unwrapErr();
@ -3429,7 +3491,7 @@ already_AddRefed<Element> HTMLEditor::GetSelectedElement(const nsAtom* aTagName,
}
Result<CreateElementResult, nsresult> HTMLEditor::CreateAndInsertElement(
WithTransaction aWithTransaction, nsAtom& aTagName,
WithTransaction aWithTransaction, const nsAtom& aTagName,
const EditorDOMPoint& aPointToInsert,
const InitializeInsertingElement& aInitializer) {
MOZ_ASSERT(IsEditActionDataAvailable());

View file

@ -26,6 +26,7 @@
#include "nsIHTMLEditor.h"
#include "nsIHTMLInlineTableEditor.h"
#include "nsIHTMLObjectResizer.h"
#include "nsIPrincipal.h"
#include "nsITableEditor.h"
#include "nsPoint.h"
#include "nsStubMutationObserver.h"
@ -299,7 +300,26 @@ class HTMLEditor final : public EditorBase,
MOZ_CAN_RUN_SCRIPT nsresult
OutdentAsAction(nsIPrincipal* aPrincipal = nullptr);
MOZ_CAN_RUN_SCRIPT nsresult SetParagraphFormatAsAction(
/**
* The Document.execCommand("formatBlock") handler.
*
* @param aParagraphFormat Must not be an empty string, and the value must
* be one of address, article, aside, blockquote,
* div, footer, h1, h2, h3, h4, h5, h6, header,
* hgroup, main, nav, p, pre, selection, dt or dd.
*/
MOZ_CAN_RUN_SCRIPT nsresult FormatBlockAsAction(
const nsAString& aParagraphFormat, nsIPrincipal* aPrincipal = nullptr);
/**
* The cmd_paragraphState command handler.
*
* @param aParagraphFormat Can be empty string. If this is empty string,
* this removes ancestor format elements.
* Otherwise, the value must be one of p, pre,
* h1, h2, h3, h4, h5, h6, address, dt or dl.
*/
MOZ_CAN_RUN_SCRIPT nsresult SetParagraphStateAsAction(
const nsAString& aParagraphFormat, nsIPrincipal* aPrincipal = nullptr);
MOZ_CAN_RUN_SCRIPT nsresult AlignAsAction(const nsAString& aAlignType,
@ -1344,7 +1364,7 @@ class HTMLEditor final : public EditorBase,
*/
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<CreateElementResult, nsresult>
CreateAndInsertElement(
WithTransaction aWithTransaction, nsAtom& aTagName,
WithTransaction aWithTransaction, const nsAtom& aTagName,
const EditorDOMPoint& aPointToInsert,
const InitializeInsertingElement& aInitializer = DoNothingForNewElement);
@ -1401,7 +1421,7 @@ class HTMLEditor final : public EditorBase,
*/
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<SplitNodeResult, nsresult>
MaybeSplitAncestorsForInsertWithTransaction(
nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode,
const nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode,
const Element& aEditingHost);
/**
@ -1430,7 +1450,7 @@ class HTMLEditor final : public EditorBase,
enum class BRElementNextToSplitPoint { Keep, Delete };
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<CreateElementResult, nsresult>
InsertElementWithSplittingAncestorsWithTransaction(
nsAtom& aTagName, const EditorDOMPoint& aPointToInsert,
const nsAtom& aTagName, const EditorDOMPoint& aPointToInsert,
BRElementNextToSplitPoint aBRElementNextToSplitPoint,
const Element& aEditingHost,
const InitializeInsertingElement& aInitializer = DoNothingForNewElement);
@ -1497,6 +1517,25 @@ class HTMLEditor final : public EditorBase,
const nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
const Element& aEditingHost);
/**
* Our traditional formatBlock was same as XUL cmd_paragraphState command.
* However, the behavior is pretty different from the others and aligning
* the XUL command behavior may break Thunderbird a lot because it handles
* <blockquote> in a special path and <div> (generic block element) is not
* treated as a format node and these things may be used for designing
* current roles of the elements in the email composer of Thunderbird.
* Therefore, we create a new mode for HTMLFormatBlockCommand to align
* the behavior to the others but does not harm Thunderbird.
*/
enum class FormatBlockMode {
// Document.execCommand("formatBlock"). Cannot set new format to "normal"
// nor "". So, the paths to handle these ones are not used in this mode.
HTMLFormatBlockCommand,
// cmd_paragraphState. Can set new format to "normal" or "" to remove
// ancestor format blocks.
XULParagraphStateCommand,
};
/**
* RemoveBlockContainerElementsWithTransaction() removes all format blocks,
* table related element, etc in aArrayOfContents from the DOM tree. If
@ -1505,36 +1544,44 @@ class HTMLEditor final : public EditorBase,
* If aArrayOfContents has a table related element, <li>, <blockquote> or
* <div>, it will be removed and its contents will be moved to where it was.
*
* @param aFormatBlockMode Whether HTML formatBlock command or XUL
* paragraphState command.
*
* @return A suggest point to put caret if succeeded, but it may be
* unset if there is no suggestion.
*/
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<EditorDOMPoint, nsresult>
RemoveBlockContainerElementsWithTransaction(
const nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
BlockInlineCheck aBlockInlineCheck);
FormatBlockMode aFormatBlockMode, BlockInlineCheck aBlockInlineCheck);
/**
* CreateOrChangeBlockContainerElement() formats all nodes in aArrayOfContents
* with block elements whose name is aBlockTag.
* CreateOrChangeFormatContainerElement() formats all nodes in
* aArrayOfContents with block elements whose name is aNewFormatTagName.
*
* If aArrayOfContents has an inline element, a block element is created and
* the inline element and following inline elements are moved into the new
* block element.
* If aArrayOfContents has <br> elements, they'll be removed from the DOM
* tree and new block element will be created when there are some remaining
* inline elements.
* If aArrayOfContents has a block element, this calls itself with children
* of the block element. Then, new block element will be created when there
* are some remaining inline elements.
* If aArrayOfContents has <br> elements, they'll be removed from the DOM tree
* and new block element will be created when there are some remaining inline
* elements.
* If aArrayOfContents has a block element, this calls itself with children of
* the block element. Then, new block element will be created when there are
* some remaining inline elements.
*
* @param aArrayOfContents Must be descendants of a node.
* @param aBlockTag The element name of new block elements.
* @param aNewFormatTagName The element name of new block elements.
* @param aFormatBlockMode The replacing block element target type is for
* whether HTML formatBLock command or XUL
* paragraphState command.
* @param aEditingHost The editing host.
* @return The latest created new block element and a
* suggest point to put caret.
*/
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<CreateElementResult, nsresult>
CreateOrChangeBlockContainerElement(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents, nsAtom& aBlockTag,
CreateOrChangeFormatContainerElement(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
const nsStaticAtom& aNewFormatTagName, FormatBlockMode aFormatBlockMode,
const Element& aEditingHost);
/**
@ -1545,22 +1592,25 @@ class HTMLEditor final : public EditorBase,
* @param aSelectionRanges The ranges which are cloned by selection or
* updated from it with doing something before
* calling this.
* @param aBlockType New block tag name.
* If nsGkAtoms::normal or nsGkAtoms::_empty,
* RemoveBlockContainerElementsWithTransaction() will be
* called.
* If nsGkAtoms::blockquote,
* WrapContentsInBlockquoteElementsWithTransaction() will
* be called.
* Otherwise, CreateOrChangeBlockContainerElement() will be
* called.
* @param aNewFormatTagName New block tag name.
* If nsGkAtoms::normal or nsGkAtoms::_empty,
* RemoveBlockContainerElementsWithTransaction()
* will be called.
* If nsGkAtoms::blockquote,
* WrapContentsInBlockquoteElementsWithTransaction()
* will be called.
* Otherwise, CreateOrChangeBlockContainerElement()
* will be called.
* @param aFormatBlockMode Whether HTML formatBlock command or XUL
* paragraphState command.
* @param aEditingHost The editing host.
* @return If selection should be finally collapsed in a
* created block element, this returns the element.
*/
[[nodiscard]] MOZ_CAN_RUN_SCRIPT Result<RefPtr<Element>, nsresult>
FormatBlockContainerWithTransaction(AutoRangeArray& aSelectionRanges,
nsAtom& aBlockType,
const nsStaticAtom& aNewFormatTagName,
FormatBlockMode aFormatBlockMode,
const Element& aEditingHost);
/**
@ -1698,6 +1748,9 @@ class HTMLEditor final : public EditorBase,
class AutoListElementCreator;
[[nodiscard]] static bool IsFormatElement(FormatBlockMode aFormatBlockMode,
const nsIContent& aContent);
/**
* MakeOrChangeListAndListItemAsSubAction() handles create list commands with
* current selection. If
@ -3866,8 +3919,11 @@ class HTMLEditor final : public EditorBase,
*
* @param aTagName A block level element name. Must NOT be
* nsGkAtoms::dt nor nsGkAtoms::dd.
* @param aFormatBlockMode Whether HTML formatBlock command or XUL
* paragraphState command.
*/
MOZ_CAN_RUN_SCRIPT nsresult FormatBlockContainerAsSubAction(nsAtom& aTagName);
MOZ_CAN_RUN_SCRIPT nsresult FormatBlockContainerAsSubAction(
const nsStaticAtom& aTagName, FormatBlockMode aFormatBlockMode);
/**
* Increase/decrease the font size of selection.
@ -4629,8 +4685,15 @@ class MOZ_STACK_CLASS AlignStateAtSelection final {
*/
class MOZ_STACK_CLASS ParagraphStateAtSelection final {
public:
using FormatBlockMode = HTMLEditor::FormatBlockMode;
ParagraphStateAtSelection() = delete;
ParagraphStateAtSelection(HTMLEditor& aHTMLEditor, ErrorResult& aRv);
/**
* @param aFormatBlockMode Whether HTML formatBlock command or XUL
* paragraphState command.
*/
ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
FormatBlockMode aFormatBlockMode, ErrorResult& aRv);
/**
* GetFirstParagraphStateAtSelection() returns:
@ -4663,11 +4726,13 @@ class MOZ_STACK_CLASS ParagraphStateAtSelection final {
* @param aArrayOfContents [in/out] Found descendant format blocks
* and first inline node in each non-format
* block will be appended to this.
* @param aFormatBlockMode Whether HTML formatBlock command or XUL
* paragraphState command.
* @param aNonFormatBlockElement Must be a non-format block element.
*/
static void AppendDescendantFormatNodesAndFirstInlineNode(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
dom::Element& aNonFormatBlockElement);
FormatBlockMode aFormatBlockMode, dom::Element& aNonFormatBlockElement);
/**
* CollectEditableFormatNodesInSelection() collects only editable nodes

View file

@ -336,7 +336,7 @@ nsresult ListItemCommand::ToggleState(nsStaticAtom& aTagName,
// XXX Note: This actually doesn't work for "LI",
// but we currently don't use this for non DL lists anyway.
// Problem: won't this replace any current block paragraph style?
nsresult rv = aHTMLEditor.SetParagraphFormatAsAction(
nsresult rv = aHTMLEditor.SetParagraphStateAsAction(
nsDependentAtomString(&aTagName), aPrincipal);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"HTMLEditor::SetParagraphFormatAsAction() failed");
@ -511,6 +511,50 @@ nsresult MultiStateCommandBase::GetCommandStateParams(
return rv;
}
/*****************************************************************************
* mozilla::FormatBlockStateCommand
*****************************************************************************/
StaticRefPtr<FormatBlockStateCommand> FormatBlockStateCommand::sInstance;
nsresult FormatBlockStateCommand::GetCurrentState(
HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const {
if (NS_WARN_IF(!aHTMLEditor)) {
return NS_ERROR_INVALID_ARG;
}
ErrorResult error;
ParagraphStateAtSelection state(
*aHTMLEditor,
ParagraphStateAtSelection::FormatBlockMode::HTMLFormatBlockCommand,
error);
if (error.Failed()) {
NS_WARNING("ParagraphStateAtSelection failed");
return error.StealNSResult();
}
aParams.SetBool(STATE_MIXED, state.IsMixed());
if (NS_WARN_IF(!state.GetFirstParagraphStateAtSelection())) {
aParams.SetCString(STATE_ATTRIBUTE, ""_ns);
} else {
nsCString paragraphState; // Don't use `nsAutoCString` for avoiding copy.
state.GetFirstParagraphStateAtSelection()->ToUTF8String(paragraphState);
aParams.SetCString(STATE_ATTRIBUTE, paragraphState);
}
return NS_OK;
}
nsresult FormatBlockStateCommand::SetState(HTMLEditor* aHTMLEditor,
const nsAString& aNewState,
nsIPrincipal* aPrincipal) const {
if (NS_WARN_IF(!aHTMLEditor) || NS_WARN_IF(aNewState.IsEmpty())) {
return NS_ERROR_INVALID_ARG;
}
nsresult rv = aHTMLEditor->FormatBlockAsAction(aNewState, aPrincipal);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"HTMLEditor::FormatBlockAsAction() failed");
return rv;
}
/*****************************************************************************
* mozilla::ParagraphStateCommand
*****************************************************************************/
@ -524,7 +568,10 @@ nsresult ParagraphStateCommand::GetCurrentState(
}
ErrorResult error;
ParagraphStateAtSelection state(*aHTMLEditor, error);
ParagraphStateAtSelection state(
*aHTMLEditor,
ParagraphStateAtSelection::FormatBlockMode::XULParagraphStateCommand,
error);
if (error.Failed()) {
NS_WARNING("ParagraphStateAtSelection failed");
return error.StealNSResult();
@ -547,9 +594,9 @@ nsresult ParagraphStateCommand::SetState(HTMLEditor* aHTMLEditor,
if (NS_WARN_IF(!aHTMLEditor)) {
return NS_ERROR_INVALID_ARG;
}
nsresult rv = aHTMLEditor->SetParagraphFormatAsAction(aNewState, aPrincipal);
nsresult rv = aHTMLEditor->SetParagraphStateAsAction(aNewState, aPrincipal);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"HTMLEditor::SetParagraphFormatAsAction() failed");
"HTMLEditor::SetParagraphStateAsAction() failed");
return rv;
}

View file

@ -82,6 +82,7 @@ nsresult HTMLEditorController::RegisterHTMLEditorCommands(
NS_REGISTER_COMMAND(RemoveListCommand, "cmd_removeList");
// format stuff
NS_REGISTER_COMMAND(FormatBlockStateCommand, "cmd_formatBlock");
NS_REGISTER_COMMAND(ParagraphStateCommand, "cmd_paragraphState");
NS_REGISTER_COMMAND(FontFaceStateCommand, "cmd_fontFace");
NS_REGISTER_COMMAND(FontSizeStateCommand, "cmd_fontSize");
@ -122,6 +123,7 @@ void HTMLEditorController::Shutdown() {
ListCommand::Shutdown();
ListItemCommand::Shutdown();
RemoveListCommand::Shutdown();
FormatBlockStateCommand::Shutdown();
ParagraphStateCommand::Shutdown();
FontFaceStateCommand::Shutdown();
FontSizeStateCommand::Shutdown();

View file

@ -442,8 +442,9 @@ AlignStateAtSelection::AlignStateAtSelection(HTMLEditor& aHTMLEditor,
* ParagraphStateAtSelection
****************************************************************************/
ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
ErrorResult& aRv) {
ParagraphStateAtSelection::ParagraphStateAtSelection(
HTMLEditor& aHTMLEditor, FormatBlockMode aFormatBlockMode,
ErrorResult& aRv) {
if (NS_WARN_IF(aHTMLEditor.Destroyed())) {
aRv = EditorBase::ToGenericNSResult(NS_ERROR_EDITOR_DESTROYED);
return;
@ -464,19 +465,26 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
return;
}
Element* editingHostOrRoot = aHTMLEditor.ComputeEditingHost();
if (!editingHostOrRoot) {
// This is not a handler of editing command so that if there is no active
// editing host, let's use the <body> or document element instead.
editingHostOrRoot = aHTMLEditor.GetRoot();
if (!editingHostOrRoot) {
return;
if (MOZ_UNLIKELY(!aHTMLEditor.SelectionRef().RangeCount())) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
const Element* const editingHostOrBodyOrDocumentElement = [&]() -> Element* {
if (Element* editingHost = aHTMLEditor.ComputeEditingHost()) {
return editingHost;
}
return aHTMLEditor.GetRoot();
}();
if (!editingHostOrBodyOrDocumentElement ||
!HTMLEditUtils::IsSimplyEditableNode(
*editingHostOrBodyOrDocumentElement)) {
return;
}
AutoTArray<OwningNonNull<nsIContent>, 64> arrayOfContents;
nsresult rv = CollectEditableFormatNodesInSelection(
aHTMLEditor, *editingHostOrRoot, arrayOfContents);
aHTMLEditor, *editingHostOrBodyOrDocumentElement, arrayOfContents);
if (NS_FAILED(rv)) {
NS_WARNING(
"ParagraphStateAtSelection::CollectEditableFormatNodesInSelection() "
@ -492,7 +500,9 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
OwningNonNull<nsIContent>& content = arrayOfContents[index];
if (HTMLEditUtils::IsBlockElement(content,
BlockInlineCheck::UseHTMLDefaultStyle) &&
!HTMLEditUtils::IsFormatNode(content)) {
(content->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) ||
!HTMLEditor::IsFormatElement(aFormatBlockMode, content))) {
// XXX This RemoveObject() call has already been commented out and
// the above comment explained we're trying to replace non-format
// block nodes in the array. According to the following blocks and
@ -500,7 +510,7 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
// non-format block with descendants format blocks makes sense.
// arrayOfContents.RemoveObject(node);
ParagraphStateAtSelection::AppendDescendantFormatNodesAndFirstInlineNode(
arrayOfContents, *content->AsElement());
arrayOfContents, aFormatBlockMode, *content->AsElement());
}
}
@ -510,21 +520,20 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
const auto atCaret =
aHTMLEditor.GetFirstSelectionStartPoint<EditorRawDOMPoint>();
if (NS_WARN_IF(!atCaret.IsInContentNode())) {
MOZ_ASSERT(false,
"We've already checked whether there is a selection range, "
"but we have no range right now.");
aRv.Throw(NS_ERROR_FAILURE);
return;
}
arrayOfContents.AppendElement(*atCaret.ContainerAs<nsIContent>());
}
dom::Element* bodyOrDocumentElement = aHTMLEditor.GetRoot();
if (NS_WARN_IF(!bodyOrDocumentElement)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
for (auto& content : Reversed(arrayOfContents)) {
nsAtom* paragraphStateOfNode = nsGkAtoms::_empty;
if (HTMLEditUtils::IsFormatNode(content)) {
if (!content->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) &&
HTMLEditor::IsFormatElement(aFormatBlockMode, content)) {
MOZ_ASSERT(content->NodeInfo()->NameAtom());
paragraphStateOfNode = content->NodeInfo()->NameAtom();
}
@ -536,16 +545,17 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
}
// If we meet an inline node, let's get its parent format.
else {
for (nsINode* parentNode = content->GetParentNode(); parentNode;
parentNode = parentNode->GetParentNode()) {
for (Element* parentElement : content->AncestorsOfType<Element>()) {
// If we reach `HTMLDocument.body` or `Document.documentElement`,
// there is no format.
if (parentNode == bodyOrDocumentElement) {
if (parentElement == editingHostOrBodyOrDocumentElement) {
break;
}
if (HTMLEditUtils::IsFormatNode(parentNode)) {
MOZ_ASSERT(parentNode->NodeInfo()->NameAtom());
paragraphStateOfNode = parentNode->NodeInfo()->NameAtom();
if (!parentElement->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) &&
HTMLEditor::IsFormatElement(aFormatBlockMode, *parentElement)) {
MOZ_ASSERT(parentElement->NodeInfo()->NameAtom());
paragraphStateOfNode = parentElement->NodeInfo()->NameAtom();
break;
}
}
@ -567,10 +577,13 @@ ParagraphStateAtSelection::ParagraphStateAtSelection(HTMLEditor& aHTMLEditor,
// static
void ParagraphStateAtSelection::AppendDescendantFormatNodesAndFirstInlineNode(
nsTArray<OwningNonNull<nsIContent>>& aArrayOfContents,
dom::Element& aNonFormatBlockElement) {
FormatBlockMode aFormatBlockMode, dom::Element& aNonFormatBlockElement) {
MOZ_ASSERT(HTMLEditUtils::IsBlockElement(
aNonFormatBlockElement, BlockInlineCheck::UseHTMLDefaultStyle));
MOZ_ASSERT(!HTMLEditUtils::IsFormatNode(&aNonFormatBlockElement));
MOZ_ASSERT(
aNonFormatBlockElement.IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) ||
!HTMLEditor::IsFormatElement(aFormatBlockMode, aNonFormatBlockElement));
// We only need to place any one inline inside this node onto
// the list. They are all the same for purposes of determining
@ -581,12 +594,15 @@ void ParagraphStateAtSelection::AppendDescendantFormatNodesAndFirstInlineNode(
childContent; childContent = childContent->GetNextSibling()) {
const bool isBlock = HTMLEditUtils::IsBlockElement(
*childContent, BlockInlineCheck::UseHTMLDefaultStyle);
const bool isFormat = HTMLEditUtils::IsFormatNode(childContent);
const bool isFormat =
!childContent->IsAnyOfHTMLElements(nsGkAtoms::dd, nsGkAtoms::dl,
nsGkAtoms::dt) &&
HTMLEditor::IsFormatElement(aFormatBlockMode, *childContent);
// If the child is a non-format block element, let's check its children
// recursively.
if (isBlock && !isFormat) {
ParagraphStateAtSelection::AppendDescendantFormatNodesAndFirstInlineNode(
aArrayOfContents, *childContent->AsElement());
aArrayOfContents, aFormatBlockMode, *childContent->AsElement());
continue;
}

View file

@ -410,9 +410,6 @@ const knownFailures = {
"QV-Proposed-I_MYI-1-SI-dM": true,
"QV-Proposed-I_MYI-1-SI-body": true,
"QV-Proposed-I_MYI-1-SI-div": true,
"QV-Proposed-FB_BQ-1_SC-dM": true,
"QV-Proposed-FB_BQ-1_SC-body": true,
"QV-Proposed-FB_BQ-1_SC-div": true,
"QV-Proposed-FB_H1-H2-1_SL-dM": true,
"QV-Proposed-FB_H1-H2-1_SL-body": true,
"QV-Proposed-FB_H1-H2-1_SL-div": true,

View file

@ -1,180 +1,36 @@
[formatblock.html?1-1000]
expected:
if (os == "android") and fission: [OK, TIMEOUT]
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "foo[\]bar<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "foo[\]bar<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "foo[bar\]baz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "foo[bar\]baz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "foo\]bar[baz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "foo\]bar[baz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "{<p><p> <p>foo</p>}" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "{<p><p> <p>foo</p>}" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "foo[bar<i>baz\]qoz</i>quz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "foo[bar<i>baz\]qoz</i>quz<p>extra" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<div>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<div>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<p>[foobar\]</p>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<p>[foobar\]</p>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<blockquote>[foobar\]</blockquote>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<blockquote>[foobar\]</blockquote>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h1>[foobar\]</h1>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h1>[foobar\]</h1>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h2>[foobar\]</h2>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h2>[foobar\]</h2>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h3>[foobar\]</h3>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h3>[foobar\]</h3>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h4>[foobar\]</h4>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h4>[foobar\]</h4>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h5>[foobar\]</h5>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h5>[foobar\]</h5>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h6>[foobar\]</h6>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h6>[foobar\]</h6>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>foo<dd>[bar\]</dl>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<dl><dt>[foo<dd>bar\]</dl>" compare innerHTML]
expected: FAIL
@ -199,51 +55,6 @@
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<dl><dt>[foo<dd>bar\]</dl>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<ol><li>[foobar\]</ol>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<ol><li>[foobar\]</ol>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<ul><li>[foobar\]</ul>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<ul><li>[foobar\]</ul>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<address>[foobar\]</address>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<address>[foobar\]</address>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<pre>[foobar\]</pre>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<pre>[foobar\]</pre>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<article>[foobar\]</article>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<article>[foobar\]</article>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<article>[foobar\]</article>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<article>[foobar\]</article>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<ins>[foobar\]</ins>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<ins>[foobar\]</ins>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<del>[foobar\]</del>" queryCommandValue("formatblock") after]
expected: FAIL
[formatblock.html?1001-2000]
expected:
@ -254,36 +65,12 @@
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<quasit>[foobar\]</quasit>" queryCommandValue("defaultparagraphseparator") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<quasit>[foobar\]</quasit>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<quasit>[foobar\]</quasit>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<quasit style=\\"display: block\\">[foobar\]</quasit>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<quasit style=\\"display: block\\">[foobar\]</quasit>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<dl><dt>[foo\]<dd>bar</dl>" compare innerHTML]
expected: FAIL
@ -348,267 +135,69 @@
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<listing>[foobar\]</listing>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<xmp>[foobar\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<xmp>[foobar\]</xmp>" queryCommandValue("defaultparagraphseparator") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<xmp>[foobar\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<article>[foobar\]</article>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<article>[foobar\]</article>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<article>[foobar\]</article>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<article>[foobar\]</article>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<blockquote>[foo\]</blockquote><p>extra": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<blockquote>[foo\]</blockquote><p>extra" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<blockquote><p>[foo\]<p>bar</blockquote><p>extra": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<blockquote><p>[foo\]<p>bar</blockquote><p>extra" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "[foo\]<blockquote>bar</blockquote><p>extra": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "[foo\]<blockquote>bar</blockquote><p>extra" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foo<p>bar\]<p>baz": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foo<p>bar\]<p>baz" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section>[foo\]</section>": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section>[foo\]</section>" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section><p>[foo\]</section>": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section><p>[foo\]</section>" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section><hgroup><h1>[foo\]</h1><h2>bar</h2></hgroup><p>baz</section>": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section><hgroup><h1>[foo\]</h1><h2>bar</h2></hgroup><p>baz</section>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<address>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<address>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<address>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<address>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<article>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<article>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<div>[foobar\]</div>": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dd>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<del>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<del>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<dl>"\]\] "<div>[foobar\]</div>": execCommand("formatblock", false, "<dl>") return value]
expected: FAIL
[[["formatblock","<dl>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["formatblock","<dl>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<dl>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<dt>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h1>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h1>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h1>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h1>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h2>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h2>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h2>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h2>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h3>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h3>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h3>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h3>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h4>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h4>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h4>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h4>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h5>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h5>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h5>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h5>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h6>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h6>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h6>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h6>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<ins>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<ins>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<li>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<li>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<ol>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<ol>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<pre>"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<pre>"\]\] "<div>[foobar\]</div>" queryCommandValue("defaultparagraphseparator") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<pre>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<ul>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<ul>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<quasit>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","<quasit>"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foobar\]</p>": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foobar\]</p>" compare innerHTML]
expected: FAIL
@ -633,6 +222,9 @@
[[["defaultparagraphseparator","p"\],["formatblock","<dt>"\]\] "<p>[foobar\]</p>" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<section><p>[foo\]</section>" queryCommandValue("formatblock") before]
expected: FAIL
[formatblock.html?3001-4000]
expected:
@ -640,15 +232,6 @@
[[["defaultparagraphseparator","div"\],["formatblock","<h5>"\]\] "<p>[foobar\]</p>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<address>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<address>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foo<p>bar\]": execCommand("formatblock", false, "<blockquote>") return value]
expected: FAIL
[[["formatblock","<blockquote>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
@ -658,12 +241,6 @@
[[["defaultparagraphseparator","p"\],["formatblock","<dd>"\]\] "<p>[foo<p>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<p>[foo<p>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<p>[foo<p>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["formatblock","<dl>"\]\] "<p>[foo<p>bar\]": execCommand("formatblock", false, "<dl>") return value]
expected: FAIL
@ -679,66 +256,9 @@
[[["defaultparagraphseparator","p"\],["formatblock","<dt>"\]\] "<p>[foo<p>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h1>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h1>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h2>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h2>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h3>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h3>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h4>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h4>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h5>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h5>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h6>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<h6>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<pre>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<pre>"\]\] "<p>[foo<p>bar\]" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","p"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","p"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","p"\]\] "<div>[foobar\]</div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","p"\]\] "<div>[foobar\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<ol><li>[foo\]<li>bar</ol>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<ol><li>[foo\]<li>bar</ol>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<h1>foo<br>[bar\]</h1>" compare innerHTML]
expected: FAIL
@ -839,114 +359,30 @@
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div>[foo<p>bar\]</p></div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<xmp>[foo\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<xmp>[foo\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<xmp>[foo\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<xmp>[foo\]</xmp>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<xmp>[foo\]</xmp>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<xmp>[foo\]</xmp>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div><ol><li>[foo\]</ol></div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div><ol><li>[foo\]</ol></div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div><ol><li>[foo\]</ol></div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div><ol><li>[foo\]</ol></div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" compare innerHTML]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<p>[foo<h1>bar\]</h1>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<p>[foo<h1>bar\]</h1>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<p>[foo<h1>bar\]</h1>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<p>[foo<h1>bar\]</h1>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h1>[foo</h1><h2>bar\]</h2>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<h1>[foo</h1><h2>bar\]</h2>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h1>[foo</h1><h2>bar\]</h2>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<h1>[foo</h1><h2>bar\]</h2>" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandIndeterm("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandIndeterm("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div>[foo</div>bar\]" queryCommandValue("formatblock") after]
expected: FAIL
[[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" compare innerHTML]
expected: FAIL
[[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" compare innerHTML]
expected: FAIL
[[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" compare innerHTML]
expected: FAIL
[[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" compare innerHTML]
expected: FAIL
[[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div style=color:blue>[foo\]</div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","div"\],["formatblock","<h1>"\]\] "{<p>foo</p>ba\]r" compare innerHTML]
expected: FAIL
@ -959,17 +395,20 @@
[[["defaultparagraphseparator","p"\],["formatblock","<h1>"\]\] "{<p>foo</p>ba\]r" queryCommandValue("formatblock") before]
expected: FAIL
[[["formatblock","p"\]\] "<div><p contenteditable=false><span contenteditable>[foo\]</span></p></div>" queryCommandValue("formatblock") before]
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div>[foo<p>bar\]</p></div>" compare innerHTML]
expected: FAIL
[[["formatblock","p"\]\] "<div><p contenteditable=false><span contenteditable>[foo\]</span></p></div>" queryCommandValue("formatblock") after]
[[["defaultparagraphseparator","div"\],["formatblock","<p>"\]\] "<div>[foo<p>bar\]</p></div>" queryCommandIndeterm("formatblock") before]
expected: FAIL
[[["formatblock","div"\]\] "<div><div contenteditable=false><p contenteditable>[foo\]</p></div></div>" queryCommandValue("formatblock") before]
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div>[foo<p>bar\]</p></div>" compare innerHTML]
expected: FAIL
[[["formatblock","div"\]\] "<div><div contenteditable=false><p contenteditable>[foo\]</p></div></div>" queryCommandValue("formatblock") after]
[[["defaultparagraphseparator","p"\],["formatblock","<p>"\]\] "<div>[foo<p>bar\]</p></div>" queryCommandIndeterm("formatblock") before]
expected: FAIL
[[["formatblock","div"\]\] "<div><div contenteditable=false><div contenteditable>[foo\]</div></div></div>" queryCommandValue("formatblock") after]
[[["defaultparagraphseparator","div"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" queryCommandValue("formatblock") before]
expected: FAIL
[[["defaultparagraphseparator","p"\],["formatblock","<div>"\]\] "<div><table><tr><td>[foo\]</table></div>" queryCommandValue("formatblock") before]
expected: FAIL

View file

@ -1,12 +1,6 @@
[multitest.html?1-1000]
expected:
if (os == "android") and fission: [OK, TIMEOUT]
[[["bold",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["bold",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["bold",""\],["inserthtml","ab<b>c</b>d"\]\] "foo[\]bar" queryCommandState("bold") after]
expected: FAIL
@ -46,12 +40,6 @@
[[["bold",""\],["justifyright",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["italic",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["italic",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["italic",""\],["inserthtml","ab<b>c</b>d"\]\] "foo[\]bar" queryCommandState("italic") after]
expected: FAIL
@ -101,15 +89,9 @@
[[["strikethrough",""\],["delete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["strikethrough",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["strikethrough",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["strikethrough",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["strikethrough",""\],["forwarddelete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
@ -176,9 +158,6 @@
[[["subscript",""\],["delete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["subscript",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[multitest.html?2001-3000]
expected:
@ -234,12 +213,6 @@
[[["superscript",""\],["delete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["superscript",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["superscript",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["superscript",""\],["forwarddelete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
@ -286,12 +259,6 @@
[[["superscript",""\],["justifyright",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["underline",""\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["underline",""\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["underline",""\],["inserthtml","ab<b>c</b>d"\]\] "foo[\]bar" queryCommandState("underline") after]
expected: FAIL
@ -343,15 +310,9 @@
[[["backcolor","#00FFFF"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("backcolor") after]
expected: FAIL
[[["backcolor","#00FFFF"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["backcolor","#00FFFF"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("backcolor") after]
expected: FAIL
[[["backcolor","#00FFFF"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["backcolor","#00FFFF"\],["forwarddelete",""\]\] "foo[\]bar" queryCommandValue("backcolor") after]
expected: FAIL
@ -479,15 +440,9 @@
[[["createlink","http://www.google.com/"\],["delete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["createlink","http://www.google.com/"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["createlink","http://www.google.com/"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["createlink","http://www.google.com/"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["createlink","http://www.google.com/"\],["forwarddelete",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
@ -549,12 +504,6 @@
[[["createlink","http://www.google.com/"\],["outdent",""\],["inserttext","a"\]\] "foo[\]bar" compare innerHTML]
expected: FAIL
[[["fontname","sans-serif"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["fontname","sans-serif"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["fontname","sans-serif"\],["inserthtml","ab<b>c</b>d"\]\] "foo[\]bar" queryCommandValue("fontname") after]
expected: FAIL
@ -606,15 +555,9 @@
[[["fontsize","4"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("fontsize") before]
expected: FAIL
[[["fontsize","4"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["fontsize","4"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("fontsize") before]
expected: FAIL
[[["fontsize","4"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["fontsize","4"\],["forwarddelete",""\]\] "foo[\]bar" queryCommandValue("fontsize") before]
expected: FAIL
@ -742,12 +685,6 @@
[[["fontsize","4"\],["outdent",""\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("fontsize") before]
expected: FAIL
[[["forecolor","#0000FF"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["forecolor","#0000FF"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["forecolor","#0000FF"\],["inserthtml","ab<b>c</b>d"\]\] "foo[\]bar" queryCommandValue("forecolor") after]
expected: FAIL
@ -803,15 +740,9 @@
[[["hilitecolor","#00FFFF"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("hilitecolor") after]
expected: FAIL
[[["hilitecolor","#00FFFF"\],["formatblock","<div>"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["hilitecolor","#00FFFF"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("hilitecolor") after]
expected: FAIL
[[["hilitecolor","#00FFFF"\],["formatblock","<div>"\],["inserttext","a"\]\] "foo[\]bar" queryCommandValue("formatblock") after]
expected: FAIL
[[["hilitecolor","#00FFFF"\],["forwarddelete",""\]\] "foo[\]bar" queryCommandValue("hilitecolor") after]
expected: FAIL

View file

@ -147,14 +147,14 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"div"]}],
["<blockquote>[foobar]</blockquote>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<blockquote><div>[foobar]</div></blockquote>",
"<div>[foobar]</div>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"blockquote",false,false,"div"]}],
["<blockquote>[foobar]</blockquote>",
[["defaultparagraphseparator","p"],["formatblock","<div>"]],
"<blockquote><div>[foobar]</div></blockquote>",
"<div>[foobar]</div>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"blockquote",false,false,"div"]}],
["<h1>[foobar]</h1>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div>[foobar]</div>",
@ -287,14 +287,14 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"pre",false,false,"div"]}],
["<article>[foobar]</article>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<article><div>[foobar]</div></article>",
"<div>[foobar]</div>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"article",false,false,"div"]}],
["<article>[foobar]</article>",
[["defaultparagraphseparator","p"],["formatblock","<div>"]],
"<article><div>[foobar]</div></article>",
"<div>[foobar]</div>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"article",false,false,"div"]}],
["<ins>[foobar]</ins>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div><ins>[foobar]</ins></div>",
@ -482,14 +482,14 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<blockquote>[foobar]</blockquote>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<blockquote><p>[foobar]</p></blockquote>",
"<p>[foobar]</p>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"p"]}],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"blockquote",false,false,"p"]}],
["<blockquote>[foobar]</blockquote>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<blockquote><p>[foobar]</p></blockquote>",
"<p>[foobar]</p>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"p"]}],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"blockquote",false,false,"p"]}],
["<h1>[foobar]</h1>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p>[foobar]</p>",
@ -622,34 +622,34 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"pre",false,false,"p"]}],
["<listing>[foobar]</listing>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p>[foobar]</p>",
"<p><listing>[foobar]</listing></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"p"]}],
["<listing>[foobar]</listing>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<p>[foobar]</p>",
"<p><listing>[foobar]</listing></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"p"]}],
["<xmp>[foobar]</xmp>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p>[foobar]</p>",
"<p><xmp>[foobar]</xmp></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"p"]}],
["<xmp>[foobar]</xmp>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<p>[foobar]</p>",
"<p><xmp>[foobar]</xmp></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"p"]}],
["<article>[foobar]</article>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<article><p>[foobar]</p></article>",
"<p>[foobar]</p>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"p"]}],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"article",false,false,"p"]}],
["<article>[foobar]</article>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<article><p>[foobar]</p></article>",
"<p>[foobar]</p>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"p"]}],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"article",false,false,"p"]}],
["<ins>[foobar]</ins>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p><ins>[foobar]</ins></p>",
@ -693,43 +693,46 @@ var browserTests = [
["<blockquote>[foo]</blockquote><p>extra",
[["formatblock","<blockquote>"]],
"<blockquote>[foo]</blockquote><p>extra</p>",
[false],
{"formatblock":[false,false,"",false,false,""]}],
[true],
{"formatblock":[false,false,"blockquote",false,false,"blockquote"]}],
["<blockquote><p>[foo]<p>bar</blockquote><p>extra",
[["formatblock","<blockquote>"]],
"<blockquote><p>[foo]</p><p>bar</p></blockquote><p>extra</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<blockquote><blockquote>[foo]</blockquote><p>bar</p></blockquote><p>extra</p>",
[true],
{"formatblock":[false,false,"p",false,false,"blockquote"]}],
["[foo]<blockquote>bar</blockquote><p>extra",
[["formatblock","<blockquote>"]],
"[foo]<blockquote>bar</blockquote><p>extra</p>",
[false],
{"formatblock":[false,false,"",false,false,""]}],
"<blockquote>[foo]</blockquote><blockquote>bar</blockquote><p>extra</p>",
[true],
{"formatblock":[false,false,"",false,false,"blockquote"]}],
["<p>[foo<p>bar]<p>baz",
[["formatblock","<blockquote>"]],
"<p>[foo</p><p>bar]</p><p>baz</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<blockquote>[foo<br>bar]</blockquote><p>baz</p>",
"<blockquote>[foo</blockquote><blockquote>bar]</blockquote><p>baz</p>",
]
[true],
{"formatblock":[false,false,"",false,false,"blockquote"]}],
["<section>[foo]</section>",
[["formatblock","<blockquote>"]],
"<section>[foo]</section>",
[false],
{"formatblock":[false,false,"",false,false,""]}],
"<blockquote>[foo]</blockquote>",
[true],
{"formatblock":[false,false,"section",false,false,"blockquote"]}],
["<section><p>[foo]</section>",
[["formatblock","<blockquote>"]],
"<section><p>[foo]</p></section>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<section><blockquote>[foo]</blockquote></section>",
[true],
{"formatblock":[false,false,"p",false,false,"blockquote"]}],
["<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>",
[["formatblock","<blockquote>"]],
"<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</p></section>",
[false],
{"formatblock":[false,false,"h1",false,false,"h1"]}],
"<section><hgroup><blockquote>[foo]</blockquote><h2>bar</h2></hgroup><p>baz</p></section>",
[true],
{"formatblock":[false,false,"h1",false,false,"blockquote"]}],
["<section>[foo]</section>",
[["formatblock","<article>"]],
"<section>[foo]</section>",
[false],
{"formatblock":[false,false,"",false,false,""]}],
"<article>[foo]</article>",
[true],
{"formatblock":[false,false,"section",false,false,"article"]}],
["<div>[foobar]</div>",
[["defaultparagraphseparator","div"],["formatblock","<address>"]],
"<address>[foobar]</address>",
@ -742,14 +745,14 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"div",false,false,"address"]}],
["<div>[foobar]</div>",
[["formatblock","<article>"]],
"<div>[foobar]</div>",
[false],
{"formatblock":[false,false,"div",false,false,"div"]}],
"<article>[foobar]</article>",
[true],
{"formatblock":[false,false,"div",false,false,"article"]}],
["<div>[foobar]</div>",
[["formatblock","<blockquote>"]],
"<div>[foobar]</div>",
[false],
{"formatblock":[false,false,"div",false,false,"div"]}],
"<blockquote>[foobar]</blockquote>",
[true],
{"formatblock":[false,false,"div",false,false,"blockquote"]}],
["<div>[foobar]</div>",
[["defaultparagraphseparator","div"],["formatblock","<dd>"]],
"<dl><dd>[foobar]</dd></dl>",
@ -882,19 +885,19 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"address"]}],
["<p>[foobar]</p>",
[["formatblock","<article>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<article>[foobar]</article>",
[true],
{"formatblock":[false,false,"p",false,false,"article"]}],
["<p>[foobar]</p>",
[["formatblock","<aside>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<aside>[foobar]</aside>",
[true],
{"formatblock":[false,false,"p",false,false,"aside"]}],
["<p>[foobar]</p>",
[["formatblock","<blockquote>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<blockquote>[foobar]</blockquote>",
[true],
{"formatblock":[false,false,"p",false,false,"blockquote"]}],
["<p>[foobar]</p>",
[["formatblock","<body>"]],
"<p>[foobar]</p>",
@ -957,9 +960,9 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foobar]</p>",
[["formatblock","<footer>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<footer>[foobar]</footer>",
[true],
{"formatblock":[false,false,"p",false,false,"footer"]}],
["<p>[foobar]</p>",
[["formatblock","<form>"]],
"<p>[foobar]</p>",
@ -1027,9 +1030,9 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h6"]}],
["<p>[foobar]</p>",
[["formatblock","<header>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<header>[foobar]</header>",
[true],
{"formatblock":[false,false,"p",false,false,"header"]}],
["<p>[foobar]</p>",
[["formatblock","<head>"]],
"<p>[foobar]</p>",
@ -1037,9 +1040,9 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foobar]</p>",
[["formatblock","<hgroup>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<hgroup>[foobar]</hgroup>",
[true],
{"formatblock":[false,false,"p",false,false,"hgroup"]}],
["<p>[foobar]</p>",
[["formatblock","<hr>"]],
"<p>[foobar]</p>",
@ -1072,9 +1075,9 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foobar]</p>",
[["formatblock","<nav>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<nav>[foobar]</nav>",
[true],
{"formatblock":[false,false,"p",false,false,"nav"]}],
["<p>[foobar]</p>",
[["formatblock","<ol>"]],
"<p>[foobar]</p>",
@ -1097,9 +1100,9 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"pre"]}],
["<p>[foobar]</p>",
[["formatblock","<section>"]],
"<p>[foobar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
"<section>[foobar]</section>",
[true],
{"formatblock":[false,false,"p",false,false,"section"]}],
["<p>[foobar]</p>",
[["formatblock","<ul>"]],
"<p>[foobar]</p>",
@ -1117,29 +1120,44 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<address>"]],
"<address>[foo<br>bar]</address>",
[
"<address>[foo<br>bar]</address>",
"<address>[foo</address><address>bar]</address>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"address"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<address>"]],
"<address>[foo<br>bar]</address>",
[
"<address>[foo<br>bar]</address>",
"<address>[foo</address><address>bar]</address>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"address"]}],
["<p>[foo<p>bar]",
[["formatblock","<article>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<article>[foo<br>bar]</article>",
"<article>[foo</article><article>bar]</article>",
],
[true],
{"formatblock":[false,false,"p",false,false,"article"]}],
["<p>[foo<p>bar]",
[["formatblock","<aside>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<aside>[foo<br>bar]</aside>",
"<aside>[foo</aside><aside>bar]</aside>",
],
[true],
{"formatblock":[false,false,"p",false,false,"aside"]}],
["<p>[foo<p>bar]",
[["formatblock","<blockquote>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<blockquote>[foo<br>bar]</blockquote>",
"<blockquote>[foo</blockquote><blockquote>bar]</blockquote>",
],
[true],
{"formatblock":[false,false,"p",false,false,"blockquote"]}],
["<p>[foo<p>bar]",
[["formatblock","<body>"]],
"<p>[foo</p><p>bar]</p>",
@ -1172,12 +1190,18 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div>[foo</div><div>bar]</div>",
[
"<div>[foo<br>bar]</div>",
"<div>[foo</div><div>bar]</div>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"div"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<div>"]],
"<div>[foo</div><div>bar]</div>",
[
"<div>[foo<br>bar]</div>",
"<div>[foo</div><div>bar]</div>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"div"]}],
["<p>[foo<p>bar]",
@ -1212,9 +1236,12 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["formatblock","<footer>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<footer>[foo<br>bar]</footer>",
"<footer>[foo</footer><footer>bar]</footer>",
],
[true],
{"formatblock":[false,false,"p",false,false,"footer"]}],
["<p>[foo<p>bar]",
[["formatblock","<form>"]],
"<p>[foo</p><p>bar]</p>",
@ -1222,69 +1249,108 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h1>"]],
"<h1>[foo<br>bar]</h1>",
[
"<h1>[foo<br>bar]</h1>",
"<h1>[foo</h1><h1>bar]</h1>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h1"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h1>"]],
"<h1>[foo<br>bar]</h1>",
[
"<h1>[foo<br>bar]</h1>",
"<h1>[foo</h1><h1>bar]</h1>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h1"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h2>"]],
"<h2>[foo<br>bar]</h2>",
[
"<h2>[foo<br>bar]</h2>",
"<h2>[foo</h2><h2>bar]</h2>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h2"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h2>"]],
"<h2>[foo<br>bar]</h2>",
[
"<h2>[foo<br>bar]</h2>",
"<h2>[foo</h2><h2>bar]</h2>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h2"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h3>"]],
"<h3>[foo<br>bar]</h3>",
[
"<h3>[foo<br>bar]</h3>",
"<h3>[foo</h3><h3>bar]</h3>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h3"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h3>"]],
"<h3>[foo<br>bar]</h3>",
[
"<h3>[foo<br>bar]</h3>",
"<h3>[foo</h3><h3>bar]</h3>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h3"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h4>"]],
"<h4>[foo<br>bar]</h4>",
[
"<h4>[foo<br>bar]</h4>",
"<h4>[foo</h4><h4>bar]</h4>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h4"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h4>"]],
"<h4>[foo<br>bar]</h4>",
[
"<h4>[foo<br>bar]</h4>",
"<h4>[foo</h4><h4>bar]</h4>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h4"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h5>"]],
"<h5>[foo<br>bar]</h5>",
[
"<h5>[foo<br>bar]</h5>",
"<h5>[foo</h5><h5>bar]</h5>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h5"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h5>"]],
"<h5>[foo<br>bar]</h5>",
[
"<h5>[foo<br>bar]</h5>",
"<h5>[foo</h5><h5>bar]</h5>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h5"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<h6>"]],
"<h6>[foo<br>bar]</h6>",
[
"<h6>[foo<br>bar]</h6>",
"<h6>[foo</h6><h6>bar]</h6>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"h6"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","p"],["formatblock","<h6>"]],
"<h6>[foo<br>bar]</h6>",
[
"<h6>[foo<br>bar]</h6>",
"<h6>[foo</h6><h6>bar]</h6>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"h6"]}],
["<p>[foo<p>bar]",
[["formatblock","<header>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<header>[foo<br>bar]</header>",
"<header>[foo</header><header>bar]</header>",
],
[true],
{"formatblock":[false,false,"p",false,false,"header"]}],
["<p>[foo<p>bar]",
[["formatblock","<head>"]],
"<p>[foo</p><p>bar]</p>",
@ -1292,9 +1358,12 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["formatblock","<hgroup>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<hgroup>[foo<br>bar]</hgroup>",
"<hgroup>[foo</hgroup><hgroup>bar]</hgroup>",
],
[true],
{"formatblock":[false,false,"p",false,false,"hgroup"]}],
["<p>[foo<p>bar]",
[["formatblock","<hr>"]],
"<p>[foo</p><p>bar]</p>",
@ -1327,9 +1396,12 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["formatblock","<nav>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<nav>[foo<br>bar]</nav>",
"<nav>[foo</nav><nav>bar]</nav>",
],
[true],
{"formatblock":[false,false,"p",false,false,"nav"]}],
["<p>[foo<p>bar]",
[["formatblock","<ol>"]],
"<p>[foo</p><p>bar]</p>",
@ -1347,7 +1419,10 @@ var browserTests = [
{"formatblock":[false,false,"p",false,false,"p"]}],
["<p>[foo<p>bar]",
[["defaultparagraphseparator","div"],["formatblock","<pre>"]],
"<pre>[foo<br>bar]</pre>",
[
"<pre>[foo<br>bar]</pre>",
"<pre>[foo</pre><pre>bar]</pre>",
],
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"p",false,false,"pre"]}],
["<p>[foo<p>bar]",
@ -1357,9 +1432,12 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"p",false,false,"pre"]}],
["<p>[foo<p>bar]",
[["formatblock","<section>"]],
"<p>[foo</p><p>bar]</p>",
[false],
{"formatblock":[false,false,"p",false,false,"p"]}],
[
"<section>[foo<br>bar]</section>",
"<section>[foo</section><section>bar]</section>",
],
[true],
{"formatblock":[false,false,"p",false,false,"section"]}],
["<p>[foo<p>bar]",
[["formatblock","<ul>"]],
"<p>[foo</p><p>bar]</p>",
@ -1672,44 +1750,44 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[true,false,"",false,false,"h1"]}],
["<div>[foo<p>bar]</p></div>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<div><p>[foo</p><p>bar]</p></div>",
"<p>[foo</p><div><p>bar]</p></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[true,false,"",false,false,"p"]}],
["<div>[foo<p>bar]</p></div>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<div><p>[foo</p><p>bar]</p></div>",
"<p>[foo</p><div><p>bar]</p></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[true,false,"",false,false,"p"]}],
["<xmp>[foo]</xmp>",
[["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p>[foo]</p>",
"<p><xmp>[foo]</xmp></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"p"]}],
["<xmp>[foo]</xmp>",
[["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<p>[foo]</p>",
"<p><xmp>[foo]</xmp></p>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"p"]}],
["<xmp>[foo]</xmp>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div>[foo]</div>",
"<div><xmp>[foo]</xmp></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}],
["<xmp>[foo]</xmp>",
[["defaultparagraphseparator","p"],["formatblock","<div>"]],
"<div>[foo]</div>",
"<div><xmp>[foo]</xmp></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"div"]}],
["<div><ol><li>[foo]</ol></div>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div><ol><li><div>[foo]</div></li></ol></div>",
"<div><ol><li>[foo]</li></ol></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"div",false,false,"div"]}],
["<div><ol><li>[foo]</ol></div>",
[["defaultparagraphseparator","p"],["formatblock","<div>"]],
"<div><ol><li><div>[foo]</div></li></ol></div>",
"<div><ol><li>[foo]</li></ol></div>",
[true,true],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"",false,false,"div"]}],
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"div",false,false,"div"]}],
["<div><table><tr><td>[foo]</table></div>",
[["defaultparagraphseparator","div"],["formatblock","<div>"]],
"<div><table><tbody><tr><td><div>[foo]</div></td></tr></tbody></table></div>",
@ -1752,22 +1830,22 @@ var browserTests = [
{"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[true,false,"div",false,false,"div"]}],
["<div style=color:blue>[foo]</div>",
[["stylewithcss","true"],["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p><span style=\"color:rgb(0, 0, 255)\">[foo]</span></p>",
"<p style=\"color:rgb(0, 0, 255)\">[foo]</p>",
[true,true,true],
{"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"p",false,false,"div"],"formatblock":[false,false,"div",false,false,"p"]}],
["<div style=color:blue>[foo]</div>",
[["stylewithcss","false"],["defaultparagraphseparator","div"],["formatblock","<p>"]],
"<p><font color=\"#0000ff\">[foo]</font></p>",
"<p style=\"color:rgb(0, 0, 255)\">[foo]</p>",
[true,true,true],
{"stylewithcss":[false,true,"",false,false,""],"defaultparagraphseparator":[false,false,"div",false,false,"div"],"formatblock":[false,false,"div",false,false,"p"]}],
["<div style=color:blue>[foo]</div>",
[["stylewithcss","true"],["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<p><span style=\"color:rgb(0, 0, 255)\">[foo]</span></p>",
"<p style=\"color:rgb(0, 0, 255)\">[foo]</p>",
[true,true,true],
{"stylewithcss":[false,false,"",false,true,""],"defaultparagraphseparator":[false,false,"div",false,false,"p"],"formatblock":[false,false,"div",false,false,"p"]}],
["<div style=color:blue>[foo]</div>",
[["stylewithcss","false"],["defaultparagraphseparator","p"],["formatblock","<p>"]],
"<p><font color=\"#0000ff\">[foo]</font></p>",
"<p style=\"color:rgb(0, 0, 255)\">[foo]</p>",
[true,true,true],
{"stylewithcss":[false,true,"",false,false,""],"defaultparagraphseparator":[false,false,"p",false,false,"p"],"formatblock":[false,false,"div",false,false,"p"]}],
["{<p>foo</p>ba]r",

View file

@ -85,7 +85,7 @@ NS_DEFINE_COMMAND(FormatSubscript, cmd_subscript)
NS_DEFINE_COMMAND(FormatSuperscript, cmd_superscript)
NS_DEFINE_COMMAND(HistoryUndo, cmd_undo)
NS_DEFINE_COMMAND(HistoryRedo, cmd_redo)
NS_DEFINE_COMMAND(FormatBlock, cmd_paragraphState)
NS_DEFINE_COMMAND(FormatBlock, cmd_formatBlock)
NS_DEFINE_COMMAND(FormatIndent, cmd_indent)
NS_DEFINE_COMMAND(FormatOutdent, cmd_outdent)
NS_DEFINE_COMMAND_WITH_PARAM(FormatJustifyLeft, cmd_align, left)
@ -156,6 +156,7 @@ NS_DEFINE_COMMAND(MoveRight, cmd_moveRight)
NS_DEFINE_COMMAND(MoveRight2, cmd_moveRight2)
NS_DEFINE_COMMAND(MoveUp, cmd_moveUp)
NS_DEFINE_COMMAND(MoveUp2, cmd_moveUp2)
NS_DEFINE_COMMAND(ParagraphState, cmd_paragraphState)
NS_DEFINE_COMMAND(PasteAsQuotation, cmd_pasteQuote)
NS_DEFINE_COMMAND(PasteTransferable, cmd_pasteTransferable)
NS_DEFINE_COMMAND(PasteWithoutFormat, cmd_pasteNoFormatting)