mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-09-10 11:54:40 +00:00
195 lines
5.0 KiB
HTML
195 lines
5.0 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="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="application/javascript;version=1.7" src="inputmethod_common.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/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';
|
|
|
|
SpecialPowers.pushPermissions([{
|
|
type: 'input',
|
|
allow: true,
|
|
context: {
|
|
url: imeUrl,
|
|
originAttributes: {
|
|
inBrowser: true
|
|
}
|
|
}
|
|
}], function() {
|
|
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>
|
|
|