/*******************************************************************************
 * Copyright (c) 2011, 2012 EclipseSource and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   EclipseSource - initial API and implementation
 ******************************************************************************/

qx.Class.define( "org.eclipse.rwt.test.tests.KeyEventSupportTest", {

  extend : qx.core.Object,

  construct : function() {
    this.base( arguments );
    org.eclipse.rwt.test.fixture.TestUtil.prepareTimerUse();
  },

  members : {

    testSetActiveKeysByProtocol : function() {
      var processor = rwt.protocol.MessageProcessor;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();

      processor.processOperation( {
        "target" : "w1",
        "action" : "set",
        "properties" : {
          "activeKeys" : [ "#65", "CTRL+#65" ]
        }
      } );

      var expected = { "#65" : true, "CTRL+#65" : true };
      assertEquals( expected, keyUtil._keyBindings );
      keyUtil.setKeyBindings( {} );
    },

    testSetCancelKeysByProtocol : function() {
      var processor = rwt.protocol.MessageProcessor;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();

      processor.processOperation( {
        "target" : "w1",
        "action" : "set",
        "properties" : {
          "cancelKeys" : [ "#65", "CTRL+#65" ]
        }
      } );

      var expected = { "#65" : true, "CTRL+#65" : true };
      assertEquals( expected, keyUtil._cancelKeys );
      keyUtil.setCancelKeys( {} );
    },

    testKeyBindingSingleCharacter : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "#66" : true } );
      TestUtil.press( widget, "b" );
      assertEquals( 1, TestUtil.getRequestsSend() );

      var msg = TestUtil.getMessageObject();

      assertEquals( 66, msg.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingWithMissingKeypressEventUpperCase : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "CTRL+SHIFT+#66" : true } );
      var dom = qx.event.type.DomEvent;
      var mod = dom.CTRL_MASK | dom.SHIFT_MASK;

      TestUtil.fireFakeKeyDomEvent( widget.getElement(), "keydown", "B", mod );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 66, msg.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 66, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingWithMissingKeypressEventLowerCase : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "CTRL+#66" : true } );
      var dom = qx.event.type.DomEvent;

      TestUtil.fireFakeKeyDomEvent( widget.getElement(), "keydown", "b", dom.CTRL_MASK );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 66, msg.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingSingleCharacterHold : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "#66" : true } );

      TestUtil.keyDown( widget.getElement(), "b", 0 );
      TestUtil.keyHold( widget.getElement(), "b", 0 );
      TestUtil.keyUp( widget.getElement(), "b", 0 );

      assertEquals( 2, TestUtil.getRequestsSend() );
      var msg1 = TestUtil.getMessageObject( 0 );
      var msg2 = TestUtil.getMessageObject( 1 );
      assertEquals( 66, msg1.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg1.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      assertEquals( 66, msg2.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg2.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingSingleCharacterHoldAndCancel : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "#66" : true } );
      keyUtil.setCancelKeys( { "#66" : true } );

      TestUtil.keyDown( widget.getElement(), "b", 0 );
      TestUtil.keyHold( widget.getElement(), "b", 0 );
      TestUtil.keyUp( widget.getElement(), "b", 0 );

      assertEquals( 2, TestUtil.getRequestsSend() );
      var msg1 = TestUtil.getMessageObject( 0 );
      var msg2 = TestUtil.getMessageObject( 1 );
      assertEquals( 66, msg1.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg1.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      assertEquals( 66, msg2.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 98, msg2.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingSpecialCharacter : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "/" : true } );

      TestUtil.press( widget, "/", false, 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 47, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingPointCharacter : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "." : true } );

      TestUtil.press( widget, ".", false, 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 46, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testKeyBindingsPreventDefaultNotCalled : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var prevented = false;
      var preventDefault = function() {
        prevented = true;
      };
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "#66" : true } );
      var node = widget._getTargetNode();
      var event = TestUtil.createFakeDomKeyEvent( node, "keydown", "b", 0 );
      event.preventDefault = preventDefault;
      TestUtil.fireFakeDomEvent( event );
      assertFalse( prevented );
      widget.destroy();
    },

    testKeyBindingWithServerKeyListener : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      widget.setUserData( "isControl", true );
      widget.setUserData( "keyListener", true );
      widget.focus();
      keyUtil.setKeyBindings( { "#66" : true } );
      assertEquals( 0, TestUtil.getRequestsSend() );
      TestUtil.press( widget, "b", false, 0 );
      TestUtil.forceTimerOnce();
      assertEquals( 1, TestUtil.getRequestsSend() );
      assertTrue( keyUtil._keyEventRequestRunning !== true );
      widget.destroy();
    },

    testKeyBindingWithClientKeyListener : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      var log = [];
      var logger = function( event ) {
        log.push( event );
      };
      widget.addEventListener( "keydown", logger );
      widget.addEventListener( "keypress", logger );
      widget.addEventListener( "keyup", logger );
      widget.focus();
      keyUtil.setKeyBindings( { "#66" : true } );
      assertEquals( 0, TestUtil.getRequestsSend() );
      TestUtil.press( widget, "a", false, 0 );
      assertEquals( 0, TestUtil.getRequestsSend() );
      assertEquals( 3, log.length );
      TestUtil.press( widget, "b", false, 0 );
      TestUtil.forceTimerOnce();
      assertEquals( 1, TestUtil.getRequestsSend() );
      assertEquals( 6, log.length );
      widget.destroy();
    },

    testKeyBindingsNoModifiersAllowed : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( {
        "66" : true
      } );
      var dom = qx.event.type.DomEvent;
      TestUtil.press( widget, "b", false, dom.CTRL_MASK );
      TestUtil.press( widget, "b", false, dom.ALT_MASK );
      TestUtil.press( widget, "b", false, dom.SHIFT_MASK );
      var all = dom.CTRL_MASK | dom.SHIFT_MASK | dom.ALT_MASK;
      TestUtil.press( widget, "b", false, all );
      assertEquals( 0, TestUtil.getRequestsSend() );
      widget.destroy();
    },

    testKeyBindingsModifiersNeeded : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( {
        "SHIFT+#66" : true
      } );
      var dom = qx.event.type.DomEvent;
      TestUtil.press( widget, "b", false, 0 );
      TestUtil.press( widget, "b", false, dom.ALT_MASK );
      assertEquals( 0, TestUtil.getRequestsSend() );
      TestUtil.press( widget, "b", false, dom.SHIFT_MASK );
      assertEquals( 1, TestUtil.getRequestsSend() );
      widget.destroy();
    },

    testKeyBindingsModifiersOrder : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "ALT+CTRL+SHIFT+#66" : true } );
      var dom = qx.event.type.DomEvent;
      TestUtil.press( widget, "b", false, 0 );
      TestUtil.press( widget, "b", false, dom.CTRL_MASK );
      TestUtil.press( widget, "b", false, dom.ALT_MASK );
      TestUtil.press( widget, "b", false, dom.SHIFT_MASK );
      assertEquals( 0, TestUtil.getRequestsSend() );
      var all = dom.CTRL_MASK | dom.SHIFT_MASK | dom.ALT_MASK;
      TestUtil.press( widget, "b", false, all );
      assertEquals( 1, TestUtil.getRequestsSend() );
      widget.destroy();
    },

    testKeyBindingShiftAndNumberOnKeypress : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.initRequestLog();
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setKeyBindings( { "SHIFT+#53" : true } );
      var dom = qx.event.type.DomEvent;

      TestUtil.fireFakeKeyDomEvent( widget.getElement(), "keydown", 53, dom.SHIFT_MASK );
      assertEquals( 0, TestUtil.getRequestsSend() );
      TestUtil.fireFakeKeyDomEvent( widget.getElement(), "keypress", 53, dom.SHIFT_MASK );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 53, msg.findNotifyProperty( "w1", "KeyDown", "keyCode" ) );
      assertEquals( 53, msg.findNotifyProperty( "w1", "KeyDown", "charCode" ) );
      widget.destroy();
    },

    testCancelKeysPreventDefaultNotCalled : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var prevented = false;
      var preventDefault = function() {
        prevented = true;
      };
      var widget = this._createWidget();
      keyUtil.setCancelKeys( { "#66" : true } ); // "b"
      var node = widget._getTargetNode();
      var event = TestUtil.createFakeDomKeyEvent( node, "keydown", "a", 0 );
      event.preventDefault = preventDefault;
      TestUtil.fireFakeDomEvent( event );
      assertFalse( prevented );
      widget.destroy();
    },

    testCancelKeysPreventDefaultCalled : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var preventedDown = false;
      var preventedPress = false;
      var widget = this._createWidget();
      keyUtil.setCancelKeys( { "#66" : true } );
      var node = widget._getTargetNode();
      var eventDown = TestUtil.createFakeDomKeyEvent( node, "keydown", "b", 0 );
      eventDown.preventDefault = function() {
        preventedDown = true;
      };
      var eventPress = TestUtil.createFakeDomKeyEvent( node, "keypress", "b", 0 );
      eventPress.preventDefault = function() {
        preventedPress = true;
      };
      TestUtil.fireFakeDomEvent( eventDown );
      TestUtil.fireFakeDomEvent( eventPress );
      assertTrue( preventedDown );
      assertTrue( preventedPress );
      widget.destroy();
    },

    testCancelKeysPreventDefaultCalledIfSent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var preventedDown = false;
      var preventedPress = false;
      var widget = this._createWidget();
      keyUtil.setCancelKeys( { "#13" : true } );
      keyUtil.setKeyBindings( { "#13" : true } );
      var node = widget._getTargetNode();
      var eventDown = TestUtil.createFakeDomKeyEvent( node, "keydown", 13, 0 );
      eventDown.preventDefault = function() {
        preventedDown = true;
      };
      var eventPress = TestUtil.createFakeDomKeyEvent( node, "keypress", 13, 0 );
      eventPress.preventDefault = function() {
        preventedPress = true;
      };
      TestUtil.fireFakeDomEvent( eventDown );
      TestUtil.fireFakeDomEvent( eventPress );
      assertTrue( preventedDown );
      assertTrue( preventedPress );
      widget.destroy();
    },

    testCancelKeysNotProcessed : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var widget = this._createWidget();
      keyUtil.setCancelKeys( { "#66" : true } );
      var listener = function() {
        fail();
      };
      widget.addEventListener( "keydown", listener );
      widget.addEventListener( "keypress", listener );
      widget.addEventListener( "keyup", listener );
      TestUtil.press( widget, "b" );
      TestUtil.cleanUpKeyUtil();
      widget.destroy();
    },

    testBufferEvents : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var req = rwt.remote.Server.getInstance();
      req.removeEventListener( "received", keyUtil._onRequestReceived, keyUtil );
      TestUtil.initRequestLog();
      var text = this._createTextWidget();
      TestUtil.press( text, "x", false, 0 );
      assertEquals( 0, keyUtil._bufferedEvents.length );
      TestUtil.press( text, "y", false, 0 );
      assertEquals( 1, keyUtil._bufferedEvents.length );
      TestUtil.press( text, "z", false, 0 );
      assertEquals( 2, keyUtil._bufferedEvents.length );
      assertEquals( 1, TestUtil.getRequestsSend() );
      keyUtil._onRequestReceived();
      assertEquals( 2, TestUtil.getRequestsSend() );
      assertEquals( 1, keyUtil._bufferedEvents.length );
      keyUtil._onRequestReceived();
      assertEquals( 3, TestUtil.getRequestsSend() );
      assertEquals( 0, keyUtil._bufferedEvents.length );
      req.addEventListener( "received", keyUtil._onRequestReceived, keyUtil );
      this._disposeTextWidget( text );
    },

    testBufferedEventInfo : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var keyUtil = org.eclipse.rwt.KeyEventSupport.getInstance();
      var req = rwt.remote.Server.getInstance();
      req.removeEventListener( "received", keyUtil._onRequestReceived, keyUtil );
      TestUtil.initRequestLog();
      var text = this._createTextWidget();
      TestUtil.press( text, "x", false, 0 );
      TestUtil.press( text, "y", false, 0 );
      assertEquals( 1, keyUtil._bufferedEvents.length );

      keyUtil._onRequestReceived();

      assertEquals( 2, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject( 1 );
      assertEquals( 89, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 121, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      assertFalse( msg.findNotifyProperty( "w3", "KeyDown", "ctrlKey" ) );
      assertFalse( msg.findNotifyProperty( "w3", "KeyDown", "shiftKey" ) );
      assertFalse( msg.findNotifyProperty( "w3", "KeyDown", "altKey" ) );
      req.addEventListener( "received", keyUtil._onRequestReceived, keyUtil );
      this._disposeTextWidget( text );
    },

    testKeyEventListenerUntrustedKey : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      var node = text._inputElement;
      // cancel event
      assertEquals( 0, TestUtil.getRequestsSend() );
      TestUtil.fireFakeKeyDomEvent( node, "keydown", 37 );
      this._disposeTextWidget( text );
    },

    testNotifyTraverse : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();

      TestUtil.press( text, 9, false );

      var msg = TestUtil.getMessageObject();
      assertEquals( 9, msg.findNotifyProperty( "w3", "Traverse", "keyCode" ) );
      assertEquals( 0, msg.findNotifyProperty( "w3", "Traverse", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testKeyCodeLowerCase : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();

      TestUtil.press( text, "a", 0 );

      var msg = TestUtil.getMessageObject();
      assertEquals( 65, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 97, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testKeyCodeUpperCase : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();

      TestUtil.press( text, "A", 0 );

      var msg = TestUtil.getMessageObject();
      assertEquals( 65, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 65, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testSendModifier : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      var shift = qx.event.type.DomEvent.SHIFT_MASK;

      TestUtil.keyDown( text.getElement(), "Shift", shift );
      TestUtil.keyHold( text.getElement(), "Shift", shift );

      var msg = TestUtil.getMessageObject();
      assertEquals( 16, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 0, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testShiftCharacter : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      var shift = qx.event.type.DomEvent.SHIFT_MASK;
      TestUtil.keyDown( text.getElement(), "Shift", shift );
      TestUtil.keyDown( text.getElement(), "A", shift );

      assertEquals( 2, TestUtil.getRequestsSend() );

      this._disposeTextWidget( text );
    },

    testSetActiveKeys : function() {
      var text = this._createTextWidget();

      this._setActiveKeys( text, [ "a", "b" ] );

      var expected = { "a" : true, "b" : true };
      assertEquals( expected, text.getUserData( "activeKeys" ) );
      this._disposeTextWidget( text );
    },

    testNonActiveCharKeysNotSent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [] );

      TestUtil.press( text, "a", 0 );
      TestUtil.press( text, "A", 0 );
      TestUtil.press( text, "z", 0 );
      TestUtil.press( text, "Z", 0 );

      assertEquals( 0, TestUtil.getRequestsSend() );
      this._disposeTextWidget( text );
    },

    testActiveLowerCharKeySent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "#90" ] );

      TestUtil.press( text, "a", 0 );
      TestUtil.press( text, "z", 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 90, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 122, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testActiveUpperCharKeySent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "#90" ] );

      TestUtil.press( text, "Z", 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 90, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 90, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testActiveSpecialKeySent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "#40" ] );

      TestUtil.press( text, "Up", 0 );
      TestUtil.press( text, "Down", 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 40, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      assertEquals( 0, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testDontSendCtrlTab : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "CTRL+#9", "CTRL+SHIFT+#9" ] );
      var dom = qx.event.type.DomEvent;

      TestUtil.press( text, 9, false, dom.CTRL_MASK );
      TestUtil.press( text, 9, false, dom.CTRL_MASK | dom.SHIFT_MASK );

      assertEquals( 0, TestUtil.getRequestsSend() );
      this._disposeTextWidget( text );
    },

    testActiveSpecialCharKeySent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "/" ] );

      TestUtil.press( text, "\\", 0 );
      TestUtil.press( text, "/", 0 );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 47, msg.findNotifyProperty( "w3", "KeyDown", "charCode" ) );
      this._disposeTextWidget( text );
    },

    testActiveKeySequenceSent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setActiveKeys( text, [ "ALT+CTRL+#90" ] );
      var dom = qx.event.type.DomEvent;
      TestUtil.press( text, "z", false, 0 );
      TestUtil.press( text, "z", false, dom.CTRL_MASK );
      TestUtil.press( text, "z", false, dom.ALT_MASK );
      TestUtil.press( text, "z", false, dom.SHIFT_MASK );
      assertEquals( 0, TestUtil.getRequestsSend() );

      TestUtil.press( text, "z", false, dom.ALT_MASK | dom.CTRL_MASK );

      assertEquals( 1, TestUtil.getRequestsSend() );
      var msg = TestUtil.getMessageObject();
      assertEquals( 90, msg.findNotifyProperty( "w3", "KeyDown", "keyCode" ) );
      this._disposeTextWidget( text );
    },

    testCancelKeySequenceNotProcessed : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setCancelKeys( text, [
        "#90",
        "ALT+#90",
        "CTRL+#90",
        "SHIFT+#90"
      ] );
      var log = [];
      var listener = function( e ) {
        log.push( e );
      };
      text.addEventListener( "keydown", listener );
      text.addEventListener( "keypress", listener );
      text.addEventListener( "keyup", listener );
      var dom = qx.event.type.DomEvent;
      TestUtil.press( text, "z", false, 0 );
      TestUtil.press( text, "z", false, dom.CTRL_MASK );
      TestUtil.press( text, "z", false, dom.ALT_MASK );
      TestUtil.press( text, "z", false, dom.SHIFT_MASK );
      assertEquals( 0, log.length );

      TestUtil.press( text, "z", false, dom.ALT_MASK | dom.CTRL_MASK );

      assertEquals( 3, log.length );
      this._disposeTextWidget( text );
    },

    testCancelKeySequenceSent : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      var text = this._createTextWidget();
      this._setCancelKeys( text, [
        "#90",
        "ALT+#90",
        "CTRL+#90",
        "SHIFT+#90"
      ] );

      var dom = qx.event.type.DomEvent;

      TestUtil.press( text, "z", false, 0 );
      TestUtil.press( text, "z", false, dom.CTRL_MASK );
      TestUtil.press( text, "z", false, dom.ALT_MASK );
      TestUtil.press( text, "z", false, dom.SHIFT_MASK );

      assertEquals( 4, TestUtil.getRequestsSend() );
      this._disposeTextWidget( text );
    },

    setUp : function() {
      display = rwt.widgets.Display.getCurrent();
      var adapter = rwt.protocol.AdapterRegistry.getAdapter( "rwt.widgets.Display" );
      rwt.protocol.ObjectRegistry.add( "w1", display, adapter );
    },

    _createWidget : function() {
      var result = new rwt.widgets.base.MultiCellWidget( [] );
      result.addToDocument();
      result.setLocation( 0, 0 );
      result.setDimension( 100, 100 );
      rwt.widgets.base.Widget.flushGlobalQueues();
      rwt.protocol.ObjectRegistry.add( "w11", result );
      return result;
    },

    _createTextWidget : function() {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.createShellByProtocol( "w2" );
      var processor = rwt.protocol.MessageProcessor;
      processor.processOperation( {
        "target" : "w3",
        "action" : "create",
        "type" : "rwt.widgets.Text",
        "properties" : {
          "style" : [ "SINGLE", "RIGHT" ],
          "parent" : "w2"
        }
      } );
      processor.processOperation( {
        "target" : "w3",
        "action" : "listen",
        "properties" : {
          "KeyDown" : true,
          "Traverse" : true
        }
      } );
      var text = rwt.protocol.ObjectRegistry.getObject( "w3" );
      TestUtil.flush();
      text.focus();
      TestUtil.initRequestLog();
      return text;
    },

    _disposeTextWidget : function( text ) {
      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
      TestUtil.clearRequestLog();
      text.blur(); // otherwise TextUtil will crash on next server-request.
      text.destroy();
      TestUtil.flush();
    },

    _setActiveKeys : function( widget, activeKeys ) {
      var id = rwt.protocol.ObjectRegistry.getId( widget );
      var processor = rwt.protocol.MessageProcessor;
      processor.processOperation( {
        "target" : id,
        "action" : "set",
        "properties" : {
          "activeKeys" : activeKeys
        }
      } );
    },

    _setCancelKeys : function( widget, cancelKeys ) {
      var id = rwt.protocol.ObjectRegistry.getId( widget );
      var processor = rwt.protocol.MessageProcessor;
      processor.processOperation( {
        "target" : id,
        "action" : "set",
        "properties" : {
          "cancelKeys" : cancelKeys
        }
      } );
    }

  }

} );