/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
EventUtils.synthesizeKey("KEY_ArrowRight");
evt = await caretMoved;
is(textarea.caretOffset, 6, "Caret offset remains 6 after ArrowRight");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line"); // Caret is at start of second line.
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "e", 6, 7,
textarea,
kOk,
kOk,
kOk
);
testTextAtOffset(
kCaretOffset,
BOUNDARY_WORD_START, "e", 6, 7,
textarea,
kOk,
kOk,
kOk
);
testTextAtOffset(
kCaretOffset,
BOUNDARY_LINE_START, "e", 6, 7,
textarea,
kOk,
kOk,
kOk
);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
EventUtils.synthesizeKey("KEY_ArrowRight");
evt = await caretMoved;
is(textarea.caretOffset, 7, "Caret offset is 7 after ArrowRight");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(evt.isAtEndOfLine, "Caret is at end of line"); // Caret is at end of textarea.
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "", 7, 7,
textarea,
kOk,
kOk,
kOk
);
testTextAtOffset(
kCaretOffset,
BOUNDARY_WORD_START, "e", 6, 7,
textarea,
kOk,
kOk,
kOk
);
testTextAtOffset(
kCaretOffset,
BOUNDARY_LINE_START, "e", 6, 7,
textarea,
kOk,
kOk,
kOk
);
// BrowserTestUtils.synthesizeMouseAtPoint takes coordinates relative to the document. const docX = {}; const docY = {};
docAcc.getBounds(docX, docY, {}, {});
let charX = {};
let charY = {};
textarea.getCharacterExtents( 0,
charX,
charY,
{},
{},
COORDTYPE_SCREEN_RELATIVE
);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
await BrowserTestUtils.synthesizeMouseAtPoint(
charX.value - docX.value,
charY.value - docY.value,
{},
docAcc.browsingContext
);
evt = await caretMoved;
is(textarea.caretOffset, 0, "Caret offset is 0 after click");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "a", 0, 1,
textarea,
kOk,
kOk,
kOk
);
textarea.getCharacterExtents( 1,
charX,
charY,
{},
{},
COORDTYPE_SCREEN_RELATIVE
);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
await BrowserTestUtils.synthesizeMouseAtPoint(
charX.value - docX.value,
charY.value - docY.value,
{},
docAcc.browsingContext
);
evt = await caretMoved;
is(textarea.caretOffset, 1, "Caret offset is 1 after click");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "b", 1, 2,
textarea,
kOk,
kOk,
kOk
);
const empty = findAccessibleChildByID(docAcc, "empty", [nsIAccessibleText]);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, empty);
empty.takeFocus();
evt = await caretMoved;
is(empty.caretOffset, 0, "Caret offset in empty textarea is 0");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
const contentEditable = findAccessibleChildByID(docAcc, "contentEditable", [
nsIAccessibleText,
]);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, contentEditable);
contentEditable.takeFocus();
evt = await caretMoved;
is(
contentEditable.caretOffset, 0, "Initial caret offset in contentEditable is 0"
);
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "a", 0, 1,
contentEditable,
kOk,
kOk,
kOk
);
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, contentEditable);
EventUtils.synthesizeKey("KEY_ArrowRight");
evt = await caretMoved;
is(contentEditable.caretOffset, 1, "Caret offset is 1 after ArrowRight");
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
testTextAtOffset(
kCaretOffset,
BOUNDARY_CHAR, "b", 1, 2,
contentEditable,
kOk,
kOk,
kOk
);
const editableWithTextThenP = findAccessibleChildByID(
docAcc, "editableWithTextThenP",
[nsIAccessibleText]
);
info("Focusing editableWithTextThenP");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, editableWithTextThenP);
editableWithTextThenP.takeFocus();
evt = await caretMoved;
is(
editableWithTextThenP.caretOffset, 0, "Initial caret offset in editableWithTextThenP is 0"
);
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
info("Pressing ArrowRight");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, editableWithTextThenP);
EventUtils.synthesizeKey("KEY_ArrowRight");
evt = await caretMoved;
is(
editableWithTextThenP.caretOffset, 1, "Caret offset is 1 after ArrowRight"
);
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(evt.isAtEndOfLine, "Caret is at end of line");
const editableWithTextAndLink = findAccessibleChildByID(
docAcc, "editableWithTextAndLink",
[nsIAccessibleText]
);
info("Focusing editableWithTextAndLink");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, editableWithTextAndLink);
editableWithTextAndLink.takeFocus();
evt = await caretMoved;
is(
editableWithTextAndLink.caretOffset, 0, "Initial caret offset in editableWithTextAndLink is 0"
);
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
info("Pressing ArrowRight");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, editableWithTextAndLink);
EventUtils.synthesizeKey("KEY_ArrowRight");
evt = await caretMoved;
is(
editableWithTextAndLink.caretOffset, 1, "Caret offset is 1 after ArrowRight"
);
evt.QueryInterface(nsIAccessibleCaretMoveEvent);
ok(!evt.isAtEndOfLine, "Caret is not at end of line");
},
{ chrome: true, topLevel: true, iframe: true, remoteIframe: true }
);
/** *Testsettingthecaret.
*/
addAccessibleTask(
`
<textarea id="textarea">ab\nc</textarea>
<div id="editable" contenteditable>
<p id="p">a<a id="link" href="https://example.com/">b</a></p>
</div>
`,
async function (browser, docAcc) { const textarea = findAccessibleChildByID(docAcc, "textarea", [
nsIAccessibleText,
]);
info("textarea: Set caret offset to 0");
let focused = waitForEvent(EVENT_FOCUS, textarea);
let caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
textarea.caretOffset = 0;
await focused;
await caretMoved;
is(textarea.caretOffset, 0, "textarea caret correct"); // May get two caret moved events (one from focusing textarea and one // from setting selection), so wait a bit for the second event to be fired.
await new Promise(r =>
requestAnimationFrame(() => requestAnimationFrame(r))
); // Test setting caret to another line.
info("textarea: Set caret offset to 3");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
textarea.caretOffset = 3;
await caretMoved;
is(textarea.caretOffset, 3, "textarea caret correct"); // Test setting caret to the end.
info("textarea: Set caret offset to 4 (end)");
caretMoved = waitForEvent(EVENT_TEXT_CARET_MOVED, textarea);
textarea.caretOffset = 4;
await caretMoved;
is(textarea.caretOffset, 4, "textarea caret correct");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.