Bug 1357365 - part 0-2: Add WPT for testing whether typing text is inserted into or outside of a link in various cases r=m_kato

This patch adds WPTs whose expected result is based on Chrome's behavior.

Differential Revision: https://phabricator.services.mozilla.com/D100998
This commit is contained in:
Masayuki Nakano 2021-01-13 01:54:04 +00:00
Родитель aca200577d
Коммит 3cd22c1f8e
6 изменённых файлов: 2006 добавлений и 2 удалений

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

@ -0,0 +1,477 @@
[typing-around-link-element-at-collapsed-selection.tentative.html?target=DesignMode&parent=b&child=i]
[Inserting "XY" after setting caret position to start of a link in <b> and containing <i> (Selection.collapse) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> and containing <i> (Selection.addRange) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> and containing <i> (Selection.collapse) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> and containing <i> (Selection.addRange) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <b> and containing <i> in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <b> and containing <i> in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abc</i></a>d[\]</b></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abc</i></a>d[\]</b></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link in <b> and containing <i> (Delete) in <p><b>[\]z<a href="about:blank"><i>abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b>[\]z<a href="about:blank"><i>abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abcd[\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abcd[\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>abc[\]d</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>abc[\]d</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>z[\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>z[\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>[\]zabc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>[\]zabc</i></a></b></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable&parent=b&child=i]
[Inserting "XY" after setting caret position to start of a link in <b> and containing <i> (Selection.collapse) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> and containing <i> (Selection.addRange) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> and containing <i> (Selection.collapse) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> and containing <i> (Selection.addRange) in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <b> and containing <i> in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <b> and containing <i> in <p><b><a href="about:blank"><i>ab[\]c</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abc</i></a>d[\]</b></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abc</i></a>d[\]</b></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link in <b> and containing <i> (Delete) in <p><b>[\]z<a href="about:blank"><i>abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b>[\]z<a href="about:blank"><i>abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abcd[\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abcd[\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>abc[\]d</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>abc[\]d</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>z[\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>z[\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>[\]zabc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>[\]zabc</i></a></b></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable&parent=b]
[Replacing text in a link in <b> with "XY" in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Selection.collapseToEnd) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following ArrowRight key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following End key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Selection.collapseToStart) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following ArrowLeft key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Home key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> (Selection.collapse) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> (Selection.addRange) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> (Selection.collapse) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> (Selection.addRange) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <b> in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <b> in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (Backspace) in <p><b><a href="about:blank">abcd[\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">abcd[\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (Delete) in <p><b><a href="about:blank">abc[\]d</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">abc[\]d</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Backspace) in <p><b><a href="about:blank">z[\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">z[\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Delete) in <p><b><a href="about:blank">[\]zabc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">[\]zabc</a></b></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=DesignMode&child=b]
[Inserting "XY" after setting caret position to start of a link containing <b> (Selection.collapse) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link containing <b> (Selection.addRange) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link containing <b> (Selection.collapse) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link containing <b> (Selection.addRange) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link containing <b> in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link containing <b> in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abc</b></a>d[\]</p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abc</b></a>d[\]</p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link containing <b> (Delete) in <p>[\]z<a href="about:blank"><b>abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link containing <b> (execCommand("forwarddelete")) in <p>[\]z<a href="about:blank"><b>abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abcd[\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abcd[\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (Delete) in <p><a href="about:blank"><b>abc[\]d</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>abc[\]d</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>z[\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>z[\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Delete) in <p><a href="about:blank"><b>[\]zabc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>[\]zabc</b></a></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=DesignMode&parent=b]
[Replacing text in a link in <b> with "XY" in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Selection.collapseToEnd) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following ArrowRight key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following End key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Selection.collapseToStart) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following ArrowLeft key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after making a link in <b> (following Home key press) in <p><b>[abc\]</b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> (Selection.collapse) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link in <b> (Selection.addRange) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> (Selection.collapse) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link in <b> (Selection.addRange) in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <b> in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <b> in <p><b><a href="about:blank">ab[\]c</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (Backspace) in <p><b><a href="about:blank">abcd[\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">abcd[\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (Delete) in <p><b><a href="about:blank">abc[\]d</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">abc[\]d</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Backspace) in <p><b><a href="about:blank">z[\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">z[\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Delete) in <p><b><a href="about:blank">[\]zabc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">[\]zabc</a></b></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=DesignMode]
[Inserting "XY" after making a link (following Selection.collapseToEnd) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following ArrowRight key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following End key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following Selection.collapseToStart) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following ArrowLeft key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following Home key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link (Selection.collapse) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link (Selection.addRange) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link (Selection.collapse) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link (Selection.addRange) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (Backspace) in <p><a href="about:blank">abcd[\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (execCommand("delete")) in <p><a href="about:blank">abcd[\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (Delete) in <p><a href="about:blank">abc[\]d</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">abc[\]d</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Backspace) in <p><a href="about:blank">z[\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("delete")) in <p><a href="about:blank">z[\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Delete) in <p><a href="about:blank">[\]zabc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">[\]zabc</a></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable]
[Inserting "XY" after making a link (following Selection.collapseToEnd) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following ArrowRight key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following End key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following Selection.collapseToStart) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following ArrowLeft key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after making a link (following Home key press) in <p>[abc\]</p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link (Selection.collapse) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link (Selection.addRange) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link (Selection.collapse) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link (Selection.addRange) in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link in <p><a href="about:blank">ab[\]c</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (Backspace) in <p><a href="about:blank">abcd[\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (execCommand("delete")) in <p><a href="about:blank">abcd[\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (Delete) in <p><a href="about:blank">abc[\]d</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">abc[\]d</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Backspace) in <p><a href="about:blank">z[\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("delete")) in <p><a href="about:blank">z[\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Delete) in <p><a href="about:blank">[\]zabc</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">[\]zabc</a></p>]
expected: FAIL
[typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable&child=b]
[Inserting "XY" after setting caret position to start of a link containing <b> (Selection.collapse) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to start of a link containing <b> (Selection.addRange) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link containing <b> (Selection.collapse) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after setting caret position to end of a link containing <b> (Selection.addRange) in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to start of a link containing <b> in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after modifying caret position to end of a link containing <b> in <p><a href="about:blank"><b>ab[\]c</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abc</b></a>d[\]</p>]
expected: FAIL
[Inserting "XY" after deleting following character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abc</b></a>d[\]</p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link containing <b> (Delete) in <p>[\]z<a href="about:blank"><b>abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting a previous character of a link containing <b> (execCommand("forwarddelete")) in <p>[\]z<a href="about:blank"><b>abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abcd[\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abcd[\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (Delete) in <p><a href="about:blank"><b>abc[\]d</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>abc[\]d</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>z[\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>z[\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Delete) in <p><a href="about:blank"><b>[\]zabc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>[\]zabc</b></a></p>]
expected: FAIL

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

@ -0,0 +1,447 @@
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=ContentEditable]
[Inserting "XY" after deleting text after middle of a link (Direct typing) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Direct typing) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Direct typing) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Backspace) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (Backspace) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link (Backspace) in <p>a[bc<a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Backspace) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Backspace) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Delete) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (Delete) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link (Delete) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Delete) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Delete) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("delete")) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (execCommand("delete")) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link (execCommand("delete")) in <p>a[bc<a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (execCommand("delete")) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (execCommand("delete")) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (execCommand("forwarddelete")) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link (execCommand("forwarddelete")) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (execCommand("forwarddelete")) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (execCommand("forwarddelete")) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=DesignMode&child=b]
[Inserting "XY" after deleting text after middle of a link containing <b> (Direct typing) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Direct typing) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (Backspace) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Backspace) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Delete) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (Delete) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (Delete) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Delete) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (execCommand("delete")) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (execCommand("forwarddelete")) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=DesignMode&parent=b]
[Inserting "XY" after deleting text after middle of a link in <b> (Direct typing) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Backspace) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (Backspace) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> (Backspace) in <p><b>a[bc<a href="about:blank">de\]f</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Delete) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (Delete) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> (Delete) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> (execCommand("delete")) in <p><b>a[bc<a href="about:blank">de\]f</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=DesignMode&parent=b&child=i]
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Direct typing) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Direct typing) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Backspace) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Delete) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (execCommand("delete")) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=ContentEditable&parent=b&child=i]
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Direct typing) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Direct typing) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Backspace) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Backspace) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (Delete) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (Delete) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (execCommand("delete")) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (execCommand("delete")) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>[z\]abc</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>abc[d\]</i></a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b><a href="about:blank"><i>ab[cd</i></a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> and containing <i> (execCommand("forwarddelete")) in <p><b>a[bc<a href="about:blank"><i>de\]f</i></a></b></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=ContentEditable&child=b]
[Inserting "XY" after deleting text after middle of a link containing <b> (Direct typing) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Direct typing) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Backspace) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (Backspace) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (Backspace) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Backspace) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (Delete) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (Delete) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (Delete) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (Delete) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (execCommand("delete")) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (execCommand("delete")) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>[z\]abc</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>abc[d\]</b></a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link containing <b> (execCommand("forwarddelete")) in <p><a href="about:blank"><b>ab[cd</b></a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link containing <b> (execCommand("forwarddelete")) in <p>a[bc<a href="about:blank"><b>de\]f</b></a></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=ContentEditable&parent=b]
[Inserting "XY" after deleting text after middle of a link in <b> (Direct typing) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Backspace) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (Backspace) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> (Backspace) in <p><b>a[bc<a href="about:blank">de\]f</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (Delete) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (Delete) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> (Delete) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (execCommand("delete")) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link in <b> (execCommand("delete")) in <p><b>a[bc<a href="about:blank">de\]f</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">[z\]abc</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">abc[d\]</a></b></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link in <b> (execCommand("forwarddelete")) in <p><b><a href="about:blank">ab[cd</a>de\]f</b></p>]
expected: FAIL
[typing-around-link-element-at-non-collapsed-selection.tentative.html?target=DesignMode]
[Inserting "XY" after deleting text after middle of a link (Direct typing) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Direct typing) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Direct typing) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Backspace) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (Backspace) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link (Backspace) in <p>a[bc<a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Backspace) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Backspace) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (Delete) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (Delete) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link (Delete) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (Delete) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (Delete) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("delete")) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (execCommand("delete")) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text before middle of a link (execCommand("delete")) in <p>a[bc<a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (execCommand("delete")) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (execCommand("delete")) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting first character of a link (execCommand("forwarddelete")) in <p><a href="about:blank">[z\]abc</a></p>]
expected: FAIL
[Inserting "XY" after deleting last character in a non-collapsed range of a link (execCommand("forwarddelete")) in <p><a href="about:blank">abc[d\]</a></p>]
expected: FAIL
[Inserting "XY" after deleting text after middle of a link (execCommand("forwarddelete")) in <p><a href="about:blank">ab[cd</a>de\]f</p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 same links (execCommand("forwarddelete")) in <p><a href="about:blank">a[bc</a><a href="about:blank">de\]f</a></p>]
expected: FAIL
[Inserting "XY" after deleting text between 2 different links (execCommand("forwarddelete")) in <p><a href="about:blank">a[bc</a><a href="http://example.com/">de\]f</a></p>]
expected: FAIL

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

