Mypal/dom/inputmethod/mochitest/test_bug1043828.html

184 lines
4.8 KiB
HTML

<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1043828
-->
<head>
<title>Basic test for Switching Keyboards.</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=1043828">Mozilla Bug 1043828</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 KB frame script running in Keyboard B.
function kbFrameScript() {
function tryGetText() {
var ctx = content.navigator.mozInputMethod.inputcontext;
if (ctx) {
var p = ctx.getText();
p.then(function(){
sendAsyncMessage('test:InputMethod:getText:Resolve');
}, function(e){
sendAsyncMessage('test:InputMethod:getText:Reject');
});
} else {
dump("Could not get inputcontext") ;
}
}
addMessageListener('test:InputMethod:getText:Do', function(){
tryGetText();
});
}
function runTest() {
let app, keyboardA, keyboardB;
let getTextPromise;
let mmKeyboardA, mmKeyboardB;
/**
* Test flow:
* 1. Create two keyboard iframes & a mozbrowser iframe with a text field in it & focus the text
* field.
* 2. Set keyboard frame A as active input. Wait 200ms.
* 3. Set keyboard frame B as active input. Wait 200ms.
* 4. Set keyboard frame A as inactive. Wait 200ms.
* 5. Allow frame b to use getText() with inputcontext to get the content from the text field
* iframe. Wait 200ms.
* [Test would succeed if the Promise returned by getText() resolves correctly.
* Test would fail if otherwise]
*/
let path = location.pathname;
let basePath = location.protocol + '//' + location.host +
path.substring(0, path.lastIndexOf('/'));
const WAIT_TIME = 200;
// STEP 1: Create the frames.
function step1() {
// app
app = document.createElement('iframe');
app.src = basePath + '/file_test_app.html';
app.setAttribute('mozbrowser', true);
document.body.appendChild(app);
// keyboards
keyboardA = document.createElement('iframe');
keyboardA.setAttribute('mozbrowser', true);
document.body.appendChild(keyboardA);
keyboardB = document.createElement('iframe');
keyboardB.setAttribute('mozbrowser', true);
document.body.appendChild(keyboardB);
// simulate two different keyboard apps
let imeUrl = basePath + '/file_blank.html';
keyboardA.src = imeUrl;
keyboardB.src = imeUrl;
var handler = {
handleEvent: function(){
keyboardB.removeEventListener('mozbrowserloadend', this);
mmKeyboardB = SpecialPowers.getBrowserFrameMessageManager(keyboardB);
mmKeyboardB.loadFrameScript('data:,(' + kbFrameScript.toString() + ')();', false);
mmKeyboardB.addMessageListener('test:InputMethod:getText:Resolve', function() {
info('getText() was resolved');
inputmethod_cleanup();
});
mmKeyboardB.addMessageListener('test:InputMethod:getText:Reject', function() {
ok(false, 'getText() was rejected');
inputmethod_cleanup();
});
setTimeout(function(){
step2();
}, WAIT_TIME);
}
};
keyboardB.addEventListener('mozbrowserloadend', handler);
}
// STEP 2: Set keyboard A active
function step2() {
info('step2');
let req = keyboardA.setInputMethodActive(true);
req.onsuccess = function(){
setTimeout(function(){
step3();
}, WAIT_TIME);
};
req.onerror = function(){
ok(false, 'setInputMethodActive failed: ' + this.error.name);
inputmethod_cleanup();
};
}
// STEP 3: Set keyboard B active
function step3() {
info('step3');
let req = keyboardB.setInputMethodActive(true);
req.onsuccess = function(){
setTimeout(function(){
step4();
}, WAIT_TIME);
};
req.onerror = function(){
ok(false, 'setInputMethodActive failed: ' + this.error.name);
inputmethod_cleanup();
};
}
// STEP 4: Set keyboard A inactive
function step4() {
info('step4');
let req = keyboardA.setInputMethodActive(false);
req.onsuccess = function(){
setTimeout(function(){
step5();
}, WAIT_TIME);
};
req.onerror = function(){
ok(false, 'setInputMethodActive failed: ' + this.error.name);
inputmethod_cleanup();
};
}
// STEP 5: getText
function step5() {
info('step5');
mmKeyboardB.sendAsyncMessage('test:InputMethod:getText:Do');
}
step1();
}
</script>
</pre>
</body>
</html>