mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1785739 - Ensure the editor is initialized in RestoreSelectionState r=masayuki
Before D99291 the initialization was always done via SetSelectionRange because IsDirty was always true after input construction (because SetValue always set the flag regardless of whether actual change happened). Now the flag is always false initially, so we need to explicitly initialize the editor. Differential Revision: https://phabricator.services.mozilla.com/D154995
This commit is contained in:
parent
db3259dff7
commit
68bd57f300
@ -186,11 +186,12 @@ class RestoreSelectionState : public Runnable {
|
||||
mFrame->GetConstFrameSelection());
|
||||
|
||||
if (mFrame) {
|
||||
// SetSelectionRange leads to
|
||||
// EnsureEditorInitialized and SetSelectionRange leads to
|
||||
// Selection::AddRangeAndSelectFramesAndNotifyListeners which flushes
|
||||
// Layout - need to block script to avoid nested PrepareEditor calls (bug
|
||||
// 642800).
|
||||
nsAutoScriptBlocker scriptBlocker;
|
||||
mFrame->EnsureEditorInitialized();
|
||||
TextControlState::SelectionProperties& properties =
|
||||
mTextControlState->GetSelectionProperties();
|
||||
if (properties.IsDirty()) {
|
||||
|
@ -608,6 +608,7 @@ skip-if = os == "android" # up/down arrow keys not supported on android
|
||||
[test_bug1322678.html]
|
||||
skip-if = toolkit == "android"
|
||||
[test_bug1472426.html]
|
||||
[test_bug1785739.html]
|
||||
[test_fakepath.html]
|
||||
[test_script_module.html]
|
||||
support-files =
|
||||
|
48
dom/html/test/test_bug1785739.html
Normal file
48
dom/html/test/test_bug1785739.html
Normal file
@ -0,0 +1,48 @@
|
||||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>nsFind::Find() should initialize the editor</title>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
<input value="1abc1
|
||||
2abc2
|
||||
3abc3
|
||||
4abc4
|
||||
5abc5
|
||||
6abc6
|
||||
7abc7
|
||||
8abc8
|
||||
9abc9" id="input">
|
||||
<script>
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
// The current window.find() impl does not support text controls, so import the internal component
|
||||
const finder =
|
||||
SpecialPowers
|
||||
.Cc["@mozilla.org/typeaheadfind;1"]
|
||||
.getService(SpecialPowers.Ci.nsITypeAheadFind);
|
||||
|
||||
finder.init(SpecialPowers.wrap(window).docShell);
|
||||
|
||||
function find() {
|
||||
return finder.find(
|
||||
"abc",
|
||||
false,
|
||||
SpecialPowers.Ci.nsITypeAheadFind.FIND_NEXT,
|
||||
true);
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
finder.find("abc", false, SpecialPowers.Ci.nsITypeAheadFind.FIND_FIRST, true);
|
||||
// Wait until layout flush as the bug repro needs it
|
||||
await new Promise(requestAnimationFrame);
|
||||
|
||||
for (let i = 0; i < 9; i++) {
|
||||
find();
|
||||
await new Promise(requestAnimationFrame);
|
||||
is(input.selectionStart, (i * 19) + 1);
|
||||
}
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
window.addEventListener("load", runTests);
|
||||
</script>
|
Loading…
Reference in New Issue
Block a user