Bug 1583766 - Consider `IMEContentObserver` to send selection change notification when its sender sends a text change notification r=m_kato

The previous change is wrong because the sender shouldn't send selection change
notification if `IMEContentObserver` does not receive text change notifications
nor selection change notifications.

This patch reverts the change in the if block of previous change and instead
sets `IMEContentObserver::mNeedsToNotifyIMEOfSelectionChange` to `true` if
the sender sends a text change notification.  (Note that even if there is
another text change with a mutation event listener, we need to send selection
change notification later so that this must be the right approach.)

Differential Revision: https://phabricator.services.mozilla.com/D47564

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Masayuki Nakano 2019-09-30 03:59:09 +00:00
Родитель c16fe33b0e
Коммит b3450ef1e7
1 изменённых файлов: 12 добавлений и 9 удалений

Просмотреть файл

@ -1680,23 +1680,26 @@ IMEContentObserver::IMENotificationSender::Run() {
if (observer->mNeedsToNotifyIMEOfTextChange) { if (observer->mNeedsToNotifyIMEOfTextChange) {
observer->mNeedsToNotifyIMEOfTextChange = false; observer->mNeedsToNotifyIMEOfTextChange = false;
SendTextChange(); SendTextChange();
// Even if the observer hasn't received selection change, let's try to send
// selection change notification to IME because selection start offset may
// be changed if the previous contents of selection start are changed. For
// example, when previous `<p>` element of another `<p>` element which
// contains caret is removed by a DOM mutation, selection change event
// won't be fired, but selection start offset should be decreased by the
// length of removed `<p>` element.
observer->mNeedsToNotifyIMEOfSelectionChange = true;
} }
// If a text change notification causes another text change again, we should // If a text change notification causes another text change again, we should
// notify IME of that before sending a selection change notification. // notify IME of that before sending a selection change notification.
// Otherwise, even if the observer hasn't received selection change, let's
// try to send selection change notification to IME because selection
// start offset may be changed if the previous contents of selection start
// are changed. For example, when previous `<p>` element of another `<p>`
// element which contains caret is removed by a DOM mutation, selection
// change event won't be fired, but selection start offset should be
// decreased by the length of removed `<p>` element.
if (!observer->mNeedsToNotifyIMEOfTextChange) { if (!observer->mNeedsToNotifyIMEOfTextChange) {
// Be aware, PuppetWidget depends on the order of this. A selection change // Be aware, PuppetWidget depends on the order of this. A selection change
// notification should not be sent before a text change notification because // notification should not be sent before a text change notification because
// PuppetWidget shouldn't query new text content every selection change. // PuppetWidget shouldn't query new text content every selection change.
observer->mNeedsToNotifyIMEOfSelectionChange = false; if (observer->mNeedsToNotifyIMEOfSelectionChange) {
SendSelectionChange(); observer->mNeedsToNotifyIMEOfSelectionChange = false;
SendSelectionChange();
}
} }
// If a text change notification causes another text change again or a // If a text change notification causes another text change again or a