addendum of rev c554d461ab
parent
c554d461ab
commit
023203e555
23 changed files with 2616 additions and 280 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,167 @@ |
||||
<!DOCTYPE HTML> |
||||
<html> |
||||
<!-- |
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=1122463 |
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=820057 |
||||
--> |
||||
<head> |
||||
<title>Test focus when page unloads</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=1122463">Mozilla Bug 1122463</a> |
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=820057">Mozilla Bug 820057</a> |
||||
<p id="display"></p> |
||||
<pre id="test"> |
||||
<script class="testbody" type="application/javascript;version=1.7"> |
||||
|
||||
inputmethod_setup(function() { |
||||
runTest(); |
||||
}); |
||||
|
||||
let appFrameScript = function appFrameScript() { |
||||
let form1 = content.document.body.firstElementChild; |
||||
let input1 = form1.firstElementChild; |
||||
let submit1 = form1.lastElementChild; |
||||
let input2; |
||||
|
||||
let cancelSubmit = function(evt) { |
||||
evt.preventDefault(); |
||||
}; |
||||
|
||||
// Content of the second page. |
||||
form1.action = 'data:text/html,<html><body><input value="Second"></body></html>'; |
||||
|
||||
let i = 1; |
||||
|
||||
input1.focus(); |
||||
|
||||
addMessageListener('test:next', function() { |
||||
i++; |
||||
switch (i) { |
||||
case 2: |
||||
// Click the submit button, trigger the submit event and make our |
||||
// installed event listener preventing the submission. |
||||
form1.addEventListener('submit', cancelSubmit); |
||||
submit1.click(); |
||||
|
||||
sendAsyncMessage('test:step'); |
||||
|
||||
break; |
||||
|
||||
case 3: |
||||
// Actually submit the form. |
||||
form1.removeEventListener('submit', cancelSubmit); |
||||
submit1.click(); |
||||
|
||||
break; |
||||
|
||||
case 4: |
||||
if (!content.document.body) { |
||||
content.onload = function() { |
||||
content.onload = null; |
||||
|
||||
let input2 = content.document.body.firstElementChild; |
||||
input2.focus(); |
||||
}; |
||||
|
||||
return; |
||||
} |
||||
|
||||
input2 = content.document.body.firstElementChild; |
||||
input2.focus(); |
||||
|
||||
break; |
||||
|
||||
case 5: |
||||
content.location.href = 'data:text/html,Hello!'; |
||||
|
||||
break; |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
function runTest() { |
||||
let im = navigator.mozInputMethod; |
||||
|
||||
let i = 0; |
||||
function nextStep() { |
||||
let inputcontext = navigator.mozInputMethod.inputcontext; |
||||
|
||||
i++; |
||||
switch (i) { |
||||
// focus on the first input receives the first input context. |
||||
case 1: |
||||
ok(!!inputcontext, '1) Receving the first input context'); |
||||
is(inputcontext.textAfterCursor, 'First'); |
||||
|
||||
mm.sendAsyncMessage('test:next'); |
||||
break; |
||||
|
||||
// Cancelled submission should not cause us lost focus. |
||||
case 2: |
||||
ok(!!inputcontext, '2) Receving the first input context'); |
||||
is(inputcontext.textAfterCursor, 'First'); |
||||
|
||||
mm.sendAsyncMessage('test:next'); |
||||
break; |
||||
|
||||
// Real submit and page transition should cause us lost focus. |
||||
// XXX: Unless we could delay the page transition, we does not know if |
||||
// the inputcontext is lost because of the submit or the pagehide/beforeload |
||||
// event. |
||||
case 3: |
||||
is(inputcontext, null, '3) Receving null inputcontext'); |
||||
|
||||
mm.sendAsyncMessage('test:next'); |
||||
|
||||
break; |
||||
|
||||
// Regaining focus of input in the second page. |
||||
case 4: |
||||
ok(!!inputcontext, '4) Receving the second input context'); |
||||
is(inputcontext.textAfterCursor, 'Second'); |
||||
|
||||
mm.sendAsyncMessage('test:next'); |
||||
|
||||
break; |
||||
|
||||
// Page transition should cause us lost focus |
||||
case 5: |
||||
is(inputcontext, null, '5) Receving null inputcontext'); |
||||
|
||||
inputmethod_cleanup(); |
||||
|
||||
break; |
||||
} |
||||
} |
||||
|
||||
// Set current page as an input method. |
||||
SpecialPowers.wrap(im).setActive(true); |
||||
|
||||
let iframe = document.createElement('iframe'); |
||||
iframe.src = 'data:text/html,<html><body><form id="form"><input value="First"><input type="submit"></form></body></html>'; |
||||
iframe.setAttribute('mozbrowser', true); |
||||
document.body.appendChild(iframe); |
||||
|
||||
let mm = SpecialPowers.getBrowserFrameMessageManager(iframe); |
||||
im.oninputcontextchange = nextStep; |
||||
|
||||
let frameScriptLoaded = false; |
||||
iframe.addEventListener('mozbrowserloadend', function() { |
||||
if (frameScriptLoaded) |
||||
return; |
||||
|
||||
frameScriptLoaded = true; |
||||
mm.addMessageListener('test:step', nextStep); |
||||
mm.loadFrameScript('data:,(' + encodeURIComponent(appFrameScript.toString()) + ')();', false); |
||||
}); |
||||
} |
||||
|
||||
</script> |
||||
</pre> |
||||
</body> |
||||
</html> |
||||
|