Closed Bug 1609675 Opened 5 years ago Closed 5 years ago

[TSF][TS_E_NOLAYOUT] MS-IME candidate window sometimes appears and flickers at top-left corner of display on Nightly or early Beta

Categories

(Core :: Widget: Win32, defect, P5)

x86_64
Windows 10
defect

Tracking

()

RESOLVED FIXED
mozilla75
Tracking Status
firefox75 --- fixed

People

(Reporter: kuroweb, Assigned: masayuki)

Details

(Keywords: inputmethod)

Attachments

(3 files)

My Computer:
Windows 10 version 1909 (OS build 18363.535)

Build identifier:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Built from https://hg.mozilla.org/mozilla-central/rev/5ba39736e74b8a072a63ee215545f89d5c2ec8c8

Steps to reproduce.
1.create new profile.
2.open http://www.htmq.com/html/textarea.shtml
3.turn on Microsoft IME.
4.type in japanese characters.

Actual results:
Japanese input candidates are displayed for a sometimes in the upper left corner of the desktop.

Expected results.
Display at the position where characters are being input.

Other browser results:
Google Chrome (version 79.0.3945.117 Official Build 64bit) is fine.
Microsoft Edge (version 44.18362.449.0) is fine.

Google Japanese IME(2.25.3700.0) is fine on Firefox Nightly.

related bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=1208977
https://bugzilla.mozilla.org/show_bug.cgi?id=1187583

add images.

Component: General → Widget: Win32
Keywords: inputmethod
Product: Firefox → Core

The priority flag is not set for this bug.
:jimm, could you have a look please?

For more information, please visit auto_nag documentation.

Flags: needinfo?(jmathies)

Hey Masayuki, do we have anyone working on IME issues currently? This looks like a rather bad annoyance bug.

Flags: needinfo?(jmathies) → needinfo?(masayuki)

I guess that you don't reproduce it with late Beta or Release, isn't it?

The reason is, I stopped the hack for TS_E_NO_LAYOUT for MS-IME if you run early Beta or Nightly on Win10 build 17643 or newer (bug 1481153).
https://searchfox.org/mozilla-central/rev/a4be2fbe9bd4f405c91cc16e4e3a80400f5a9301/modules/libpref/init/all.js#3184-3198

If you cannot reproduce it with Release, unfortunately, it means that the traditional MS-IME has a bug to handle TS_E_NO_LAYOUT. I hope that it'd be fixed in new MS-IME which will be shipped in a couple of years...

I'll try to get the log when it happens (when I have much time).

Flags: needinfo?(masayuki) → needinfo?(kuroweb)
Priority: -- → P5

I reproduced this bug easily with debug build.
The following log is when I typed "う" of "あいう" in an <input> element:

TSFTextStore::RequestLock(dwLockFlags=TS_LF_READWRITE | TS_LF_SYNC, phrSession=0x000000FF7D5FD910), mLock=not-specified, mDestroyed=false
  Locking (TS_LF_READWRITE) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x000000FF7D5FD0F8, pcFetched=0x000000FF7D5FD240)
TSFTextStore::GetSelection() succeeded, acpStart=2, acpEnd=2 (length=0), reverted=false
TSFTextStore::SetText(dwFlags=not-specified, acpStart=2, acpEnd=2, pchText=0x000002F99C5B8774 "う", cch=1, pChange=0x000000FF7D5FCCC8), mComposition.IsComposing()=true
 TSFTextStore::SetSelectionInternal(pSelection={ acpStart=2, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false} }, aDispatchCompositionChangeEvent=false), mComposition.IsComposing()=true
...
  TSFTextStore::Content::ReplaceTextWith(aStart=2, aLength=0, aReplaceString="う"), mComposition={ mStart=0, mString="あいう" }, mLastCompositionString="あい", mMinTextModifiedOffset=4294967295, firstDifferentOffset=2
...
TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x00007FFB14BFF590, cchPlainReq=128, pcchPlainOut=0x000000FF7D5FC800, prgRunInfo=0x00007FFB14BFF480, ulRunInfoReq=33, pulRunInfoOut=0x00007FFB14BFF47C, pacpNext=0x00007FFB14BFF478), mComposition={ mStart=0, mString.Length()=3, IsComposing()=true }
  TSFTextStore::SelectionForTSFRef(): acpStart=3, acpEnd=3 (length=0), reverted=false
  TSFTextStore::ContentForTSFRef(): mContentForTSF={ mText="あいう" (Length()=3), mLastCompositionString="あい" (Length()=2), mMinTextModifiedOffset=2 }
  TSFTextStore::GetText() succeeded: pcchPlainOut=0x000000FF7D5FC800, *prgRunInfo={ uCount=3, type=TS_RT_PLAIN }, *pulRunInfoOut=1, *pacpNext=3)
TSFTextStore::OnUpdateComposition(pComposition=0x000002F98FBEC510, pRangeNew=0x0000000000000000), mComposition.mView=0x000002F98FBEC510
...
  TSFTextStore::OnUpdateComposition() succeeded but not complete
