UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

270 lines (216 loc) 6.67 kB
<!DOCTYPE html> <html> <!-- Copyright 2010 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by the Apache License, Version 2.0. See the COPYING file for details. --> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>JsUnit tests for goog.events.ImeHandler</title> <script src="../base.js"></script> <script> goog.require('goog.array'); goog.require('goog.dom'); goog.require('goog.events.ImeHandler'); goog.require('goog.object'); goog.require('goog.testing.PropertyReplacer'); goog.require('goog.testing.events'); goog.require('goog.testing.jsunit'); </script> </head> <body> <div id="sandbox"></div> <div> <b>Last 10 events:</b> <div id="logger" style='padding: 0.5em;'> </div> <script type='text/javascript'> var sandbox = goog.dom.getElement('sandbox'); var imeHandler; var eventsFired; var stubs = new goog.testing.PropertyReplacer(); var eventTypes = goog.events.ImeHandler.EventType; function setUp() { } function initImeHandler() { goog.events.ImeHandler.USES_COMPOSITION_EVENTS = goog.userAgent.GECKO || (goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher(532)); imeHandler = new goog.events.ImeHandler(sandbox); eventsFired = []; goog.events.listen( imeHandler, goog.object.getValues(goog.events.ImeHandler.EventType), function(e) { eventsFired.push(e.type); }); } function tearDown() { imeHandler.dispose(); imeHandler = null; stubs.reset(); } function tearDownPage() { // Set up a test bed. sandbox.innerHTML = '<div contentEditable="true">hello world</div>'; initImeHandler(); function unshiftEvent(e) { last10Events.unshift(e.type + ':' + e.keyCode + ':' + goog.string.htmlEscape(goog.dom.getTextContent(sandbox))); last10Events.length = Math.min(last10Events.length, 10); goog.dom.getElement('logger').innerHTML = last10Events.join('<br/>'); } var last10Events = []; goog.events.listen( imeHandler, goog.object.getValues(goog.events.ImeHandler.EventType), unshiftEvent); goog.events.listen( sandbox, ['keydown', 'textInput'], unshiftEvent); } function assertEventsFired(var_args) { assertArrayEquals( goog.array.clone(arguments), eventsFired); } function fireInputEvent(type) { return goog.testing.events.fireBrowserEvent( new goog.testing.events.Event(type, sandbox)); } function fireImeKeySequence() { return fireKeySequence(goog.events.KeyCodes.WIN_IME); } function fireKeySequence(keyCode) { return ( goog.testing.events.fireBrowserEvent( new goog.testing.events.Event('textInput', sandbox)) & goog.testing.events.fireKeySequence( sandbox, keyCode)); } function testHandleKeyDown_GeckoCompositionEvents() { // This test verifies that our IME functions can dispatch IME events to // InputHandler in the expected order on Gecko. // Set the userAgent used for this test to Firefox. setUserAgent('GECKO'); stubs.set(goog.userAgent, 'MAC', false); initImeHandler(); fireInputEvent('compositionstart'); assertImeMode(); fireInputEvent('compositionupdate'); fireInputEvent('compositionupdate'); fireInputEvent('compositionend'); assertEventsFired( eventTypes.START, eventTypes.UPDATE, eventTypes.UPDATE, eventTypes.END); assertNotImeMode(); } /** * Verifies that our IME functions can dispatch IME events to the input handler * in the expected order on Chrome. jsUnitFarm does not have Linux Chrome or * Mac Chrome. So, we manually change the platform and run this test three * times. */ function testChromeCompositionEventsLinux() { runChromeCompositionEvents('LINUX'); } function testChromeCompositionEventsMac() { runChromeCompositionEvents('MAC'); } function testChromeCompositionEventsWindows() { runChromeCompositionEvents('WINDOWS'); } function runChromeCompositionEvents(platform) { setUserAgent('WEBKIT'); setVersion(532); stubs.set(goog.userAgent, platform, true); initImeHandler(); fireImeKeySequence(); fireInputEvent('compositionstart'); assertImeMode(); fireInputEvent('compositionupdate'); fireInputEvent('compositionupdate'); fireInputEvent('compositionend'); assertEventsFired( eventTypes.START, eventTypes.UPDATE, eventTypes.UPDATE, eventTypes.END); assertNotImeMode(); } /** * Ensures that the IME mode turn on/off correctly. */ function testHandlerKeyDownForIme_imeOnOff() { setUserAgent('IE'); initImeHandler(); // Send a WIN_IME keyDown event and see whether IME mode turns on. fireImeKeySequence(); assertImeMode(); // Send keyDown events which should not turn off IME mode and see whether // IME mode holds on. fireKeySequence(goog.events.KeyCodes.SHIFT); assertImeMode(); fireKeySequence(goog.events.KeyCodes.CTRL); assertImeMode(); // Send a keyDown event with keyCode = ENTER and see whether IME mode // turns off. fireKeySequence(goog.events.KeyCodes.ENTER); assertNotImeMode(); assertEventsFired( eventTypes.START, eventTypes.END); } /** * Ensures that IME mode turns off when keyup events which are involved * in commiting IME text occurred in Safari. */ function testHandleKeyUpForSafari() { setUserAgent('WEBKIT'); setVersion(531); initImeHandler(); fireImeKeySequence(); assertImeMode(); fireKeySequence(goog.events.KeyCodes.ENTER); assertNotImeMode(); } /** * SCIM on Linux will fire WIN_IME keycodes for random characters. * Fortunately, all Linux-based browsers use composition events. * This test just verifies that we ignore the WIN_IME keycodes. */ function testScimFiresWinImeKeycodesGeckoLinux() { setUserAgent('GECKO'); assertScimInputIgnored(); } function testScimFiresWinImeKeycodesChromeLinux() { setUserAgent('WEBKIT'); setVersion(532); assertScimInputIgnored(); } function assertScimInputIgnored() { initImeHandler(); fireImeKeySequence(); assertNotImeMode(); fireInputEvent('compositionstart'); assertImeMode(); fireImeKeySequence(); assertImeMode(); fireInputEvent('compositionend'); assertNotImeMode(); } var userAgents = ['IE', 'GECKO', 'WEBKIT']; function setUserAgent(userAgent) { for (var i = 0; i < userAgents.length; i++) { stubs.set(goog.userAgent, userAgents[i], userAgents[i] == userAgent); } } function setVersion(version) { goog.userAgent.VERSION = version; goog.userAgent.isVersionOrHigherCache_ = {}; } function assertImeMode() { assertTrue('Should be in IME mode.', imeHandler.isImeMode()); } function assertNotImeMode() { assertFalse('Should not be in IME mode.', imeHandler.isImeMode()); } </script> </body> </html>