WebAPI/InputMethod API with hardware keyboard: Difference between revisions
Luke-chang (talk | contribs) (Created page with "Meta bug: [https://bugzilla.mozilla.org/show_bug.cgi?id=929365 bug 929365]. == Idea == The previous iteration of InputMethod API (See WebAPI/KeboardIME) enables the keyb...") |
Luke-chang (talk | contribs) No edit summary |
||
(16 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
== Idea == | |||
== | Relevant bugs: [https://bugzilla.mozilla.org/show_bug.cgi?id=929365 bug 929365 (meta)], [https://bugzilla.mozilla.org/show_bug.cgi?id=1110030 bug 1110030]. | ||
The previous iteration of InputMethod API (See [[WebAPI/KeboardIME]]) enables the keyboard apps to interact with the targeted input field. We would like it to handle the connected hardware keyboard as well. | The previous iteration of InputMethod API (See [[WebAPI/KeboardIME]]) enables the keyboard apps to interact with the targeted input field. We would like it to handle the connected hardware keyboard as well. | ||
== | == Prerequisite == | ||
The critical keys (POWER, HOME and so on) need to be handled by system app first. | |||
== Concept == | |||
[[File:InputMethod API with hardware keyboard Concept.jpg]] | |||
This proposal is based on [[WebAPI/BrowserAPI/KeyboardEvent]]. | |||
# The blue lines are the current behavior. [line (1)] | |||
# This proposal is about adding keyboard app into the chain right before the event target (the active app). | |||
# In mozbrowser'''*before*'''keyXXX phase, Gecko dispatches the key events to keyboard app prior to deliver it to the event target if and only if keyboard app is active. [line (2)] | |||
# If keyboard app wants to handle certain keys, it should cancel the events by calling "preventDefault". | |||
# If keyboard app doesn't cancel the events, Gecko will then dispatch it to the event target as usual. [line (3)] | |||
# If keyboard app cancels the events, it should be regarded the same as cancelled by the event target and follow the same rules defined in [[WebAPI/BrowserAPI/KeyboardEvent]]. | |||
== Flowchart == | |||
[[File:InputMethod API with hardware keyboard Flowchart.png]] | |||
== Proposed API == | |||
# Internal API (mozInputMethod) | |||
## Determine whether keyboard app is active or not | |||
## Dispatch the key events to '''mozInputMethod.inputcontext''' | |||
# External API | |||
## Register/unregister a listener to handle the key events in keyboard app | |||
### Add "keydown" and "keyup" events to '''mozInputMethod.inputcontext''' object | |||
### Register: '''mozInputMethod.inputcontext.addEventListener('keydown', function handler() {});''' | |||
### Unregister: '''mozInputMethod.inputcontext.removeEventListener('keydown', handler);''' | |||
### Events are non-bubbles and cancellable. | |||
### The event objects of "keydown" and "keyup" are identical to the one that the input field expects to receive | |||
### No "keypress" since there's no use case | |||
== Limitation == | |||
If an input field is embedded in system app (i.e. there are only two levels: shell.html and system app) and gets the focus, we need to dispatch the events to the active keyboard app prior to system app (event target). Therefore, it will violate the prerequisite. | |||
'''Short-term solution''' | |||
Make the new added APIs to be certified only, and trust built-in keyboard apps doing things correctly. | |||
''' Long-term solution''' | |||
Moving all UIs out of the system app might be be a feasible solution. | |||
== Questions == | |||
Keyboard app may want to adapt its view or behavior based on the state of hardware keyboard. For instance, keyboard app can hide the qwerty panel and leave the candidate panel while a hardware keyboard is connected to the device. | |||
# How to detect whether there's a hardware keyboard connected? | |||
# Is it possible to detect the current hardware keyboard type? (e.g. qwerty or T9) |
Latest revision as of 08:13, 20 January 2015
Idea
Relevant bugs: bug 929365 (meta), bug 1110030.
The previous iteration of InputMethod API (See WebAPI/KeboardIME) enables the keyboard apps to interact with the targeted input field. We would like it to handle the connected hardware keyboard as well.
Prerequisite
The critical keys (POWER, HOME and so on) need to be handled by system app first.
Concept
This proposal is based on WebAPI/BrowserAPI/KeyboardEvent.
- The blue lines are the current behavior. [line (1)]
- This proposal is about adding keyboard app into the chain right before the event target (the active app).
- In mozbrowser*before*keyXXX phase, Gecko dispatches the key events to keyboard app prior to deliver it to the event target if and only if keyboard app is active. [line (2)]
- If keyboard app wants to handle certain keys, it should cancel the events by calling "preventDefault".
- If keyboard app doesn't cancel the events, Gecko will then dispatch it to the event target as usual. [line (3)]
- If keyboard app cancels the events, it should be regarded the same as cancelled by the event target and follow the same rules defined in WebAPI/BrowserAPI/KeyboardEvent.
Flowchart
Proposed API
- Internal API (mozInputMethod)
- Determine whether keyboard app is active or not
- Dispatch the key events to mozInputMethod.inputcontext
- External API
- Register/unregister a listener to handle the key events in keyboard app
- Add "keydown" and "keyup" events to mozInputMethod.inputcontext object
- Register: mozInputMethod.inputcontext.addEventListener('keydown', function handler() {});
- Unregister: mozInputMethod.inputcontext.removeEventListener('keydown', handler);
- Events are non-bubbles and cancellable.
- The event objects of "keydown" and "keyup" are identical to the one that the input field expects to receive
- No "keypress" since there's no use case
- Register/unregister a listener to handle the key events in keyboard app
Limitation
If an input field is embedded in system app (i.e. there are only two levels: shell.html and system app) and gets the focus, we need to dispatch the events to the active keyboard app prior to system app (event target). Therefore, it will violate the prerequisite.
Short-term solution
Make the new added APIs to be certified only, and trust built-in keyboard apps doing things correctly.
Long-term solution
Moving all UIs out of the system app might be be a feasible solution.
Questions
Keyboard app may want to adapt its view or behavior based on the state of hardware keyboard. For instance, keyboard app can hide the qwerty panel and leave the candidate panel while a hardware keyboard is connected to the device.
- How to detect whether there's a hardware keyboard connected?
- Is it possible to detect the current hardware keyboard type? (e.g. qwerty or T9)