Bug 1845208 - Make `HTMLEditor::SplitAncestorStyledInlineElementsAtRangeEdges` abort if splitting points are lost r=m_kato

Due to the `DOMNodeRemoved` event listener, splitting at range boundaries
may fail tracking the DOM tree due to unexpected container lost.  In the
cases, the method should abort its task.

Differential Revision: https://phabricator.services.mozilla.com/D184457
This commit is contained in:
Masayuki Nakano 2023-07-27 03:21:31 +00:00
Родитель 10e9f89858
Коммит da566fe581
2 изменённых файлов: 40 добавлений и 1 удалений

Просмотреть файл

@ -2043,6 +2043,11 @@ HTMLEditor::SplitAncestorStyledInlineElementsAtRangeEdges(
return Err(NS_ERROR_FAILURE);
}
range.SetStart(std::move(startOfRange));
} else if (MOZ_UNLIKELY(!range.IsPositioned())) {
NS_WARNING(
"HTMLEditor::SplitAncestorStyledInlineElementsAt() caused unexpected "
"DOM tree");
return Err(NS_ERROR_EDITOR_UNEXPECTED_DOM_TREE);
}
return result;
}();
@ -2063,7 +2068,7 @@ HTMLEditor::SplitAncestorStyledInlineElementsAtRangeEdges(
return result;
}
tracker.FlushAndStopTracking();
if (result.inspect().Handled()) {
if (NS_WARN_IF(result.inspect().Handled())) {
auto endOfRange = result.inspect().AtSplitPoint<EditorDOMPoint>();
if (!endOfRange.IsSet()) {
result.inspect().IgnoreCaretPointSuggestion();
@ -2073,6 +2078,11 @@ HTMLEditor::SplitAncestorStyledInlineElementsAtRangeEdges(
return Err(NS_ERROR_FAILURE);
}
range.SetEnd(std::move(endOfRange));
} else if (MOZ_UNLIKELY(!range.IsPositioned())) {
NS_WARNING(
"HTMLEditor::SplitAncestorStyledInlineElementsAt() caused unexpected "
"DOM tree");
return Err(NS_ERROR_EDITOR_UNEXPECTED_DOM_TREE);
}
return result;
}();

Просмотреть файл

@ -0,0 +1,29 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script>
document.addEventListener("DOMContentLoaded", () => {
window.find("a");
document.addEventListener("DOMNodeRemoved", () => {
try {
document.getElementById("target").normalize();
document.execCommand("removeFormat");
} catch (e) {
}
});
document.adoptNode(document.querySelector("datalist"));
});
</script>
</head>
<body>
<kbd>
<datalist>
</kbd>
<figcaption contenteditable>
<font id="target">
a
</font>
</figcaption>
</body>
</html>