Make `HTMLEditUtils::GetPreviousEditablePoint` and `HTMLEditUtils::GetNextEditablePoint` check ancestor limiter before getting a sibling of ancestor
They check ancestor limiter when they are climbing up the DOM tree if and only
if the ancestor does not have a sibling. However, this causes moving into
a sibling of the ancestor limiter.
Differential Revision: https://phabricator.services.mozilla.com/D192528
bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1860210
gecko-commit: 08912004c5957a0f988b54b079ef49760d3a02e3
gecko-reviewers: m_kato
diff --git a/input-events/input-events-get-target-ranges-backspace.tentative.html b/input-events/input-events-get-target-ranges-backspace.tentative.html
index 347ac61..9075504 100644
--- a/input-events/input-events-get-target-ranges-backspace.tentative.html
+++ b/input-events/input-events-get-target-ranges-backspace.tentative.html
@@ -2062,4 +2062,70 @@
checkGetTargetRangesOfInputOnDeleteSomething();
}, 'Meta + Backspace at "<p> abc[] def</p>"');
+// If editing host is nested, editing in the nested one shouldn't cause
+// target ranges extended to outside of it.
+promise_test(async t => {
+ const innerHTML = "<div contenteditable=\"false\"><div contenteditable=\"\"><p><br></p></div></div>";
+ initializeTest(innerHTML);
+ const p = gEditor.querySelector("p");
+ const innerEditingHost = p.parentNode;
+ document.activeElement?.blur();
+ p.parentNode.focus();
+ gSelection.collapse(p, 0);
+ await sendBackspaceKey();
+ if (gEditor.innerHTML == innerHTML) {
+ checkGetTargetRangesOfBeforeinputOnDeleteSomething({
+ startContainer: p,
+ startOffset: 0,
+ endContainer: p,
+ endOffset: 0,
+ });
+ checkGetTargetRangesOfInputOnDoNothing();
+ } else {
+ checkEditorContentResultAsSubTest(
+ "<div contenteditable=\"false\"><div contenteditable=\"\"><br></div></div>",
+ t.name
+ );
+ checkGetTargetRangesOfBeforeinputOnDeleteSomething({
+ startContainer: innerEditingHost,
+ startOffset: 0,
+ endContainer: p,
+ endOffset: 1,
+ });
+ checkGetTargetRangesOfInputOnDeleteSomething();
+ }
+}, 'Backspace at "<div contenteditable="false"><div contenteditable=""><p>{}<br></p></div></div>');
+
+promise_test(async t => {
+ const innerHTML = "<div contenteditable=\"false\">\n <div contenteditable=\"\"><p><br></p></div></div>";
+ initializeTest(innerHTML);
+ const p = gEditor.querySelector("p");
+ const innerEditingHost = p.parentNode;
+ document.activeElement?.blur();
+ p.parentNode.focus();
+ gSelection.collapse(p, 0);
+ await sendBackspaceKey();
+ if (gEditor.innerHTML == innerHTML) {
+ checkGetTargetRangesOfBeforeinputOnDeleteSomething({
+ startContainer: p,
+ startOffset: 0,
+ endContainer: p,
+ endOffset: 0,
+ });
+ checkGetTargetRangesOfInputOnDoNothing();
+ } else {
+ checkEditorContentResultAsSubTest(
+ "<div contenteditable=\"false\">\n <div contenteditable=\"\"><br></div></div>",
+ t.name
+ );
+ checkGetTargetRangesOfBeforeinputOnDeleteSomething({
+ startContainer: innerEditingHost,
+ startOffset: 0,
+ endContainer: p,
+ endOffset: 1,
+ });
+ checkGetTargetRangesOfInputOnDeleteSomething();
+ }
+}, 'Backspace at "<div contenteditable="false">\n <div contenteditable=""><p>{}<br></p></div></div>');
+
</script>