diff options
Diffstat (limited to 'dom/webidl/InputMethod.webidl')
-rw-r--r-- | dom/webidl/InputMethod.webidl | 738 |
1 files changed, 738 insertions, 0 deletions
diff --git a/dom/webidl/InputMethod.webidl b/dom/webidl/InputMethod.webidl new file mode 100644 index 000000000..ca22dcc1b --- /dev/null +++ b/dom/webidl/InputMethod.webidl @@ -0,0 +1,738 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/** + * InputMethod API implements a bridge between the web content hosting an input + * element and the input content (a.k.a. input app, virtual keyboard app, + * or IME). This API is input content facing in order for it to interact with + * the remote input element. + * The API also contains a few Gaia System app only methods + * (marked with "input-manage" permission) for Gaia System app to interact with + * some types of inputs and to regulate the input apps. + */ +[JSImplementation="@mozilla.org/b2g-inputmethod;1", + NavigatorProperty="mozInputMethod", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputMethod : EventTarget { + /** + * Activate or decactive current API instance. + * Gaia System app call this method via BrowserElement#setInputMethodActive. + */ + [ChromeOnly] + void setActive(boolean isActive); + + /** + * InputMethodManager contain a few global methods expose to input apps. + */ + readonly attribute MozInputMethodManager mgmt; + + /** + * Fired when the input context changes, include changes from and to null. + * The new InputContext instance will be available in the event + * object under |inputcontext| property. When it changes to null it + * means the app (the user of this API) no longer has the control of + * the original focused input field. + * Note that if the app saves the original context, it might get + * void; implementation decides when to void the input context. + */ + attribute EventHandler oninputcontextchange; + + /** + * An "input context" is mapped to a text field that the app is + * allow to mutate. This attribute should be null when there is no + * text field currently focused. + */ + readonly attribute MozInputContext? inputcontext; + + /** + * Add a dynamically declared input. + * + * The id must not be the same with any statically declared input in the app + * manifest. If an input of the same id is already declared, the info of that + * input will be updated. + */ + Promise<void> addInput(DOMString inputId, + MozInputMethodInputManifest inputManifest); + + /** + * Remove a dynamically declared input. + * + * The id must not be the same with any statically declared input in the app + * manifest. Silently resolves if the input is not previously declared; + * rejects if attempt to remove a statically declared input. + */ + Promise<void> removeInput(DOMString id); + + /** + * Remove focus from the current input, usable by Gaia System app, globally, + * regardless of the current focus state. + */ + void removeFocus(); + + /** + * The following are internal methods for Firefox OS System app only, + * for handling the "option" group inputs. + */ + + /** + * Set the value on the currently focused element. This has to be used + * for special situations where the value had to be chosen amongst a + * list (type=month) or a widget (type=date, time, etc.). + * If the value passed in parameter isn't valid (in the term of HTML5 + * Forms Validation), the value will simply be ignored by the element. + */ + void setValue(DOMString value); + + /** + * Select the <select> option specified by index. + * If this method is called on a <select> that support multiple + * selection, then the option specified by index will be added to + * the selection. + * If this method is called for a select that does not support multiple + * selection the previous element will be unselected. + */ + void setSelectedOption(long index); + + /** + * Select the <select> options specified by indexes. All other options + * will be deselected. + * If this method is called for a <select> that does not support multiple + * selection, then the last index specified in indexes will be selected. + */ + void setSelectedOptions(sequence<long> indexes); +}; + +/** + * InputMethodManager contains a few of the global methods for the input app. + */ +[JSImplementation="@mozilla.org/b2g-imm;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputMethodManager : EventTarget { + /** + * Ask the OS to show a list of available inputs for users to switch from. + * OS should sliently ignore this request if the app is currently not the + * active one. + */ + void showAll(); + + /** + * Ask the OS to switch away from the current active input app. + * OS should sliently ignore this request if the app is currently not the + * active one. + */ + void next(); + + /** + * If this method returns true, it is recommended that the input app provides + * a shortcut that would invoke the next() method above, for easy switching + * between inputs -- i.e. show a "global" button on screen if the input app + * implements an on-screen virtual keyboard. + * + * The returning value is depend on the inputType of the current input context. + */ + boolean supportsSwitching(); + + /** + * Ask the OS to remove the input focus, will cause the lost of input context. + * OS should sliently ignore this request if the app is currently not the + * active one. + */ + void hide(); + + /** + * Update Gecko with information on the input types which supportsSwitching() + * should return ture. + * + * @param types Array of input types in which supportsSwitching() should + * return true. + */ + void setSupportsSwitchingTypes(sequence<MozInputMethodInputContextInputTypes> types); + + /** + * CustomEvent dispatches to System when there is an input to handle. + * If the API consumer failed to handle and call preventDefault(), + * there will be a message printed on the console. + * + * evt.detail is defined by MozInputContextFocusEventDetail. + */ + attribute EventHandler oninputcontextfocus; + + /** + * Event dispatches to System when there is no longer an input to handle. + * If the API consumer failed to handle and call preventDefault(), + * there will be a message printed on the console. + */ + attribute EventHandler oninputcontextblur; + + /** + * Event dispatches to System when there is a showAll() call. + * If the API consumer failed to handle and call preventDefault(), + * there will be a message printed on the console. + */ + attribute EventHandler onshowallrequest; + + /** + * Event dispatches to System when there is a next() call. + * If the API consumer failed to handle and call preventDefault(), + * there will be a message printed on the console. + */ + attribute EventHandler onnextrequest; + + /** + * Event dispatches to System when there is a addInput() call. + * The API consumer must call preventDefault() to indicate the event is + * consumed, otherwise the request is not considered handled even if + * waitUntil() was called. + * + * evt.detail is defined by MozInputRegistryEventDetail. + */ + attribute EventHandler onaddinputrequest; + + /** + * Event dispatches to System when there is a removeInput() call. + * The API consumer must call preventDefault() to indicate the event is + * consumed, otherwise the request is not considered handled even if + * waitUntil() was called. + * + * evt.detail is defined by MozInputRegistryEventDetail. + */ + attribute EventHandler onremoveinputrequest; +}; + +/** + * Detail of the inputcontextfocus event. + */ +[JSImplementation="@mozilla.org/b2g-imm-focus;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputContextFocusEventDetail { + /** + * The type of the focused input. + */ + readonly attribute MozInputMethodInputContextTypes type; + /** + * The input type of the focused input. + */ + readonly attribute MozInputMethodInputContextInputTypes inputType; + + /** + * The following is only needed for rendering and handling "option" input types, + * in System app. + */ + + /** + * Current value of the input. + */ + readonly attribute DOMString? value; + /** + * An object representing all the <optgroup> and <option> elements + * in the <select> element. + */ + [Pure, Cached, Frozen] + readonly attribute MozInputContextChoicesInfo? choices; + /** + * Max/min value of <input> + */ + readonly attribute DOMString? min; + readonly attribute DOMString? max; +}; + +/** + * Information about the options within the <select> element. + */ +dictionary MozInputContextChoicesInfo { + boolean multiple; + sequence<MozInputMethodChoiceDict> choices; +}; + +/** + * Content of the option header (<optgroup>) or an option (<option>). + */ +dictionary MozInputMethodChoiceDict { + boolean group; + DOMString text; + boolean disabled; + boolean? inGroup; + boolean? selected; + long? optionIndex; +}; + +/** + * detail of addinputrequest or removeinputrequest event. + */ +[JSImplementation="@mozilla.org/b2g-imm-input-registry;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputRegistryEventDetail { + /** + * Manifest URL of the requesting app. + */ + readonly attribute DOMString manifestURL; + /** + * ID of the input + */ + readonly attribute DOMString inputId; + /** + * Input manifest of the input to add. + * Null for removeinputrequest event. + */ + [Pure, Cached, Frozen] + readonly attribute MozInputMethodInputManifest? inputManifest; + /** + * Resolve or Reject the addInput() or removeInput() call when the passed + * promises are resolved. + */ + [Throws] + void waitUntil(Promise<any> p); +}; + +/** + * The input context, which consists of attributes and information of current + * input field. It also hosts the methods available to the keyboard app to + * mutate the input field represented. An "input context" gets void when the + * app is no longer allowed to interact with the text field, + * e.g., the text field does no longer exist, the app is being switched to + * background, and etc. + */ +[JSImplementation="@mozilla.org/b2g-inputcontext;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputContext: EventTarget { + /** + * Type of the InputContext. See MozInputMethodInputContextTypes + */ + readonly attribute MozInputMethodInputContextTypes? type; + + /** + * InputType of the InputContext. See MozInputMethodInputContextInputTypes. + */ + readonly attribute MozInputMethodInputContextInputTypes? inputType; + + /** + * The inputmode string, representing the inputmode of the input. + * See http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#input-modalities:-the-inputmode-attribute + */ + readonly attribute DOMString? inputMode; + + /** + * The primary language for the input field. + * It is the value of HTMLElement.lang. + * See http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#htmlelement + */ + readonly attribute DOMString? lang; + + /** + * Get the whole text content of the input field. + * @return DOMString + */ + Promise<DOMString> getText(optional long offset, optional long length); + + /** + * The start and stop position of the current selection. + */ + readonly attribute long selectionStart; + readonly attribute long selectionEnd; + + /** + * The text in the current input. + */ + readonly attribute DOMString? text; + + /** + * The text before and after the begining of the selected text. + * + * You should use the text property instead because these properties are + * truncated at 100 characters. + */ + readonly attribute DOMString? textBeforeCursor; + readonly attribute DOMString? textAfterCursor; + + /** + * Set the selection range of the the editable text. + * Note: This method cannot be used to move the cursor during composition. Calling this + * method will cancel composition. + * @param start The beginning of the selected text. + * @param length The length of the selected text. + * + * Note that the start position should be less or equal to the end position. + * To move the cursor, set the start and end position to the same value. + * + * @return boolean + */ + Promise<boolean> setSelectionRange(long start, long length); + + /* User moves the cursor, or changes the selection with other means. If the text around + * cursor has changed, but the cursor has not been moved, the IME won't get notification. + * + * evt.detail is defined by MozInputContextSelectionChangeEventDetail. + */ + attribute EventHandler onselectionchange; + + /** + * Commit text to current input field and replace text around + * cursor position. It will clear the current composition. + * + * @param text The string to be replaced with. + * @param offset The offset from the cursor position where replacing starts. Defaults to 0. + * @param length The length of text to replace. Defaults to 0. + * @return boolean + */ + Promise<boolean> replaceSurroundingText(DOMString text, optional long offset, optional long length); + + /** + * Delete text around the cursor. + * @param offset The offset from the cursor position where deletion starts. + * @param length The length of text to delete. + * TODO: maybe updateSurroundingText(DOMString beforeText, DOMString afterText); ? + * @return boolean + */ + Promise<boolean> deleteSurroundingText(long offset, long length); + + /** + * Notifies when the text around the cursor is changed, due to either text + * editing or cursor movement. If the cursor has been moved, but the text around has not + * changed, the IME won't get notification. + * + * evt.detail is defined by MozInputContextSurroundingTextChangeEventDetail. + */ + attribute EventHandler onsurroundingtextchange; + + /** + * Send a string/character with its key events. There are two ways of invocating + * the method for backward compability purpose. + * + * (1) The recommended way, allow specifying DOM level 3 properties like |code|. + * @param dictOrKeyCode See MozInputMethodKeyboardEventDict. + * @param charCode disregarded + * @param modifiers disregarded + * @param repeat disregarded + * + * (2) Deprecated, reserved for backward compability. + * @param dictOrKeyCode keyCode of the key to send, should be one of the DOM_VK_ value in KeyboardEvent. + * @param charCode charCode of the character, should be 0 for non-printable keys. + * @param modifiers this paramater is no longer honored. + * @param repeat indicates whether a key would be sent repeatedly. + * + * @return A promise. Resolve to true if succeeds. + * Rejects to a string indicating the error. + * + * Note that, if you want to send a key n times repeatedly, make sure set + * parameter repeat to true and invoke sendKey n times, and invoke keyup + * after the end of the input. + */ + Promise<boolean> sendKey((MozInputMethodRequiredKeyboardEventDict or long) dictOrKeyCode, + optional long charCode, + optional long modifiers, + optional boolean repeat); + + /** + * Send a string/character with keydown, and keypress events. + * keyup should be called afterwards to ensure properly sequence. + * + * @param dict See MozInputMethodKeyboardEventDict. + * + * @return A promise. Resolve to true if succeeds. + * Rejects to a string indicating the error. + */ + Promise<boolean> keydown(MozInputMethodRequiredKeyboardEventDict dict); + + /** + * Send a keyup event. keydown should be called first to ensure properly sequence. + * + * @param dict See MozInputMethodKeyboardEventDict. + * + * @return A promise. Resolve to true if succeeds. + * Rejects to a string indicating the error. + */ + Promise<boolean> keyup(MozInputMethodRequiredKeyboardEventDict dict); + + /** + * Set current composing text. This method will start composition or update + * composition if it has started. The composition will be started right + * before the cursor position and any selected text will be replaced by the + * composing text. When the composition is started, calling this method can + * update the text and move cursor winthin the range of the composing text. + * @param text The new composition text to show. + * @param cursor The new cursor position relative to the start of the + * composition text. The cursor should be positioned within the composition + * text. This means the value should be >= 0 and <= the length of + * composition text. Defaults to the lenght of composition text, i.e., the + * cursor will be positioned after the composition text. + * @param clauses The array of composition clause information. If not set, + * only one clause is supported. + * @param dict The properties of the keyboard event that cause the composition + * to set. keydown or keyup event will be fired if it's necessary. + * For compatibility, we recommend that you should always set this argument + * if it's caused by a key operation. + * + * The composing text, which is shown with underlined style to distinguish + * from the existing text, is used to compose non-ASCII characters from + * keystrokes, e.g. Pinyin or Hiragana. The composing text is the + * intermediate text to help input complex character and is not committed to + * current input field. Therefore if any text operation other than + * composition is performed, the composition will automatically end. Same + * apply when the inputContext is lost during an unfinished composition + * session. + * + * To finish composition and commit text to current input field, an IME + * should call |endComposition|. + */ + Promise<boolean> setComposition(DOMString text, + optional long cursor, + optional sequence<CompositionClauseParameters> clauses, + optional MozInputMethodKeyboardEventDict dict); + + /** + * End composition, clear the composing text and commit given text to + * current input field. The text will be committed before the cursor + * position. + * @param text The text to commited before cursor position. If empty string + * is given, no text will be committed. + * @param dict The properties of the keyboard event that cause the composition + * to end. keydown or keyup event will be fired if it's necessary. + * For compatibility, we recommend that you should always set this argument + * if it's caused by a key operation. + * + * Note that composition always ends automatically with nothing to commit if + * the composition does not explicitly end by calling |endComposition|, but + * is interrupted by |sendKey|, |setSelectionRange|, + * |replaceSurroundingText|, |deleteSurroundingText|, user moving the + * cursor, changing the focus, etc. + */ + Promise<boolean> endComposition(optional DOMString text, + optional MozInputMethodKeyboardEventDict dict); + + /** + * The interface used to receive the native events from hardware keyboard + */ + readonly attribute MozHardwareInput? hardwareinput; +}; + +/* + * This interface will be added into inputcontext and used to receive the + * events from the hardware keyboard. + * Example: + * mozInputMethod.inputcontext.hardwareinput.addEventListener('keyup', this); + * mozInputMethod.inputcontext.hardwareinput.removeEventListener('keyup', this); + */ +[JSImplementation="@mozilla.org/b2g-hardwareinput;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozHardwareInput: EventTarget { +}; + +/** + * Detail of the selectionchange event. + */ +[JSImplementation="@mozilla.org/b2g-imm-selectionchange;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputContextSelectionChangeEventDetail { + /** + * Indicate whether or not the change is due to our own action from, + * for example, sendKey() call. + * + * Note: this property is untrustworthy because it would still be true even + * if script in the page changed the text synchronously upon responding to + * events trigger by the call. + */ + readonly attribute boolean ownAction; + + /** + * The start and stop position of the current selection. + */ + readonly attribute long selectionStart; + readonly attribute long selectionEnd; +}; + +/** + * Detail of the surroundingtextchange event. + */ +[JSImplementation="@mozilla.org/b2g-imm-surroundingtextchange;1", + Pref="dom.mozInputMethod.enabled", + ChromeOnly] +interface MozInputContextSurroundingTextChangeEventDetail { + /** + * Indicate whether or not the change is due to our own action from, + * for example, sendKey() call. + * + * Note: this property is untrustworthy because it would still be true even + * if script in the page changed the text synchronously upon responding to + * events trigger by the call. + */ + readonly attribute boolean ownAction; + + /** + * The text in the current input. + */ + readonly attribute DOMString? text; + + /** + * The text before and after the begining of the selected text. + * + * You should use the text property instead because these properties are + * truncated at 100 characters. + */ + readonly attribute DOMString? textBeforeCursor; + readonly attribute DOMString? textAfterCursor; +}; + +enum CompositionClauseSelectionType { + "raw-input", + "selected-raw-text", + "converted-text", + "selected-converted-text" +}; + +dictionary CompositionClauseParameters { + CompositionClauseSelectionType selectionType = "raw-input"; + long length; +}; + +/** + * Types are HTML tag names of the inputs that is explosed with InputContext, + * *and* the special keyword "contenteditable" for contenteditable element. + */ +enum MozInputMethodInputContextTypes { + "input", "textarea", "contenteditable", + /** + * <select> is managed by the API but it is handled by the System app only, + * so this value is only accessible by System app from inputcontextfocus event. + */ + "select" +}; + +/** + * InputTypes of the input that InputContext is representing. The value + * is inferred from the type attribute of element. + * + * See https://html.spec.whatwg.org/multipage/forms.html#states-of-the-type-attribute + * for types of HTMLInputElement. + * + * They are divided into groups -- an layout/input capable of handling one type + * in the group is considered as capable of handling all of the types in the + * same group. + * The layout/input that could handle type "text" is considered as the fallback + * if none of layout/input installed can handle a specific type. + * + * Groups and fallbacks is enforced in Gaia System app currently. + * + * Noted that the actual virtual keyboard to show, for example in the case of + * Gaia Keyboard app, will also depend on the inputMode of the input element. + */ +enum MozInputMethodInputContextInputTypes { + /** + * Group "text". Be reminded that contenteditable element is assigned with + * an input type of "textarea". + */ + "text", "search", "textarea", + /** + * Group "number" + */ + "number", "tel", + /** + * Group "url" + */ + "url", + /** + * Group "email" + */ + "email", + /** + * Group "password". + * An non-Latin alphabet layout/input should not be able to handle this type. + */ + "password", + /** + * Group "option". These types are handled by System app itself currently, so + * no input app will be set to active for these input types. + * System app access these types from inputcontextfocus event. + * ("select-one" and "select-multiple" are valid HTMLSelectElement#type.) + */ + "datetime", "date", "month", "week", "time", "datetime-local", "color", + "select-one", "select-multiple" + /** + * These types are ignored by the API even though they are valid + * HTMLInputElement#type. + */ + //"checkbox", "radio", "file", "submit", "image", "range", "reset", "button" +}; + +/** + * An input app can host multiple inputs (a.k.a. layouts) and the capability of + * the input is described by the input manifest. + */ +dictionary MozInputMethodInputManifest { + required DOMString launch_path; + required DOMString name; + DOMString? description; + sequence<MozInputMethodInputContextInputTypes> types; +}; + +/** + * A MozInputMethodKeyboardEventDictBase contains the following properties, + * indicating the properties of the keyboard event caused. + * + * This is the base dictionary type for us to create two child types that could + * be used as argument type in two types of methods, as WebIDL parser required. + * + */ +dictionary MozInputMethodKeyboardEventDictBase { + /** + * String/character to output, or a registered name of non-printable key. + * (To be defined in the inheriting dictionary types.) + */ + // DOMString key; + /** + * String/char indicating the virtual hardware key pressed. Optional. + * Must be a value defined in + * http://www.w3.org/TR/DOM-Level-3-Events-code/#keyboard-chording-virtual + * If your keyboard app emulates physical keyboard layout, this value should + * not be empty string. Otherwise, it should be empty string. + */ + DOMString code = ""; + /** + * keyCode of the keyboard event. Optional. + * To be disregarded if |key| is an alphanumeric character. + * If the key causes inputting a character and if your keyboard app emulates + * a physical keyboard layout, this value should be same as the value used + * by Firefox for desktop. If the key causes inputting an ASCII character + * but if your keyboard app doesn't emulate any physical keyboard layouts, + * the value should be proper value for the key value. + */ + long? keyCode; + /** + * Indicates whether a key would be sent repeatedly. Optional. + */ + boolean repeat = false; + /** + * Optional. True if |key| property is explicitly referring to a printable key. + * When this is set, key will be printable even if the |key| value matches any + * of the registered name of non-printable keys. + */ + boolean printable = false; +}; + +/** + * For methods like setComposition() and endComposition(), the optional + * dictionary type argument is really optional when all of it's property + * are optional. + * This dictionary type is used to denote that argument. + */ +dictionary MozInputMethodKeyboardEventDict : MozInputMethodKeyboardEventDictBase { + DOMString? key; +}; + +/** + * For methods like keydown() and keyup(), the dictionary type argument is + * considered required only if at least one of it's property is required. + * This dictionary type is used to denote that argument. + */ +dictionary MozInputMethodRequiredKeyboardEventDict : MozInputMethodKeyboardEventDictBase { + required DOMString key; +}; |