@ -0,0 +1,344 @@
/**
* EditorTestUtils is a helper utilities to test HTML editor. This can be
* instantiated per an editing host. If you test `designMode`, the editing
* host should be the <body> element.
*/
class EditorTestUtils {
kShift = "\uE008";
kMeta = "\uE03d";
kControl = "\uE009";
kAlt = "\uE00A";
editingHost;
constructor(aEditingHost, aHarnessWindow = window) {
this.editingHost = aEditingHost;
if (aHarnessWindow != this.window) {
this.window.test_driver.set_test_context(aHarnessWindow);
}
}
get document() {
return this.editingHost.ownerDocument;
}
get window() {
return this.document.defaultView;
}
get selection() {
return this.window.getSelection();
}
sendKey(key, modifier) {
if (!modifier) {
return new this.window.test_driver.Actions()
.keyDown(key)
.keyUp(key)
.send();
}
return new this.window.test_driver.Actions()
.keyDown(modifier)
.keyDown(key)
.keyUp(key)
.keyUp(modifier)
.send();
}
sendDeleteKey(modifier) {
const kDeleteKey = "\uE017";
return this.sendKey(kDeleteKey, modifier);
}
sendBackspaceKey(modifier) {
const kBackspaceKey = "\uE003";
return this.sendKey(kBackspaceKey, modifier);
}
sendArrowLeftKey(modifier) {
const kArrowLeft = "\uE012";
return this.sendKey(kArrowLeft, modifier);
}
sendArrowRightKey(modifier) {
const kArrowRight = "\uE014";
return this.sendKey(kArrowRight, modifier);
}
sendHomeKey(modifier) {
const kHome = "\uE011";
return this.sendKey(kHome, modifier);
}
sendEndKey(modifier) {
const kEnd = "\uE010";
return this.sendKey(kEnd, modifier);
}
// Similar to `setupDiv` in editing/include/tests.js, this method sets
// innerHTML value of this.editingHost, and sets multiple selection ranges
// specified with the markers.
// - `[` specifies start boundary in a text node
// - `{` specifies start boundary before a node
// - `]` specifies end boundary in a text node
// - `}` specifies end boundary after a node
setupEditingHost(innerHTMLWithRangeMarkers) {
const startBoundaries = innerHTMLWithRangeMarkers.match(/\{|\[/g) || [];
const endBoundaries = innerHTMLWithRangeMarkers.match(/\}|\]/g) || [];
if (startBoundaries.length !== endBoundaries.length) {
throw "Should match number of open/close markers";
}
this.editingHost.innerHTML = innerHTMLWithRangeMarkers;
this.editingHost.focus();
if (startBoundaries.length === 0) {
// Don't remove the range for now since some tests may assume that
// setting innerHTML does not remove all selection ranges.
return;
}
let getNextRangeAndDeleteMarker = startNode => {
let getNextLeafNode = node => {
let inclusiveDeepestFirstChildNode = container => {
while (container.firstChild) {
container = container.firstChild;
}
return container;
};
if (node.hasChildNodes()) {
return inclusiveDeepestFirstChildNode(node);
}
if (node.nextSibling) {
return inclusiveDeepestFirstChildNode(node.nextSibling);
}
let nextSibling = (child => {
for (
let parent = child.parentElement;
parent && parent != this.editingHost;
parent = parent.parentElement
) {
if (parent.nextSibling) {
return parent.nextSibling;
}
}
return null;
})(node);
if (!nextSibling) {
return null;
}
return inclusiveDeepestFirstChildNode(nextSibling);
};
let scanMarkerInTextNode = (textNode, offset) => {
return /[\{\[\]\}]/.exec(textNode.data.substr(offset));
};
let startMarker = ((startContainer, startOffset) => {
let scanStartMakerInTextNode = (textNode, offset) => {
let scanResult = scanMarkerInTextNode(textNode, offset);
if (scanResult === null) {
return null;
}
if (scanResult[0] === "}" || scanResult[0] === "]") {
throw "An end marker is found before a start marker";
}
return {
marker: scanResult[0],
container: textNode,
offset: scanResult.index + offset
};
};
if (startContainer.nodeType === Node.TEXT_NODE) {
let scanResult = scanStartMakerInTextNode(
startContainer,
startOffset
);
if (scanResult !== null) {
return scanResult;
}
}
let nextNode = startContainer;
while ((nextNode = getNextLeafNode(nextNode))) {
if (nextNode.nodeType === Node.TEXT_NODE) {
let scanResult = scanStartMakerInTextNode(nextNode, 0);
if (scanResult !== null) {
return scanResult;
}
continue;
}
}
return null;
})(startNode, 0);
if (startMarker === null) {
return null;
}
let endMarker = ((startContainer, startOffset) => {
let scanEndMarkerInTextNode = (textNode, offset) => {
let scanResult = scanMarkerInTextNode(textNode, offset);
if (scanResult === null) {
return null;
}
if (scanResult[0] === "{" || scanResult[0] === "[") {
throw "A start marker is found before an end marker";
}
return {
marker: scanResult[0],
container: textNode,
offset: scanResult.index + offset
};
};
if (startContainer.nodeType === Node.TEXT_NODE) {
let scanResult = scanEndMarkerInTextNode(startContainer, startOffset);
if (scanResult !== null) {
return scanResult;
}
}
let nextNode = startContainer;
while ((nextNode = getNextLeafNode(nextNode))) {
if (nextNode.nodeType === Node.TEXT_NODE) {
let scanResult = scanEndMarkerInTextNode(nextNode, 0);
if (scanResult !== null) {
return scanResult;
}
continue;
}
}
return null;
})(startMarker.container, startMarker.offset + 1);
if (endMarker === null) {
throw "Found an open marker, but not found corresponding close marker";
}
let indexOfContainer = (container, child) => {
let offset = 0;
for (let node = container.firstChild; node; node = node.nextSibling) {
if (node == child) {
return offset;
}
offset++;
}
throw "child must be a child node of container";
};
let deleteFoundMarkers = () => {
let removeNode = node => {
let container = node.parentElement;
let offset = indexOfContainer(container, node);
node.remove();
return { container, offset };
};
if (startMarker.container == endMarker.container) {
// If the text node becomes empty, remove it and set collapsed range
// to the position where there is the text node.
if (startMarker.container.length === 2) {
if (!/[\[\{][\]\}]/.test(startMarker.container.data)) {
throw `Unexpected text node (data: "${startMarker.container.data}")`;
}
let { container, offset } = removeNode(startMarker.container);
startMarker.container = endMarker.container = container;
startMarker.offset = endMarker.offset = offset;
startMarker.marker = endMarker.marker = "";
return;
}
startMarker.container.data = `${startMarker.container.data.substring(
0,
startMarker.offset
)}${startMarker.container.data.substring(
startMarker.offset + 1,
endMarker.offset
)}${startMarker.container.data.substring(endMarker.offset + 1)}`;
if (startMarker.offset >= startMarker.container.length) {
startMarker.offset = endMarker.offset =
startMarker.container.length;
return;
}
endMarker.offset--; // remove the start marker's length
if (endMarker.offset > endMarker.container.length) {
endMarker.offset = endMarker.container.length;
}
return;
}
if (startMarker.container.length === 1) {
let { container, offset } = removeNode(startMarker.container);
startMarker.container = container;
startMarker.offset = offset;
startMarker.marker = "";
} else {
startMarker.container.data = `${startMarker.container.data.substring(
0,
startMarker.offset
)}${startMarker.container.data.substring(startMarker.offset + 1)}`;
}
if (endMarker.container.length === 1) {
let { container, offset } = removeNode(endMarker.container);
endMarker.container = container;
endMarker.offset = offset;
endMarker.marker = "";
} else {
endMarker.container.data = `${endMarker.container.data.substring(
0,
endMarker.offset
)}${endMarker.container.data.substring(endMarker.offset + 1)}`;
}
};
deleteFoundMarkers();
let handleNodeSelectMarker = () => {
if (startMarker.marker === "{") {
if (startMarker.offset === 0) {
// The range start with the text node.
let container = startMarker.container.parentElement;
startMarker.offset = indexOfContainer(
container,
startMarker.container
);
startMarker.container = container;
} else if (startMarker.offset === startMarker.container.data.length) {
// The range start after the text node.
let container = startMarker.container.parentElement;
startMarker.offset =
indexOfContainer(container, startMarker.container) + 1;
startMarker.container = container;
} else {
throw 'Start marker "{" is allowed start or end of a text node';
}
}
if (endMarker.marker === "}") {
if (endMarker.offset === 0) {
// The range ends before the text node.
let container = endMarker.container.parentElement;
endMarker.offset = indexOfContainer(container, endMarker.container);
endMarker.container = container;
} else if (endMarker.offset === endMarker.container.data.length) {
// The range ends with the text node.
let container = endMarker.container.parentElement;
endMarker.offset =
indexOfContainer(container, endMarker.container) + 1;
endMarker.container = container;
} else {
throw 'End marker "}" is allowed start or end of a text node';
}
}
};
handleNodeSelectMarker();
let range = document.createRange();
range.setStart(startMarker.container, startMarker.offset);
range.setEnd(endMarker.container, endMarker.offset);
return range;
};
let ranges = [];
for (
let range = getNextRangeAndDeleteMarker(this.editingHost.firstChild);
range;
range = getNextRangeAndDeleteMarker(range.endContainer)
) {
ranges.push(range);
}
this.selection.removeAllRanges();
for (let range of ranges) {
this.selection.addRange(range);
}
if (this.selection.rangeCount != ranges.length) {
throw `Failed to set selection to the given ranges whose length is ${ranges.length}, but only ${this.selection.rangeCount} ranges are added`;
}
}
}

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

@ -0,0 +1,520 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="timeout" content="long">
<meta name="variant" content="?target=ContentEditable">
<meta name="variant" content="?target=ContentEditable&parent=b">
<meta name="variant" content="?target=ContentEditable&child=b">
<meta name="variant" content="?target=ContentEditable&parent=b&child=i">
<meta name="variant" content="?target=DesignMode">
<meta name="variant" content="?target=DesignMode&parent=b">
<meta name="variant" content="?target=DesignMode&child=b">
<meta name="variant" content="?target=DesignMode&parent=b&child=i">
<title>Testing inserting content around link element</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="../include/editor-test-utils.js"></script>
</head>
<body>
<div contenteditable></div>
<iframe srcdoc="
<!doctype html>
<html>
<script>document.designMode='on';</script>
<script src='/resources/testdriver.js'></script>
<script src='/resources/testdriver-vendor.js'></script>
<script src='/resources/testdriver-actions.js'></script>
<body></body>
</html>"></iframe>
<script>
"use strict";
const params = new URLSearchParams(location.search.substring(1));
const kTarget = params.get("target");
const kParentTag = params.get("parent") === null
? ["", ""]
: [`<${params.get("parent")}>`, `</${params.get("parent")}>`];
const kChildTag = params.get("child") === null
? ["", ""]
: [`<${params.get("child")}>`, `</${params.get("child")}>`];
const kLinkDesc = (() => {
let result = ""
if (kParentTag[0] !== "") {
result += `in ${kParentTag[0]} `;
if (kChildTag[0] !== "") {
result += "and ";
}
}
if (kChildTag[0] !== "") {
result += `containing ${kChildTag[0]} `;
}
return result;
})();
const kNewContainerOfLink = (() => {
if (kParentTag !== "" && kChildTag !== "") {
return [`${kParentTag[0]}${kChildTag[0]}`, `${kChildTag[1]}${kParentTag[1]}`];
}
if (kParentTag !== "") {
return kParentTag;
}
if (kChildTag !== "") {
return kChildTag;
}
return ["", ""];
})();
const kSelectorForTextNodeContainer = kChildTag[0] === ""
? "a"
: `a > ${kChildTag[0].substr(1, kChildTag[0].length - 2)}`;
function getEditingHost() {
return kTarget === "ContentEditable"
? document.querySelector("div[contenteditable]")
: document.querySelector("iframe").contentDocument.body;
}
function addPromiseTest(test) {
promise_test(async () => {
let editingHost = getEditingHost();
let utils = new EditorTestUtils(editingHost);
utils.setupEditingHost(test.innerHTML);
utils.window.focus();
utils.document.body.focus();
editingHost.focus();
await test.run(utils);
if (Array.isArray(test.expectedResult)) {
assert_in_array(editingHost.innerHTML, test.expectedResult);
} else {
assert_equals(editingHost.innerHTML, test.expectedResult);
}
}, `${test.description.trim()} in ${test.innerHTML}`);
}
promise_test(async () => {
await new Promise(resolve => {
addEventListener("load", resolve, { once: true });
});
}, "");
if (kChildTag[0] === "") {
// Immediately after creating a link with Document.execCommand.
addPromiseTest({
description: `Replacing text in a link ${kLinkDesc}with "XY"`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">XY${kParentTag[1]}</a></p>`,
`<p>${kParentTag[0]}<a href="about:blank">XY${kParentTag[1]}</a><br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following Selection.collapseToEnd)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
utils.selection.collapseToEnd();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following ArrowRight key press)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
await utils.sendArrowRightKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following End key press)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
await utils.sendEndKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following Selection.collapseToStart)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
utils.selection.collapseToStart();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following ArrowLeft key press)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
await utils.sendArrowLeftKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after making a link ${kLinkDesc}(following Home key press)`,
innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
run: async (utils) => {
utils.document.execCommand("createLink", false, "about:blank");
await utils.sendHomeKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
],
});
}
addPromiseTest({
description: `Inserting "XY" after setting caret position to middle of a link ${kLinkDesc}(Selection.collapse)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after setting caret position to middle of a link ${kLinkDesc}(Selection.addRange)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.removeAllRanges();
let range = utils.document.createRange();
range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
utils.selection.addRange(range);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after setting caret position to start of a link ${kLinkDesc}(Selection.collapse)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[2]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after setting caret position to start of a link ${kLinkDesc}(Selection.addRange)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.removeAllRanges();
let range = utils.document.createRange();
range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
utils.selection.addRange(range);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[2]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after setting caret position to end of a link ${kLinkDesc}(Selection.collapse)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[2]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after setting caret position to end of a link ${kLinkDesc}(Selection.addRange)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[2]}<br></p>`,
],
});
// Type text after moving caret with Range API.
addPromiseTest({
description: `Inserting "XY" after modifying caret position to middle of a link ${kLinkDesc}`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
let range = utils.selection.getRangeAt(0);
range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after modifying caret position to start of a link ${kLinkDesc}`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
let range = utils.selection.getRangeAt(0);
range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
range.setEnd(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after modifying caret position to end of a link ${kLinkDesc}`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
let range = utils.selection.getRangeAt(0);
range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
// Type text after deleting character immediately before/after a link.
addPromiseTest({
description: `Inserting "XY" after deleting following character of a link ${kLinkDesc}(Backspace)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>d[]${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendBackspaceKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting following character of a link ${kLinkDesc}(execCommand("delete"))`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>d[]${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("delete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting a previous character of a link ${kLinkDesc}(Delete)`,
innerHTML: `<p>${kParentTag[0]}[]z<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendDeleteKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting a previous character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
innerHTML: `<p>${kParentTag[0]}[]z<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("forwarddelete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
// Type text after deleting the last character in a link.
addPromiseTest({
description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(Backspace)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcd[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendBackspaceKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[1]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(execCommand("delete"))`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcd[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("delete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[1]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(Delete)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc[]d${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendDeleteKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc[]d${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("forwarddelete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
],
});
// Type text after deleting the first character in a link.
addPromiseTest({
description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(Backspace)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}z[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendBackspaceKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(execCommand("delete"))`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}z[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("delete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(Delete)`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]zabc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.sendDeleteKey();
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]zabc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await utils.document.execCommand("forwarddelete", false);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
],
});
</script>
</body>
</html>

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

@ -0,0 +1,214 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="timeout" content="long">
<meta name="variant" content="?target=ContentEditable">
<meta name="variant" content="?target=ContentEditable&parent=b">
<meta name="variant" content="?target=ContentEditable&child=b">
<meta name="variant" content="?target=ContentEditable&parent=b&child=i">
<meta name="variant" content="?target=DesignMode">
<meta name="variant" content="?target=DesignMode&parent=b">
<meta name="variant" content="?target=DesignMode&child=b">
<meta name="variant" content="?target=DesignMode&parent=b&child=i">
<title>Testing inserting content at non-collapsed selection around link element</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="../include/editor-test-utils.js"></script>
</head>
<body>
<div contenteditable></div>
<iframe srcdoc="
<!doctype html>
<html>
<script>document.designMode='on';</script>
<script src='/resources/testdriver.js'></script>
<script src='/resources/testdriver-vendor.js'></script>
<script src='/resources/testdriver-actions.js'></script>
<body></body>
</html>"></iframe>
<script>
"use strict";
const params = new URLSearchParams(location.search.substring(1));
const kTarget = params.get("target");
const kParentTag = params.get("parent") === null
? ["", ""]
: [`<${params.get("parent")}>`, `</${params.get("parent")}>`];
const kChildTag = params.get("child") === null
? ["", ""]
: [`<${params.get("child")}>`, `</${params.get("child")}>`];
const kLinkDesc = (() => {
let result = ""
if (kParentTag[0] !== "") {
result += `in ${kParentTag[0]} `;
if (kChildTag[0] !== "") {
result += "and ";
}
}
if (kChildTag[0] !== "") {
result += `containing ${kChildTag[0]} `;
}
return result;
})();
const kNewContainerOfLink = (() => {
if (kParentTag !== "" && kChildTag !== "") {
return [`${kParentTag[0]}${kChildTag[0]}`, `${kChildTag[1]}${kParentTag[1]}`];
}
if (kParentTag !== "") {
return kParentTag;
}
if (kChildTag !== "") {
return kChildTag;
}
return ["", ""];
})();
function getEditingHost() {
return kTarget === "ContentEditable"
? document.querySelector("div[contenteditable]")
: document.querySelector("iframe").contentDocument.body;
}
function addPromiseTest(test) {
promise_test(async () => {
let editingHost = getEditingHost();
let utils = new EditorTestUtils(editingHost);
utils.setupEditingHost(test.innerHTML);
utils.window.focus();
utils.document.body.focus();
editingHost.focus();
await test.run(utils);
if (Array.isArray(test.expectedResult)) {
assert_in_array(editingHost.innerHTML, test.expectedResult);
} else {
assert_equals(editingHost.innerHTML, test.expectedResult);
}
}, `${test.description} in ${test.innerHTML}`);
}
promise_test(async () => {
await new Promise(resolve => {
addEventListener("load", resolve, { once: true });
});
}, "");
for (const test of [
["Direct typing", utils => {}],
["Backspace", utils => { return utils.sendBackspaceKey(); }],
["Delete", utils => { return utils.sendDeleteKey(); }],
["execCommand(\"delete\")", utils => { utils.document.execCommand("delete", false); }],
["execCommand(\"forwarddelete\")", utils => { utils.document.execCommand("forwarddelete", false); }],
]) {
addPromiseTest({
description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(${test[0]})`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[z]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: (() => {
if (test[0] === "Direct typing") {
return [
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}XYabc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}XYabc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
];
}
return [
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
];
})(),
});
addPromiseTest({
description: `Inserting "XY" after deleting last character in a non-collapsed range of a link ${kLinkDesc}(${test[0]})`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc[d]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: (() => {
if (test[0] === "Direct typing") {
return [
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcXY${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcXY${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
];
}
return [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
];
})(),
});
addPromiseTest({
description: `Inserting "XY" after deleting text after middle of a link ${kLinkDesc}(${test[0]})`,
innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[cd${kChildTag[1]}</a>de]f${kParentTag[1]}</p>`,
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kNewContainerOfLink[0]}<a href="about:blank">ab</a>XY${kChildTag[1]}f${kParentTag[1]}</p>`,
`<p>${kNewContainerOfLink[0]}<a href="about:blank">ab</a>XY${kChildTag[1]}f${kParentTag[1]}<br></p>`,
],
});
addPromiseTest({
description: `Inserting "XY" after deleting text before middle of a link ${kLinkDesc}(${test[0]})`,
innerHTML: `<p>${kParentTag[0]}a[bc<a href="about:blank">${kChildTag[0]}de]f${kChildTag[1]}</a>${kParentTag[1]}</p>`,
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
`<p>${kParentTag[0]}aXY<a href="about:blank">${kChildTag[0]}f${kChildTag[1]}</a>${kParentTag[1]}</p>`,
`<p>${kParentTag[0]}aXY<a href="about:blank">${kChildTag[0]}f${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
],
});
if (kParentTag[0] !== "" || kChildTag[0] !== "") {
continue;
}
addPromiseTest({
description: `Inserting "XY" after deleting text between 2 same links (${test[0]})`,
innerHTML: '<p><a href="about:blank">a[bc</a><a href="about:blank">de]f</a></p>',
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
'<p><a href="about:blank">a</a>XY<a href="about:blank">f</a></p>',
'<p><a href="about:blank">a</a>XY<a href="about:blank">f</a><br></p>',
],
});
addPromiseTest({
description: `Inserting "XY" after deleting text between 2 different links (${test[0]})`,
innerHTML: '<p><a href="about:blank">a[bc</a><a href="http://example.com/">de]f</a></p>',
run: async (utils) => {
await test[1](utils);
await utils.sendKey("X", utils.kShiftKey);
await utils.sendKey("Y", utils.kShiftKey);
},
expectedResult: [
'<p><a href="about:blank">a</a>XY<a href="http://example.com/">f</a></p>',
'<p><a href="about:blank">a</a>XY<a href="http://example.com/">f</a><br></p>',
],
});
}
</script>
</body>
</html>

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

@ -1,5 +1,7 @@
"use strict";
// TODO: extend `EditorTestUtils` in editing/include/edit-test-utils.mjs
const kBackspaceKey = "\uE003";
const kDeleteKey = "\uE017";
const kArrowRight = "\uE014";
@ -323,7 +325,7 @@ function setupEditor(innerHTMLWithRangeMarkers) {
return {
marker: scanResult[0],
container: textNode,
offset: scanResult.index + offset,
offset: scanResult.index + offset
};
}
if (startContainer.nodeType === Node.TEXT_NODE) {
@ -359,7 +361,7 @@ function setupEditor(innerHTMLWithRangeMarkers) {
return {
marker: scanResult[0],
container: textNode,
offset: scanResult.index + offset,
offset: scanResult.index + offset
};
}
if (startContainer.nodeType === Node.TEXT_NODE) {