зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 2 changesets (bug 1384606) for causing failures on test_atcaretoffset.html CLOSED TREE
Backed out changeset bfc8cf25efac (bug 1384606) Backed out changeset b3c0fd32af16 (bug 1384606)
This commit is contained in:
Родитель
e9c97c71d7
Коммит
5349e0db4d
|
@ -140,8 +140,6 @@ support-files = bug1448730.html
|
|||
[test_bug1550869_video.html]
|
||||
[test_bug1714640.html]
|
||||
[test_bug1756118.html]
|
||||
[test_caret_browsing_around_form_controls.html]
|
||||
skip-if = toolkit == 'android'
|
||||
[test_dynamic_toolbar_max_height.html]
|
||||
support-files = file_dynamic_toolbar_max_height.html
|
||||
[test_emulateMedium.html]
|
||||
|
|
|
@ -1,379 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
SimpleTest.waitForFocus(async () => {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set:[
|
||||
["accessibility.browsewithcaret", true],
|
||||
],
|
||||
});
|
||||
(function test_move_caret_from_before_input_text() {
|
||||
info("Starting test_move_caret_from_before_input_text...");
|
||||
document.body.innerHTML = '<div>abc<input value="def">ghi</div>';
|
||||
const input = document.querySelector("input");
|
||||
const textBefore = input.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_input_text: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
input.nextSibling,
|
||||
"test_move_caret_from_before_input_text: caret should be moved to text node after the <input>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_input_text: caret should be moved to start of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_input_text() {
|
||||
info("Starting test_move_caret_from_after_input_text...");
|
||||
document.body.innerHTML = '<div>abc<input value="def">ghi</div>';
|
||||
const input = document.querySelector("input");
|
||||
getSelection().collapse(input.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_input_text: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
input.previousSibling,
|
||||
"test_move_caret_from_after_input_text: caret should be moved to text node before the <input>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
input.previousSibling.length,
|
||||
"test_move_caret_from_after_input_text: caret should be moved to end of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_before_double_input_text() {
|
||||
info("Starting test_move_caret_from_before_double_input_text...");
|
||||
document.body.innerHTML = '<div>abc<input value="def"><input value="ghi">jkl</div>';
|
||||
const firstInput = document.querySelector("input");
|
||||
const secondInput = firstInput.nextSibling;
|
||||
const textBefore = firstInput.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_double_input_text: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
secondInput.nextSibling,
|
||||
"test_move_caret_from_before_double_input_text: caret should be moved to text node after the second <input> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_double_input_text: caret should be moved to text node after the second <input> (offset)"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_double_input_text() {
|
||||
info("Starting test_move_caret_from_after_double_input_text...");
|
||||
document.body.innerHTML = '<div>abc<input value="def"><input value="ghi">jkl</div>';
|
||||
const firstInput = document.querySelector("input");
|
||||
const secondInput = firstInput.nextSibling;
|
||||
getSelection().collapse(secondInput.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_double_input_text: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
firstInput.previousSibling,
|
||||
"test_move_caret_from_after_double_input_text: caret should be moved to text node before the first <input> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
firstInput.previousSibling.length,
|
||||
"test_move_caret_from_after_double_input_text: caret should be moved to text node before the first <input> (offset)"
|
||||
);
|
||||
})();
|
||||
|
||||
(function test_move_caret_from_before_input_button() {
|
||||
info("Starting test_move_caret_from_before_input_button...");
|
||||
document.body.innerHTML = '<div>abc<input type="button" value="def">ghi</div>';
|
||||
const input = document.querySelector("input");
|
||||
const textBefore = input.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_input_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
input.nextSibling,
|
||||
"test_move_caret_from_before_input_button: caret should be moved to text node after the <input>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_input_button: caret should be moved to start of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_input_button() {
|
||||
info("Starting test_move_caret_from_after_input_button...");
|
||||
document.body.innerHTML = '<div>abc<input type="button" value="def">ghi</div>';
|
||||
const input = document.querySelector("input");
|
||||
getSelection().collapse(input.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_input_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
input.previousSibling,
|
||||
"test_move_caret_from_after_input_button: caret should be moved to text node before the <input>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
input.previousSibling.length,
|
||||
"test_move_caret_from_after_input_button: caret should be moved to end of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_before_double_input_button() {
|
||||
info("Starting test_move_caret_from_before_double_input_button...");
|
||||
document.body.innerHTML = '<div>abc<input type="button" value="def"><input type="button" value="ghi">jkl</div>';
|
||||
const firstInput = document.querySelector("input");
|
||||
const secondInput = firstInput.nextSibling;
|
||||
const textBefore = firstInput.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_double_input_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
secondInput.nextSibling,
|
||||
"test_move_caret_from_before_double_input_button: caret should be moved to text node after the second <input> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_double_input_button: caret should be moved to text node after the second <input> (offset)"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_double_input_button() {
|
||||
info("Starting test_move_caret_from_after_double_input_button...");
|
||||
document.body.innerHTML = '<div>abc<input type="button" value="def"><input type="button" value="ghi">jkl</div>';
|
||||
const firstInput = document.querySelector("input");
|
||||
const secondInput = firstInput.nextSibling;
|
||||
getSelection().collapse(secondInput.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_double_input_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
firstInput.previousSibling,
|
||||
"test_move_caret_from_after_double_input_button: caret should be moved to text node before the first <input> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
firstInput.previousSibling.length,
|
||||
"test_move_caret_from_after_double_input_button: caret should be moved to text node before the first <input> (offset)"
|
||||
);
|
||||
})();
|
||||
|
||||
(function test_move_caret_from_before_button() {
|
||||
info("Starting test_move_caret_from_before_button...");
|
||||
document.body.innerHTML = '<div>abc<button>def</button>ghi</div>';
|
||||
const button = document.querySelector("button");
|
||||
const textBefore = button.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
button.nextSibling,
|
||||
"test_move_caret_from_before_button: caret should be moved to text node after the <button>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_button: caret should be moved to start of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_button() {
|
||||
info("Starting test_move_caret_from_after_button...");
|
||||
document.body.innerHTML = '<div>abc<button>def</button>ghi</div>';
|
||||
const button = document.querySelector("button");
|
||||
getSelection().collapse(button.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
button.previousSibling,
|
||||
"test_move_caret_from_after_button: caret should be moved to text node before the <button>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
button.previousSibling.length,
|
||||
"test_move_caret_from_after_button: caret should be moved to end of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_before_double_button() {
|
||||
info("Starting test_move_caret_from_before_double_button...");
|
||||
document.body.innerHTML = '<div>abc<button>def</button><button>ghi</button>jkl</div>';
|
||||
const firstButton = document.querySelector("button");
|
||||
const secondButton = firstButton.nextSibling;
|
||||
const textBefore = firstButton.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_double_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
secondButton.nextSibling,
|
||||
"test_move_caret_from_before_double_button: caret should be moved to text node after the second <button> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_double_button: caret should be moved to text node after the second <button> (offset)"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_double_button() {
|
||||
info("Starting test_move_caret_from_after_double_button...");
|
||||
document.body.innerHTML = '<div>abc<button>def</button><button>ghi</button>jkl</div>';
|
||||
const firstButton = document.querySelector("button");
|
||||
const secondButton = firstButton.nextSibling;
|
||||
getSelection().collapse(secondButton.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_double_button: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
firstButton.previousSibling,
|
||||
"test_move_caret_from_after_double_button: caret should be moved to text node before the first <button> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
firstButton.previousSibling.length,
|
||||
"test_move_caret_from_after_double_button: caret should be moved to text node before the first <button> (offset)"
|
||||
);
|
||||
})();
|
||||
|
||||
(function test_move_caret_from_before_textarea() {
|
||||
info("Starting test_move_caret_from_before_textarea...");
|
||||
document.body.innerHTML = '<div>abc<textarea>def</textarea>ghi</div>';
|
||||
const textarea = document.querySelector("textarea");
|
||||
const textBefore = textarea.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_textarea: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
textarea.nextSibling,
|
||||
"test_move_caret_from_before_textarea: caret should be moved to text node after the <textarea>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_textarea: caret should be moved to start of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_textarea() {
|
||||
info("Starting test_move_caret_from_after_textarea...");
|
||||
document.body.innerHTML = '<div>abc<textarea>def</textarea>ghi</div>';
|
||||
const textarea = document.querySelector("textarea");
|
||||
getSelection().collapse(textarea.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_textarea: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
textarea.previousSibling,
|
||||
"test_move_caret_from_after_textarea: caret should be moved to text node before the <textarea>"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
textarea.previousSibling.length,
|
||||
"test_move_caret_from_after_textarea: caret should be moved to end of the text node"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_before_double_textarea() {
|
||||
info("Starting test_move_caret_from_before_double_textarea...");
|
||||
document.body.innerHTML = '<div>abc<textarea>def</textarea><textarea>ghi</textarea>jkl</div>';
|
||||
const firstTextarea = document.querySelector("textarea");
|
||||
const secondTextarea = firstTextarea.nextSibling;
|
||||
const textBefore = firstTextarea.previousSibling;
|
||||
getSelection().collapse(textBefore, textBefore.length);
|
||||
synthesizeKey("KEY_ArrowRight");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_before_double_textarea: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
secondTextarea.nextSibling,
|
||||
"test_move_caret_from_before_double_textarea: caret should be moved to text node after the second <textarea> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
0,
|
||||
"test_move_caret_from_before_double_textarea: caret should be moved to text node after the second <textarea> (offset)"
|
||||
);
|
||||
})();
|
||||
(function test_move_caret_from_after_double_textarea() {
|
||||
info("Starting test_move_caret_from_after_double_textarea...");
|
||||
document.body.innerHTML = '<div>abc<textarea>def</textarea><textarea>ghi</textarea>jkl</div>';
|
||||
const firstTextarea = document.querySelector("textarea");
|
||||
const secondTextarea = firstTextarea.nextSibling;
|
||||
getSelection().collapse(secondTextarea.nextSibling, 0);
|
||||
synthesizeKey("KEY_ArrowLeft");
|
||||
ok(
|
||||
getSelection().isCollapsed,
|
||||
"test_move_caret_from_after_double_textarea: selection should be collapsed after moving caret"
|
||||
);
|
||||
is(
|
||||
getSelection().focusNode,
|
||||
firstTextarea.previousSibling,
|
||||
"test_move_caret_from_after_double_textarea: caret should be moved to text node before the first <textarea> (container)"
|
||||
);
|
||||
is(
|
||||
getSelection().focusOffset,
|
||||
firstTextarea.previousSibling.length,
|
||||
"test_move_caret_from_after_double_textarea: caret should be moved to text node before the first <textarea> (offset)"
|
||||
);
|
||||
})();
|
||||
|
||||
SimpleTest.finish();
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
|
@ -9536,8 +9536,6 @@ nsIFrame::SelectablePeekReport nsIFrame::GetFrameFromDirection(
|
|||
bool selectable = false;
|
||||
nsIFrame* traversedFrame = this;
|
||||
AutoAssertNoDomMutations guard;
|
||||
const nsIContent* const nativeAnonymousSubtreeContent =
|
||||
GetClosestNativeAnonymousSubtreeRoot();
|
||||
while (!selectable) {
|
||||
auto [blockFrame, lineFrame] =
|
||||
traversedFrame->GetContainingBlockForLine(aScrollViewStop);
|
||||
|
@ -9575,17 +9573,10 @@ nsIFrame::SelectablePeekReport nsIFrame::GetFrameFromDirection(
|
|||
return result;
|
||||
}
|
||||
|
||||
auto IsSelectable = [aForceEditableRegion, nativeAnonymousSubtreeContent](
|
||||
const nsIFrame* aFrame) {
|
||||
auto IsSelectable = [aForceEditableRegion](const nsIFrame* aFrame) {
|
||||
if (!aFrame->IsSelectable(nullptr)) {
|
||||
return false;
|
||||
}
|
||||
// If the new frame is in a native anonymous subtree, we should treat it
|
||||
// as not selectable unless the frame and found frame are in same subtree.
|
||||
if (aFrame->GetClosestNativeAnonymousSubtreeRoot() !=
|
||||
nativeAnonymousSubtreeContent) {
|
||||
return false;
|
||||
}
|
||||
return !aForceEditableRegion || aFrame->GetContent()->IsEditable();
|
||||
};
|
||||
|
||||
|
|
|
@ -747,18 +747,6 @@ class nsIFrame : public nsQueryFrame {
|
|||
*/
|
||||
nsIContent* GetContent() const { return mContent; }
|
||||
|
||||
/**
|
||||
* @brief Get the closest native anonymous subtree root if the content is in a
|
||||
* native anonymous subtree.
|
||||
*
|
||||
* @return The root of native anonymous subtree which the content belongs to.
|
||||
* Otherwise, nullptr.
|
||||
*/
|
||||
nsIContent* GetClosestNativeAnonymousSubtreeRoot() const {
|
||||
return mContent ? mContent->GetClosestNativeAnonymousSubtreeRoot()
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the frame that should be the parent for the frames of child elements
|
||||
* May return nullptr during reflow
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
div {
|
||||
border: medium solid red;
|
||||
border-width: 32em;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
document.execCommand("selectAll");
|
||||
getSelection().modify("move", "backward", "character");
|
||||
getSelection().collapseToStart();
|
||||
}, {once: true});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<button contenteditable></button>
|
||||
<input value="a">
|
||||
<div></div>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче