From 331e0a761b532339f0098800527e8163344997f3 Mon Sep 17 00:00:00 2001 From: Mirko Brodesser Date: Thu, 9 May 2019 07:40:47 +0000 Subject: [PATCH] Bug 1174452: Part 2 -- scan `nsTextNode`'s parent element for preformat in nsDocumentEncoder r=masayuki,hsivonen This takes into account `white-space: pre` style of `nsTextNode`'s parent element when formatting the selected text of the `nsTextNode` node. Differential Revision: https://phabricator.services.mozilla.com/D29159 --HG-- extra : moz-landing-system : lando --- dom/base/nsDocumentEncoder.cpp | 22 ++++++++++++++++++---- dom/base/test/test_user_select.html | 4 ++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/dom/base/nsDocumentEncoder.cpp b/dom/base/nsDocumentEncoder.cpp index 1dbd694e0da2..7f6519438d76 100644 --- a/dom/base/nsDocumentEncoder.cpp +++ b/dom/base/nsDocumentEncoder.cpp @@ -338,8 +338,15 @@ nsresult nsDocumentEncoder::SerializeNodeStart(nsINode& aOriginalNode, int32_t aEndOffset, nsAString& aStr, nsINode* aFixupNode) { - if (mNeedsPreformatScanning && aOriginalNode.IsElement()) { - mSerializer->ScanElementForPreformat(aOriginalNode.AsElement()); + if (mNeedsPreformatScanning) { + if (aOriginalNode.IsElement()) { + mSerializer->ScanElementForPreformat(aOriginalNode.AsElement()); + } else if (aOriginalNode.IsText()) { + const nsCOMPtr parent = aOriginalNode.GetParent(); + if (parent && parent->IsElement()) { + mSerializer->ScanElementForPreformat(parent->AsElement()); + } + } } if (!IsVisibleNode(&aOriginalNode)) { @@ -393,8 +400,15 @@ nsresult nsDocumentEncoder::SerializeNodeStart(nsINode& aOriginalNode, } nsresult nsDocumentEncoder::SerializeNodeEnd(nsINode& aNode, nsAString& aStr) { - if (mNeedsPreformatScanning && aNode.IsElement()) { - mSerializer->ForgetElementForPreformat(aNode.AsElement()); + if (mNeedsPreformatScanning) { + if (aNode.IsElement()) { + mSerializer->ForgetElementForPreformat(aNode.AsElement()); + } else if (aNode.IsText()) { + const nsCOMPtr parent = aNode.GetParent(); + if (parent && parent->IsElement()) { + mSerializer->ForgetElementForPreformat(parent->AsElement()); + } + } } if (!IsVisibleNode(&aNode)) { diff --git a/dom/base/test/test_user_select.html b/dom/base/test/test_user_select.html index 1a5fcba6b18b..6cee6295f763 100644 --- a/dom/base/test/test_user_select.html +++ b/dom/base/test/test_user_select.html @@ -293,7 +293,7 @@ function test() e = document.getElementById('testG'); synthesizeMouse(e, 1, 1, {}); synthesizeMouse(e, 400, 180, { shiftKey: true }); - checkText("aaaa bbbb", e); // XXX this doesn't seem right - bug 1247799 + checkText("aaaa\n\n\n\nbbbb", e); checkRanges([[0,0,-1,1],[2,0,-1,3],[4,0,-1,5],[6,0,6,5]], e); doneTest(e); @@ -303,7 +303,7 @@ function test() synthesizeMouse(e, 30, 90, { shiftKey: true }); synthesizeMouse(e, 50, 90, { shiftKey: true }); synthesizeMouse(e, 70, 90, { shiftKey: true }); - checkText("aaaa bbb", e); + checkText("aaaa\n\nbbb", e); checkRanges([[0,0,-1,1],[-1,2,3,4]], e); doneTest(e);