IMEHandlingGuide.rst (50183B)
1 ================== 2 IME handling guide 3 ================== 4 5 This document explains how Gecko handles IME. 6 7 Introduction 8 ============ 9 10 IME is an abbreviation of Input Method Editor. This is a technical term from 11 Windows but these days, this is used on other platforms as well. 12 13 IME is a helper application of a user's text input. It handles native key 14 events before or after focused application (depending on the platform) and 15 creates a composition string (a.k.a. preedit string), suggests a list of what 16 the user attempts to input, commits composition string as a selected item off 17 the list and commits composition string without any conversion. IME is used by 18 Chinese, Japanese, Korean and Taiwan users for inputting Chinese characters 19 because the number of them is beyond thousands and cannot be input from the 20 keyboard directly. However, especially on mobile devices nowadays, IME is also 21 used for inputting Latin languages like autocomplete. Additionally, IME may be 22 used for handwriting systems or speech input systems on some platforms. 23 24 If IME is available on focused elements, we call that state "enabled". If IME 25 is not fully available(i.e., user cannot enable IME), we call this state 26 "disabled". 27 28 If IME is enabled but users use direct input mode (e.g., for inputting Latin 29 characters), we call it "IME is closed". Otherwise, we call it "IME is open". 30 (FYI: "open" is also called "active" or "turned on". "closed" is also called 31 "inactive" or "turned off") 32 33 So, this document is useful when you're try to fix a bug for text input in 34 Gecko. 35 36 37 Composition string and clauses 38 ============================== 39 40 Typical Japanese IME can input two or more words into a composition string. 41 When a user converts from Hiragana characters to Chinese characters the 42 composition string, Japanese IME separates the composition string into multiple 43 clauses. For example, if a user types "watasinonamaehanakanodesu", it's 44 converted to Hiragana characters, "わたしのなまえはなかのです", automatically (In 45 the following screenshots, the composition string has a wavy underline and the 46 only one clause is called "raw input clause"). 47 48 .. image:: inputting_composition_string.png 49 :alt: Screenshot of raw composition string which is inputting Roman 50 character mode of MS-IME (Japanese) 51 52 .. image:: raw_composition_string.png 53 :alt: Screenshot of raw composition string whose all characters are Hiragana 54 character (MS-IME, Japanese) 55 56 When a user presses ``Convert`` key, Japanese IME separates the composition 57 string as "わたしの" (my), "なまえは" (name is) and "なかのです" (Nakano). Then, 58 converts each clause with Chinese characters: "私の", "名前は" and "中野です" (In 59 the following screenshot each clause is underlined and not connected 60 adjacently. These clauses are called "converted clause"). 61 62 .. image:: converted_composition_string.png 63 :alt: Screenshot of converted composition string (MS-IME, Japanese) 64 65 If one or more clauses were not converted as expected, the user can choose one 66 of the clauses with Arrow keys and look for the expected result form the list 67 in the drop down menu (In the following screenshot, the clause with the thicker 68 underline is called "selected clause"). 69 70 .. image:: candidatewindow.png 71 :alt: Screenshot of candidate window of MS-IME (Japanese) which converts the 72 selected clause 73 74 Basically, composition string and each clause style is rendered by Gecko. And 75 the drop down menu is created by IME. 76 77 Each clause is represented with selection in the editor. From chrome script, 78 you can check it with ``nsISelectionController``. In native code, you can 79 access it with either ``nsISelectionController`` or ``mozilla::SelectionType`` 80 (the latter is recommended because of type safer). And editor sets these IME 81 selections from ``mozilla::TextRangeType`` which are sent by 82 ``mozilla::WidgetCompositionEvent`` as ``mozilla::TextRangeArray``. The 83 following table explains the mapping between them. 84 85 .. table:: Selection types of each clause of composition string or caret 86 87 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 88 | |`nsISelectionController`_ |`mozilla::SelectionType`_|`mozilla::TextRangeType`_| 89 +============================================================+=======================================+=========================+=========================+ 90 |Caret |``SELECTION_NORMAL`` |``eNormal`` |``eCaret`` | 91 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 92 |Raw text typed by the user |``SELECTION_IME_RAW_INPUT`` |``eIMERawClause`` |``eRawClause`` | 93 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 94 |Selected clause of raw text typed by the user |``SELECTION_IME_SELECTEDRAWTEXT`` |``eIMESelectedRawClause``|``eSelectedRawClause`` | 95 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 96 |Converted clause by IME |``SELECTION_IME_CONVERTEDTEXT`` |``eIMEConvertedClause`` |``eConvertedClause`` | 97 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 98 |Selected clause by the user or IME and also converted by IME|``SELECTION_IME_SELECTEDCONVERTEDTEXT``|``eIMESelectedClause`` |``eSelectedClause`` | 99 +------------------------------------------------------------+---------------------------------------+-------------------------+-------------------------+ 100 101 Note that typically, "Selected clause of raw text typed by the user" isn't used 102 because when composition string is already separated to multiple clauses, that 103 means that the composition string has already been converted by IME at least 104 once. 105 106 .. _nsISelectionController: https://searchfox.org/mozilla-central/source/dom/base/nsISelectionController.idl 107 .. _mozilla::SelectionType: https://searchfox.org/mozilla-central/source/dom/base/nsISelectionController.idl 108 .. _mozilla::TextRangeType: https://searchfox.org/mozilla-central/source/widget/TextRange.h 109 110 Modules handling IME composition 111 ================================ 112 113 widget 114 ------ 115 116 Each widget handles native IME events and dispatches ``WidgetCompositionEvent`` 117 with ``mozilla::widget::TextEventDispatcher`` to represent the behavior of IME 118 in the focused editor. 119 120 This is the only module that depends on the users platform. See also 121 `Native IME handlers`_ section for the detail of each platform's 122 implementation. 123 124 .. note:: 125 126 Android widget still does not use ``TextEventDispatcher`` to dispatch 127 ``WidgetCompositionEvents``, see 128 `bug 1137567 <https://bugzilla.mozilla.org/show_bug.cgi?id=1137567>`__. 129 130 mozilla::widget::TextEventDispatcher 131 ------------------------------------ 132 133 This class is used by native IME handler(s) on each platform. This capsules the 134 logic to dispatch ``WidgetCompositionEvent`` and ``WidgetKeyboardEvent`` for 135 making the behavior on each platform exactly same. For example, if 136 ``WidgetKeyboardEvent`` should be dispatched when there is a composition is 137 managed by this class in XP level. First of use, native IME handlers get the 138 rights to use ``TextEventDispatcher`` with a call of 139 ``BeginNativeInputTransaction()``. Then, ``StartComposition()``, 140 ``SetPendingComposition()``, ``FlushPendingComposition()``, 141 ``CommitComposition()``, etc. are available if 142 ``BeginNativeInputTransaction()`` return true. These methods automatically 143 manage composition state and dispatch ``WidgetCompositionEvent`` properly. 144 145 This is also used by ``mozilla::TextInputProcessor`` which can emulates (or 146 implements) IME with chrome script. So, native IME handlers using this class 147 means that the dispatching part is also tested by automated tests. 148 149 mozilla::WidgetCompositionEvent 150 ------------------------------- 151 152 Internally, ``WidgetCompositionEvent`` represents native IME behavior. Its 153 message is one of following values: 154 155 eCompositionStart 156 ^^^^^^^^^^^^^^^^^ 157 158 This is dispatched at starting a composition. This represents a DOM 159 ``compositionstart`` event. The mData value is a selected string at dispatching 160 the DOM event and it's automatically set by ``TextComposition``. 161 162 eCompositionUpdate 163 ^^^^^^^^^^^^^^^^^^ 164 165 This is dispatched by ``TextComposition`` when an ``eCompositionChange`` will 166 change the composition string. This represents a DOM ``compositionupdate`` 167 event. 168 169 eCompositionEnd 170 ^^^^^^^^^^^^^^^ 171 172 This is dispatched by ``TextComposition`` when an ``eCompositionCommitAsIs`` or 173 ``eCompositionCommit`` event is dispatched. This represents a DOM 174 ``compositionend`` event. 175 176 eCompositionChange 177 ^^^^^^^^^^^^^^^^^^ 178 179 This is used internally only. This is dispatched at modifying a composition 180 string, committing a composition, changing caret position and/or changing 181 ranges of clauses. This represents a DOM text event which is not in any 182 standards. ``mRanges`` should not be empty only with this message. 183 184 eCompositionCommitAsIs 185 ^^^^^^^^^^^^^^^^^^^^^^ 186 187 This is used internally only. This is dispatched when a composition is 188 committed with the string. The ``mData`` value should be always be an empty 189 string. This causes a DOM text event without clause information and a DOM 190 ``compositionend`` event. 191 192 eCompositionCommit 193 ^^^^^^^^^^^^^^^^^^ 194 195 This is used internally only. This is dispatched when a composition is 196 committed with specific string. The ``mData`` value is the commit string. This 197 causes a DOM text event without clause information and a DOM ``compositionend`` 198 event. 199 200 .. table:: Table of event messages 201 202 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 203 | |meaning of mData |who sets ``mData``? |``mRanges`` |representing DOM event| 204 +==========================+===========================================+===============================+=======================+======================+ 205 |``eCompositionStart`` |selected string before starting composition|``TextComposition`` |``nullptr`` |``compositionstart`` | 206 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 207 |``eCompositionUpdate`` |new composition string |``TextComposition`` |``nullptr`` |``compositionupdate`` | 208 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 209 |``eCompositionEnd`` |commit string |``TextComposition`` |``nullptr`` |``compositionend`` | 210 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 211 |``eCompositionChange`` |new composition string |widget (or ``TextComposition``)|must not be ``nullptr``|``text`` | 212 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 213 |``eCompositionCommitAsIs``|N/A (must be empty) |nobody |``nullptr`` |None | 214 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 215 |``eCompositionCommit`` |commit string |widget (or ``TextComposition``)|``nullptr`` |None | 216 +--------------------------+-------------------------------------------+-------------------------------+-----------------------+----------------------+ 217 218 PresShell 219 --------- 220 221 ``PresShell`` receives the widget events and decides an event target from 222 focused document and element. Then, it sends the events and the event target to 223 ``IMEStateManager``. 224 225 mozilla::IMEStateManager 226 ------------------------ 227 228 ``IMEStateManager`` looks for a ``TextComposition`` instance whose native IME 229 context is same as the widget' which dispatches the widget event. If there is 230 no proper ``TextComposition`` instance, it creates the instance. And it sends 231 the event to the ``TextComposition`` instance. 232 233 Note that all instances of ``TextComposition`` are managed by 234 ``IMEStateManager``. When an instance is created, it's registered to the list. 235 When composition completely ends, it's unregistered from the list (and released 236 automatically). 237 238 mozilla::TextComposition 239 ------------------------ 240 241 ``TextComposition`` manages a composition and dispatches DOM 242 ``compositionupdate`` events. 243 244 When this receives an ``eCompositionChange``, ``eCompositionCommit`` or 245 ``eCompositionCommitAsIs`` event, it dispatches the event to the stored node 246 which was the event target of ``eCompositionStart`` event. Therefore, this 247 class guarantees that all composition events for a composition are fired on 248 same element. 249 250 When this receives ``eCompositionChange`` or ``eCompositionCommit``, this 251 checks if new composition string (or committing string) is different from the 252 last data stored by the ``TextComposition``. If the composition event is 253 changing the composition string, the ``TextComposition`` instance dispatches 254 ``WidgetCompositionEvent`` with ``eCompositionUpdate`` into the DOM tree 255 directly and modifies the last data. The ``eCompositionUpdate`` event will 256 cause a DOM ``compositionupdate`` event. 257 258 When this receives ``eCompositionCommitAsIs`` or ``eCompositionCommit``, this 259 dispatches an ``eCompositionEnd`` event which will cause a DOM 260 ``compositionend`` event after dispatching ``eCompositionUpdate`` event and/or 261 ``eCompositionChange`` event if necessary. 262 263 One of the other important jobs of this is, when a focused editor handles a 264 dispatched ``eCompositionChange`` event, this modifies the stored composition 265 string and its clause information. The editor refers the stored information for 266 creating or modifying a text node representing a composition string. 267 268 And before dispatching ``eComposition*`` events, this class removes ASCII 269 control characters from dispatching composition event's data in the default 270 settings. Although, this can be disabled with 271 ``"dom.compositionevent.allow_control_characters"`` pref. 272 273 Finally, this class guarantees that requesting to commit or cancel current 274 composition to IME is perefored synchronously. See 275 `Forcibly committing composition`_ section for the detail. 276 277 editor/libeditor 278 ---------------- 279 280 `mozilla::EditorEventListener <https://searchfox.org/mozilla-central/source/editor/libeditor/EditorEventListener.cpp>`__ 281 listens for trusted DOM ``compositionstart``, ``text`` and ``compositionend`` 282 events and notifies 283 `mozilla::EditorBase <https://searchfox.org/mozilla-central/source/editor/libeditor/EditorBase.cpp>`__ 284 and 285 `mozilla::TextEditor <https://searchfox.org/mozilla-central/source/editor/libeditor/TextEditor.cpp>`__ 286 of the events. 287 288 When ``EditorBase`` receives an ``eCompositionStart`` 289 (DOM ``"compositionstart"``) event, it looks for a proper ``TextComposition`` 290 instance and stores it. 291 292 When ``TextEditor`` receives an ``eCompositionChange`` (DOM ``"text"``) event, 293 it creates or modifies a text node which includes the composition string and 294 `mozilla::CompositionTransaction <https://searchfox.org/mozilla-central/source/editor/libeditor/CompositionTransaction.cpp>`__ 295 (it was called ``IMETextTxn``) sets IME selections for representing the clauses 296 of the composition string. 297 298 When ``EditorBase`` receives an ``eCompositionEnd`` (DOM ``"compositionend"``) 299 event, it releases the stored ``TextComposition`` instance. 300 301 nsTextFrame 302 ----------- 303 ``nsTextFrame`` paints IME selections. 304 305 mozilla::IMEContentObserver 306 --------------------------- 307 308 ``IMEContentObserver`` observes various changes of a focused editor. When a 309 corresponding element of a ``TextEditor`` or ``HTMLEditor`` instance gets 310 focus, an instance is created by ``IMEStateManager``, then, starts to observe 311 and notifies ``widget`` of IME getting focus. When the editor loses focus, it 312 notifies ``widget`` of IME losing focus and stops observing everything. 313 Finally, it's destroyed by ``IMEStateManager``. 314 315 This class observes selection changes (caret position changes), text changes of 316 a focused editor and layout changes (by reflow or scroll) of everything in the 317 document. It depends on the result of ``nsIWidget::GetIMEUpdatePreference()`` 318 what is observed. 319 320 When this notifies ``widget`` of something, it needs to be safe to run 321 script because notifying something may cause dispatching one or more DOM events 322 and/or new reflow. Therefore, ``IMEContentObserver`` only stores which 323 notification should be sent to ``widget``. Then, 324 ``mozilla::IMEContentObserver::IMENotificationSender`` tries to send the 325 pending notifications when it might become safe to do that. Currently, it's 326 tried: 327 328 * after a native event is dispatched from ``PresShell::HandleEventInternal()`` 329 * when new focused editor receives DOM ``focus`` event 330 * when next refresh driver tick 331 332 .. note:: 333 334 The 3rd timing may not be safe actually, but it causes a lot of oranges of 335 automated tests. 336 337 See also `Notifications to IME`_ section for the detail of sending 338 notifications. 339 340 Currently, ``WidgetQueryContentEvent`` is handled via ``IMEContentObserver`` 341 because if it has a cache of selection, it can set reply of 342 ``eQuerySelectedText`` event only with the cache. That is much faster than 343 using ``ContentEventHandler``. 344 345 e10s support 346 ============ 347 348 Even when a remote process has focus, native IME handler in chrome process does 349 its job. So, there is process boundary between native IME handler and focused 350 editor. Unfortunately, it's not allowed to use synchronous communication from 351 chrome process to a remote process. This means that chrome process (and also 352 native IME and our native IME handler) cannot query the focused editor contents 353 directly. For fixing this issue, we have ``ContentCache`` classes around 354 process boundary. 355 356 mozilla::ContentCache 357 --------------------- 358 This is a base class of ``ContentCacheInChild`` and ``ContentCacheInParent`` 359 and IPC-aware. This has common members of them including all cache data: 360 361 ``mText`` 362 Whole text in focused editor. This may be too big but IME may request all 363 text in the editor. 364 365 If we can separate editor contents per paragraph, moving selection between 366 paragraphs generates pseudo focus move, we can reduce this size and runtime 367 cost of ``ContentEventHandler``. However, we've not had a plan to do that 368 yet. Note that Microsoft Word uses this hack. 369 370 ``mCompositionStart`` 371 Offset of composition string in ``mText``. When there is no composition, 372 this is ``UINT32_MAX``. 373 374 ``mSelection::mAnchor``, ``mSelection::mFocus`` 375 Offset of selection anchor and focus in ``mText``. 376 377 ``mSelection::mWritingMode`` 378 Writing mode at selection start. 379 380 ``mSelection::mAnchorCharRect``, ``mSelection::mFocusCharRect`` 381 Next character rectangle of ``mSelection::mAnchor`` and 382 ``mSelection::mFocus``. If corresponding offset is end of the editor 383 contents, its rectangle should be a caret rectangle. 384 385 These rectangles shouldn't be empty rect. 386 387 ``mSelection::mRect`` 388 Unified character rectangle in selection range. When the selection is 389 collapsed, this should be caret rect. 390 391 ``mFirstRect`` 392 First character rect of ``mText``. When ``mText`` is empty string, this 393 should be caret rect. 394 395 ``mCaret::mOffset`` 396 Always same as selection start offset even when selection isn't collapsed. 397 398 ``mCaret::mRect`` 399 Caret rect at ``mCaret::mOffset``. If caret isn't actually exists, it's 400 computed with a character rect at the offset. 401 402 ``mTextRectArray::mStart`` 403 If there is composition, ``mStart`` is same as ``mCompositionStart``. 404 Otherwise, ``UINT32_MAX``. 405 406 ``mTextRectArray::mRects`` 407 Each character rectangle of composition string. 408 409 ``mEditorRect`` 410 The rect of editor element. 411 412 mozilla::ContentCacheInChild 413 ---------------------------- 414 415 This exists only in remote processes. This is created as a member of 416 `PuppetWidget <https://searchfox.org/mozilla-central/source/widget/PuppetWidget.cpp>`__. 417 When ``PuppetWidget`` receives notifications to IME from ``IMEContentObserver`` 418 in the remote process, it makes this class modify its cached content. Then, 419 this class do that with ``WidgetQueryContentEvents``. Finally, ``PuppetWidget`` 420 sends the notification and ``ContentCacheInParent`` instance as 421 ``ContentCache`` to its parent process. 422 423 mozilla::ContentCacheInParent 424 ----------------------------- 425 426 This exists as a member of ``TabParent``. When ``TabParent`` receives 427 notification from corresponding remote process, it assigns 428 ``ContentCacheInParent`` new ``ContentCache`` and post the notification to 429 ``ContentCacheInParent``. If all sent ``WidgetCompositionEvents`` and 430 ``WidgetSelectionEvents`` are already handled in the remote process, 431 ``ContentCacheInParent`` sending the notifications to widget. 432 433 And also this handles ``WidgetQueryContentEvents`` with its cache. Supported 434 event messages of them are: 435 436 * ``eQuerySelectedText`` (only with ``SelectionType::eNormal``) 437 * ``eQueryTextContent`` 438 * ``eQueryTextRect`` 439 * ``eQueryCaretRect`` 440 * ``eQueryEditorRect`` 441 442 Additionally, this does not support query content events with XP line breakers 443 but this must not be any problem since native IME handlers query contents with 444 native line breakers. 445 446 ``ContentCacheInParent`` also manages sent ``WidgetCompositionEvents`` and 447 ``WidgetSelectionEvents``. After these events are handled in the remote 448 process, ``TabParent`` receives it with a call of 449 ``RecvOnEventNeedingAckHandled()``. Then, it calls 450 ``ContentCacheInParent::OnEventNeedingAckHandled()``. Finally, 451 ``ContentCacheInParent`` flushes pending notifications. 452 453 How do mozilla::TextComposition and mozilla::IMEStateManager work in e10s mode? 454 ------------------------------------------------------------------------------- 455 In remote process, they work as non-e10s mode. On the other hand, they work 456 specially in parent process. 457 458 When ``IMEStateManager`` in parent process receives ``eCompositionStart``, it 459 creates ``TextComposition`` instance normally. However, if the event target has 460 remote contents, ``TextComposition::DispatchCompositionEvent()`` directly sends 461 the event to the remote process instead of dispatching the event into the 462 target DOM tree in the process. 463 464 That means that even in a parent process, anybody can retrieve 465 ``TextComposition`` instance, but it just does nothing in parent process. 466 467 ``IMEStateManager`` works more complicated because ``IMEStateManager`` in each 468 process need to negotiate about owner ship of managing input context. 469 470 When a remote process gets focus, temporarily, ``IMEStateManager`` in parent 471 process disables IME in the widget. After that, ``IMEStateManager`` in the 472 remote process will set proper input context for the focused editor. At this 473 time, ``IMEStateManager`` in the parent process does nothing. Therefore, 474 ``IMEContentObserver`` is never created while a remote process has focus. 475 476 When a remote process loses focus, ``IMEStateManager`` in parent process 477 notifies ``IMEStateManager`` in the remote process of 478 "Stop IME state management". When ``IMEStateManager::StopIMEStateManagement()`` 479 is called in the remote process by this, the ``IMEStateManager`` forgets all 480 focus information (i.e., that indicates nobody has focus). 481 482 When ``IMEStateManager`` in parent process is notified of pseudo focus move 483 from or to menubar while a remote process has focus, it notifies the remote 484 process of "Menu keyboard listener installed". Then, ``TabChild`` calls 485 ``IMEStateManager::OnInstalledMenuKeyboardListener()`` in the remote process. 486 487 Style of each clause 488 -------------------- 489 490 The style of each IME selection is managed by 491 `LookAndFeel <https://searchfox.org/mozilla-central/source/widget/LookAndFeel.h>`__ 492 class per platform. Therefore, it can be overridden by prefs. 493 494 Background color, foreground color (text color) and underline color can be 495 specified with following prefs. The values must be string of "#rrggbb" format. 496 497 * ``ui.IMERawInputBackground`` 498 * ``ui.IMERawInputForeground`` 499 * ``ui.IMERawInputUnderline`` 500 * ``ui.IMESelectedRawTextBackground`` 501 * ``ui.IMESelectedRawTextForeground`` 502 * ``ui.IMESelectedRawTextUnderline`` 503 * ``ui.IMEConvertedTextBackground`` 504 * ``ui.IMEConvertedTextForeground`` 505 * ``ui.IMEConvertedTextUnderline`` 506 * ``ui.IMESelectedConvertedTextBackground`` 507 * ``ui.IMESelectedConvertedTextForeground`` 508 * ``ui.IMESelectedConvertedTextUnderline`` 509 510 Underline style can be specified with the following prefs. The values are 511 integer, 0: none, 1: dotted, 2: dashed, 3: solid, 4: double, 5: wavy (The 512 values same as ``mozilla::StyleTextDecorationStyle`` defined in 513 `nsStyleConsts.h <https://searchfox.org/mozilla-central/source/layout/style/nsStyleConsts.h>`__). 514 515 * ``ui.IMERawInputUnderlineStyle`` 516 * ``ui.IMESelectedRawTextUnderlineStyle`` 517 * ``ui.IMEConvertedTextUnderlineStyle`` 518 * ``ui.IMESelectedConvertedTextUnderlineStyle`` 519 520 Underline width can be specified with ``"ui.IMEUnderlineRelativeSize"`` pref. 521 This affects all types of clauses. The value should be 100 or 200. 100 means 522 normal width, 200 means double width. 523 524 On some platforms, IME may support its own style for each clause. Currently, 525 this feature is supported in TSF mode of Windows and on Linux. The style 526 information is stored in ``TextRangeStyle`` which is defined in 527 `TextRange.h <https://searchfox.org/mozilla-central/source/widget/TextRange.h>`__. 528 It's a member of ``TextRange``. ``TextRange`` is stored in ``mRanges`` of 529 ``WidgetCompositionEvent`` only when its message is ``eCompositionChange``. 530 531 Lifetime of composition string 532 ============================== 533 534 When native IME notifies Gecko of starting a composition, a widget dispatches 535 ``WidgetCompositionEvent`` with ``eCompositionStart`` which will cause a DOM 536 ``compositionstart`` event. 537 538 When native IME notifies Gecko of a composition string change, a caret position 539 change and/or a change of length of clauses, a widget dispatches 540 ``WidgetCompositionEvent`` with ``eCompositionChange`` event. It will cause a 541 DOM ``compositionupdate`` event when composition string is changing. That is 542 dispatched by ``TextComposition`` automatically. After that when the widget and 543 ``PresShell`` of the focused editor have not been destroyed yet, the 544 ``eCompositionChange`` will cause a DOM text event which is not in any web 545 standards. 546 547 When native IME notifies Gecko of the ending of a composition, a widget 548 dispatches ``WidgetCompositionEvent`` with ``eCompositionCommitAsIs`` or 549 ``eCompositionCommit``. If the committing string is different from the last set 550 of data (i.e., if the event message is ``eCompositionCommit``), 551 ``TextComposition`` dispatches a DOM ``compositionupdate`` event. After that, 552 when the widget and ``PresShell`` of the focused editor have not been destroyed 553 yet, an ``eCompositionChange`` event dispatched by ``TextComposition``, that 554 causes a DOM text event. Finally, if the widget and PresShell of the focused 555 editor has not been destroyed yet too, ``TextComposition`` dispatches an 556 ``eCompositionEnd`` event which will cause a DOM compositionend event. 557 558 Limitation of handling composition 559 ================================== 560 561 Currently, ``EditorBase`` touches undo stack at receiving every 562 ``WidgetCompositionEvent``. Therefore, ``EditorBase`` requests to commit 563 composition when the following cases occur: 564 565 * The editor loses focus 566 * The caret is moved by mouse or Javascript 567 * Value of the editor is changed by Javascript 568 * Node of the editor is removed from DOM tree 569 * Somethings object is modified in an HTML editor, e.g., resizing an image 570 * Composition string is moved to a different position which is specified by 571 native IME (e.g., only a part of composition is committed) 572 573 In the future, we should fix this limitation. If we make ``EditorBase`` not 574 touch undo stack until composition is committed, some of the cases must be 575 fixed. 576 577 Notifications to IME 578 ==================== 579 580 XP part of Gecko uses ``nsIWidget::NotifyIME()`` for notifying ``widget`` of 581 something useful to handle IME. Note that some of them are notified only when 582 ``nsIWidget::GetIMEUpdatePreference()`` returns flags which request the 583 notifications. 584 585 ``NOTIFY_IME_OF_TEXT_CHANGE``, ``NOTIFY_IME_OF_SELECTION_CHANGE``, 586 ``NOTIFY_IME_OF_POSITION_CHANGE`` and 587 ``NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED`` are always sent by following order: 588 589 1. ``NOTIFY_IME_OF_TEXT_CHANGE`` 590 2. ``NOTIFY_IME_OF_SELECTION_CHANGE`` 591 3. ``NOTIFY_IME_OF_POSITION_CHANGE`` 592 4. ``NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED`` 593 594 If sending one of above notifications causes higher priority notification, the 595 sender should abort to send remaining notifications and restart from high 596 priority notification again. 597 598 Additionally, all notifications except ``NOTIFY_IME_OF_BLUR`` should be sent 599 only when it's safe to run script since the notification may cause querying 600 content and/or dispatching composition events. 601 602 NOTIFY_IME_OF_FOCUS 603 ------------------- 604 605 When an editable editor gets focus and ``IMEContentObserver`` starts to observe 606 it, this is sent to widget. This must be called after the previous 607 ``IMEContentObserver`` notified widget of ``NOTIFY_IME_OF_BLUR``. 608 609 Note that even if there are pending notifications, they are canceled when 610 ``NOTIFY_IME_OF_FOCUS`` is sent since querying content with following 611 notifications immediately after getting focus does not make sense. The result 612 is always same as the result of querying contents at receiving this 613 notification. 614 615 NOTIFY_IME_OF_BLUR 616 ------------------ 617 618 When an ``IMEContentObserver`` instance ends observing the focused editor, this 619 is sent to ``widget`` synchronously because assumed that this notification 620 causes neither query content events nor composition events. 621 622 If ``widget`` wants notifications even while all windows are inactive, 623 ``IMEContentObserver`` doesn't end observing the focused editor. I.e., in this 624 case, ``NOTIFY_IME_OF_FOCUS`` and ``NOTIFY_IME_OF_BLUR`` are not sent to 625 ``widget`` when a window which has a composition is being activated or 626 inactivated. 627 628 When ``widget`` wants notifications during inactive, ``widget`` includes 629 ``NOTIFY_DURING_DEACTIVE`` to the result of 630 ``nsIWidget::GetIMEUpdatePreference()``. 631 632 If this notification is tried to sent before sending ``NOTIFY_IME_OF_FOCUS``, 633 all pending notifications and ``NOTIFY_IME_OF_BLUR`` itself are canceled. 634 635 NOTIFY_IME_OF_TEXT_CHANGE 636 ------------------------- 637 638 When text of focused editor is changed, this is sent to ``widget`` with a range 639 of the change. But this is sent only when result of 640 ``nsIWidget::GetIMEUpdatePreference()`` includes ``NOTIFY_TEXT_CHANGE``. 641 642 If two or more text changes occurred after previous 643 ``NOTIFY_IME_OF_TEXT_CHANGE`` or ``NOTIFY_IME_OF_FOCUS``, the ranges of all 644 changes are merged. E.g., if first change is from ``1`` to ``5`` and second 645 change is from ``5`` to ``10``, the notified range is from ``1`` to ``10``. 646 647 If all merged text changes were caused by composition, 648 ``IMENotification::mTextChangeData::mCausedOnlyByComposition`` is set to true. 649 This is useful if native IME handler wants to ignore all text changes which are 650 expected by native IME. 651 652 If at least one text change of the merged text changes was caused by current 653 composition, 654 ``IMENotification::mTextChangeData::mIncludingChangesDuringComposition`` is set 655 to true. This is useful if native IME handler wants to ignore delayed text 656 change notifications. 657 658 If at least one text change of the merged text changes was caused when there 659 was no composition, 660 ``IMENotification::mTextChangeData::mIncludingChangesWithoutComposition`` is 661 set to true. 662 663 NOTIFY_IME_OF_SELECTION_CHANGE 664 ------------------------------ 665 666 When selection (or caret position) is changed in focused editor, widget is 667 notified of this. 668 669 If the last selection change was occurred by a composition event event 670 handling, ``IMENotification::mSelectionChangeData::mCausedByComposition`` is 671 set to true. This is useful if native IME handler wants to ignore the last 672 selection change which is expected by native IME. 673 674 If the last selection change was occurred by an ``eSetSelection`` event, 675 ``IMENotification::mSelectionChangeData::mCausedBySelectionEvent`` is set to 676 true. This is useful if native IME handler wants to ignore the last selection 677 change which was requested by native IME. 678 679 If the last selection is occurred during a composition, 680 ``IMENotification::mSelectionChangeData::mOccurredDuringComposition`` is set to 681 true. This is useful if native IME handler wants to ignore the last selection 682 change which occurred by web application's ``compositionstart`` or 683 ``compositionupdate`` event handler before inserting composition string. 684 685 NOTIFY_IME_OF_POSITION_CHANGE 686 ----------------------------- 687 688 When reflow or scroll occurs in the document, this is sent to widget, but this 689 is sent only when result of ``nsIWidget::GetIMEUpdatePreference()`` includes 690 ``NOTIFY_POSITION_CHANGE``. 691 692 This might be useful to update a candidate window position or something. 693 694 NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED 695 --------------------------------------- 696 697 After ``TextComposition`` handles ``eCompositionStart``, 698 ``eCompositionChange``, ``eComposiitionCommit`` or ``eCompositionCommitAsIs``, 699 this notification is sent to widget. This might be useful to update a candidate 700 window position or something. 701 702 NOTIFY_IME_OF_MOUSE_BUTTON_EVENT 703 -------------------------------- 704 705 When a ``mousedown`` event or a ``mouseup`` event is fired on a character in a 706 focused editor, this is sent to widget. But this is sent only when result of 707 ``nsIWidget::GetIMEUpdatePreference()`` includes 708 ``NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR``. This is sent with various information. 709 See ``IMENotification::mMouseButtonEventData`` in 710 `IMEData.h <https://searchfox.org/mozilla-central/source/widget/IMEData.h>`__ 711 for the detail. 712 713 If native IME supports mouse button event handling, ``widget`` should notify 714 IME of mouse button events with this. If IME consumes an event, ``widget`` 715 should return ``NS_SUCCESS_EVENT_CONSUMED`` from ``nsIWidget::NotifyIME()``. 716 Then, ``EditorBase`` doesn't handle the mouse event. 717 718 Note that if a ``mousedown`` event or a ``mouseup`` event is consumed by a web 719 application (before a focused editor handles it), this notification is not sent 720 to ``widget``. This means that web applications can handle mouse button events 721 before IME. 722 723 Requests to IME 724 =============== 725 726 XP part of Gecko can request IME to commit or cancel composition. This must be 727 requested via ``IMEStateManager::NotifyIME()``. Then, ``IMEStateManager`` looks 728 for a proper ``TextComposition`` instance. If it's found, 729 ``TextComposition::RequestToCommit()`` for calling ``nsIWidget::NotifyIME()`` 730 and handles some extra jobs. 731 732 widget should call the proper native API if it's available. Even if commit or 733 canceling composition does not occur synchronously, widget doesn't need to 734 emulate it since ``TextComposition`` will emulate it automatically. In other 735 words, widget should only request to commit or cancel composition to IME. 736 737 REQUEST_TO_COMMIT_COMPOSITION 738 ----------------------------- 739 740 A request to commit current composition to IME. See also following 741 "`Forcibly committing composition`_" section for additional information. 742 743 REQUEST_TO_CANCEL_COMPOSITION 744 ----------------------------- 745 746 A request to cancel current composition to IME. In other words, a request to 747 commit current composition with an empty string. 748 749 Forcibly committing composition 750 =============================== 751 752 When ``TextComposition::RequestToCommit()`` calls ``nsIWidget::NotifyIME()``, 753 it guarantees synchronous commit or canceling composition. 754 755 In order to put it into practice, we need to handle the following four 756 scenarios: 757 758 The composition is committed with non-empty string synchronously 759 ---------------------------------------------------------------- 760 761 This is the most usual case. In this case, ``TextComposition`` handles 762 ``WidgetCompositionEvent`` instances during a request normally. However, in a 763 remote process in e10s mode, this case never occurs since requests to native 764 IME is handled asynchronously. 765 766 The composition is not committed synchronously but later 767 -------------------------------------------------------- 768 769 This is the only case in a remote process in e10s mode or occurs on Linux even 770 in non-e10s mode if the native IME is iBus. The callers of 771 ``NotifyIME(REQUEST_TO_COMMIT_COMPOSITION)`` may expect that composition string 772 is committed immediately for their next job. For such a case, 773 ``TextComposition::RequestToCommit()`` synthesizes DOM composition events and a 774 DOM text event for emulating to commit composition synchronously. Additionally, 775 ``TextComposition`` ignores committing events which are dispatched by widget 776 when the widget receives native IME events. 777 778 In this case, using the last composition string as commit string. 779 780 However, if the last composition string is only an ideographic space (fullwidth 781 space), the composition string may be a placeholder of some old Chinese IME on 782 Windows. 783 784 .. image:: ChangJie.png 785 :alt: aScreenshot of ChangJie (Traditional Chinese IME) which puts an 786 ideographic space into composition string for placeholder 787 788 In this case, although, we should not commit the placeholder character because 789 it's not a character which the user wanted to input but we commit it as is. The 790 reason is, inputting an ideographic space causes a composition. Therefore, we 791 cannot distinguish if committing composition is unexpected. If the user uses 792 such old Chinese IME, ``"intl.ime.remove_placeholder_character_at_commit"`` 793 pref may be useful but we don't support them anymore in default settings 794 (except if somebody will find a good way to fix this issue). 795 796 The composition is committed synchronously but with empty string 797 ---------------------------------------------------------------- 798 799 This case may occur on Linux or with some IME on other platforms. If a web 800 application implements autocomplete, committing with different strings 801 especially an empty string it might cause confusion. 802 803 In this case, TextComposition overwrites the commit string of 804 ``eCompositionChange`` event dispatched by widget. However, if the last 805 composition string is only an ideographic space, it shouldn't be committed. See 806 the previous case. 807 808 Note that this case doesn't work as expected when composition is in a remote 809 process in e10s mode. 810 811 The composition is not committed 812 -------------------------------- 813 814 On Linux, there is no API to request commit or canceling composition forcibly. 815 Instead, Gecko uses ``gtk_im_context_reset()`` API for this purpose because 816 most IME cancel composition with it. But there are some IMEs which do nothing 817 when Gecko calls it. 818 819 If this occurs, Gecko should restart composition with a DOM 820 ``compositionstart`` event , a DOM ``compositionupdate`` event and a DOM 821 ``text`` event at caret position. 822 823 .. note:: 824 825 This issue hasn't been supported yet. 826 827 IME state management 828 ==================== 829 830 IME is a text input system. It means that except when a user wants to input 831 some text, IME shouldn't be available. For example, pressing the space key to 832 attempt scrolling a page may be consumed and prevented by IME. Additionally, 833 password editors need to request special behavior with IME. 834 835 For solving this issue, Gecko sets the proper IME state at DOM focus change. 836 837 First, when a DOM node gets focus, nsFocusManager notifies ``IMEStateManager`` 838 of the new focused node (calls ``IMEStateManager::OnChangeFocus()``). 839 ``IMEStateManager`` asks desired IME state by calling 840 ``nsIContent::GetDesiredIMEState()`` of the node. If the node owns 841 ``TextEditor`` instance, it asks for the desired IME state from the editor and 842 returns the result. 843 844 Next, ``IMEStateManager`` initializes ``InputContext`` (defined in 845 `IMEData.h <https://searchfox.org/mozilla-central/source/widget/IMEData.h>`__) 846 with the desired IME state and node information. Then, it calls 847 ``nsIWidget::SetInputContext()`` with the ``InputContext``. 848 849 Finally, widget stores the InputContext and enables or disables IME if the 850 platform has such an API. 851 852 InputContext 853 ------------ 854 855 InputContext is a struct. Its ``mIMEState``, ``mHTMLInputType``, 856 ``mHTMLInputInputMode`` and ``mActionHint`` are set at 857 ``nsIWidget::SetInputContext()`` called. 858 859 mIMEState 860 ^^^^^^^^^ 861 IME state has two abilities. One is enabled state: 862 863 ENABLED 864 """"""" 865 866 This means IME is fully available. E.g., when an editable element such as 867 ``<input type="text">``, ``<textarea>`` or ``<foo contenteditable>`` has focus. 868 869 DISABLED 870 """""""" 871 872 This means IME is not available. E.g., when a non-editable element has focus or 873 no element has focus, the desired IME state is ``DISABLED``. 874 875 PASSWORD 876 """""""" 877 878 This means IME state should be the same as the state when a native password 879 field has focus. This state is set only when 880 ``<input type="password"> (ime-mode: auto;)``, 881 ``<input type="text" style="ime-mode: disabled;">`` or 882 ``<textarea style="ime-mode: disabled;">``. 883 884 The other is IME open state: 885 886 DONT_CHANGE_OPEN_STATE 887 """""""""""""""""""""" 888 889 The open state of IME shouldn't be changed. I.e., Gecko should keep the last 890 IME open state. 891 892 OPEN 893 """" 894 Open IME. This is specified only when ime-mode of the new focused element is 895 ``active``. 896 897 CLOSE 898 """"" 899 Close IME. This is specified only when ime-mode of the new focused element is 900 ``inactive``. 901 902 .. note:: 903 904 E.g., on Linux, applications cannot manage IME open state. On such 905 platforms, this is ignored. 906 907 .. note:: 908 909 IME open state should be changed only when ``nsIWidget::SetInputContext()`` 910 is called at DOM focus change because changing IME open state while an 911 editor has focus makes users confused. The reason why 912 ``nsIWidget::SetInputContext()`` is called is stored in 913 ``InputContextAction::mCause``. 914 915 How does Gecko disable IME in IMM mode on Windows 916 """"""""""""""""""""""""""""""""""""""""""""""""" 917 918 Every window on Windows is associated an ``IMContext``. When Gecko disables 919 IME, 920 `mozilla::widget::IMEHandler <https://searchfox.org/mozilla-central/source/widget/windows/WinIMEHandler.cpp>`__::SetInputContext() 921 disassociates the context from the window. 922 923 How does Gecko disable IME in TSF mode on Windows 924 """"""""""""""""""""""""""""""""""""""""""""""""" 925 926 `mozilla::widget::TSFTextStore <https://searchfox.org/mozilla-central/source/widget/windows/TSFTextStore.cpp>`__ 927 sets focus to a dummy context which disables the keyboard. 928 929 How does Gecko disable IME on Mac 930 """"""""""""""""""""""""""""""""" 931 932 `mozilla::widget::TextInputHandler <https://searchfox.org/mozilla-central/source/widget/cocoa/TextInputHandler.mm>`__::HandleKeyDownEvent() 933 doesn't call focused view's interpretKeyEvents. This prevents native key events 934 to be passed to IME. 935 936 How does Gecko disable IME on GTK 937 """"""""""""""""""""""""""""""""" 938 939 `mozilla::widget::IMContextWrapper <https://searchfox.org/mozilla-central/source/widget/gtk/IMContextWrapper.cpp>`__ 940 sets focus to a dummy context which doesn't have IME composition. 941 942 How does Gecko disable IME on Android 943 """"""""""""""""""""""""""""""""""""" 944 945 ? 946 947 mHTMLInputType 948 ^^^^^^^^^^^^^^ 949 950 The value is a string representing the focused editor. 951 952 ``"text"``, ``"password"``, ``"number"``, etc. 953 When an ``<input>`` element gets focus, the value is the type of the input 954 element. 955 956 ``"textarea"`` 957 When a ``<textarea>`` element gets focus, the value is ``"textarea"``. 958 959 ``""`` 960 When an HTML editor (an element whose ``contenteditable`` attribute is 961 ``true`` or document whose ``designMode`` is ``"on"``) gets focus, the 962 value is empty. And also, when the other elements get focus. 963 964 mHTMLInputMode 965 ^^^^^^^^^^^^^^ 966 967 The value is ``inputmode`` attribute value of the focused editor. 968 969 mActionHint 970 ^^^^^^^^^^^ 971 972 The value is ``enterkeyhint`` attribute value of the focused editor when 973 ``"dom.forms.enterkeyhint"`` pref is true. This is useful for deciding the 974 caption for the submit button in virtual keyboard. E.g., the value could be 975 ``"Go"``, ``"Next"`` or ``"Search"``. 976 977 Native IME handlers 978 =================== 979 980 Following classes handles IME on each platform: 981 982 Windows 983 ------- 984 985 `mozilla::widget::IMEHandler`__ 986 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 987 988 This class manages input method context of each window and makes ``IMMHandler`` 989 or ``TSFTextStore`` work with active IME and focused editor. This class has 990 only static members, i.e., never created its instance. 991 992 __ https://searchfox.org/mozilla-central/source/widget/windows/WinIMEHandler.cpp 993 994 `mozilla::widget::IMMHandler`__ 995 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 996 997 This class is used when TSF mode is disabled by pref (``"intl.tsf.enabled"`` 998 since 108, formerly named ``"intl.tsf.enable"``) or active IME is for IMM 999 (i.e., not TIP for TSF). 1000 1001 This class handles ``WM_IME_*`` messages and uses ``Imm*()`` API. This is a 1002 singleton class since Gecko supports only on IM context in a process. 1003 Typically, a process creates windows with default IM context. Therefore, this 1004 design is enough (ideally, an instance should be created per IM context, 1005 though). The singleton instance is created when it becomes necessary. 1006 1007 __ https://searchfox.org/mozilla-central/source/widget/windows/IMMHandler.cpp 1008 1009 `mozilla::widget::TSFTextStore`__ 1010 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1011 1012 This class handles IME events in TSF mode and when TIP (IME implemented with 1013 TSF) is active. This instances are created when an editable element gets focus 1014 and released when it loses focus. 1015 1016 ``TSFTextStore`` implements some COM interfaces which is necessary to work with 1017 TIP. And similarly, there is a singleton class, ``TSFStaticSink``, to observe 1018 active TIP changes. 1019 1020 TSF is the most complicated IME API on all platforms, therefore, design of this 1021 class is also very complicated. 1022 1023 FIrst, TSF/TIP requests to lock the editor content for querying or modifying 1024 the content or selection. However, web standards don't have such mechanism. 1025 Therefore, when it's requested, ``TSFTextStore`` caches current content and 1026 selection with ``WidgetQueryContentEvent``. Then, it uses the cache to reply to 1027 query requests, and modifies the cache as they requested. At this time, 1028 ``TSFTextStore`` saves the requests of modification into the queue called 1029 ``PendingAction``. Finally, after unlocking the contents, it flushes the 1030 pending actions with dispatches ``WidgetCompositionEvent``s via 1031 ``TextEventDispatcher``. 1032 1033 Then, ``IMEContentObserver`` will notify some changes caused by the dispatched 1034 ``WidgetCompositionEvents`` (they are notified synchronously in chrome or 1035 non-e10s mode, but asynchronously from a remote process in e10s mode). At this 1036 time, ``TSFTextStore`` may receive notifications which indicates web 1037 application changes the content differently from cache in ``TSFTextStore``. 1038 However, ``TSFTextStore`` ignores such fact temporarily until the composition 1039 is finished completely. The reason is that, notifying unexpected text or 1040 selection changes to TSF and/or TIP during composition may behave them odd. 1041 1042 When a composition is committed and it receives 1043 ``NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED``, ``TSFTextStore`` clears the cache 1044 of contents and notifying TSF of merged text changes and the last selection 1045 change if they are not caused by composition. By this step, TSF and TIP may 1046 sync its internal cache with actual contents. 1047 1048 Note that if new composition is started before 1049 ``NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED`` notification, ``TSFTextStore`` 1050 handles the a composition with cached contents which may be different from 1051 actual contents. So, e.g., reconversion around caret may not work as unexpected 1052 in such case, but we don't have a good solution for this issue. 1053 1054 On the other hand, ``TSFTextStore`` cannot cache character rectangles since if 1055 there are a lot of characters, caching the rectangles require a lot of CPU cost 1056 (to compute each rect) and memory. Therefore, ``TSFTextStore`` will use 1057 insertion point relative query for them 1058 `bug 1286157 <https://bugzilla.mozilla.org/show_bug.cgi?id=1286157>`__. Then, 1059 it can retrieve expected character's rect even if the cache of ``TSFTextStore`` 1060 is different from the actual contents because TIP typically needs caret 1061 position's character rect (for a popup to indicate current input mode or next 1062 word suggestion list) or first character rect of the target clause of current 1063 composition (for a candidate list window of conversion). 1064 1065 __ https://searchfox.org/mozilla-central/source/widget/windows/TSFTextStore.cpp 1066 1067 Mac 1068 --- 1069 1070 Both IME and key events are handled in 1071 `TextInputHandler.mm <https://searchfox.org/mozilla-central/source/widget/cocoa/TextInputHandler.mm>`__. 1072 1073 ``mozilla::widget::TextInputHandlerBase`` is the most base class. 1074 ``mozilla::widget::IMEInputHandler`` inherits ``TextInputHandlerBase`` and 1075 handles IME related events. ``mozilla::widget::TextInputHandler`` inherits 1076 ``TextInputHandlerBase`` and implements ``NSTextInput`` protocol of Cocoa. Its 1077 instance is created per 1078 `nsChildView <https://searchfox.org/mozilla-central/source/widget/cocoa/nsChildView.mm>`__ 1079 instance. 1080 1081 GTK 1082 --- 1083 1084 `mozilla::widget::IMContextWrapper <https://searchfox.org/mozilla-central/source/widget/gtk/IMContextWrapper.cpp>`__ 1085 handles IME. The instance is created per top level window. 1086 1087 Android 1088 ------- 1089 1090 `org.mozilla.geckoview.GeckoEditable <https://searchfox.org/mozilla-central/source/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoEditable.java>`__ handles native IME events and `mozilla::widget::GeckoEditableSupport <https://searchfox.org/mozilla-central/source/widget/android/GeckoEditableSupport.cpp>`__ 1091 dispatches ``Widget*Event``.