[TSF] Selected text isn't replaced with composition string when you use MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win8.1 and Win10

RESOLVED FIXED in Firefox 41

Status

()

defect
RESOLVED FIXED
4 years ago
a year ago

People

(Reporter: qydwhotmail, Assigned: masayuki)

Tracking

({inputmethod})

43 Branch
mozilla43
x86_64
Windows 10
Points:
---
Dependency tree / graph

Firefox Tracking Flags

(e10s?, firefox40 unaffected, firefox41+ fixed, firefox42+ fixed, firefox43+ fixed)

Details

Attachments

(3 attachments)

Reporter

Description

4 years ago
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0
Build ID: 20150828030205

Steps to reproduce:

1. Open an e10s window.
2. Switch to Microsoft Pinyin Chinese Mode.
3. Select some text in any textbox and type something.



Actual results:

Selected text cannot be deleted automatically.


Expected results:

Selected text should be deleted automatically.
Reporter

Updated

4 years ago
Blocks: e10s
Component: Untriaged → General
OS: Unspecified → Windows 10
Hardware: Unspecified → x86_64
Reporter

Updated

4 years ago
Blocks: e10s-ime
Hey masayuki, is this an e10s blocker?
Flags: needinfo?(masayuki)
Yes.
Status: UNCONFIRMED → NEW
Component: General → Widget: Win32
Ever confirmed: true
Flags: needinfo?(masayuki)
Product: Firefox → Core
Summary: Selected text cannot be deleted automatically when typing using Chinese Pinyin IME in e10s window → [TSF] Selected text cannot be deleted automatically when typing using Chinese Pinyin IME in e10s window
(In reply to Masayuki Nakano (:masayuki) (Mozilla Japan) from comment #2)
> Yes.

Are we planning on shipping tsf in the near future?
Flags: needinfo?(masayuki)
(In reply to Jim Mathies [:jimm] from comment #3)
> (In reply to Masayuki Nakano (:masayuki) (Mozilla Japan) from comment #2)
> > Yes.
> 
> Are we planning on shipping tsf in the near future?

We have already enabled TSF in default settings even in e10s mode.
Flags: needinfo?(masayuki)
Sigh, this is not an e10s specific bug. We have this bug even in non-e10s mode.
Assignee: nobody → masayuki
Status: NEW → ASSIGNED
I confirmed that this can be reproduced on Beta. I guess that it's too late to fix this bug on Beta since Beta needs different patch for TSF. If the cause is in XP code, we may have a chance.
Summary: [TSF] Selected text cannot be deleted automatically when typing using Chinese Pinyin IME in e10s window → [TSF] Selected text isn't replaced with composition string when you use MS Pinyin on Win10
> 0[19ca0e800]: TSF: 0x1b119db00   Locking (TS_LF_READWRITE) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::QueryInsert(acpTestStart=1, acpTestEnd=2, cch=0, pacpResultStart=0x100000001, pacpResultEnd=0x2)
> 0[19ca0e800]: TSF: 0x1b119db00  TSFTextStore::QueryInsert() succeeded: *pacpResultStart=1, *pacpResultEnd=1)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::OnStartComposition(pComposition=0x19f06c470, pfOk=0x19c00c3f0), mComposition.mView=0x0
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RecordCompositionStartAction(aComposition=0x19f06c470, aRange=0x19f06c598, aPreserveSelection=false), mComposition.mView=0x0
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RecordCompositionStartAction(aComposition=0x19f06c470, aStart=1, aLength=0, aPreserveSelection=false), mComposition.mView=0x0
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetCurrentText(): retrieving text from the content...
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::LockedContent(): mLockedContent={ mText="abc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=4294967295 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RecordCompositionStartAction() succeeded: mComposition={ mStart=1, mString.Length()=0, mSelection={ acpStart=1, acpEnd=1, style.ase=TS_AE_END, style.fInterimChar=false } }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::OnStartComposition() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::SetText(dwFlags=not-specified, acpStart=1, acpEnd=1, pchText=0x1af52b970 "n", cch=1, pChange=0x19c00c3c8), mComposition.IsComposing()=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::SetSelectionInternal(pSelection={ acpStart=1, acpEnd=1, style={ ase=TS_AE_END, fInterimChar=false} }, aDispatchCompositionChangeEvent=false), mComposition.IsComposing()=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=1 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::InsertTextAtSelectionInternal(aInsertStr="n", aTextChange=0x19c00c3c8), IsComposing=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=1 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::LockedContent(): mLockedContent={ mText="abc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=4294967295 }
> 0[19ca0e800]: TSF: 0x1b119dba0   TSFTextStore::Content::ReplaceTextWith(aStart=1, aLength=0, aReplaceString="n"), mComposition={ mStart=1, mString="n" }, mLastCompositionString="", mMinTextModifiedOffset=4294967295, firstDifferentOffset=1
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::InsertTextAtSelectionInternal() succeeded: mWidget=0x1a7f10400, mWidget->Destroyed()=false, aTextChange={ acpStart=1, acpOldEnd=1, acpNewEnd=2 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::SetText() succeeded: pChange={ acpStart=1, acpOldEnd=1, acpNewEnd=2 }
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x19c00bf20, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::LockedContent(): mLockedContent={ mText="anbc" (Length()=4), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetText() succeeded: pcchPlainOut=0x19c00bf20, *prgRunInfo={ uCount=4, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::OnUpdateComposition(pComposition=0x19f06c470, pRangeNew=0x0), mComposition.mView=0x19f06c470
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::OnUpdateComposition() succeeded but not complete
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::SetSelection(ulCount=1, pSelection=19c00c3a8 { acpStart=2, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false } }), mComposition.IsComposing()=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::SetSelectionInternal(pSelection={ acpStart=2, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false} }, aDispatchCompositionChangeEvent=true), mComposition.IsComposing()=true
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RestartCompositionIfNecessary(aRangeNew=0x0), mComposition.mView=0x19f06c470
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RestartCompositionIfNecessary(), range=1-2, mComposition={ mStart=1, mString.Length()=1 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RestartCompositionIfNecessary() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RecordCompositionUpdateAction(), mComposition={ mView=0x19f06c470, mStart=1, mString="n" (Length()=1) }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RecordCompositionUpdateAction() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::SetSelection() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x19c00c6b0, pcFetched=0x19c00cba4)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetSelection() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetStatus(pdcs=0x19c00cc68)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetActiveView(pvcView=0x19c00cb98)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetWnd(vcView=1, phwnd=0x19c00cbc8), mWidget=0x1a7f10400
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetWnd() succeeded: *phwnd=0x6142c
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetStatus(pdcs=0x19c00ca88)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x19c00c5b0, pcFetched=0x19c00ca90)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetSelection() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetActiveView(pvcView=0x19c00c9e8)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetTextExt(vcView=1, acpStart=2, acpEnd=2, prc=0x19c00cab0, pfClipped=0x19c00ca80), mDeferNotifyingTSF=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetTextExt() hacked the offsets for TIP acpStart=1, acpEnd=1
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetScreenExtInternal()
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetScreenExtInternal() succeeded: aScreenExt={ left=1346, top=403, right=1566, bottom=433 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetTextExt() succeeded: *prc={ left=1365, top=410, right=1366, bottom=425 }, *pfClipped=false
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetActiveView(pvcView=0x19c00ca58)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetScreenExt(vcView=1, prc=0x19c00cac0)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetScreenExtInternal()
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetScreenExtInternal() succeeded: aScreenExt={ left=1346, top=403, right=1566, bottom=433 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetScreenExt() succeeded: *prc={ left=1346, top=403, right=1566, bottom=433 }
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x19c00c6f0, pcFetched=0x19c00cc68)
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetSelection() succeeded
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x19c00c500, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::LockedContent(): mLockedContent={ mText="anbc" (Length()=4), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetText() succeeded: pcchPlainOut=0x19c00c500, *prgRunInfo={ uCount=4, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x19c00c440, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::LockedContent(): mLockedContent={ mText="anbc" (Length()=4), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::GetText() succeeded: pcchPlainOut=0x19c00c440, *prgRunInfo={ uCount=4, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[19ca0e800]: TSF: 0x1b119db00   Unlocked (TS_LF_READWRITE) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::FlushPendingActions() flushing COMPOSITION_START={ mSelectionStart=1, mSelectionLength=0 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::FlushPendingActions() dispatching compositionstart event...
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::FlushPendingActions() flushing COMPOSITION_UPDATE={ mData="n", mRanges=0x1a7a350c0, mRanges->Length()=2 }
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::FlushPendingActions(), dispatching compositionchange event...
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::MaybeFlushPendingNotifications(), putting off flushing pending notifications due to being dispatching events...
> 0[19ca0e800]: TSF: 0x1b119db00   TSFTextStore::RequestLock() succeeded: *phrSession=S_OK
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::GetStatus(pdcs=0x19c00cfc0)
> 0[19ca0e800]: TSF: 0x1b119db00 TSFTextStore::RequestLock(dwLockFlags=TS_LF_READWRITE, phrSession=0x19c00d018), mLock=not-specified

Hmm, according to this log, this is a bug of MS Pinyin. It doesn't specify correct range at calling ITextStore::SetText()...
Okay, I can reproduce same bug with MS Wubi, MS Changjie and MS Quick. They must base on same code.
> 0[5451a0e800]: TSF: 0x5461b14100   Locking (TS_LF_READWRITE) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::QueryInsert(acpTestStart=1, acpTestEnd=2, cch=0, pacpResultStart=0x7ffb00000001, pacpResultEnd=0x5400000002)
> 0[5451a0e800]: TSF: 0x5461b14100  TSFTextStore::QueryInsert() succeeded: *pacpResultStart=1, *pacpResultEnd=2)
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::OnStartComposition(pComposition=0x545f36ede0, pfOk=0x5450ebd660), mComposition.mView=0x0
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RecordCompositionStartAction(aComposition=0x545f36ede0, aRange=0x545f36e248, aPreserveSelection=false), mComposition.mView=0x0
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RecordCompositionStartAction(aComposition=0x545f36ede0, aStart=1, aLength=1, aPreserveSelection=false), mComposition.mView=0x0
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetCurrentText(): retrieving text from the content...
> 0[5451a0e800]: IMECO: 0x5461b13a00 IMEContentObserver::HandleQueryContentEvent(aEvent={ mMessage=NS_QUERY_TEXT_CONTENT })
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::LockedContent(): mLockedContent={ mText="abc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=4294967295 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RecordCompositionStartAction() succeeded: mComposition={ mStart=1, mString.Length()=1, mSelection={ acpStart=1, acpEnd=2, style.ase=TS_AE_END, style.fInterimChar=false } }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::OnStartComposition() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::SetText(dwFlags=not-specified, acpStart=1, acpEnd=2, pchText=0x5451776a40 "n", cch=1, pChange=0x5450ebd638), mComposition.IsComposing()=true
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::SetSelectionInternal(pSelection={ acpStart=1, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false} }, aDispatchCompositionChangeEvent=false), mComposition.IsComposing()=true
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::InsertTextAtSelectionInternal(aInsertStr="n", aTextChange=0x5450ebd638), IsComposing=true
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=1, acpEnd=2 (length=1), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::LockedContent(): mLockedContent={ mText="abc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=4294967295 }
> 0[5451a0e800]: TSF: 0x5461b141a0   TSFTextStore::Content::ReplaceTextWith(aStart=1, aLength=1, aReplaceString="n"), mComposition={ mStart=1, mString="n" }, mLastCompositionString="", mMinTextModifiedOffset=4294967295, firstDifferentOffset=1
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::InsertTextAtSelectionInternal() succeeded: mWidget=0x546040f000, mWidget->Destroyed()=false, aTextChange={ acpStart=1, acpOldEnd=2, acpNewEnd=2 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::SetText() succeeded: pChange={ acpStart=1, acpOldEnd=2, acpNewEnd=2 }
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x5450ebd050, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::LockedContent(): mLockedContent={ mText="anc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetText() succeeded: pcchPlainOut=0x5450ebd050, *prgRunInfo={ uCount=3, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::OnUpdateComposition(pComposition=0x545f36ede0, pRangeNew=0x0), mComposition.mView=0x545f36ede0
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::OnUpdateComposition() succeeded but not complete
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::SetSelection(ulCount=1, pSelection=5450ebd618 { acpStart=2, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false } }), mComposition.IsComposing()=true
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::SetSelectionInternal(pSelection={ acpStart=2, acpEnd=2, style={ ase=TS_AE_END, fInterimChar=false} }, aDispatchCompositionChangeEvent=true), mComposition.IsComposing()=true
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RestartCompositionIfNecessary(aRangeNew=0x0), mComposition.mView=0x545f36ede0
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RestartCompositionIfNecessary(), range=1-2, mComposition={ mStart=1, mString.Length()=1 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RestartCompositionIfNecessary() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RecordCompositionUpdateAction(), mComposition={ mView=0x545f36ede0, mStart=1, mString="n" (Length()=1) }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::RecordCompositionUpdateAction() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::SetSelection() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x5450ebd920, pcFetched=0x5450ebde14)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetSelection() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetStatus(pdcs=0x5450ebded8)
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetActiveView(pvcView=0x5450ebde08)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetWnd(vcView=1, phwnd=0x5450ebde38), mWidget=0x546040f000
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetWnd() succeeded: *phwnd=0x101762
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetStatus(pdcs=0x5450ebdcf8)
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x5450ebd820, pcFetched=0x5450ebdd00)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetSelection() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetActiveView(pvcView=0x5450ebdc58)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetTextExt(vcView=1, acpStart=2, acpEnd=2, prc=0x5450ebdd20, pfClipped=0x5450ebdcf0), mDeferNotifyingTSF=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetTextExt() hacked the offsets for TIP acpStart=1, acpEnd=1
> 0[5451a0e800]: IMECO: 0x5461b13a00 IMEContentObserver::HandleQueryContentEvent(aEvent={ mMessage=NS_QUERY_TEXT_RECT })
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetScreenExtInternal()
> 0[5451a0e800]: IMECO: 0x5461b13a00 IMEContentObserver::HandleQueryContentEvent(aEvent={ mMessage=NS_QUERY_EDITOR_RECT })
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetScreenExtInternal() succeeded: aScreenExt={ left=1346, top=340, right=1511, bottom=360 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetTextExt() succeeded: *prc={ left=1353, top=340, right=1355, bottom=360 }, *pfClipped=false
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetActiveView(pvcView=0x5450ebdcc8)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetActiveView() succeeded: *pvcView=1
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetScreenExt(vcView=1, prc=0x5450ebdd30)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetScreenExtInternal()
> 0[5451a0e800]: IMECO: 0x5461b13a00 IMEContentObserver::HandleQueryContentEvent(aEvent={ mMessage=NS_QUERY_EDITOR_RECT })
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetScreenExtInternal() succeeded: aScreenExt={ left=1346, top=340, right=1511, bottom=360 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetScreenExt() succeeded: *prc={ left=1346, top=340, right=1511, bottom=360 }
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetSelection(ulIndex=4294967295, ulCount=1, pSelection=0x5450ebd960, pcFetched=0x5450ebded8)
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetSelection() succeeded
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x5450ebd770, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::LockedContent(): mLockedContent={ mText="anc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetText() succeeded: pcchPlainOut=0x5450ebd770, *prgRunInfo={ uCount=3, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[5451a0e800]: TSF: 0x5461b14100 TSFTextStore::GetText(acpStart=0, acpEnd=-1, pchPlain=0x7ffb2fe56bc0, cchPlainReq=128, pcchPlainOut=0x5450ebd6b0, prgRunInfo=0x7ffb2fe56cc0, ulRunInfoReq=33, pulRunInfoOut=0x7ffb2fe56bb0, pacpNext=0x7ffb2fe56dc8), mComposition={ mStart=1, mString.Length()=1, IsComposing()=true }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::CurrentSelection(): acpStart=2, acpEnd=2 (length=0), reverted=false
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::LockedContent(): mLockedContent={ mText="anc" (Length()=3), mLastCompositionString="" (Length()=0), mMinTextModifiedOffset=1 }
> 0[5451a0e800]: TSF: 0x5461b14100   TSFTextStore::GetText() succeeded: pcchPlainOut=0x5450ebd6b0, *prgRunInfo={ uCount=3, type=TS_RT_PLAIN }, *pulRunInfoOut=803564464, *pacpNext=803565000)
> 0[5451a0e800]: TSF: 0x5461b14100   Unlocked (TS_LF_READWRITE) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

If we do hack the result of ITextStoreACP::QueryInsert(), MS Pinyin works fine. So, the TIPs sets the result of QueryInsert() to SetText(). Therefore, MS Pinyin ignores the selection.

jimm:

Do you know some people of MS who are good people to report this bug? This bug exists in MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win10 and Win8.1.
Flags: needinfo?(jmathies)
Er, perhaps, I'm wrong about the comment 10. SetText() should be available if OnStartComposition() has already been called.
Summary: [TSF] Selected text isn't replaced with composition string when you use MS Pinyin on Win10 → [TSF] Selected text isn't replaced with composition string when you use MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win8.1 and Win10
Probably, I found the counter part of ITextStoreACP::QueryInsert(), that must be ITfRange::AdjustForInsert():
https://msdn.microsoft.com/en-us/library/windows/desktop/ms628914%28v=vs.85%29.aspx

According to this document, the method shouldn't be called when TIP starts composition at selected range. So, I believe that this is a bug of the Chinese TIPs.
When we land the patch to beta, we need to uplift the patch (only part.1) of bug 1050644.
Depends on: 1050644
[Tracking Requested - why for this release]:
Because this bug must be pretty annoying for Chinese (both Transitional and Simplified) IME users. This is a bug of the IMEs, but we can hack it only when one of them is active. So, this can be fixed safely.
According to the above investigation result, we should return specified range as result from ITextStore::QueryInsert(). This should work safe because it runs only when the active TIP is one of them.

Honestly, I wanted to hack after OnStartComposition() because QueryInsert() *might* be called other purpose. However, I think that this must be safe because this should be called only when if TIP wants to start composition without selected range. I don't know such feature of Chinese TIPs and even if they have such feature, the handling of the result is probably same as this.

I tested this patch on Win10-Ja, Win8.1-zh-CN, Win8.1-zh-TW.
Attachment #8657044 - Flags: review?(VYV03354)
If we can uplift the fix, we need to uplift this patch landed by bug 1050644. This patch allows to check if the active TIP is one of the Chinese TIPs.
> Honestly, I wanted to hack after OnStartComposition() because QueryInsert() *might* be called other
> purpose. However, I think that this must be safe because this should be called only when if TIP wants
> to start composition without selected range.

I forgot to mention the reason why I don't do so. I tried the approach first. However, it needs a lot of methods and we need to hack at least 3 methods and check the pending action arrays to ensure that each method is called in this case. So, the patch became much complicated and too big. Therefore, I changed my mind. The simpler patch may be allowed to uplift, but if it's complicated, not so.
Attachment #8657044 - Flags: review?(VYV03354) → review+
Attachment #8657047 - Flags: review?(VYV03354) → review+
url:        https://hg.mozilla.org/integration/mozilla-inbound/rev/06c35ae9bc22874fdbc811aed0181063502efeca
changeset:  06c35ae9bc22874fdbc811aed0181063502efeca
user:       Masayuki Nakano <masayuki@d-toybox.com>
date:       Fri Sep 04 20:55:09 2015 +0900
description:
Bug 1199997 TSFTextStore::QueryInsert() should return specified range if the TIP is one of buggy Chinese TIPs of Microsoft r=emk
Tracking for 41+.  

It's getting late in the beta cycle but we still may want to take this on beta (with the patch from bug 1050644)
https://hg.mozilla.org/mozilla-central/rev/06c35ae9bc22
Status: ASSIGNED → RESOLVED
Last Resolved: 4 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla43
Comment on attachment 8657044 [details] [diff] [review]
TSFTextStore::QueryInsert() should return specified range if the TIP is one of buggy Chinese TIPs of Microsoft

Approval Request Comment
[Feature/regressing bug #]: New bug of TSF mode, but not ours, the MS's IME's bug. They use wrong API to start composition.
[User impact if declined]: Chinese language users (both Simplified Chinese and Traditional Chinese) cannot replace selected text with input string via IME.
[Describe test coverage new/current, TreeHerder]: Landed on m-c. I manually tested this bug on Win10 Ja, Win-8.1 zh-CN, zh-TW.
[Risks and why]: This patch changes the behavior of an API which is used by IME only when one of the Microsoft's Chinese IME is active. So, the risk must be low.
[String/UUID change made/needed]: Nothing.
Attachment #8657044 - Flags: approval-mozilla-aurora?
Comment on attachment 8657046 [details] [diff] [review]
part.0 Add methods to check whether the active TIP is Chinese TIP which deosn't show candidate window in e10s mode (r=emk)

Approval Request Comment
[Feature/regressing bug #]: See above.
[User impact if declined]: See above.
[Describe test coverage new/current, TreeHerder]: This comes from bug 1050644. So, very long time, this is tested on m-c and aurora.
[Risks and why]: Really low. This patch allows to check if the active IME is the MS's Chinese IME.
[String/UUID change made/needed]: Nothing.
Attachment #8657046 - Flags: approval-mozilla-beta?
Comment on attachment 8657047 [details] [diff] [review]
part.1 nsTextStore::QueryInsert() should return specified range if the TIP is one of buggy Chinese TIPs of Microsoft

Approval Request Comment
[Feature/regressing bug #]: See above.
[User impact if declined]: See above.
[Describe test coverage new/current, TreeHerder]: See above (this is just merged with beta tree, not changed logically from the patch for m-c and aurora).
[Risks and why]: See above comment which is the request for Aurora.
[String/UUID change made/needed]: Nothing.
Attachment #8657047 - Flags: approval-mozilla-beta?
Masayuki, is this an issue only in e10s mode? If so, given that e10s is not enabled by default in FF41, I do not think we should uplift this to Beta.
Flags: needinfo?(masayuki)
(In reply to Ritu Kothari (:ritu) from comment #26)
> Masayuki, is this an issue only in e10s mode? If so, given that e10s is not
> enabled by default in FF41, I do not think we should uplift this to Beta.

No, this is reproduced without e10s, unfortunately.
Flags: needinfo?(masayuki)
Comment on attachment 8657044 [details] [diff] [review]
TSFTextStore::QueryInsert() should return specified range if the TIP is one of buggy Chinese TIPs of Microsoft

OK, let's take it.
Attachment #8657044 - Flags: approval-mozilla-aurora? → approval-mozilla-aurora+
Fushan, could you please verify this fix works as expected on Nightly build from 09-05 or later? Thanks in advance.
Flags: needinfo?(qydwhotmail)
Comment on attachment 8657046 [details] [diff] [review]
part.0 Add methods to check whether the active TIP is Chinese TIP which deosn't show candidate window in e10s mode (r=emk)

Since this fix is isolated to TSF, it seems low risk to uplift to Beta41.
Attachment #8657046 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Comment on attachment 8657047 [details] [diff] [review]
part.1 nsTextStore::QueryInsert() should return specified range if the TIP is one of buggy Chinese TIPs of Microsoft

Please see my previous comment.
Attachment #8657047 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Flags: qe-verify+
Flags: qe-verify+
> jimm:
> 
> Do you know some people of MS who are good people to report this bug? This
> bug exists in MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win10 and
> Win8.1.

I do not, davidb might.
Flags: needinfo?(jmathies)
(In reply to Jim Mathies [:jimm] from comment #35)
> > jimm:
> > 
> > Do you know some people of MS who are good people to report this bug? This
> > bug exists in MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win10 and
> > Win8.1.
> 
> I do not, davidb might.

davidb: Do you have a channel to report bugs of Microsoft's IMEs? We need to report Chinese MS-IME's bug (this bug) and Japanese MS-IME's bug (bug 1204523).
Flags: needinfo?(dbolter)
(In reply to Masayuki Nakano (:masayuki) (Mozilla Japan) (Offline: 9/21-23, prehaps, not so active: 9/24, 9/25) from comment #36)
> (In reply to Jim Mathies [:jimm] from comment #35)
> > > jimm:
> > > 
> > > Do you know some people of MS who are good people to report this bug? This
> > > bug exists in MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win10 and
> > > Win8.1.
> > 
> > I do not, davidb might.
> 
> davidb: Do you have a channel to report bugs of Microsoft's IMEs? We need to
> report Chinese MS-IME's bug (this bug) and Japanese MS-IME's bug (bug
> 1204523).

I emailed my main contact earlier today. I'll leave the needinfo while I wait.
OK, I don't have an inside option. Here's the reply:
"If the user has Windows 10, the best feedback mechanism is the Windows 10 feedback app. If not, Microsoft.com/connect is the best way to report issues. Someone at Mozilla may have access to our partner reporting system, so that would be another path. They all end up in the same database eventually."

So Masayuki I think the Windows 10 feedback app is a good start.
Flags: needinfo?(dbolter)
Thank you, davidb.

I reported this bug to MS via Windows Feedback.
Windows-Feedback:?contextid=330&feedbackid=3a8e34bf-b0c5-40b5-8d78-e71accbb8fda&form=1&src=2
Reporter

Comment 40

a year ago
Thank you developers. It's fixed.
Flags: needinfo?(qydwhotmail)
You need to log in before you can comment on or make changes to this bug.