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:
Kagami Sascha Rosylight 2022-08-19 18:42:39 +00:00
parent db3259dff7
commit 68bd57f300
3 changed files with 51 additions and 1 deletions

View File

@ -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()) {

View File

@ -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 =

View 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>