summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/eventsource
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/eventsource')
-rw-r--r--testing/web-platform/tests/eventsource/OWNERS5
-rw-r--r--testing/web-platform/tests/eventsource/README.md54
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-close.htm36
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm49
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.htm34
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-eventtarget.worker.js11
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onmesage.htm36
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onopen.htm39
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-prototype.htm36
-rw-r--r--testing/web-platform/tests/eventsource/dedicated-worker/eventsource-url.htm35
-rw-r--r--testing/web-platform/tests/eventsource/event-data.html44
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-close.htm82
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-constructor-document-domain.htm29
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-constructor-non-same-origin.htm35
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-constructor-stringify.htm39
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-constructor-url-bogus.htm16
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-constructor-url-multi-window.htm37
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-cross-origin.htm64
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-eventtarget.htm26
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-onmessage.htm25
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-onopen.htm28
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-prototype.htm21
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-reconnect.htm58
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-request-cancellation.htm32
-rw-r--r--testing/web-platform/tests/eventsource/eventsource-url.htm20
-rw-r--r--testing/web-platform/tests/eventsource/format-bom-2.htm35
-rw-r--r--testing/web-platform/tests/eventsource/format-bom.htm35
-rw-r--r--testing/web-platform/tests/eventsource/format-comments.htm27
-rw-r--r--testing/web-platform/tests/eventsource/format-data-before-final-empty-line.htm29
-rw-r--r--testing/web-platform/tests/eventsource/format-field-data.htm34
-rw-r--r--testing/web-platform/tests/eventsource/format-field-event-empty.htm25
-rw-r--r--testing/web-platform/tests/eventsource/format-field-event.htm27
-rw-r--r--testing/web-platform/tests/eventsource/format-field-id-2.htm38
-rw-r--r--testing/web-platform/tests/eventsource/format-field-id.htm34
-rw-r--r--testing/web-platform/tests/eventsource/format-field-parsing.htm26
-rw-r--r--testing/web-platform/tests/eventsource/format-field-retry-bogus.htm31
-rw-r--r--testing/web-platform/tests/eventsource/format-field-retry-empty.htm25
-rw-r--r--testing/web-platform/tests/eventsource/format-field-retry.htm33
-rw-r--r--testing/web-platform/tests/eventsource/format-field-unknown.htm25
-rw-r--r--testing/web-platform/tests/eventsource/format-leading-space.htm26
-rw-r--r--testing/web-platform/tests/eventsource/format-mime-bogus.htm37
-rw-r--r--testing/web-platform/tests/eventsource/format-mime-trailing-semicolon.htm32
-rw-r--r--testing/web-platform/tests/eventsource/format-mime-valid-bogus.htm36
-rw-r--r--testing/web-platform/tests/eventsource/format-newlines.htm25
-rw-r--r--testing/web-platform/tests/eventsource/format-null-character.html30
-rw-r--r--testing/web-platform/tests/eventsource/format-utf-8.htm26
-rw-r--r--testing/web-platform/tests/eventsource/interfaces.html58
-rw-r--r--testing/web-platform/tests/eventsource/request-accept.htm25
-rw-r--r--testing/web-platform/tests/eventsource/request-cache-control.htm37
-rw-r--r--testing/web-platform/tests/eventsource/request-credentials.htm49
-rw-r--r--testing/web-platform/tests/eventsource/request-redirect.htm36
-rw-r--r--testing/web-platform/tests/eventsource/request-status-error.htm39
-rw-r--r--testing/web-platform/tests/eventsource/resources/accept.event_stream2
-rw-r--r--testing/web-platform/tests/eventsource/resources/cache-control.event_stream2
-rw-r--r--testing/web-platform/tests/eventsource/resources/cors-cookie.py31
-rw-r--r--testing/web-platform/tests/eventsource/resources/cors.py34
-rw-r--r--testing/web-platform/tests/eventsource/resources/init.htm9
-rw-r--r--testing/web-platform/tests/eventsource/resources/last-event-id.py11
-rw-r--r--testing/web-platform/tests/eventsource/resources/message.py14
-rw-r--r--testing/web-platform/tests/eventsource/resources/message2.py35
-rw-r--r--testing/web-platform/tests/eventsource/resources/reconnect-fail.py24
-rw-r--r--testing/web-platform/tests/eventsource/resources/status-error.py4
-rw-r--r--testing/web-platform/tests/eventsource/resources/status-reconnect.py21
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-close.htm39
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm52
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-url-bogus.htm37
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-eventtarget.htm40
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-onmesage.htm39
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-onopen.htm42
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-prototype.htm39
-rw-r--r--testing/web-platform/tests/eventsource/shared-worker/eventsource-url.htm38
71 files changed, 2284 insertions, 0 deletions
diff --git a/testing/web-platform/tests/eventsource/OWNERS b/testing/web-platform/tests/eventsource/OWNERS
new file mode 100644
index 000000000..4f8d605d7
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/OWNERS
@@ -0,0 +1,5 @@
+@zqzhang
+@sideshowbarker
+@deniak
+@Velmont
+@Yaffle
diff --git a/testing/web-platform/tests/eventsource/README.md b/testing/web-platform/tests/eventsource/README.md
new file mode 100644
index 000000000..6b58a1ef5
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/README.md
@@ -0,0 +1,54 @@
+# Server-Sent Events Test Collection
+
+Server-Sent Events [latest draft](http://dev.w3.org/html5/eventsource/).
+
+Following up work done during the TestTWF 2012 Paris event:
+
+Most tests comes from [Opera](http://tc.labs.opera.com/apis/EventSource/), are from august 2010 and probably only valid against [spec rev. ~1.139](http://dev.w3.org/cvsweb/~checkout~/html5/eventsource/Overview.html?rev=1.139;content-type=text%2Fhtml). You can check the following diff :
+
+[diff between 1.139 (23 Jul 2010) and 1.229 (25 Oct. 2012) revisions](http://dev.w3.org/cvsweb/html5/eventsource/Overview.html.diff?r1=text&tr1=1.139&r2=text&tr2=1.229)
+
+to get an idea of what needs to get updated.
+
+##DONE (updated against rev. 1.229):
+- **eventsource-constructor-url-bogus.htm**: whatwg r6602: renamed SYNTAX_ERR to SyntaxError
+
+- **eventsource-constructor-stringify.htm**: still valid. bugfix.
+
+##TODO (need to be updated against rev. 1.229):
+- **eventsource-cross-origin.htm**, **eventsource-constructor-non-same-origin.htm**: whatwg 6255 6257: allow CORS
+
+##TOCHECK (need to check if the test is still valid against rev.1.229):
+eventsource-close.htm
+eventsource-constructor-document-domain.htm
+eventsource-constructor-url-multi-window.htm
+eventsource-eventtarget.htm
+eventsource-onmessage.htm
+eventsource-onopen.htm
+eventsource-prototype.htm
+eventsource-reconnect.htm
+eventsource-url.htm
+format-bom-2.htm
+format-bom.htm
+format-comments.htm
+format-field-data.htm
+format-field-event-empty.htm
+format-field-event.htm
+format-field-id-2.htm
+format-field-id.htm
+format-field-parsing.htm
+format-field-retry-bogus.htm
+format-field-retry-empty.htm
+format-field-retry.htm
+format-field-unknown.htm
+format-leading-space.htm
+format-mime-bogus.htm
+format-mime-trailing-semicolon.htm
+format-mime-valid-bogus.htm
+format-newlines.htm
+format-utf-8.htm
+request-accept.htm
+request-cache-control.htm
+request-credentials.htm
+request-redirect.htm
+request-status-error.htm
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-close.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-close.htm
new file mode 100644
index 000000000..42ebb1da8
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-close.htm
@@ -0,0 +1,36 @@
+<!--
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ this.close()
+ postMessage([true, this.readyState])
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: close()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test();
+ test.step(function() {
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.CLOSED, 'this.readyState')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
new file mode 100644
index 000000000..9fe515d2a
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
@@ -0,0 +1,49 @@
+<!--
+try {
+ var url = decodeURIComponent(location.hash.substr(1))
+ var source = new EventSource(url)
+ source.onerror = function(e) {
+ postMessage([true, this.readyState, 'data' in e])
+ this.close();
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: constructor (act as if there is a network error)</title>
+ <meta name=timeout content=long>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function fetchFail(url) {
+ var test = async_test(document.title + " (" + url + ")", { timeout: 20000 })
+ test.step(function() {
+ var worker = new Worker('#'+encodeURIComponent(url))
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.CLOSED, 'source.readyState')
+ assert_false(e.data[2], "'data' in e");
+ })
+ test.done()
+ }
+ })
+ }
+ fetchFail("http://example.not/")
+ fetchFail("https://example.not/test")
+ fetchFail("ftp://example.not/")
+ fetchFail("about:blank")
+ fetchFail("mailto:whatwg@awesome.example")
+ fetchFail("javascript:alert('FAIL')")
+ </script>
+ <!-- This tests "fails the connection" as well as making sure a simple
+ event is dispatched and not a MessageEvent -->
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.htm
new file mode 100644
index 000000000..5ffdec81f
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.htm
@@ -0,0 +1,34 @@
+<!--
+try {
+ var source = new EventSource("http://this is invalid/")
+ postMessage([false, 'no exception thrown'])
+ source.close()
+} catch(e) {
+ postMessage([true, e.code])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: constructor (invalid URL)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], DOMException.SYNTAX_ERR, 'e.code')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //--> \ No newline at end of file
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-eventtarget.worker.js b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-eventtarget.worker.js
new file mode 100644
index 000000000..73b30556c
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-eventtarget.worker.js
@@ -0,0 +1,11 @@
+importScripts("/resources/testharness.js");
+
+async_test(function() {
+ var source = new EventSource("../resources/message.py")
+ source.addEventListener("message", this.step_func_done(function(e) {
+ assert_equals(e.data, 'data');
+ source.close();
+ }), false)
+}, "dedicated worker - EventSource: addEventListener()");
+
+done();
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onmesage.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onmesage.htm
new file mode 100644
index 000000000..2de142ca5
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onmesage.htm
@@ -0,0 +1,36 @@
+<!--
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onmessage = function(e) {
+ postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: onmessage</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], "data", 'e.data')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onopen.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onopen.htm
new file mode 100644
index 000000000..e753b42f7
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-onopen.htm
@@ -0,0 +1,39 @@
+<!--
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
+ this.close()
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: onopen (announcing the connection)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.OPEN, 'source.readyState')
+ assert_false(e.data[2], "'data' in e")
+ assert_false(e.data[3], 'e.bubbles')
+ assert_false(e.data[4], 'e.calcelable')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-prototype.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-prototype.htm
new file mode 100644
index 000000000..b16e24c86
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-prototype.htm
@@ -0,0 +1,36 @@
+<!--
+try {
+ EventSource.prototype.ReturnTrue = function() { return true }
+ var source = new EventSource("../resources/message.py")
+ postMessage([true, source.ReturnTrue(), 'EventSource' in self])
+ source.close()
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DoCtYpE hTMl>
+<html>
+ <heAd>
+ <title>dedicated worker - EventSource: prototype et al</tiTle>
+ <scrIpt src="/resources/testharness.js"></scripT>
+ <scriPt src="/resources/testharnessreport.js"></Script>
+ </heaD>
+ <boDy>
+ <diV iD="log"></Div>
+ <sCript>
+ var test = async_test();
+ test.step(function() {
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_true(e.data[1], 'source.ReturnTrue()')
+ assert_true(e.data[2], "'EventSource' in self")
+ })
+ test.done()
+ }
+ })
+ </scrIpt>
+ </bOdy>
+</htMl>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-url.htm b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-url.htm
new file mode 100644
index 000000000..c1ed07827
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/dedicated-worker/eventsource-url.htm
@@ -0,0 +1,35 @@
+<!--
+try {
+ var source = new EventSource("../resources/message.py")
+ postMessage([true, source.url])
+ source.close()
+} catch(e) {
+ postMessage([false, String(e)])
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>dedicated worker - EventSource: url</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test();
+ test.step(function() {
+ var url = "resources/message.py"
+ var worker = new Worker('#')
+ worker.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1]);
+ assert_equals(e.data[1].substr(-(url.length)), url)
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/event-data.html b/testing/web-platform/tests/eventsource/event-data.html
new file mode 100644
index 000000000..8f74a0178
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/event-data.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: lines and data parsing</title>
+ <meta rel=help href="http://dev.w3.org/html5/eventsource/#event-stream-interpretation">
+ <meta rel=assert title="If the line is empty (a blank line) Dispatch the event, as defined below.">
+ <meta rel=assert title="If the line starts with a U+003A COLON character (:) Ignore the line.">
+ <meta rel=assert title="If the line contains a U+003A COLON character (:)
+ Collect the characters on the line before the first U+003A COLON character (:), and let field be that string.
+ Collect the characters on the line after the first U+003A COLON character (:), and let value be that string. If value starts with a U+0020 SPACE character, remove it from value.
+ Process the field using the steps described below, using field as the field name and value as the field value.
+ ">
+ <meta rel=assert title="Otherwise, the string is not empty but does not contain a U+003A COLON character (:)
+Process the field using the steps described below, using the whole line as the field name, and the empty string as the field value.
+ ">
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(document.title);
+ test.step(function() {
+ var source = new EventSource("resources/message2.py"),
+ counter = 0;
+ source.onmessage = test.step_func(function(e) {
+ if(counter == 0) {
+ assert_equals(e.data,"msg\nmsg");
+ } else if(counter == 1) {
+ assert_equals(e.data,"");
+ } else if(counter == 2) {
+ assert_equals(e.data,"end");
+ source.close();
+ test.done();
+ } else {
+ assert_unreached();
+ }
+ counter++;
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-close.htm b/testing/web-platform/tests/eventsource/eventsource-close.htm
new file mode 100644
index 000000000..92d98ded7
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-close.htm
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: close()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py")
+ assert_equals(source.readyState, source.CONNECTING, "connecting readyState");
+ source.onopen = this.step_func(function() {
+ assert_equals(source.readyState, source.OPEN, "open readyState");
+ source.close()
+ assert_equals(source.readyState, source.CLOSED, "closed readyState");
+ this.done()
+ })
+ })
+
+ var test2 = async_test(document.title + ", test events", { timeout: 9000 });
+ test2.step(function() {
+ var count = 0, reconnected = false,
+ source = new EventSource("resources/reconnect-fail.py?id=" + new Date().getTime());
+
+ source.onerror = this.step_func(function(e) {
+ assert_equals(e.type, 'error');
+ switch(count) {
+ // reconnecting after first message
+ case 1:
+ assert_equals(source.readyState, source.CONNECTING, "reconnecting readyState");
+
+ reconnected = true;
+ break;
+
+ // one more reconnect to get to the closing
+ case 2:
+ assert_equals(source.readyState, source.CONNECTING, "last reconnecting readyState");
+ count++;
+ break;
+
+ // close
+ case 3:
+ assert_equals(source.readyState, source.CLOSED, "closed readyState");
+
+ // give some time for errors to hit us
+ setTimeout(this.step_func(function() { this.done(); }), 100);
+ break;
+
+ default:
+ assert_unreached("Error handler with msg count " + count);
+ }
+
+ });
+
+ source.onmessage = this.step_func(function(e) {
+ switch(count) {
+ case 0:
+ assert_true(!reconnected, "no error event run");
+ assert_equals(e.data, "opened", "data");
+ break;
+
+ case 1:
+ assert_true(reconnected, "have reconnected");
+ assert_equals(e.data, "reconnected", "data");
+ break;
+
+ default:
+ assert_unreached("Dunno what to do with message number " + count);
+ }
+
+ count++;
+ });
+
+ });
+
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-constructor-document-domain.htm b/testing/web-platform/tests/eventsource/eventsource-constructor-document-domain.htm
new file mode 100644
index 000000000..8fd7420ba
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-constructor-document-domain.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: document.domain</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ document.domain = document.domain
+ source = new EventSource("resources/message.py")
+ source.onopen = function(e) {
+ test.step(function() {
+ assert_equals(source.readyState, source.OPEN)
+ assert_false(e.hasOwnProperty('data'))
+ assert_false(e.bubbles)
+ assert_false(e.cancelable)
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ <!-- Apart from document.domain equivalent to the onopen test. -->
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-constructor-non-same-origin.htm b/testing/web-platform/tests/eventsource/eventsource-constructor-non-same-origin.htm
new file mode 100644
index 000000000..dd4ab84a5
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-constructor-non-same-origin.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: constructor (act as if there is a network error)</title>
+ <meta name=timeout content=long>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function fetchFail(url) {
+ var test = async_test(document.title + " (" + url + ")", { timeout: 20000 })
+ test.step(function() {
+ var source = new EventSource(url)
+ source.onerror = function(e) {
+ test.step(function() {
+ assert_equals(source.readyState, source.CLOSED)
+ assert_false(e.hasOwnProperty('data'))
+ })
+ test.done()
+ }
+ })
+ }
+ fetchFail("http://example.not/")
+ fetchFail("https://example.not/test")
+ fetchFail("ftp://example.not/")
+ fetchFail("about:blank")
+ fetchFail("mailto:whatwg@awesome.example")
+ fetchFail("javascript:alert('FAIL')")
+ </script>
+ <!-- This tests "fails the connection" as well as making sure a simple
+ event is dispatched and not a MessageEvent -->
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-constructor-stringify.htm b/testing/web-platform/tests/eventsource/eventsource-constructor-stringify.htm
new file mode 100644
index 000000000..162fa342d
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-constructor-stringify.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: stringify argument</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ async_test(function (test) {
+ test.step(function() {
+ var source = new EventSource({toString:function(){return "resources/message.py";}})
+ source.onopen = function(e) {
+ test.step(function() {
+ assert_false(e.hasOwnProperty('data'))
+ source.close()
+ test.done()
+ })
+ }
+ });
+ }, document.title + ', object');
+
+ test(function(){
+ var source = new EventSource(1);
+ assert_regexp_match(source.url, /\/1$/);
+ }, document.title + ', 1');
+ test(function(){
+ var source = new EventSource(null);
+ assert_regexp_match(source.url, /\/null$/);
+ }, document.title + ', null');
+ test(function(){
+ var source = new EventSource(undefined);
+ assert_regexp_match(source.url, /\/undefined$/);
+ }, document.title + ', undefined');
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-constructor-url-bogus.htm b/testing/web-platform/tests/eventsource/eventsource-constructor-url-bogus.htm
new file mode 100644
index 000000000..8e769ed71
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-constructor-url-bogus.htm
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: constructor (invalid URL)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ test(function() {
+ assert_throws("SyntaxError", function() { new EventSource("http://this is invalid/") })
+ })
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-constructor-url-multi-window.htm b/testing/web-platform/tests/eventsource/eventsource-constructor-url-multi-window.htm
new file mode 100644
index 000000000..99fecb972
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-constructor-url-multi-window.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: resolving URLs</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ function init() {
+ test.step(function() {
+ source = new self[0].EventSource("message.py")
+ source.onopen = function(e) {
+ test.step(function() {
+ assert_equals(source.readyState, source.OPEN)
+ assert_false(e.hasOwnProperty('data'))
+ assert_false(e.bubbles)
+ assert_false(e.cancelable)
+ this.close()
+ test.done()
+ }, this)
+ }
+ source.onerror = function(e) {
+ test.step(function() {
+ assert_unreached()
+ source.close()
+ test.done()
+ })
+ }
+ })
+ }
+ </script>
+ <iframe src="resources/init.htm"></iframe>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-cross-origin.htm b/testing/web-platform/tests/eventsource/eventsource-cross-origin.htm
new file mode 100644
index 000000000..b753bad7d
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-cross-origin.htm
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>EventSource: cross-origin</title>
+ <meta name=author title="Odin Hørthe Omdal" href="mailto:odiho@opera.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var crossdomain = location.href
+ .replace('://', '://www2.')
+ .replace(/\/[^\/]*$/, '/')
+
+ function doCORS(url, title) {
+ async_test(document.title + " " + title).step(function() {
+ var source = new EventSource(url, { withCredentials: true })
+ source.onmessage = this.step_func(function(e) {
+ assert_equals(e.data, "data")
+ source.close()
+ this.done()
+ })
+ })
+ }
+
+ doCORS(crossdomain + "resources/cors.py?run=message",
+ "basic use")
+ doCORS(crossdomain + "resources/cors.py?run=redirect&location=/eventsource/resources/cors.py?run=message",
+ "redirect use")
+ doCORS(crossdomain + "resources/cors.py?run=status-reconnect&status=200",
+ "redirect use recon")
+
+ function failCORS(url, title) {
+ async_test(document.title + " " + title).step(function() {
+ var source = new EventSource(url)
+ source.onerror = this.step_func(function(e) {
+ assert_equals(source.readyState, source.CLOSED, 'readyState')
+ assert_false(e.hasOwnProperty('data'))
+ source.close()
+ this.done()
+ })
+
+ /* Shouldn't happen */
+ source.onmessage = this.step_func(function(e) {
+ assert_unreached("shouldn't fire message event")
+ })
+ source.onopen = this.step_func(function(e) {
+ assert_unreached("shouldn't fire open event")
+ })
+ })
+ }
+
+ failCORS(crossdomain + "resources/cors.py?run=message&origin=http://example.org",
+ "allow-origin: http://example.org should fail")
+ failCORS(crossdomain + "resources/cors.py?run=message&origin=",
+ "allow-origin:'' should fail")
+ failCORS(crossdomain + "resources/message.py",
+ "No allow-origin should fail")
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-eventtarget.htm b/testing/web-platform/tests/eventsource/eventsource-eventtarget.htm
new file mode 100644
index 000000000..6e600fc7b
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-eventtarget.htm
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: addEventListener()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py")
+ source.addEventListener("message", listener, false)
+ })
+ function listener(e) {
+ test.step(function() {
+ assert_equals("data", e.data)
+ this.close()
+ }, this)
+ test.done()
+ }
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-onmessage.htm b/testing/web-platform/tests/eventsource/eventsource-onmessage.htm
new file mode 100644
index 000000000..b683ebc85
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-onmessage.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: onmessage</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("data", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-onopen.htm b/testing/web-platform/tests/eventsource/eventsource-onopen.htm
new file mode 100644
index 000000000..1c9bfe03c
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-onopen.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: onopen (announcing the connection)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ source = new EventSource("resources/message.py")
+ source.onopen = function(e) {
+ test.step(function() {
+ assert_equals(source.readyState, source.OPEN)
+ assert_false(e.hasOwnProperty('data'))
+ assert_false(e.bubbles)
+ assert_false(e.cancelable)
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-prototype.htm b/testing/web-platform/tests/eventsource/eventsource-prototype.htm
new file mode 100644
index 000000000..38f63eb5f
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-prototype.htm
@@ -0,0 +1,21 @@
+<!DoCtYpE hTMl>
+<html>
+ <heAd>
+ <title>EventSource: prototype et al</tiTle>
+ <scrIpt src="/resources/testharness.js"></scripT>
+ <scriPt src="/resources/testharnessreport.js"></Script>
+ </heaD>
+ <boDy>
+ <diV iD="log"></Div>
+ <sCript>
+ test(function() {
+ EventSource.prototype.ReturnTrue = function() { return true }
+ var source = new EventSource("resources/message.py")
+ assert_true(source.ReturnTrue())
+ assert_exists(window, "EventSource")
+ source.close()
+ })
+ </scrIpt>
+ </bOdy>
+</htMl>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-reconnect.htm b/testing/web-platform/tests/eventsource/eventsource-reconnect.htm
new file mode 100644
index 000000000..a23885f08
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-reconnect.htm
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: reconnection</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function doReconn(url, title) {
+ var test = async_test(document.title + " " + title)
+ test.step(function() {
+ var source = new EventSource(url)
+ source.onmessage = test.step_func(function(e) {
+ assert_equals(e.data, "data")
+ source.close()
+ test.done()
+ })
+ })
+ }
+
+ doReconn("resources/status-reconnect.py?status=200",
+ "200")
+
+
+ var t = async_test(document.title + ", test reconnection events", { timeout: 9000 });
+ t.step(function() {
+ var opened = false, reconnected = false,
+ source = new EventSource("resources/status-reconnect.py?status=200&ok_first&id=2");
+
+ source.onerror = t.step_func(function(e) {
+ assert_equals(e.type, 'error');
+ assert_equals(source.readyState, source.CONNECTING, "readyState");
+ assert_true(opened, "connection is opened earlier");
+
+ reconnected = true;
+ });
+
+ source.onmessage = t.step_func(function(e) {
+ if (!opened) {
+ opened = true;
+ assert_false(reconnected, "have reconnected before first message");
+ assert_equals(e.data, "ok");
+ }
+ else {
+ assert_true(reconnected, "Got reconnection event");
+ assert_equals(e.data, "data");
+ source.close()
+ t.done()
+ }
+ });
+ });
+
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/eventsource-request-cancellation.htm b/testing/web-platform/tests/eventsource/eventsource-request-cancellation.htm
new file mode 100644
index 000000000..308e4d5d7
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-request-cancellation.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: request cancellation</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var t = async_test();
+ onload = t.step_func(function() {
+ var url = "resources/message.py?sleep=1000&message=" + encodeURIComponent("retry:1000\ndata:abc\n\n");
+ var es = new EventSource(url);
+ es.onerror = t.step_func(function() {
+ assert_equals(es.readyState, EventSource.CLOSED)
+ setTimeout(t.step_func(function () {
+ assert_equals(es.readyState, EventSource.CLOSED,
+ "After stopping the eventsource readyState should be CLOSED")
+ t.done();
+ }), 1000);
+ });
+
+ setTimeout(t.step_func(function() {
+ window.stop()
+ es.onopen = t.unreached_func("Got open event");
+ es.onmessage = t.unreached_func("Got message after closing source");
+ }), 0);
+ });
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/eventsource-url.htm b/testing/web-platform/tests/eventsource/eventsource-url.htm
new file mode 100644
index 000000000..8b9262bfe
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/eventsource-url.htm
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: url</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ test(function() {
+ var url = "resources/message.py",
+ source = new EventSource(url)
+ assert_equals(source.url.substr(-(url.length)), url)
+ source.close()
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-bom-2.htm b/testing/web-platform/tests/eventsource/format-bom-2.htm
new file mode 100644
index 000000000..6f267a05a
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-bom-2.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: Double BOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(),
+ hasbeenone = false,
+ hasbeentwo = false
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=%EF%BB%BF%EF%BB%BFdata%3A1%0A%0Adata%3A2%0A%0Adata%3A3")
+ source.addEventListener("message", listener, false)
+ })
+ function listener(e) {
+ test.step(function() {
+ if(e.data == "1")
+ hasbeenone = true
+ if(e.data == "2")
+ hasbeentwo = true
+ if(e.data == "3") {
+ assert_false(hasbeenone)
+ assert_true(hasbeentwo)
+ this.close()
+ test.done()
+ }
+ }, this)
+ }
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-bom.htm b/testing/web-platform/tests/eventsource/format-bom.htm
new file mode 100644
index 000000000..921602278
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-bom.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: BOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(),
+ hasbeenone = false,
+ hasbeentwo = false
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=%EF%BB%BFdata%3A1%0A%0A%EF%BB%BFdata%3A2%0A%0Adata%3A3")
+ source.addEventListener("message", listener, false)
+ })
+ function listener(e) {
+ test.step(function() {
+ if(e.data == "1")
+ hasbeenone = true
+ if(e.data == "2")
+ hasbeentwo = true
+ if(e.data == "3") {
+ assert_true(hasbeenone)
+ assert_false(hasbeentwo)
+ this.close()
+ test.done()
+ }
+ }, this)
+ }
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-comments.htm b/testing/web-platform/tests/eventsource/format-comments.htm
new file mode 100644
index 000000000..fde360db0
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-comments.htm
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: comment fest</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var longstring = (new Array(2*1024+1)).join("x"), // cannot make the string too long; causes timeout
+ message = encodeURI("data:1\r:\0\n:\r\ndata:2\n:" + longstring + "\rdata:3\n:data:fail\r:" + longstring + "\ndata:4\n"),
+ source = new EventSource("resources/message.py?message=" + message + "&newline=none")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("1\n2\n3\n4", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-data-before-final-empty-line.htm b/testing/web-platform/tests/eventsource/format-data-before-final-empty-line.htm
new file mode 100644
index 000000000..e429d7f26
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-data-before-final-empty-line.htm
@@ -0,0 +1,29 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: a data before final empty line</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?newline=none&message=" + encodeURIComponent("retry:1000\ndata:test1\n\nid:test\ndata:test2"))
+ var count = 0;
+ source.onmessage = function(e) {
+ if (++count === 2) {
+ test.step(function() {
+ assert_equals(e.lastEventId, "", "lastEventId")
+ assert_equals(e.data, "test1", "data")
+ source.close()
+ })
+ test.done()
+ }
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-data.htm b/testing/web-platform/tests/eventsource/format-field-data.htm
new file mode 100644
index 000000000..a73135568
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-data.htm
@@ -0,0 +1,34 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: data field parsing</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=data%3A%0A%0Adata%0Adata%0A%0Adata%3Atest"),
+ counter = 0
+ source.onmessage = function(e) {
+ test.step(function() {
+ if(counter == 0) {
+ assert_equals("", e.data)
+ } else if(counter == 1) {
+ assert_equals("\n", e.data)
+ } else if(counter == 2) {
+ assert_equals("test", e.data)
+ source.close()
+ test.done()
+ } else {
+ assert_unreached()
+ }
+ counter++
+ })
+ }
+ })
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/format-field-event-empty.htm b/testing/web-platform/tests/eventsource/format-field-event-empty.htm
new file mode 100644
index 000000000..20a6d6d9f
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-event-empty.htm
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: empty "event" field</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=event%3A%20%0Adata%3Adata")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("data", e.data)
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-event.htm b/testing/web-platform/tests/eventsource/format-field-event.htm
new file mode 100644
index 000000000..3c3267f7c
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-event.htm
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: custom event name</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(),
+ dispatchedtest = false
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=event%3Atest%0Adata%3Ax%0A%0Adata%3Ax")
+ source.addEventListener("test", function() { test.step(function() { dispatchedtest = true }) }, false)
+ source.onmessage = function() {
+ test.step(function() {
+ assert_true(dispatchedtest)
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-id-2.htm b/testing/web-platform/tests/eventsource/format-field-id-2.htm
new file mode 100644
index 000000000..ac521fc13
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-id-2.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>EventSource: Last-Event-ID (2)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/last-event-id.py"),
+ counter = 0
+ source.onmessage = function(e) {
+ test.step(function() {
+ if(e.data == "hello" && counter == 0) {
+ counter++
+ assert_equals(e.lastEventId, "…")
+ } else if(counter == 1) {
+ counter++
+ assert_equals("…", e.data)
+ assert_equals("…", e.lastEventId)
+ } else if(counter == 2) {
+ counter++
+ assert_equals("…", e.data)
+ assert_equals("…", e.lastEventId)
+ source.close()
+ test.done()
+ } else
+ assert_unreached()
+ })
+ }
+ })
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/format-field-id.htm b/testing/web-platform/tests/eventsource/format-field-id.htm
new file mode 100644
index 000000000..19ada954c
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-id.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>EventSource: Last-Event-ID</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/last-event-id.py"),
+ seenhello = false
+ source.onmessage = function(e) {
+ test.step(function() {
+ if(e.data == "hello" && !seenhello) {
+ seenhello = true
+ assert_equals(e.lastEventId, "…")
+ } else if(seenhello) {
+ assert_equals("…", e.data)
+ assert_equals("…", e.lastEventId)
+ source.close()
+ test.done()
+ } else
+ assert_unreached()
+ })
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-parsing.htm b/testing/web-platform/tests/eventsource/format-field-parsing.htm
new file mode 100644
index 000000000..da2217620
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-parsing.htm
@@ -0,0 +1,26 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: field parsing</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var message = encodeURI("data:\0\ndata: 2\rData:1\ndata\0:2\ndata:1\r\0data:4\nda-ta:3\rdata_5\ndata:3\rdata:\r\n data:32\ndata:4\n"),
+ source = new EventSource("resources/message.py?message=" + message + "&newline=none")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals(e.data, "\0\n 2\n1\n3\n\n4")
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-retry-bogus.htm b/testing/web-platform/tests/eventsource/format-field-retry-bogus.htm
new file mode 100644
index 000000000..0cdf9b4f1
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-retry-bogus.htm
@@ -0,0 +1,31 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: "retry" field (bogus)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(document.title)
+ test.step(function() {
+ var timeoutms = 3000,
+ source = new EventSource("resources/message.py?message=retry%3A3000%0Aretry%3A1000x%0Adata%3Ax"),
+ opened = 0
+ source.onopen = function() {
+ test.step(function() {
+ if(opened == 0)
+ opened = new Date().getTime()
+ else {
+ var diff = (new Date().getTime()) - opened
+ assert_true(Math.abs(1 - diff / timeoutms) < 0.25) // allow 25% difference
+ this.close();
+ test.done()
+ }
+ }, this)
+ }
+ })
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/format-field-retry-empty.htm b/testing/web-platform/tests/eventsource/format-field-retry-empty.htm
new file mode 100644
index 000000000..275748618
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-retry-empty.htm
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: empty retry field</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=retry%0Adata%3Atest")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("test", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-retry.htm b/testing/web-platform/tests/eventsource/format-field-retry.htm
new file mode 100644
index 000000000..133794f62
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-retry.htm
@@ -0,0 +1,33 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: "retry" field</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test(document.title);
+ test.step(function() {
+ var timeoutms = 3000,
+ timeoutstr = "03000", // 1536 in octal, but should be 3000
+ source = new EventSource("resources/message.py?message=retry%3A" + timeoutstr + "%0Adata%3Ax"),
+ opened = 0
+ source.onopen = function() {
+ test.step(function() {
+ if(opened == 0)
+ opened = new Date().getTime()
+ else {
+ var diff = (new Date().getTime()) - opened
+ assert_true(Math.abs(1 - diff / timeoutms) < 0.25) // allow 25% difference
+ this.close();
+ test.done()
+ }
+ }, this)
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-field-unknown.htm b/testing/web-platform/tests/eventsource/format-field-unknown.htm
new file mode 100644
index 000000000..3b6efd542
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-field-unknown.htm
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: unknown fields and parsing fun</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=data%3Atest%0A%20data%0Adata%0Afoobar%3Axxx%0Ajustsometext%0A%3Athisisacommentyay%0Adata%3Atest")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("test\n\ntest", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-leading-space.htm b/testing/web-platform/tests/eventsource/format-leading-space.htm
new file mode 100644
index 000000000..b70ba89c2
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-leading-space.htm
@@ -0,0 +1,26 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: leading space</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=data%3A%09test%0Ddata%3A%20%0Adata%3Atest")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("\ttest\n\ntest", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ <!-- also used a CR as newline once -->
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-mime-bogus.htm b/testing/web-platform/tests/eventsource/format-mime-bogus.htm
new file mode 100644
index 000000000..caf9cb4a9
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-mime-bogus.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: bogus MIME type</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?mime=x%20bogus")
+ source.onmessage = function() {
+ test.step(function() {
+ assert_unreached()
+ source.close()
+ })
+ test.done()
+ }
+ source.onerror = function(e) {
+ test.step(function() {
+ assert_equals(this.readyState, this.CLOSED)
+ assert_false(e.hasOwnProperty('data'))
+ assert_false(e.bubbles)
+ assert_false(e.cancelable)
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ <!-- This tests "fails the connection" as well as making sure a simple
+ event is dispatched and not a MessageEvent -->
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-mime-trailing-semicolon.htm b/testing/web-platform/tests/eventsource/format-mime-trailing-semicolon.htm
new file mode 100644
index 000000000..6bcac8382
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-mime-trailing-semicolon.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: MIME type with trailing ;</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?mime=text/event-stream%3B")
+ source.onopen = function() {
+ test.step(function() {
+ assert_equals(source.readyState, source.OPEN)
+ source.close()
+ })
+ test.done()
+ }
+ source.onerror = function() {
+ test.step(function() {
+ assert_unreached()
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-mime-valid-bogus.htm b/testing/web-platform/tests/eventsource/format-mime-valid-bogus.htm
new file mode 100644
index 000000000..211f841a6
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-mime-valid-bogus.htm
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: incorrect valid MIME type</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?mime=text/x-bogus")
+ source.onmessage = function() {
+ test.step(function() {
+ assert_unreached()
+ source.close()
+ })
+ test.done()
+ }
+ source.onerror = function(e) {
+ test.step(function() {
+ assert_equals(source.readyState, source.CLOSED)
+ assert_false(e.hasOwnProperty('data'))
+ assert_false(e.bubbles)
+ assert_false(e.cancelable)
+ })
+ test.done()
+ }
+ })
+ </script>
+ <!-- This tests "fails the connection" as well as making sure a simple
+ event is dispatched and not a MessageEvent -->
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-newlines.htm b/testing/web-platform/tests/eventsource/format-newlines.htm
new file mode 100644
index 000000000..87d6a569e
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-newlines.htm
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+ <head>
+ <title>EventSource: newline fest</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=data%3Atest%0D%0Adata%0Adata%3Atest%0D%0A%0D&newline=none")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("test\n\ntest", e.data)
+ source.close()
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-null-character.html b/testing/web-platform/tests/eventsource/format-null-character.html
new file mode 100644
index 000000000..0640530d7
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-null-character.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>EventSource: null character in response</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/message.py?message=data%3A%00%0A%0A")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals("\x00", e.data)
+ source.close()
+ }, this)
+ test.done()
+ }
+ source.onerror = function() {
+ test.step(function() { assert_unreached() })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/format-utf-8.htm b/testing/web-platform/tests/eventsource/format-utf-8.htm
new file mode 100644
index 000000000..d7858a16c
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/format-utf-8.htm
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>EventSource: always UTF-8</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ async_test().step(function() {
+ var source = new EventSource("resources/message.py?mime=text/event-stream;charset=windows-1252&message=data%3Aok%E2%80%A6")
+ source.onmessage = this.step_func(function(e) {
+ assert_equals('ok…', e.data, 'decoded data')
+ source.close()
+ this.done()
+ })
+ source.onerror = this.step_func(function() {
+ assert_unreached("Got error event")
+ })
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/interfaces.html b/testing/web-platform/tests/eventsource/interfaces.html
new file mode 100644
index 000000000..8c3cc90b6
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/interfaces.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<title>EventSource IDL tests</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+
+<h1>EventSource IDL tests</h1>
+<div id=log></div>
+
+<script type=text/plain>
+[Constructor(DOMString url, optional EventSourceInit eventSourceInitDict)]
+interface EventSource : EventTarget {
+ readonly attribute DOMString url;
+ readonly attribute boolean withCredentials;
+
+ // ready state
+ const unsigned short CONNECTING = 0;
+ const unsigned short OPEN = 1;
+ const unsigned short CLOSED = 2;
+ readonly attribute unsigned short readyState;
+
+ // networking
+ attribute EventHandler onopen;
+ attribute EventHandler onmessage;
+ attribute EventHandler onerror;
+ void close();
+};
+
+dictionary EventSourceInit {
+ boolean withCredentials = false;
+};
+
+[TreatNonCallableAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;
+</script>
+<script>
+"use strict";
+var idlArray;
+setup(function() {
+ idlArray = new IdlArray();
+ [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
+ if (node.className == "untested") {
+ idlArray.add_untested_idls(node.textContent);
+ } else {
+ idlArray.add_idls(node.textContent);
+ }
+ });
+}, {explicit_done:true});
+window.onload = function() {
+ idlArray.add_objects({
+ EventSource: ['new EventSource("http://foo")'],
+ });
+ idlArray.test();
+ done();
+};
+</script>
diff --git a/testing/web-platform/tests/eventsource/request-accept.htm b/testing/web-platform/tests/eventsource/request-accept.htm
new file mode 100644
index 000000000..6032cb6ff
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/request-accept.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: Accept header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/accept.event_stream?pipe=sub")
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals(e.data, "text/event-stream")
+ this.close()
+ }, this)
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/request-cache-control.htm b/testing/web-platform/tests/eventsource/request-cache-control.htm
new file mode 100644
index 000000000..b39659292
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/request-cache-control.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: Cache-Control</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var crossdomain = location.href
+ .replace('://', '://www2.')
+ .replace(/\/[^\/]*$/, '/')
+
+ // running it twice to check whether it stays consistent
+ function cacheTest(runAgain, url) {
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource(url)
+ source.onmessage = function(e) {
+ test.step(function() {
+ assert_equals(e.data, "no-cache")
+ this.close()
+ if(runAgain)
+ cacheTest(false, url) // this nests tests
+ }, this)
+ test.done()
+ }
+ })
+ }
+
+ cacheTest(true, "resources/cache-control.event_stream?pipe=sub")
+ cacheTest(true, crossdomain + "resources/cors.py?run=cache-control")
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/request-credentials.htm b/testing/web-platform/tests/eventsource/request-credentials.htm
new file mode 100644
index 000000000..c3c178a77
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/request-credentials.htm
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: credentials</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var crossdomain = location.href
+ .replace('://', '://www2.')
+ .replace(/\/[^\/]*$/, '/')
+
+ function testCookie(desc, success, props, id) {
+ var test = async_test(document.title + ': credentials ' + desc)
+ test.step(function() {
+ var source = new EventSource(crossdomain + "resources/cors-cookie.py?ident=" + id, props)
+
+ source.onmessage = test.step_func(function(e) {
+ if(e.data.indexOf("first") == 0) {
+ assert_equals(e.data, "first NO_COOKIE", "cookie status")
+ }
+ else if(e.data.indexOf("second") == 0) {
+ if (success)
+ assert_equals(e.data, "second COOKIE", "cookie status")
+ else
+ assert_equals(e.data, "second NO_COOKIE", "cookie status")
+
+ source.close()
+ test.done()
+ }
+ else {
+ assert_unreached("unrecognized data returned: " + e.data)
+ source.close()
+ test.done()
+ }
+ })
+ })
+ }
+
+ testCookie('enabled', true, { withCredentials: true }, '1_' + new Date().getTime())
+ testCookie('disabled', false, { withCredentials: false }, '2_' + new Date().getTime())
+ testCookie('default', false, { }, '3_' + new Date().getTime())
+
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/request-redirect.htm b/testing/web-platform/tests/eventsource/request-redirect.htm
new file mode 100644
index 000000000..794c878fe
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/request-redirect.htm
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: redirect</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function redirectTest(status) {
+ var test = async_test(document.title + " (" + status +")")
+ test.step(function() {
+ var source = new EventSource("/common/redirect.py?location=/eventsource/resources/message.py&status=" + status)
+ source.onopen = function() {
+ test.step(function() {
+ assert_equals(this.readyState, this.OPEN)
+ this.close()
+ }, this)
+ test.done()
+ }
+ source.onerror = function() {
+ test.step(function() { assert_unreached() })
+ test.done()
+ }
+ })
+ }
+
+ redirectTest("301")
+ redirectTest("302")
+ redirectTest("303")
+ redirectTest("307")
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/request-status-error.htm b/testing/web-platform/tests/eventsource/request-status-error.htm
new file mode 100644
index 000000000..d881a4ddd
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/request-status-error.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>EventSource: incorrect HTTP status code</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function statusTest(status) {
+ var test = async_test(document.title + " (" + status +")")
+ test.step(function() {
+ var source = new EventSource("resources/status-error.py?status=" + status)
+ source.onmessage = function() {
+ test.step(function() {
+ assert_unreached()
+ })
+ test.done()
+ }
+ source.onerror = function() {
+ test.step(function() {
+ assert_equals(this.readyState, this.CLOSED)
+ }, this)
+ test.done()
+ }
+ })
+ }
+ statusTest("204")
+ statusTest("205")
+ statusTest("210")
+ statusTest("299")
+ statusTest("404")
+ statusTest("410")
+ statusTest("503")
+ </script>
+ </body>
+</html>
+
diff --git a/testing/web-platform/tests/eventsource/resources/accept.event_stream b/testing/web-platform/tests/eventsource/resources/accept.event_stream
new file mode 100644
index 000000000..24da54826
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/accept.event_stream
@@ -0,0 +1,2 @@
+data: {{headers[accept]}}
+
diff --git a/testing/web-platform/tests/eventsource/resources/cache-control.event_stream b/testing/web-platform/tests/eventsource/resources/cache-control.event_stream
new file mode 100644
index 000000000..aa9f2d6c0
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/cache-control.event_stream
@@ -0,0 +1,2 @@
+data: {{headers[cache-control]}}
+
diff --git a/testing/web-platform/tests/eventsource/resources/cors-cookie.py b/testing/web-platform/tests/eventsource/resources/cors-cookie.py
new file mode 100644
index 000000000..7deaff498
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/cors-cookie.py
@@ -0,0 +1,31 @@
+from datetime import datetime
+
+def main(request, response):
+ last_event_id = request.headers.get("Last-Event-Id", "")
+ ident = request.GET.first('ident', "test")
+ cookie = "COOKIE" if ident in request.cookies else "NO_COOKIE"
+ origin = request.GET.first('origin', request.headers["origin"])
+ credentials = request.GET.first('credentials', 'true')
+
+ headers = []
+
+ if origin != 'none':
+ headers.append(("Access-Control-Allow-Origin", origin));
+
+ if credentials != 'none':
+ headers.append(("Access-Control-Allow-Credentials", credentials));
+
+ if last_event_id == '':
+ headers.append(("Content-Type", "text/event-stream"))
+ response.set_cookie(ident, "COOKIE")
+ data = "id: 1\nretry: 200\ndata: first %s\n\n" % cookie
+ elif last_event_id == '1':
+ headers.append(("Content-Type", "text/event-stream"))
+ long_long_time_ago = datetime.now().replace(year=2001, month=7, day=27)
+ response.set_cookie(ident, "COOKIE", expires=long_long_time_ago)
+ data = "id: 2\ndata: second %s\n\n" % cookie
+ else:
+ headers.append(("Content-Type", "stop"))
+ data = "data: " + last_event_id + cookie + "\n\n";
+
+ return headers, data
diff --git a/testing/web-platform/tests/eventsource/resources/cors.py b/testing/web-platform/tests/eventsource/resources/cors.py
new file mode 100644
index 000000000..d01596c83
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/cors.py
@@ -0,0 +1,34 @@
+import os
+from wptserve import pipes
+
+def run_other(request, response, path):
+ #This is a terrible hack
+ environ = {"__file__": path}
+ execfile(path, environ, environ)
+ rv = environ["main"](request, response)
+ return rv
+
+def main(request, response):
+ origin = request.GET.first("origin", request.headers["origin"])
+ credentials = request.GET.first("credentials", "true")
+
+ response.headers.update([("Access-Control-Allow-Origin", origin),
+ ("Access-Control-Allow-Credentials", credentials)])
+
+ handler = request.GET.first('run')
+ if handler in ["status-reconnect",
+ "message",
+ "redirect",
+ "cache-control"]:
+ if handler == "cache-control":
+ response.headers.set("Content-Type", "text/event-stream")
+ rv = open(os.path.join(request.doc_root, "eventsource", "resources", "cache-control.event_stream"), "r").read()
+ response.content = rv
+ pipes.sub(request, response)
+ return
+ elif handler == "redirect":
+ return run_other(request, response, os.path.join(request.doc_root, "common", "redirect.py"))
+ else:
+ return run_other(request, response, os.path.join(os.path.split(__file__)[0], handler + ".py"))
+ else:
+ return
diff --git a/testing/web-platform/tests/eventsource/resources/init.htm b/testing/web-platform/tests/eventsource/resources/init.htm
new file mode 100644
index 000000000..7c56d8880
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/init.htm
@@ -0,0 +1,9 @@
+<!doctype html>
+<html>
+ <head>
+ <title>support init file</title>
+ </head>
+ <body>
+ <script> parent.init() </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/eventsource/resources/last-event-id.py b/testing/web-platform/tests/eventsource/resources/last-event-id.py
new file mode 100644
index 000000000..4306fbaa3
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/last-event-id.py
@@ -0,0 +1,11 @@
+ # -*- coding: utf-8 -*-
+
+def main(request, response):
+ response.headers.set("Content-Type", "text/event-stream")
+ last_event_id = request.headers.get('Last-Event-ID', None)
+
+ if(last_event_id):
+ return "data: " + last_event_id + "\n\n"
+ else:
+ return "id: …\nretry: 200\ndata: hello\n\n"
+
diff --git a/testing/web-platform/tests/eventsource/resources/message.py b/testing/web-platform/tests/eventsource/resources/message.py
new file mode 100644
index 000000000..6d04b1fbe
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/message.py
@@ -0,0 +1,14 @@
+import time
+
+def main(request, response):
+ mime = request.GET.first("mime", "text/event-stream")
+ message = request.GET.first("message", "data: data");
+ newline = "" if request.GET.first("newline", None) == "none" else "\n\n";
+ sleep = int(request.GET.first("sleep", "0"))
+
+ headers = [("Content-Type", mime)]
+ body = message + newline + "\n"
+ if sleep != 0:
+ time.sleep(sleep/1000)
+
+ return headers, body
diff --git a/testing/web-platform/tests/eventsource/resources/message2.py b/testing/web-platform/tests/eventsource/resources/message2.py
new file mode 100644
index 000000000..ce339d927
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/message2.py
@@ -0,0 +1,35 @@
+import time
+
+def main(request, response):
+ response.headers.set('Content-Type', 'text/event-stream')
+ response.headers.set('Cache-Control', 'no-cache')
+
+ response.explicit_flush = True
+ response.write_status_headers()
+
+ while True:
+ response.writer.write("data:msg")
+ response.writer.write("\n")
+ response.writer.write("data: msg")
+ response.writer.write("\n\n")
+
+ response.writer.write(":")
+ response.writer.write("\n")
+
+ response.writer.write("falsefield:msg")
+ response.writer.write("\n\n")
+
+ response.writer.write("falsefield:msg")
+ response.writer.write("\n")
+
+ response.writer.write("Data:data")
+ response.writer.write("\n\n")
+
+ response.writer.write("data")
+ response.writer.write("\n\n")
+
+ response.writer.write("data:end")
+ response.writer.write("\n\n")
+
+ response.writer.flush()
+ time.sleep(2)
diff --git a/testing/web-platform/tests/eventsource/resources/reconnect-fail.py b/testing/web-platform/tests/eventsource/resources/reconnect-fail.py
new file mode 100644
index 000000000..80a247d59
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/reconnect-fail.py
@@ -0,0 +1,24 @@
+def main(request, response):
+ name = "recon_fail_" + request.GET.first("id")
+
+ headers = [("Content-Type", "text/event-stream")]
+ cookie = request.cookies.first(name, None)
+ state = cookie.value if cookie is not None else None
+
+ if state == 'opened':
+ status = (200, "RECONNECT")
+ response.set_cookie(name, "reconnected");
+ body = "data: reconnected\n\n";
+
+ elif state == 'reconnected':
+ status = (204, "NO CONTENT (CLOSE)")
+ response.delete_cookie(name);
+ body = "data: closed\n\n" # Will never get through
+
+ else:
+ status = (200, "OPEN");
+ response.set_cookie(name, "opened");
+ body = "retry: 2\ndata: opened\n\n";
+
+ return status, headers, body
+
diff --git a/testing/web-platform/tests/eventsource/resources/status-error.py b/testing/web-platform/tests/eventsource/resources/status-error.py
new file mode 100644
index 000000000..8aa230c72
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/status-error.py
@@ -0,0 +1,4 @@
+def main(request, response):
+ status = (request.GET.first("status", "404"), "HAHAHAHA")
+ headers = [("Content-Type", "text/event-stream")]
+ return status, headers, "data: data\n\n"
diff --git a/testing/web-platform/tests/eventsource/resources/status-reconnect.py b/testing/web-platform/tests/eventsource/resources/status-reconnect.py
new file mode 100644
index 000000000..16c6502e3
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/resources/status-reconnect.py
@@ -0,0 +1,21 @@
+def main(request, response):
+ status_code = request.GET.first("status", "204")
+ name = request.GET.first("id", status_code)
+
+ headers = [("Content-Type", "text/event-stream")]
+
+ cookie_name = "request" + name
+
+ if request.cookies.first(cookie_name, "") == status_code:
+ status = 200
+ response.delete_cookie(cookie_name)
+ body = "data: data\n\n"
+ else:
+ response.set_cookie(cookie_name, status_code);
+ status = (int(status_code), "TEST")
+ body = "retry: 2\n"
+ if "ok_first" in request.GET:
+ body += "data: ok\n\n"
+
+ return status, headers, body
+
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-close.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-close.htm
new file mode 100644
index 000000000..0a0bdc7b8
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-close.htm
@@ -0,0 +1,39 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ this.close()
+ port.postMessage([true, this.readyState])
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: close()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test();
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.CLOSED, 'this.readyState')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
new file mode 100644
index 000000000..277fbd401
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
@@ -0,0 +1,52 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var url = decodeURIComponent(location.hash.substr(1))
+ var source = new EventSource(url)
+ source.onerror = function(e) {
+ port.postMessage([true, this.readyState, 'data' in e])
+ this.close();
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: constructor (act as if there is a network error)</title>
+ <meta name=timeout content=long>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ function fetchFail(url) {
+ var test = async_test(document.title + " (" + url + ")", { timeout: 20000 })
+ test.step(function() {
+ var worker = new SharedWorker('#'+encodeURIComponent(url))
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.CLOSED, 'source.readyState')
+ assert_false(e.data[2], "'data' in e");
+ })
+ test.done()
+ }
+ })
+ }
+ fetchFail("http://example.not")
+ fetchFail("https://example.not/test")
+ fetchFail("ftp://example.not")
+ fetchFail("about:blank")
+ fetchFail("mailto:whatwg@awesome.example")
+ fetchFail("javascript:alert('FAIL')")
+ </script>
+ <!-- This tests "fails the connection" as well as making sure a simple
+ event is dispatched and not a MessageEvent -->
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-url-bogus.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-url-bogus.htm
new file mode 100644
index 000000000..88fa21e3b
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-constructor-url-bogus.htm
@@ -0,0 +1,37 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("http://this is invalid/")
+ port.postMessage([false, 'no exception thrown'])
+ source.close()
+} catch(e) {
+ port.postMessage([true, e.code])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: constructor (invalid URL)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], DOMException.SYNTAX_ERR, 'e.code')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //--> \ No newline at end of file
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-eventtarget.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-eventtarget.htm
new file mode 100644
index 000000000..f5f9439d1
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-eventtarget.htm
@@ -0,0 +1,40 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.addEventListener("message", listener, false)
+ function listener(e) {
+ port.postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: addEventListener()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], 'data', 'e.data')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-onmesage.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-onmesage.htm
new file mode 100644
index 000000000..82c3ce7f2
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-onmesage.htm
@@ -0,0 +1,39 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onmessage = function(e) {
+ port.postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: onmessage</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], "data", 'e.data')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-onopen.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-onopen.htm
new file mode 100644
index 000000000..25467817f
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-onopen.htm
@@ -0,0 +1,42 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ port.postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: onopen (announcing the connection)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_equals(e.data[1], EventSource.OPEN, 'source.readyState')
+ assert_false(e.data[2], "'data' in e")
+ assert_false(e.data[3], 'e.bubbles')
+ assert_false(e.data[4], 'e.calcelable')
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-prototype.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-prototype.htm
new file mode 100644
index 000000000..27d51a858
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-prototype.htm
@@ -0,0 +1,39 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ EventSource.prototype.ReturnTrue = function() { return true }
+ var source = new EventSource("../resources/message.py")
+ port.postMessage([true, source.ReturnTrue(), 'EventSource' in self])
+ source.close()
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DoCtYpE hTMl>
+<html>
+ <heAd>
+ <title>shared worker - EventSource: prototype et al</tiTle>
+ <scrIpt src="/resources/testharness.js"></scripT>
+ <scriPt src="/resources/testharnessreport.js"></Script>
+ </heaD>
+ <boDy>
+ <diV iD="log"></Div>
+ <sCript>
+ var test = async_test();
+ test.step(function() {
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1])
+ assert_true(e.data[1], 'source.ReturnTrue()')
+ assert_true(e.data[2], "'EventSource' in self")
+ })
+ test.done()
+ }
+ })
+ </scrIpt>
+ </bOdy>
+</htMl>
+<!--*/ //-->
diff --git a/testing/web-platform/tests/eventsource/shared-worker/eventsource-url.htm b/testing/web-platform/tests/eventsource/shared-worker/eventsource-url.htm
new file mode 100644
index 000000000..0491085e9
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/shared-worker/eventsource-url.htm
@@ -0,0 +1,38 @@
+<!--
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ port.postMessage([true, source.url])
+ source.close()
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+}
+/*-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>shared worker - EventSource: url</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test();
+ test.step(function() {
+ var url = "resources/message.py"
+ var worker = new SharedWorker('#')
+ worker.port.onmessage = function(e) {
+ test.step(function() {
+ assert_true(e.data[0], e.data[1]);
+ assert_equals(e.data[1].substr(-(url.length)), url)
+ })
+ test.done()
+ }
+ })
+ </script>
+ </body>
+</html>
+<!--*/ //-->