<html>
    <head>
      <base href="https://bugs.documentfoundation.org/">
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - iPad Hardware-Keyboard in iOS App: Characters appear twice"
   href="https://bugs.documentfoundation.org/show_bug.cgi?id=124906#c6">Comment # 6</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - iPad Hardware-Keyboard in iOS App: Characters appear twice"
   href="https://bugs.documentfoundation.org/show_bug.cgi?id=124906">bug 124906</a>
              from <span class="vcard"><a class="email" href="mailto:tml@iki.fi" title="Tor Lillqvist <tml@iki.fi>"> <span class="fn">Tor Lillqvist</span></a>
</span></b>
        <pre>For reference, here is a log from adding console.log calls to the original
code. From this can be seen that when I type the keys a ¨ e b , for some reason
the keydown, keypress, and keyup events for the b and c keys arrived in
duplicate, nested. That caused the b and c characters to be entered twice into
the document. What caused this duplication is unknown. Possibly some bug in
iOS, possibly some bug in the app (loleaflet) code.

<span class="quote">> [Log] ==> onKeyEvents: keydown:a keyCode=65 charCode=0 unoKeyCode=512 _keyHandled=true _isComposing=undefined (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:a keyCode=97 charCode=97 unoKeyCode=257 _keyHandled=false _isComposing=undefined (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=97 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onTextInput: _keyHandled=true (Control.MobileInput.js, line 205)
> [Log] ==> onInput: inputType=insertText (Control.MobileInput.js, line 215)
> [Log] ==> onKeyEvents: keyup:a keyCode=0 charCode=0 unoKeyCode=0 _keyHandled=true _isComposing=undefined (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)
> [Log] ==> onCompEvents: compositionstart (Control.MobileInput.js, line 188)
> [Log] ==> onCompEvents: compositionupdate (Control.MobileInput.js, line 188)
> [Log] ==> onInput: inputType=insertCompositionText (Control.MobileInput.js, line 215)
> [Log] ==> _postCompositionEvent type=input text="¨" (TileLayer.js, line 1599)
> [Log] ==> onKeyEvents: keydown:ë keyCode=69 charCode=0 unoKeyCode=516 _keyHandled=true _isComposing=true (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:ë keyCode=235 charCode=235 unoKeyCode=235 _keyHandled=false _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=235 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onTextInput: _keyHandled=true (Control.MobileInput.js, line 205)
> [Log] ==> onInput: inputType=insertFromComposition (Control.MobileInput.js, line 215)
> [Log] ==> onCompEvents: compositionend (Control.MobileInput.js, line 188)
> [Log] ==> _postCompositionEvent type=end text="" (TileLayer.js, line 1599)
> [Log] ==> onKeyEvents: keyup:Dead keyCode=69 charCode=0 unoKeyCode=516 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=516 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)
> [Log] ==> onKeyEvents: keyup:ë keyCode=0 charCode=0 unoKeyCode=0 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)


> [Log] ==> onKeyEvents: keydown:b keyCode=66 charCode=0 unoKeyCode=513 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:b keyCode=98 charCode=98 unoKeyCode=258 _keyHandled=false _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=98 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onKeyEvents: keydown:b keyCode=66 charCode=0 unoKeyCode=513 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:b keyCode=98 charCode=98 unoKeyCode=258 _keyHandled=false _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=98 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onKeyEvents: keyup:Dead keyCode=66 charCode=0 unoKeyCode=513 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=513 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)
> [Log] ==> onKeyEvents: keyup:b keyCode=0 charCode=0 unoKeyCode=0 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)
> [Log] ==> onKeyEvents: keydown:c keyCode=67 charCode=0 unoKeyCode=514 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:c keyCode=99 charCode=99 unoKeyCode=259 _keyHandled=false _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=99 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onKeyEvents: keydown:c keyCode=67 charCode=0 unoKeyCode=514 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log]     _keyHandled := false (Control.MobileInput.js, line 144)
> [Log] ==> onKeyEvents: keypress:c keyCode=99 charCode=99 unoKeyCode=259 _keyHandled=false _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=input charcode=99 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 172)
> [Log] ==> onKeyEvents: keyup:Dead keyCode=67 charCode=0 unoKeyCode=514 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=514 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)
> [Log] ==> onKeyEvents: keyup:c keyCode=0 charCode=0 unoKeyCode=0 _keyHandled=true _isComposing=false (Control.MobileInput.js, line 125)
> [Log] ==> _postKeyboardEvent type=up charcode=0 keycode=0 (TileLayer.js, line 1573)
> [Log]     _keyHandled := true (Control.MobileInput.js, line 182)</span >

When I tested with an extremely minimal HTML page with some Javascript to catch
keyboard events, I did not see any corresponding duplication, which would seem
to point the finger at our code... But no idea really.

<html>
  <head>
    <title>
      Title
    </title>

    <script>
      var keyeventhandler = function(e) {
          console.log(e.type + ' "' + e.key + '" ' + e.keyCode + ' ' +
e.charCode);
      }

      var textinputeventhandler = function(e) {
          console.log('textInput: "' + e.data + '"');
      }

      var inputeventhandler = function(e) {
          console.log(e.inputType);
      }

      var compeventhandler = function(e) {
          console.log(e.type + ' "' + e.data + '"');
      }

      window.addEventListener('keydown', keyeventhandler);
      window.addEventListener('keypress', keyeventhandler);
      window.addEventListener('keyup', keyeventhandler);

      window.addEventListener('textInput', textinputeventhandler);

      window.addEventListener('input', inputeventhandler);

      window.addEventListener('compositionstart', compeventhandler);
      window.addEventListener('compositionupdate', compeventhandler);
      window.addEventListener('compositionend', compeventhandler);

    </script>

  </head>
  <body>
    Body.
  </body>
</html></pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>