mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-05 08:35:26 +00:00
452 lines
14 KiB
HTML
452 lines
14 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=338583
|
|
-->
|
|
<head>
|
|
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
|
|
<title>Test for Bug 338583</title>
|
|
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
|
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
|
|
|
</head>
|
|
<body bgColor=white>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=338583">Mozilla Bug 338583</a>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
|
|
</div>
|
|
<pre id="test">
|
|
<script class="testbody" type="text/javascript">
|
|
/** Tests for Bug 338583 **/
|
|
|
|
// we test:
|
|
// 1) the EventSource behaviour
|
|
// 2) if the events are trusted
|
|
// 3) possible invalid eventsources
|
|
// 4) the close method when the object is just been used
|
|
// 5) access-control
|
|
// 6) the data parameter
|
|
// 7) delayed server responses
|
|
|
|
// --
|
|
|
|
function runAllTests() {
|
|
// these tests run asynchronously
|
|
doTest1(); // this will take 8000 ms
|
|
doTest2(); // this will take 5000 ms
|
|
doTest3(); // this will take 1500 ms
|
|
doTest3_b(); // this will take 1500 ms
|
|
doTest3_c(); // this will take 1500 ms
|
|
doTest3_d(); // this will take 1500 ms
|
|
doTest3_e(); // this will take 1500 ms
|
|
doTest3_f(); // this will take 1500 ms
|
|
doTest3_g(); // this will take 1500 ms
|
|
doTest3_h(); // this will take 1500 ms
|
|
doTest4(); // this will take 3000 ms
|
|
doTest4_b(); // this will take 3000 ms
|
|
doTest5(); // this will take 3000 ms
|
|
doTest5_b(); // this will take 3000 ms
|
|
doTest6(); // this will take 2500 ms
|
|
doTest7(); // this will take 8000 ms
|
|
}
|
|
|
|
function fn_onmessage(e) {
|
|
if (e.currentTarget == e.target && e.target.hits != null)
|
|
e.target.hits['fn_onmessage']++;
|
|
}
|
|
|
|
function fn_event_listener_message(e) {
|
|
if (e.currentTarget == e.target && e.target.hits != null)
|
|
e.target.hits['fn_event_listener_message']++;
|
|
}
|
|
|
|
function fn_other_event_name(e) {
|
|
if (e.currentTarget == e.target && e.target.hits != null)
|
|
e.target.hits['fn_other_event_name']++;
|
|
}
|
|
|
|
var domBranch;
|
|
var oldPrefVal;
|
|
|
|
var gEventSourceObj1 = null;
|
|
var gEventSourceObj2 = null;
|
|
var gEventSourceObj3_a = null, gEventSourceObj3_b = null,
|
|
gEventSourceObj3_c = null, gEventSourceObj3_d = null,
|
|
gEventSourceObj3_e = null, gEventSourceObj3_f = null,
|
|
gEventSourceObj3_g = null, gEventSourceObj3_h = null;
|
|
var gEventSourceObj4_a = null, gEventSourceObj4_b = null;
|
|
var gEventSourceObj5_a = null, gEventSourceObj5_b = null;
|
|
var gEventSourceObj6 = null;
|
|
var gEventSourceObj7 = null;
|
|
var stress_factor; // used in the setTimeouts in order to help
|
|
// the test when running in slow machines
|
|
|
|
function hasBeenHitFor1And2(obj, min) {
|
|
if (obj.hits['fn_onmessage'] < min ||
|
|
obj.hits['fn_event_listener_message'] < min ||
|
|
obj.hits['fn_other_event_name'] < min)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
// in order to test (1):
|
|
// a) if the EventSource constructor parameter is equal to its url attribute
|
|
// b) let its fn_onmessage, fn_event_listener_message, and fn_other_event_name functions listeners be hit four times each
|
|
// c) the close method (we expect readyState == CLOSED)
|
|
// d) the close method (we expect no message events anymore)
|
|
|
|
function doTest1() {
|
|
gEventSourceObj1 = new EventSource("eventsource.resource");
|
|
ok(gEventSourceObj1.url == "http://mochi.test:8888/tests/content/base/test/eventsource.resource", "Test 1.a failed.");
|
|
ok(gEventSourceObj1.readyState == 0 || gEventSourceObj1.readyState == 1, "Test 1.a failed.");
|
|
|
|
doTest1_b();
|
|
}
|
|
|
|
function doTest1_b() {
|
|
gEventSourceObj1.hits = [];
|
|
gEventSourceObj1.hits['fn_onmessage'] = 0;
|
|
gEventSourceObj1.onmessage = fn_onmessage;
|
|
gEventSourceObj1.hits['fn_event_listener_message'] = 0;
|
|
gEventSourceObj1.addEventListener('message', fn_event_listener_message, true);
|
|
gEventSourceObj1.hits['fn_other_event_name'] = 0;
|
|
gEventSourceObj1.addEventListener('other_event_name', fn_other_event_name, true);
|
|
|
|
// the eventsources.res always use a retry of 0.5 second, so for four hits a timeout of 6 seconds is enough
|
|
setTimeout(function(){
|
|
bhits = hasBeenHitFor1And2(gEventSourceObj1, 4);
|
|
ok(bhits, "Test 1.b failed.");
|
|
|
|
doTest1_c();
|
|
}, parseInt(6000*stress_factor));
|
|
}
|
|
|
|
function doTest1_c() {
|
|
gEventSourceObj1.close();
|
|
ok(gEventSourceObj1.readyState == 2, "Test 1.c failed.");
|
|
|
|
doTest1_d();
|
|
}
|
|
|
|
function doTest1_d() {
|
|
gEventSourceObj1.hits['fn_onmessage'] = 0;
|
|
gEventSourceObj1.hits['fn_event_listener_message'] = 0;
|
|
gEventSourceObj1.hits['fn_other_event_name'] = 0;
|
|
|
|
setTimeout(function(){
|
|
bhits = hasBeenHitFor1And2(gEventSourceObj1, 1);
|
|
ok(!bhits, "Test 1.d failed.");
|
|
gEventSourceObj1.close();
|
|
}, parseInt(2000*stress_factor));
|
|
}
|
|
|
|
// in order to test (2)
|
|
// a) set a eventsource that give the dom events messages
|
|
// b) expect trusted events
|
|
|
|
function doTest2() {
|
|
var func = function(e) {
|
|
ok(e.isTrusted, "Test 2 failed");
|
|
gEventSourceObj2.close();
|
|
};
|
|
|
|
gEventSourceObj2 = new EventSource("eventsource.resource");
|
|
gEventSourceObj2.onmessage = func;
|
|
|
|
setTimeout(function(){ // just to clean...
|
|
gEventSourceObj2.close();
|
|
}, parseInt(5000*stress_factor));
|
|
}
|
|
|
|
// in order to test (3)
|
|
// a) XSite domain error test
|
|
// b) protocol file:// test
|
|
// c) protocol javascript: test
|
|
// d) wrong Content-Type test
|
|
// e) bad http response code test
|
|
// f) message eventsource without a data test
|
|
// g) eventsource with invalid NCName char in the event field test
|
|
// h) DNS error
|
|
|
|
function doTest3() {
|
|
gEventSourceObj3_a = new EventSource("http://example.org/tests/content/base/test/eventsource.resource");
|
|
|
|
gEventSourceObj3_a.onmessage = fn_onmessage;
|
|
gEventSourceObj3_a.hits = [];
|
|
gEventSourceObj3_a.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_a.hits['fn_onmessage'] == 0, "Test 3.a failed");
|
|
gEventSourceObj3_a.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function doTest3_b() {
|
|
var xhr = new XMLHttpRequest;
|
|
xhr.open("GET", "/dynamic/getMyDirectory.sjs", false);
|
|
xhr.send();
|
|
var basePath = xhr.responseText;
|
|
|
|
gEventSourceObj3_b = new EventSource("file://" + basePath + "eventsource.resource");
|
|
|
|
gEventSourceObj3_b.onmessage = fn_onmessage;
|
|
gEventSourceObj3_b.hits = [];
|
|
gEventSourceObj3_b.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_b.hits['fn_onmessage'] == 0, "Test 3.b failed");
|
|
gEventSourceObj3_b.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function jsEvtSource()
|
|
{
|
|
return "event: message\n" +
|
|
"data: 1\n\n";
|
|
}
|
|
|
|
function doTest3_c() {
|
|
gEventSourceObj3_c = new EventSource("javascript: return jsEvtSource()");
|
|
|
|
gEventSourceObj3_c.onmessage = fn_onmessage;
|
|
gEventSourceObj3_c.hits = [];
|
|
gEventSourceObj3_c.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_c.hits['fn_onmessage'] == 0, "Test 3.c failed");
|
|
gEventSourceObj3_c.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function doTest3_d() {
|
|
gEventSourceObj3_d = new EventSource("badContentType.eventsource");
|
|
|
|
gEventSourceObj3_d.onmessage = fn_onmessage;
|
|
gEventSourceObj3_d.hits = [];
|
|
gEventSourceObj3_d.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_d.hits['fn_onmessage'] == 0, "Test 3.d failed");
|
|
gEventSourceObj3_d.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function doTest3_e() {
|
|
gEventSourceObj3_e = new EventSource("badHTTPResponseCode.eventsource");
|
|
|
|
gEventSourceObj3_e.onmessage = fn_onmessage;
|
|
gEventSourceObj3_e.hits = [];
|
|
gEventSourceObj3_e.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_e.hits['fn_onmessage'] == 0, "Test 3.e failed");
|
|
gEventSourceObj3_e.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function doTest3_f() {
|
|
gEventSourceObj3_f = new EventSource("badMessageEvent.eventsource");
|
|
|
|
gEventSourceObj3_f.onmessage = fn_onmessage;
|
|
gEventSourceObj3_f.hits = [];
|
|
gEventSourceObj3_f.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_f.hits['fn_onmessage'] == 0, "Test 3.f failed");
|
|
gEventSourceObj3_f.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function fnInvalidNCName() {
|
|
fnInvalidNCName.hits++;
|
|
}
|
|
|
|
function doTest3_g() {
|
|
gEventSourceObj3_g = new EventSource("badEventFieldName.eventsource");
|
|
|
|
fnInvalidNCName.hits = 0;
|
|
gEventSourceObj3_g.addEventListener('message event', fnInvalidNCName, true);
|
|
|
|
setTimeout(function() {
|
|
ok(fnInvalidNCName.hits != 0, "Test 3.g failed");
|
|
gEventSourceObj3_g.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
function doTest3_h() {
|
|
gEventSourceObj3_h = new EventSource("http://hdfskjghsbg.jtiyoejowe.dafsgbhjab.com");
|
|
|
|
gEventSourceObj3_h.onmessage = fn_onmessage;
|
|
gEventSourceObj3_h.hits = [];
|
|
gEventSourceObj3_h.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj3_h.hits['fn_onmessage'] == 0, "Test 3.h failed");
|
|
gEventSourceObj3_h.close();
|
|
}, parseInt(1500*stress_factor));
|
|
}
|
|
|
|
// in order to test (4)
|
|
// a) close the object when it is in use, which is being processed and that is expected
|
|
// to dispatch more eventlisteners
|
|
// b) remove an eventlistener in use
|
|
|
|
function fn_onmessage4_a(e)
|
|
{
|
|
if (e.data > gEventSourceObj4_a.lastData)
|
|
gEventSourceObj4_a.lastData = e.data;
|
|
if (e.data == 2)
|
|
gEventSourceObj4_a.close();
|
|
}
|
|
|
|
function fn_onmessage4_b(e)
|
|
{
|
|
if (e.data > gEventSourceObj4_b.lastData)
|
|
gEventSourceObj4_b.lastData = e.data;
|
|
if (e.data == 2)
|
|
gEventSourceObj4_b.removeEventListener('message', fn_onmessage4_b, true);
|
|
}
|
|
|
|
function doTest4() {
|
|
gEventSourceObj4_a = new EventSource("forRemoval.resource");
|
|
gEventSourceObj4_a.lastData = 0;
|
|
gEventSourceObj4_a.onmessage = fn_onmessage4_a;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj4_a.lastData == 2, "Test 4.a failed");
|
|
gEventSourceObj4_a.close();
|
|
}, parseInt(3000*stress_factor));
|
|
}
|
|
|
|
function doTest4_b()
|
|
{
|
|
gEventSourceObj4_b = new EventSource("forRemoval.resource");
|
|
gEventSourceObj4_b.lastData = 0;
|
|
gEventSourceObj4_b.addEventListener('message', fn_onmessage4_b, true);
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj4_b.lastData == 2, "Test 4.b failed");
|
|
gEventSourceObj4_b.close();
|
|
}, parseInt(3000*stress_factor));
|
|
}
|
|
|
|
// in order to test (5)
|
|
// a) valid access-control xsite request (but must fail)
|
|
// b) invalid access-control xsite request
|
|
|
|
function doTest5()
|
|
{
|
|
gEventSourceObj5_a = new EventSource("http://example.org/tests/content/base/test/accesscontrol.resource");
|
|
|
|
gEventSourceObj5_a.onmessage = fn_onmessage;
|
|
gEventSourceObj5_a.hits = [];
|
|
gEventSourceObj5_a.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj5_a.hits['fn_onmessage'] == 0, "Test 5.a failed");
|
|
gEventSourceObj5_a.close();
|
|
}, parseInt(3000*stress_factor));
|
|
}
|
|
|
|
function doTest5_b()
|
|
{
|
|
gEventSourceObj5_b = new EventSource("http://example.org/tests/content/base/test/invalid_accesscontrol.resource");
|
|
|
|
gEventSourceObj5_b.onmessage = fn_onmessage;
|
|
gEventSourceObj5_b.hits = [];
|
|
gEventSourceObj5_b.hits['fn_onmessage'] = 0;
|
|
|
|
setTimeout(function() {
|
|
ok(gEventSourceObj5_b.hits['fn_onmessage'] == 0, "Test 5.b failed");
|
|
gEventSourceObj5_b.close();
|
|
}, parseInt(3000*stress_factor));
|
|
}
|
|
|
|
function doTest6()
|
|
{
|
|
gEventSourceObj6 = new EventSource("somedatas.resource");
|
|
var fn_somedata = function(e) {
|
|
if (fn_somedata.expected == 0) {
|
|
ok(e.data == "123456789\n123456789123456789\n123456789123456789123456789123456789\n 123456789123456789123456789123456789123456789123456789123456789123456789\nçãá\"\'@`~Ý Ḿyyyy",
|
|
"Test 6.a failed");
|
|
} else if (fn_somedata.expected == 1) {
|
|
ok(e.data == " :xxabcdefghij\nçãá\"\'@`~Ý Ḿyyyy : zz",
|
|
"Test 6.b failed");
|
|
} else if (fn_somedata.expected == 2) {
|
|
ok(e.data == "1", "Test 6.c failed");
|
|
gEventSourceObj6.close();
|
|
} else {
|
|
ok(false, "Test 6 failed (unexpected message event)");
|
|
}
|
|
fn_somedata.expected++;
|
|
}
|
|
fn_somedata.expected = 0;
|
|
gEventSourceObj6.onmessage = fn_somedata;
|
|
|
|
setTimeout(function() {
|
|
gEventSourceObj6.close();
|
|
}, parseInt(2500*stress_factor));
|
|
}
|
|
|
|
function doTest7()
|
|
{
|
|
gEventSourceObj7 = new EventSource("delayedServerEvents.sjs");
|
|
gEventSourceObj7.msg_received = [];
|
|
gEventSourceObj7.onmessage = function(e)
|
|
{
|
|
e.target.msg_received.push(e.data);
|
|
}
|
|
|
|
setTimeout(function() {
|
|
gEventSourceObj7.close();
|
|
|
|
ok(gEventSourceObj7.msg_received[0] == "" &&
|
|
gEventSourceObj7.msg_received[1] == "delayed1" &&
|
|
gEventSourceObj7.msg_received[2] == "delayed2", "Test 7 failed");
|
|
|
|
SpecialPowers.setBoolPref("dom.server-events.enabled", oldPrefVal);
|
|
document.getElementById('waitSpan').innerHTML = '';
|
|
SimpleTest.finish();
|
|
}, parseInt(8000*stress_factor));
|
|
}
|
|
|
|
function doTest()
|
|
{
|
|
oldPrefVal = SpecialPowers.getBoolPref("dom.server-events.enabled");
|
|
SpecialPowers.setBoolPref("dom.server-events.enabled", true);
|
|
|
|
// we get a good stress_factor by testing 10 setTimeouts and some float
|
|
// arithmetic taking my machine as stress_factor==1 (time=589)
|
|
|
|
var begin_time = (new Date()).getTime();
|
|
|
|
var f = function() {
|
|
for (var j=0; j<f.i; ++j)
|
|
eval("Math.log(Math.atan(Math.sqrt(Math.pow(3.1415, 13.1415))/0.0007))");
|
|
if (f.i < 10) {
|
|
f.i++;
|
|
setTimeout(f, 10 + 10*f.i);
|
|
} else {
|
|
stress_factor = ((new Date()).getTime()-begin_time)*1/589;
|
|
stress_factor *= 1.10; // also, a margin of 10%
|
|
|
|
runAllTests();
|
|
}
|
|
}
|
|
f.i = 0;
|
|
|
|
setTimeout(f, 10);
|
|
}
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
addLoadEvent(doTest);
|
|
|
|
</script>
|
|
</pre>
|
|
<span id=waitSpan>Wait please...</span>
|
|
</body>
|
|
</html>
|
|
|