TSFTextStore::SetSelection(ulCount=1, pSelection=000000FF7D5FD0A8 { acpStart=3, acpEnd=3, style={ ase=TS_AE_NONE, fInterimChar=false } }), mComposition.IsComposing()=true
  TSFTextStore::SetSelectionInternal(pSelection={ acpStart=3, acpEnd=3, style={ ase=TS_AE_NONE, fInterimChar=false} }, aDispatchCompositionChangeEvent=true), mComposition.IsComposing()=true
  TSFTextStore::SelectionForTSFRef(): acpStart=3, acpEnd=3 (length=0), reverted=false
...
  TSFTextStore::SetSelection() succeeded
TSFTextStore::OnUpdateComposition(pComposition=0x000002F98FBEC510, pRangeNew=0x000002F9883783F8), mComposition.mView=0x000002F98FBEC510
...
  TSFTextStore::GetDisplayAttribute(): GetDisplayAttribute range=0-3 (hr=S_OK)
  TSFTextStore::GetDisplayAttribute() succeeded: Result={ crText:{ TF_CT_NONE }, crBk:{ TF_CT_NONE }, lsStyle: TF_LS_SQUIGGLE, fBoldLine: false, crLine:{ TF_CT_NONE }, bAttr: TF_ATTR_INPUT }
  TSFTextStore::RecordCompositionUpdateAction() succeeded
...
  TSFTextStore::OnUpdateComposition() succeeded: mComposition={ mStart=0, mString="あいう" }, SelectionForTSFRef()={ acpStart=3, acpEnd=3, style.ase=TS_AE_END }
TSFTextStore::OnUpdateComposition(pComposition=0x000002F98FBEC510, pRangeNew=0x000002F9883783F8), mComposition.mView=0x000002F98FBEC510
...
  TSFTextStore::GetDisplayAttribute(): GetDisplayAttribute range=0-3 (hr=S_OK)
  TSFTextStore::GetDisplayAttribute() succeeded: Result={ crText:{ TF_CT_NONE }, crBk:{ TF_CT_NONE }, lsStyle: TF_LS_SQUIGGLE, fBoldLine: false, crLine:{ TF_CT_NONE }, bAttr: TF_ATTR_INPUT }
  TSFTextStore::RecordCompositionUpdateAction() succeeded
...
  TSFTextStore::OnUpdateComposition() succeeded: mComposition={ mStart=0, mString="あいう" }, SelectionForTSFRef()={ acpStart=3, acpEnd=3, style.ase=TS_AE_END }
TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x000000FF7D5FCF38, pcFetched=0x000000FF7D5FD080)
  TSFTextStore::GetSelection() succeeded, acpStart=3, acpEnd=3 (length=0), reverted=false
...
TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x000000FF7D5FD2F8, pcFetched=0x000000FF7D5FD450)
  TSFTextStore::GetSelection() succeeded, acpStart=3, acpEnd=3 (length=0), reverted=false
...
  Unlocked (TS_LF_READWRITE) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  TSFTextStore::DispatchKeyboardEventAsProcessedByIME(), dispatching an eKeyDown event...
  TSFTextStore::FlushPendingActions() flushing Type::eCompositionUpdate={ mData="あいう", mRanges=0x000002F991B05D40, mRanges->Length()=2 }
  TSFTextStore::FlushPendingActions() dispatching compositionchange event...
  TSFTextStore::RequestLock() succeeded: *phrSession=S_OK
TSFTextStore::RequestLock(dwLockFlags=TS_LF_READWRITE | TS_LF_SYNC, phrSession=0x000000FF7D5FE2A0), mLock=not-specified, mDestroyed=false
  Locking (TS_LF_READWRITE) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x000000FF7D5FDA88, pcFetched=0x000000FF7D5FDBD0)
  TSFTextStore::GetSelection() succeeded, acpStart=3, acpEnd=3 (length=0), reverted=false
TSFTextStore::SetSelection(ulCount=1, pSelection=000000FF7D5FDA38 { acpStart=3, acpEnd=3, style={ ase=TS_AE_NONE, fInterimChar=false } }), mComposition.IsComposing()=true
  TSFTextStore::SetSelection() succeeded
TSFTextStore::OnUpdateComposition(pComposition=0x000002F98FBEC510, pRangeNew=0x000002F988378518), mComposition.mView=0x000002F98FBEC510
  TSFTextStore::RestartCompositionIfNecessary(aRangeNew=0x000002F988378518), mComposition.mView=0x000002F98FBEC510
...
  TSFTextStore::GetDisplayAttribute(): GetDisplayAttribute range=0-3 (hr=S_OK)
  TSFTextStore::GetDisplayAttribute() succeeded: Result={ crText:{ TF_CT_NONE }, crBk:{ TF_CT_NONE }, lsStyle: TF_LS_SQUIGGLE, fBoldLine: false, crLine:{ TF_CT_NONE }, bAttr: TF_ATTR_INPUT }
  TSFTextStore::RecordCompositionUpdateAction() succeeded
  TSFTextStore::SelectionForTSFRef(): acpStart=3, acpEnd=3 (length=0), reverted=false
  TSFTextStore::OnUpdateComposition() succeeded: mComposition={ mStart=0, mString="あいう" }, SelectionForTSFRef()={ acpStart=3, acpEnd=3, style.ase=TS_AE_END }
