Closed Bug 52416 Opened 24 years ago Closed 22 years ago

Editor does not accept NS_TEXT_EVENT while losing input focus

Categories

(Core :: DOM: Editor, defect, P1)

x86
Linux
defect

Tracking

()

RESOLVED FIXED

People

(Reporter: masaki.katakai, Assigned: masaki.katakai)

References

Details

(Keywords: fixedOEM, intl)

Attachments

(1 file, 6 obsolete files)

UNIX IMEs sometimes invoke extra windows for operation, for example, candidate window which grabs input focus. As I described the problem in http://bugzilla.mozilla.org/show_bug.cgi?id=29065 IME wants to draw pre-edit text (composed text) while the candidate window is invoked. It seems that Editor does not accept NS_TEXT_EVENT for updating pre-edit text by the recent changes in Editor and Layout (/event?). When I filed a bug 29065, Editor could accept NS_TEXT_EVENT, so I could see the pre-edit text was updated event when candidate window is invoked. However, it does not work on the current build. How to reproduce: 1) Start Mozilla 2) Visit www.yahoo.com 3) Click on text field for Search 4) Turn conversion on by Shift+SPACE 5) Type a i 6) Invoke candidate window by SPACE, SPACE Main window of Mozilla will loose the input focus 7) Select a candidate candidate window will be closed and the selected text will be drawn on the text field, but it won't. The first candidate word is still displayed. 8) type return to commit the word The correct word is committed, which means the word drawn in 7) is not correct. I'd like to ask Editor and Layout folks to evalute this problem. Problem of kinput2 (filed as 47568) seems to happen due to this.
reassign to kin. add yokoyama@netscape.com to the cc list kin- do you know what happen about this ?
Assignee: beppe → kin
setting to m19, Kin please take a look and see what is up, we will evaluate after Kin has preformed a preliminary debug
Whiteboard: [need info]
Target Milestone: --- → M19
Accepting bug. I'm going to need some help setting IME up on my Linux box.
Status: NEW → ASSIGNED
Kin - Is somebody helping to setup IME on your Linux? Also, since this is i18n related problem, I suggest to assign teruko@netscape.com or ji@netscape.com for QA concact.
future
Target Milestone: M19 → Future
Blocks: 60916
Adding intl and nsbeta1 keywords. Adding mcarlson to cc-list.
Keywords: intl, nsbeta1
Priority: P3 → P1
I see slightly different behavior. export LANG=ja_JP.eucJP jserver kinput2 & ./mozilla 1) click in the URL bar. 2) shift-space to engage IME 3) type "watashi" 4) type Ctrl-w twice to bring up candidate window If I use the keyboard to navigate the candidate window (space to advance, return to select) the new character(s) is displayed. If I use the mouse to select a candidate the new character(s) is not displayed until I click in the URL bar.
Katakai-san, is your window focus model: pointer or click? Would someone at sun check if the display is wrong when: 1) just using the keyboard to select the kanji or 2) using the pointer to select the kanji
Blocks: 47568
tajima@eng.sun.com is blocked by this bug. Any ideas on unblocking? /be
Summary: Editor does not accept NS_TEXT_EVENT while loosing input focus → Editor does not accept NS_TEXT_EVENT while losing input focus
*** Bug 74823 has been marked as a duplicate of this bug. ***
*** Bug 74825 has been marked as a duplicate of this bug. ***
changing to nsbeta1-. this one does not meet beta stopper guidelines.
Keywords: nsbeta1nsbeta1-
Beppe - I don't we should future this one, it has multiple dupes and is a blocker. Pls reconsider for M0.9.2. Adding nsCatFood and RTM keyword.
Keywords: nsCatFood, rtm
This problem is still serious when users use enlightenment and CDE window manager because there is no way to configure IME candidate window not to grab input focus. The problem is that event with NS_TEXT_EVENT does not go to the *last focused* content. I'm now debugging this problem and need you help. It seems that IME works well on HTML editor but does not work on any input field of XUL docs and HTML form. I found the following mCurrentEventContent = mDocument->GetRootContent(); in http://lxr.mozilla.org/mozilla/source/layout/html/base/src/nsPresShell.cpp#5399 does not return correct content while it's losing input focus. On HTML editor, it returns correct value which is same wiht HTML editor itself. However, on HTML form, the GetRootContent() returns the parent(?) content of HTML form field, not the exact content of HTML form field. Is there any way to get the *last focused* content (e.g. input form) here? Or if it is OK to return the parent content here but can we pass the event to the input form finally?
This sounds like this is a Focus/Event problem, not an editor problem. Cc'ing the focus gurus ... saari@netscape.com and blizzard@mozilla.org Anyone want to take this off my plate?
Editor *will* get a blur event if the window is deactivated. Can the editor accept these events when blurred? Have you verified that it gets them, or does the event never make it that far?
I understand editor can accept NS_TEXT_EVENT events while losing focus because this problem does not happen on HTMLEditor (Composer). This problem happens on any text field of GUI and HTML forms. When input field has an input focus, manager->GetFocusedContent(&mCurrentEventContent); can return the correct and exact content of nsHTMLInputElement. If not, mCurrentEventContent = mDocument->GetRootContent(); can not return the exact content of the *last focused* nsHTMLInputElement. Is it possible to get the *last focused* content here?
I've verified this problem does not happen on M16 but M17 has this problem.
Should we change Summary to "layout does not throw NS_TEXT_EVENT event to nsHTMLInputElement while losing focus" ?
I found one questionable point on source codes. (But, I don't know this is related to this bug.) Try to search by NS_TEXT_EVENT. http://lxr.mozilla.org/seamonkey/search?string=NS_TEXT_EVENT There are many codes like "event->message == NS_TEXT_EVENT". However, according to the struct nsEvent, NS_TEXT_EVENT must be in member "eventStructType", not "message". http://lxr.mozilla.org/seamonkey/source/widget/public/nsGUIEvent.h#88 Are these codes mistakes?
Did anyone see my comment above ?
Thank you, Kamio-san, widget side always sets both message and eventStructType to NS_TEXT_EVENT. So I don't think this causes problem. /widget/src/gtk/nsWindow.cpp, line 3700 -- textEvent.message = textEvent.eventStructType = NS_TEXT_EVENT;
Attached patch not patch, it's workaround codes (obsolete) — Splinter Review
I've attached the codes for workaround. The problem is that if losing input focus, editor does not accept any NS_TEXT_EVENT so we're seeing two problems, - composed characters are not updated when we choose a candidate on candidate window. when the candidate window grabs input focus. - commit string on candidate window does not work because commit event comes before mozilla grabs input focus again from candidate window There is no way to solve problem #1 by IME side, but for problem #2, we can store committed string as pending string then commit it by the input focus is back. I understand this is not really good way to solive this, but it can be workaround for reference. #2 is very serious issue.
Attached patch patch for nsPresShell.cpp (obsolete) — Splinter Review
patch for widget side is not working well on composer, http://bugzilla.mozilla.org/attachment.cgi?id=76393&action=view because focus is not back to "html editor pane" when getting focus again... Actually there is not way for widget side to fix this problem... I tried to modify PresShell::HandleEvent() of nsPresShell.cpp. manager->GetFocusedContent(&mCurrentEventContent); Is the focus in Mozilla, mCurrentEventContent is returned. This is correct. If not, trying to get mCurrentEventContent by, mDocument->GetRootContent(&mCurrentEventContent); this works on only composer. On HTML form and any XUL UI, it does not work. When input focus is not on Mozilla, this code is used but which will not send NS_TEXT_EVENT to proper contents. How about the patch? If the input focus exactly is not on Mozilla, get the last focused-content by using GetFocusedElement(). If not, continue to use mDocument->GetRootContent(). Kin, what do you think? logically correct? Toshi, can you try on your environment?
so, this is not editor bug, I think. Is it better to change component to layout or event handling?
Right, the bug is not an editor or layout problem, it's an event handling/dispatching problem. I'm going to defer to the focus/event handling gurus on this one, since I don't know the full extent of what could be affeted by your patches. saari, aaronl, or joki ... any comments?
Could anyone review the patch and give comments please?
Since we know this isn't an editor problem, I'm going to hand this one over to saari so it shows up on his radar.
Assignee: kin → saari
Status: ASSIGNED → NEW
Target Milestone: Future → ---
saari@netscape.com: Can you or someone take a look of this patch for us please? We want someone in this area to check out the patch because we need this ASAP for Sun's release. Thanks, Margaret
Chris Saari is on vacation until Tuesday.
Can anyone review the patch? I've verified the patch is working fine with the current tree.
We need this review please. Can someone give us a pointer to a reviewer for this bug?
CC:'ing some editor folks...
Keywords: patch, review
Hi Roland. Thanks for cc'ing to others. Any chance that you can help getting this in? We need it badly. Margaret
I am concerned with the last change; it sounds like that will break something on Macintosh (maybe keybindings?).
Attached patch use defined(XP_UNIX) (obsolete) — Splinter Review
Thank you very much for comment, I don't have build environment for Mac, so I can not verify this. OK, this problem happens on only UNIX platform, no problem for other platoform because candidate window does not grabs input focus on other platform. We'd better to keep existing codes for other platform. I've added #if defined(XP_UNIX) for safety. Also, for safer way and to avoid performance regression for normal key event, I've put the codes for getting mCurrentEventContent into if (NS_IS_IME_EVENT(aEvent)) { } Could you review again please?
Attachment #76393 - Attachment is obsolete: true
Attachment #77207 - Attachment is obsolete: true
Comment on attachment 97720 [details] [diff] [review] use defined(XP_UNIX) I am not sure whether |XP_UNIX| is correct since we have Unix-like OSes without X11 (MacOSX, Photon port, BeOS etc. etc) ... ... what about using |MOZ_X11| instead ?
Thanks, Roland. Yes, I believe that MOZ_X11 is correct for this case.
Comment on attachment 97757 [details] [diff] [review] Updated patch which is only used on X11-based ports (GTK+, Qt, Xlib) I'm not at all familiar with this code, but it looks very safe -- it won't effect non-X11 platforms and it won't change anything on any event that isn't NS_IS_IME_EVENT, so I think taking it is safe. I have three stylistic issues: >+ nsCOMPtr<nsIFocusController> focusController; >+ nsCOMPtr<nsIScriptGlobalObject> ourGlobal; >+ mDocument->GetScriptGlobalObject(getter_AddRefs(ourGlobal)); >+ nsCOMPtr<nsPIDOMWindow> ourWindow = do_QueryInterface(ourGlobal); >+ if (ourWindow) { >+ ourWindow->GetRootFocusController(getter_AddRefs(focusController)); You don't really need the focus controller until you're inside the ourWindow clause, so it would be better to declare it there. >+ if(focusedElement) { You should probably put a space after the if for consistency with the rest of the function. The third issue is that I find it hard to read with the X11 clause in one place and then later the !X11 clause. Everything in between them is comments, and they all apply to the non-X11 clause, so can you change that first #endif to an #else and remove the #ifndef? I'll attach a revision of the patch in case that wasn't clear, with my three changes, but I'll mark my r=akkana on this one.
Attachment #97757 - Flags: review+
Attached patch new patch with Akkana 's comment (obsolete) — Splinter Review
Thank you very much, Akkana. I've corrected the position of focusController definition and space issue. Your changes for #else are included. Could you r= please?
Oh, I'm sorry the patch has r= already. Now asking sr=... to reviewers.
Assignee: saari → katakai
Comment on attachment 97919 [details] [diff] [review] new patch with Akkana 's comment + // if not, search pre-focused element "search for" +#endif /* !MOZ_X11 */ That '!' should not be there (since your ifdef is now just MOZ_X11). + focusedElement->QueryInterface(NS_GET_IID(nsIContent), + (void **)&mCurrentEventContent); CallQueryInterface(focusedElement, &mCurrentEventContent); Also, there's lots of commented-out code around here that just makes the code hard to understand, imo. Could we just remove that code please? (cced saari, who commented this out ages ago). Looks good other than those nits.
Attached patch update patchSplinter Review
Thank you very much for review and comments, Boris. I've corrected the patch, except removing codes in comment line. Saari, could you give suggestion asap? We're very close to code freeze of OEM branch.
Attachment #97757 - Attachment is obsolete: true
Attachment #97876 - Attachment is obsolete: true
Attachment #97919 - Attachment is obsolete: true
Comment on attachment 98409 [details] [diff] [review] update patch sr=bzbarsky. Just land this if saari does not get back to you by the time you need to land it... If possible, do that on branch only so we can clean the code up a bit on the trunk.
Attachment #98409 - Attachment description: update patch → update patch
Attachment #98409 - Flags: superreview+
Sure, Thank you very much. Trunk tree is frozen for Mozilla 1.2alpha, so I'll not ask this to Trunk but ask to OEMbrach. Adding branchOEM keyword to request checkin to OEMbranch.
Whiteboard: [need info] → branchOEM
Hi Masaki: Please check this in to the OEM branch. Jim has already given you the permission for checkin to the OEM branch under the assumption that you will check this into the trunk when the code is cleaned up and the trunk is reopen. Thanks, Margaret
Hi Boris: Is saari around? We have not heard from him for quite a while. Shall we check in to the trunk (once it is open) and file another bug (assigned to saari) for code clean up. We just want to make sure that we are in sync with the trunk to avoid any discrepancies with our future release. Thanks, Margaret
If saari is not answering, I say we rip out those comments (and make that clear in the checkin comment). CVS history will have them if really needed.
> If saari is not answering, I say we rip out those comments (and make that clear > in the checkin comment). CVS history will have them if really needed. I concur with Boris, in case you want a second opinion/reviewer for that part.
Tree is now open for 1.2Beta. I'll check in the same patch to Trunk and OEMbranch. For Trunk, after the check-in, I'll remove the commented out codes with proper CVS comments by myself for clean up if I do not get answer from Sarri or ask Sarri to do that.
checked in the patch to Trunk. Will track code cleanup as bug 167866. Thanks everyone for your help!
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
checked into OEM branch. Thanks again.
Whiteboard: branchOEM → fixedOEM
Seems it still not fix for me on 09-12 trunk and 09-13 branch builds / linux RH7.2-JA. So, this fix only for OEM? I wonder why?
It was checked in to the trunk. Not branch though. I am assuming that you are talking about the 1.2 alpha branch?
No, I double checked this on 09-13 both trunk and branch - I don't see there is any difference: If I invoke Japanese IME, and start type something to bring up the candidate window, and press space key to switch the candidate chracters, only first two characters can be displayed in non-commit character position, all others can be highlighted but can not showed up in non-commit character. When I hit return key to commit, then I will get the highlighted character(s) be commit not the one in non-commit position. Is this bug supposedly fix this problem?
Hi Yuying, thank you for testing, The first problem - only first candidate can be displayed on preedit area this is correct behavior of kinput2. Please try the same operation on normal gtk application such as gedit. You can see the same behavior on it. The 2nd problem - candidate string can not be displayed at commit this is a bug of kinput2 I understand. Please see bug 63456. I have marked the bug as WONT FIX. kinput2 does not call needed method at commit. Type something after your commit, the preedit string can be changed to proper characters you selected at candidate window. Does your testing team have ATOK X input server? I'll try to verify the fix on Trun with ATOK X and let you know the result.
Keywords: reviewfixedOEM
Whiteboard: fixedOEM
verified the fix on OEM branch and Trunk on both Linux and Solaris.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: