<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=944397 --> <head> <title>Basic test for InputMethod API.</title> <script type="application/javascript;version=1.7" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> <script type="application/javascript;version=1.7" src="inputmethod_common.js"></script> <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=944397">Mozilla Bug 944397</a> <p id="display"></p> <pre id="test"> <script class="testbody" type="application/javascript;version=1.7"> SimpleTest.requestFlakyTimeout("untriaged"); inputmethod_setup(function() { runTest(); }); // The frame script running in file_test_app.html. function appFrameScript() { let input = content.document.getElementById('test-input'); input.oninput = function() { sendAsyncMessage('test:InputMethod:oninput', { value: input.value }); }; } function runTest() { let app, keyboard; /** * So this test does the following: * 1. Create a mozbrowser iframe with a text field in it, and focus the text field * 2. 100ms. after loading we create new keyboard iframe, that will try to execute * replaceSurroundingText on the current active inputcontext * 3. That should trigger 'input' event on the said text field * 4. And if that happens we know everything is OK */ let path = location.pathname; let basePath = location.protocol + '//' + location.host + path.substring(0, path.lastIndexOf('/')); // STEP 1: Create an app frame to recieve keyboard inputs. function step1() { app = document.createElement('iframe'); app.src = basePath + '/file_test_app.html'; app.setAttribute('mozbrowser', true); document.body.appendChild(app); app.addEventListener('mozbrowserloadend', function() { let mm = SpecialPowers.getBrowserFrameMessageManager(app); mm.loadFrameScript('data:,(' + appFrameScript.toString() + ')();', false); mm.addMessageListener("test:InputMethod:oninput", function(ev) { step4(SpecialPowers.wrap(ev).json.value); }); step2(); }); } function step2() { // STEP 2a: Create a browser frame to load the input method app. keyboard = document.createElement('iframe'); keyboard.setAttribute('mozbrowser', true); document.body.appendChild(keyboard); // STEP 2b: Grant input privileges to the keyboard iframe let imeUrl = basePath + '/file_inputmethod.html#data'; // STEP 2c: Tell Gecko to use this iframe as its keyboard app let req = keyboard.setInputMethodActive(true); req.onsuccess = function() { ok(true, 'setInputMethodActive succeeded.'); }; req.onerror = function() { ok(false, 'setInputMethodActive failed: ' + this.error.name); inputmethod_cleanup(); }; // STEP 3: Loads the input method app to the browser frame after a delay. setTimeout(function() { keyboard.src = imeUrl; }, 100); } function step4(val) { ok(true, 'Keyboard input was received.'); is(val, '#dataYuan', 'Input value'); inputmethod_cleanup(); } step1(); } </script> </pre> </body> </html>