Hi Jeremy,

I have been investigating keyboard events on Windows, Linux, and Mac
to find solutions for these issues. Shall we have a discussion about
these issues when I finish writing my report (maybe sometime next
week)?

Regards,

Hironori Bono
E-mail: hb...@chromium.org

On Thu, May 28, 2009 at 7:14 AM, Jeremy Moskovich <jer...@chromium.org> wrote:
> Hi All,
> We currently fudge our keyboard handling on OSX, we interpret command key
> shortcuts ourselves and thus miss out on quite a few Cocoa text handling
> niceities.  We also don't support IMEs.
> Relevant bugs:
> http://crbug.com/10862 - OS X: Can't use command-key shortcuts with foreign
> keyboard layouts
> http://crbug.com/12698 - standard macintosh text editing keyboard shortcuts
> are missing
> http://crbug.com/11981 - Deadkeys do not work
> http://crbug.com/11952 - IME support (Chinese input method doesnt work)
> We also don't handle activation/deactivation of edit menu items correctly
> (select all is always disabled).
> I've done a little digging in WebKit's keyboard handling and what follows is
> a proposal on how we can more closely match the OSX keyboard handling code
> and [hopefully] do things the right way.  I don't purport to understand this
> all and there may be simpler ways to achieve this so feel free to comment.
> Standard commands (Copy/Paste/Select-all):
> WebKit handles these through the regular obj-c selectors in WebHTMLView, see
> the WEBCORE_COMMAND macro.
> We could do the same thing and add these selectors
> to BrowserWindowController which would then send an IPC message over to the
> renderer process to execute the appropriate command.
> The tricky bit is updating the menus, the model in Cocoa is for the OS to
> call you for each menu item before displaying a menu.  We can't block the
> browser process on the renderer process so the browser process would always
> need to know if there is an active selection.  WebCore appears to already
> have a mechanism to do this via notifyAccessibilityForSelectionChange() - we
> could use the same or a similar mechanism to send an IPC message back to the
> browser process each time the selection changes.
> Emacs keyboard commands and IMEs:
> The IME part of the title may be nonsense, but looking at the code it
> appears the code path and issues are the same.
> I've attached the stack trace for hitting cntrl-t to the end of this email.
>  The tricky bit here is that WebCore is first given a shot at handling the
> event and then passes it back to WebHTMLView to take another look at the
> event which is where it's actually parsed.  I assume this is to give JS code
> a chance to listen on these events.
> Since we can't serialize an NSEvent, we can't replicate this code solely in
> the renderer.
> A possible solution to this would be to store a queue of the last N NSEvents
> per renderer matched with an ID.  the event would then be serialized and
> sent to the renderer which could then send it's own IPC message back to the
> browser process to get Cocoa to handle the message, we could pick the
> NSEvent out of the queue by ID and send back the relevant edit command to
> the renderer.
> Since the events belong to a specific renderer a malicious renderer process
> can't access events not targeted at them.
> Best regards,
> Jeremy
> Stack trace of hitting cntrl-t (transpose) in a text view, Cocoa
> [browser-process] stuff marked in bold.
> #0 WebCore::executeTranspose (frame=0x70b9800) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:961
> #1 0x03702f0f in WebCore::Editor::Command::execute (this=0xbfffe2f4,
> paramet...@0xbfffe2ac, triggeringEvent=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:1450
> #2 0x037052ad in WebCore::Editor::Command::execute (this=0xbfffe2f4,
> triggeringEvent=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:1455
> #3 0x0031d3da in -[WebHTMLView(WebNSTextInputSupport) doCommandBySelector:]
> (self=0x6cefe90, _cmd=0x943edca4, selector=0x94423fa4) at
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:5337
> #4 0x0031c238 in -[WebHTMLView(WebInternal)
> _interceptEditingKeyEvent:shouldSaveCommand:] (self=0x6cefe90,
> _cmd=0x3a405c, event=0x24178380, shouldSave=0 '\000') at
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:4966
> #5 0x002eb19b in WebEditorClient::handleKeyboardEvent (this=0x6c31aa0,
> event=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebCoreSupport/WebEditorClient.mm:440
> #6 0x036f8875 in WebCore::Editor::handleKeyboardEvent (this=0x70b9cd4,
> event=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/Editor.cpp:105
> #7 0x037156fb in WebCore::EventHandler::defaultKeyboardEventHandler
> (this=0x70b9d00, event=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/EventHandler.cpp:1907
> #8 0x03a7876e in WebCore::Node::defaultEventHandler (this=0x1c23f430,
> event=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2812
> #9 0x037c7d17 in WebCore::HTMLInputElement::defaultEventHandler
> (this=0x1c23f430, evt=0x24178380) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/html/HTMLInputElement.cpp:1120
> #10 0x03a70c27 in WebCore::Node::dispatchGenericEvent (this=0x1c23f430,
> prpeve...@0xbfffe63c) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2439
> #11 0x03a70f0f in WebCore::Node::dispatchEvent (this=0x1c23f430,
> e...@0xbfffe6e8, e...@0xbfffe6cc) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2336
> #12 0x03718720 in WebCore::EventHandler::keyEvent (this=0x70b9d00,
> initialkeyeve...@0xbfffe74c) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/EventHandler.cpp:1848
> #13 0x0371da3b in WebCore::EventHandler::keyEvent (this=0x70b9d00,
> event=0x2416ded0) at
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/mac/EventHandlerMac.mm:172
> #14 0x003138ce in -[WebHTMLView performKeyEquivalent:] (self=0x6cefe90,
> _cmd=0x94421a60, event=0x2416ded0) at
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:4013
> #15 0x959398b6 in -[NSControl _performKeyEquivalent:conditionally:] ()
> #16 0x95939782 in -[NSView performKeyEquivalent:] ()
> #17 0x95939782 in -[NSView performKeyEquivalent:] ()
> #18 0x95939782 in -[NSView performKeyEquivalent:] ()
> #19 0x95939782 in -[NSView performKeyEquivalent:] ()
> #20 0x95939782 in -[NSView performKeyEquivalent:] ()
> #21 0x95939782 in -[NSView performKeyEquivalent:] ()
> #22 0x95939782 in -[NSView performKeyEquivalent:] ()
> #23 0x95939782 in -[NSView performKeyEquivalent:] ()
> #24 0x959394eb in -[NSWindow performKeyEquivalent:] ()
> #25 0x0004dbc1 in ?? ()
> #26 0x959391af in -[NSApplication _handleKeyEquivalent:] ()
> #27 0x958560fb in -[NSApplication sendEvent:] ()
> #28 0x0003918a in ?? ()
> #29 0x957b362f in -[NSApplication run] ()
> #30 0x95780834 in NSApplicationMain ()
> #31 0x00003296 in ?? ()

--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: chromium-dev@googlegroups.com 
View archives, change email options, or unsubscribe: 
    http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to