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