зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
10e9f89858
Коммит
da566fe581
|
@ -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>
|
Загрузка…
Ссылка в новой задаче