TSFTextStore::OnUpdateComposition(pComposition=0x000002F98FBEC510, pRangeNew=0x000002F988378518), mComposition.mView=0x000002F98FBEC510
...
  TSFTextStore::RecordCompositionUpdateAction(), mComposition={ mView=0x000002F98FBEC510, mStart=0, mString="あいう" (Length()=3) }
  TSFTextStore::GetDisplayAttribute(): GetDisplayAttribute range=0-3 (hr=S_OK)
  TSFTextStore::GetDisplayAttribute() succeeded: Result={ crText:{ TF_CT_NONE }, crBk:{ TF_CT_NONE }, lsStyle: TF_LS_SQUIGGLE, fBoldLine: false, crLine:{ TF_CT_NONE }, bAttr: TF_ATTR_INPUT }
  TSFTextStore::RecordCompositionUpdateAction() succeeded
  TSFTextStore::OnUpdateComposition() succeeded: mComposition={ mStart=0, mString="あいう" }, SelectionForTSFRef()={ acpStart=3, acpEnd=3, style.ase=TS_AE_END }
TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x000000FF7D5FD8C8, pcFetched=0x000000FF7D5FDA10)
  TSFTextStore::GetSelection() succeeded, acpStart=3, acpEnd=3 (length=0), reverted=false
...
  Unlocked (TS_LF_READWRITE) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  TSFTextStore::FlushPendingActions() flushing Type::eCompositionUpdate={ mData="あいう", mRanges=0x000002F991B05D40, mRanges->Length()=2 }
  TSFTextStore::FlushPendingActions() dispatching compositionchange event...
  TSFTextStore::RequestLock() succeeded: *phrSession=S_OK
TSFTextStore::GetStatus(pdcs=0x000000FF7D5FE280)
TSFTextStore::RequestLock(dwLockFlags=TS_LF_READWRITE | TS_LF_SYNC, phrSession=0x000000FF7D5FE2A0), mLock=not-specified, mDestroyed=false
  Locking (TS_LF_READWRITE) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
...
TSFTextStore::GetTextExt(vcView=1, acpStart=0, acpEnd=3, prc=0x000000FF7D5FDB00, pfClipped=0x000000FF7D5FDAE0), IsHandlingComposition()=true, mContentForTSF={ MinOffsetOfLayoutChanged()=2, LatestCompositionStartOffset()=0, LatestCompositionEndOffset()=3 }, mComposition= { IsComposing()=true, mStart=0, EndOffset()=3 }, mDeferNotifyingTSF=false, mWaitingQueryLayout=false, IMEHandler::IsA11yHandlingNativeCaret()=true
  TSFTextStore::SelectionForTSFRef(): acpStart=3, acpEnd=3 (length=0), reverted=false
  TSFTextStore::GetTextExt() returned TS_E_NOLAYOUT (acpEnd=3)

After composition string is updated, MS-IME (oddly) notifies Gecko of composition update again. Then, it'll call GetTextExt() to retrieve rect of composition string. However, in this case, new composition string's rectangle hasn't been computed in the remote process yet. Therefore, Gecko returns TS_E_NOLAYOUT. But MS-IME does not wait next layout change notification from Gecko and positions suggest window to top-left of the screen. It's a bug of MS-IME, at least, they should keep previous position for avoiding flicker, but anyway we should keep doing a hack in this case even if Nightly runs on new Win10 which has a fix of TS_E_NOLAYOUT issue in TSF.

Assignee: nobody → masayuki
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Flags: needinfo?(kuroweb)
Summary: MS-IME candidate window sometimes appears and flickers at top-left corner on Windows 10 → [TSF][TS_E_NOLAYOUT} MS-IME candidate window sometimes appears and flickers at top-left corner of display on Nightly or early Beta

MS-IME should get TS_E_NOLAYOUT error correctly when it's running on Win10
Build 17643 or later. However, according to the bug report, MS-IME itself
does not handle it correctly. Therefore, we need to enable a hack for MS-IME
for Japanese even when
intl.tsf.hack.allow_to_stop_hacking_on_build_17643_or_later is true.

Summary: [TSF][TS_E_NOLAYOUT} MS-IME candidate window sometimes appears and flickers at top-left corner of display on Nightly or early Beta → [TSF][TS_E_NOLAYOUT] MS-IME candidate window sometimes appears and flickers at top-left corner of display on Nightly or early Beta
Pushed by masayuki@d-toybox.com: https://hg.mozilla.org/integration/autoland/rev/5f2e62175414 Enable a `TS_E_NOLAYOUT` hack for MS-IME even if running on Win10 Build 17643 or later r=m_kato
Status: ASSIGNED → RESOLVED
Closed: 5 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla75
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: