mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Update web-platform-tests to revision 41a7d8732d8e5c65728c153d29a34fe9d5192b29
This commit is contained in:
parent
b05c3fc0c0
commit
5e8b92f3de
77 changed files with 1871 additions and 1412 deletions
File diff suppressed because it is too large
Load diff
|
@ -1 +1 @@
|
|||
7ee605db117bfc96ef145a1c77d43b704baeacb2
|
||||
b3b9deafa7ed87bd0649849f3aa729f21c4ff45d
|
|
@ -16,7 +16,7 @@ is ongoing that will affect a number of the following tests.</strong>
|
|||
<script>
|
||||
test(function() {
|
||||
assert_true("Blob" in window, "window should have a Blob property.");
|
||||
assert_equals(Blob.length, 2, "Blob.length should be 2.");
|
||||
assert_equals(Blob.length, 0, "Blob.length should be 0.");
|
||||
assert_true(Blob instanceof Function, "Blob should be a function.");
|
||||
}, "Blob interface object");
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
var open_rq = createdb(t);
|
||||
open_rq.onupgradeneeded = function(e) {
|
||||
db = event.target.result;
|
||||
db = e.target.result;
|
||||
var store = db.createObjectStore("test", {keyPath:"pKey"});
|
||||
store.createIndex("idx", "iKey");
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
var open_rq = createdb(t);
|
||||
open_rq.onupgradeneeded = function(e) {
|
||||
db = event.target.result;
|
||||
db = e.target.result;
|
||||
var store = db.createObjectStore("test", {keyPath:"pKey"});
|
||||
|
||||
for(var i = 0; i < records.length; i++) {
|
||||
|
|
|
@ -29,7 +29,7 @@ open_rq.onsuccess = function(e) {
|
|||
upgradeneeded_fired = counter++;
|
||||
});
|
||||
rq.onsuccess = t.step_func(function (e) {
|
||||
assert_equals(versionchange_fired, 0, 'block event fired #')
|
||||
assert_equals(versionchange_fired, 0, 'versionchange event fired #')
|
||||
assert_equals(blocked_fired, 1, 'block event fired #')
|
||||
assert_equals(upgradeneeded_fired, 2, 'second upgradeneeded event fired #')
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>IDBDatabase.createObjectStore() - Attampt Create Exsists Object Store With Difference keyPath throw ConstraintError </title>
|
||||
<title>IDBDatabase.createObjectStore() - attempting to create an existing object store with a different keyPath throw ConstraintError </title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#widl-IDBDatabase-createObjectStore-IDBObjectStore-DOMString-name-IDBObjectStoreParameters-optionalParameters">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
|
|
@ -47,7 +47,7 @@ should_throw({
|
|||
|
||||
function should_work(val) {
|
||||
var t = async_test("Calling open() with version argument 1.5 should not throw.")
|
||||
var rq = createdb(t)
|
||||
var rq = createdb(t, val)
|
||||
rq.onupgradeneeded = function() {
|
||||
t.done()
|
||||
}
|
||||
|
|
|
@ -25,11 +25,14 @@
|
|||
txn.objectStore("store")
|
||||
.openCursor().onsuccess = this.step_func(function(e)
|
||||
{
|
||||
if (e.target.result)
|
||||
if (e.target.result) {
|
||||
count += 1;
|
||||
e.target.result.continue()
|
||||
}
|
||||
})
|
||||
|
||||
txn.oncomplete = this.step_func(function() {
|
||||
assert_equals(count, 100);
|
||||
this.done()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
<script src=support.js></script>
|
||||
|
||||
<script>
|
||||
// TODO XXX DO THE IDBTransaction abort test here here
|
||||
var db, aborted,
|
||||
t = async_test(document.title, {timeout: 10000}),
|
||||
record = { indexedProperty: "bar" };
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
// Errors
|
||||
db.onerror = fail(t, "db.error");
|
||||
db.abort = fail(t, "db.abort");
|
||||
db.onabort = fail(t, "db.abort");
|
||||
|
||||
setTimeout(t.step_func(deleteDB), 10);
|
||||
});
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
<!--
|
||||
Test converted from WebKit:
|
||||
http://trac.webkit.org/browser/trunk/LayoutTests/storage/indexeddb/resources/interfaces.js
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<!-- Submitted from TestTWF Paris -->
|
||||
<meta charset=utf-8>
|
||||
<title>Test IndexedDB's interfaces</title>
|
||||
<link rel=author href="mailto:romain.huet@gmail.com" title="Romain Huet">
|
||||
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src=support.js></script>
|
||||
|
||||
<script>
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBCursor' in self);
|
||||
}, "Test IDBCursor");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBCursorWithValue' in self);
|
||||
}, "Test IDBCursorWithValue");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBDatabase' in self);
|
||||
}, "Test IDBDatabase");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBFactory' in self);
|
||||
}, "Test IDBFactory");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBIndex' in self);
|
||||
}, "Test IDBIndex");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBKeyRange' in self);
|
||||
}, "Test IDBKeyRange");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBObjectStore' in self);
|
||||
}, "Test IDBObjectStore");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBOpenDBRequest' in self);
|
||||
}, "Test IDBOpenDBRequest");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBRequest' in self);
|
||||
}, "Test IDBRequest");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBTransaction' in self);
|
||||
}, "Test IDBTransaction");
|
||||
|
||||
test(function() {
|
||||
assert_true('IDBVersionChangeEvent' in self);
|
||||
}, "Test IDBVersionChangeEvent");
|
||||
|
||||
</script>
|
||||
|
||||
<div id=log></div>
|
|
@ -267,7 +267,7 @@ GitHub UI. Below is one method and others can be found on
|
|||
|
||||
|
||||
4. Wait for feedback on your pull request and once your pull request is
|
||||
accepted, detele youre branch (see '
|
||||
accepted, delete your branch (see '
|
||||
[When Pull Request is Accepted][cleanup]').
|
||||
|
||||
That's it! If you're currently at a Test the Web Forward event, find an
|
||||
|
|
|
@ -14,8 +14,18 @@ function testNode(create, type) {
|
|||
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.deleteData(5, 10) })
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.deleteData(5, 0) })
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.deleteData(-1, 10) })
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.deleteData(-1, 0) })
|
||||
}, type + ".deleteData() out of bounds")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.deleteData(0, 2)
|
||||
assert_equals(node.data, "st")
|
||||
}, type + ".deleteData() at the start")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
@ -32,6 +42,33 @@ function testNode(create, type) {
|
|||
assert_equals(node.data, "tst")
|
||||
}, type + ".deleteData() in the middle")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.deleteData(2, 0)
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.deleteData(0, 0)
|
||||
assert_equals(node.data, "test")
|
||||
}, type + ".deleteData() with zero count")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.deleteData(2, -1)
|
||||
assert_equals(node.data, "te")
|
||||
}, type + ".deleteData() with small negative count")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.deleteData(1, -0x100000000 + 2)
|
||||
assert_equals(node.data, "tt")
|
||||
}, type + ".deleteData() with large negative count")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
node.data = "This is the character data test, append more 資料,更多測試資料";
|
||||
|
|
|
@ -16,6 +16,38 @@ function testNode(create, type) {
|
|||
assert_throws("INDEX_SIZE_ERR", function() { node.insertData(5, "") })
|
||||
}, type + ".insertData() out of bounds")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.insertData(-1, "x") })
|
||||
assert_throws("INDEX_SIZE_ERR", function() { node.insertData(-0x100000000 + 5, "x") })
|
||||
}, type + ".insertData() negative out of bounds")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.insertData(-0x100000000 + 2, "X")
|
||||
assert_equals(node.data, "teXst")
|
||||
}, type + ".insertData() negative in bounds")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.insertData(0, "")
|
||||
assert_equals(node.data, "test")
|
||||
}, type + ".insertData('')")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
||||
node.insertData(0, "X")
|
||||
assert_equals(node.data, "Xtest")
|
||||
}, type + ".insertData() at the start")
|
||||
|
||||
test(function() {
|
||||
var node = create()
|
||||
assert_equals(node.data, "test")
|
||||
|
|
53
tests/wpt/web-platform-tests/dom/nodes/Text-splitText.html
Normal file
53
tests/wpt/web-platform-tests/dom/nodes/Text-splitText.html
Normal file
|
@ -0,0 +1,53 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Text.splitText()</title>
|
||||
<link rel=help href="https://dom.spec.whatwg.org/#dom-text-splittextoffset">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var text = document.createTextNode("camembert");
|
||||
assert_throws("INDEX_SIZE_ERR", function () { text.splitText(10) });
|
||||
}, "Split text after end of data");
|
||||
|
||||
test(function() {
|
||||
var text = document.createTextNode("");
|
||||
var new_text = text.splitText(0);
|
||||
assert_equals(text.data, "");
|
||||
assert_equals(new_text.data, "");
|
||||
}, "Split empty text");
|
||||
|
||||
test(function() {
|
||||
var text = document.createTextNode("comté");
|
||||
var new_text = text.splitText(0);
|
||||
assert_equals(text.data, "");
|
||||
assert_equals(new_text.data, "comté");
|
||||
}, "Split text at beginning");
|
||||
|
||||
test(function() {
|
||||
var text = document.createTextNode("comté");
|
||||
var new_text = text.splitText(5);
|
||||
assert_equals(text.data, "comté");
|
||||
assert_equals(new_text.data, "");
|
||||
}, "Split text at end");
|
||||
|
||||
test(function() {
|
||||
var text = document.createTextNode("comté");
|
||||
var new_text = text.splitText(3);
|
||||
assert_equals(text.data, "com");
|
||||
assert_equals(new_text.data, "té");
|
||||
assert_equals(new_text.parentNode, null);
|
||||
}, "Split root");
|
||||
|
||||
test(function() {
|
||||
var parent = document.createElement('div');
|
||||
var text = document.createTextNode("bleu");
|
||||
parent.appendChild(text);
|
||||
var new_text = text.splitText(2);
|
||||
assert_equals(text.data, "bl");
|
||||
assert_equals(new_text.data, "eu");
|
||||
assert_equals(text.nextSibling, new_text);
|
||||
assert_equals(new_text.parentNode, parent);
|
||||
}, "Split child");
|
||||
</script>
|
|
@ -0,0 +1,3 @@
|
|||
def main(request, response):
|
||||
response.headers.set("Content-Type", "text/plain;charset=" + request.GET.first("label"))
|
||||
response.content = "hello encoding"
|
|
@ -86,7 +86,7 @@
|
|||
async_test(function(t) {
|
||||
var frame = document.createElement("iframe"),
|
||||
name = compatibility_names[encoding.name] || encoding.name;
|
||||
frame.src = "resources/single-byte-raw.py?label=" + label
|
||||
frame.src = "resources/text-plain-charset.py?label=" + label
|
||||
frame.onload = t.step_func_done(function() {
|
||||
assert_equals(frame.contentDocument.characterSet, name)
|
||||
assert_equals(frame.contentDocument.inputEncoding, name)
|
||||
|
|
|
@ -63,9 +63,7 @@ test(function() {
|
|||
assert_equals(img2.id, "test4");
|
||||
|
||||
assert_false("test4" in document, '"test4" in document should be false');
|
||||
var collection = document.test4;
|
||||
assert_class_string(collection, "HTMLCollection", "collection should be an HTMLCollection");
|
||||
assert_array_equals(collection, [img1, img2]);
|
||||
assert_equals(document.test4, undefined);
|
||||
}, "If there are two imgs, nothing should be returned. (id)");
|
||||
|
||||
test(function() {
|
||||
|
|
|
@ -373,7 +373,7 @@ ReflectionTests.typeMap = {
|
|||
{toString:function() {return 2;}, valueOf: null},
|
||||
{valueOf:function() {return 3;}}],
|
||||
"domExpected": function(val) {
|
||||
var parsed = ReflectionTests.parseNonneg(val + "");
|
||||
var parsed = ReflectionTests.parseNonneg(String(val));
|
||||
if (parsed === false || parsed > maxInt || parsed < minInt) {
|
||||
return null;
|
||||
}
|
||||
|
@ -409,7 +409,7 @@ ReflectionTests.typeMap = {
|
|||
{toString:function() {return 2;}, valueOf: null},
|
||||
{valueOf:function() {return 3;}}],
|
||||
"domExpected": function(val) {
|
||||
var parsed = ReflectionTests.parseNonneg(val + "");
|
||||
var parsed = ReflectionTests.parseNonneg(String(val));
|
||||
// Note maxInt, not maxUnsigned.
|
||||
if (parsed === false || parsed < 0 || parsed > maxInt) {
|
||||
return null;
|
||||
|
@ -450,7 +450,7 @@ ReflectionTests.typeMap = {
|
|||
{toString:function() {return 2;}, valueOf: null},
|
||||
{valueOf:function() {return 3;}}],
|
||||
"domExpected": function(val) {
|
||||
var parsed = ReflectionTests.parseNonneg(val + "");
|
||||
var parsed = ReflectionTests.parseNonneg(String(val));
|
||||
// Note maxInt, not maxUnsigned.
|
||||
if (parsed === false || parsed < 1 || parsed > maxInt) {
|
||||
return null;
|
||||
|
@ -696,7 +696,7 @@ ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) {
|
|||
}
|
||||
try {
|
||||
domObj.setAttribute(domName, domTests[i]);
|
||||
ReflectionHarness.test(domObj.getAttribute(domName), domTests[i] + "", "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by getAttribute()");
|
||||
ReflectionHarness.test(domObj.getAttribute(domName), String(domTests[i]), "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by getAttribute()");
|
||||
ReflectionHarness.test(idlObj[idlName], domExpected[i], "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by IDL get");
|
||||
if (ReflectionHarness.catchUnexpectedExceptions) {
|
||||
ReflectionHarness.success();
|
||||
|
|
|
@ -26,11 +26,11 @@
|
|||
test(function(){ assert_equals(document.getElementById("chkDefaultValue").value, "");
|
||||
}, "time element of default time value");
|
||||
test(function(){assert_equals(document.getElementById('chkStep').step, "");
|
||||
} , "step attribute on default value check");
|
||||
}, "step attribute on default value check");
|
||||
test(function(){assert_equals(document.getElementById('chkDefaultValue').max, "");
|
||||
} , "max attribute on default value check")
|
||||
}, "max attribute on default value check")
|
||||
test(function(){assert_equals(document.getElementById('chkDefaultValue').max, "");
|
||||
} , "min attribute on default value check")
|
||||
}, "min attribute on default value check")
|
||||
|
||||
/* simple attribute test*/
|
||||
test(function(){assert_equals(document.getElementById("chkSupportAttribute").type,"time");}
|
||||
|
|
|
@ -15,9 +15,7 @@ INDENT TABS: custom-elements/*
|
|||
INDENT TABS: DOMEvents/*
|
||||
INDENT TABS: eventsource/*
|
||||
INDENT TABS: html/editing/dnd/*
|
||||
INDENT TABS: html/semantics/*
|
||||
INDENT TABS: html/syntax/*
|
||||
INDENT TABS: html/webappapis/*
|
||||
INDENT TABS: media-source/*
|
||||
INDENT TABS: old-tests/*
|
||||
INDENT TABS: pointerlock/*
|
||||
|
@ -89,6 +87,7 @@ PRINT STATEMENT:*/tools/*
|
|||
CR AT EOL:WebIDL/valid/idl/documentation-dos.widl
|
||||
CR AT EOL:cors/resources/cors-headers.asis
|
||||
CR AT EOL:html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html
|
||||
INDENT TABS:html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html
|
||||
CR AT EOL:webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/newlines.vtt
|
||||
PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/empty.svg
|
||||
PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/empty.xhtml
|
||||
|
|
|
@ -97,5 +97,5 @@ function mediaSourceConfigChangeTest(directory, idA, idB, description)
|
|||
});
|
||||
});
|
||||
});
|
||||
}, description, { timeout: 10000 } );
|
||||
}, description);
|
||||
};
|
||||
|
|
|
@ -211,7 +211,7 @@
|
|||
test.done();
|
||||
});
|
||||
});
|
||||
}, 'Test setting same duration multiple times does not fire duplicate durationchange', {timeout: 2500});
|
||||
}, 'Test setting same duration multiple times does not fire duplicate durationchange');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
assert_greater_than(timeUpdateCount, 2, "timeUpdateCount");
|
||||
test.done();
|
||||
});
|
||||
}, "Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API", {timeout: 5000});
|
||||
}, "Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
mediaSource.endOfStream();
|
||||
mediaElement.play();
|
||||
});
|
||||
}, "Test normal playback case with MediaSource API", {timeout: 5000});
|
||||
}, "Test normal playback case with MediaSource API");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
test.done();
|
||||
});
|
||||
|
||||
}, 'Test seeking to a new location before transitioning beyond HAVE_METADATA.', {timeout: 10000} );
|
||||
}, 'Test seeking to a new location before transitioning beyond HAVE_METADATA.');
|
||||
|
||||
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
||||
{
|
||||
|
@ -136,7 +136,7 @@
|
|||
assert_greater_than(mediaElement.readyState, mediaElement.HAVE_CURRENT_DATA, 'Greater than HAVE_CURRENT_DATA');
|
||||
test.done();
|
||||
});
|
||||
}, 'Test seeking to a new location during a pending seek.', {timeout: 10000} );
|
||||
}, 'Test seeking to a new location during a pending seek.');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
(function(window) {
|
||||
setup({ timeout: 12000 });
|
||||
|
||||
var SEGMENT_INFO_LIST = [
|
||||
{
|
||||
url: 'mp4/test.mp4',
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<div id="test"></div>
|
||||
<div id="log">FAILED (This TC requires JavaScript enabled)</div>
|
||||
|
||||
<script id="async-script" async src="scripts/include-2.js?pipe=trickle(d1)"></script>
|
||||
<script id="async-script" async src="scripts/include-2.js?pipe=trickle(d2)"></script>
|
||||
|
||||
<script>
|
||||
var t = async_test();
|
||||
|
|
9
tests/wpt/web-platform-tests/referrer-policy/README.html
Normal file
9
tests/wpt/web-platform-tests/referrer-policy/README.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title>Referrer-Policy Web Platform Tests - README</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
TODO(burnik): Instructions on how to write tests for Referrer-Policy.
|
||||
</p>
|
||||
</body>
|
|
@ -0,0 +1,28 @@
|
|||
// NOTE: This method only strips the fragment and is not in accordance to the
|
||||
// recommended draft specification:
|
||||
// https://w3c.github.io/webappsec/specs/referrer-policy/#null
|
||||
// TODO(burnik): Implement this helper as defined by spec once added scenarios
|
||||
// for URLs containing username/password/etc.
|
||||
function stripUrlForUseAsReferrer(url) {
|
||||
return url.replace(/#.*$/, "");
|
||||
}
|
||||
|
||||
function parseUrlQueryString(queryString) {
|
||||
var queries = queryString.replace(/^\?/, "").split("&");
|
||||
var params = {};
|
||||
|
||||
for (var i in queries) {
|
||||
var kvp = queries[i].split("=");
|
||||
params[kvp[0]] = kvp[1];
|
||||
}
|
||||
|
||||
return params;
|
||||
};
|
||||
|
||||
function appendIframeToBody(url) {
|
||||
var iframe = document.createElement("iframe");
|
||||
iframe.src = url;
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
return iframe;
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Check that sub-resource gets the referrer URL when no explicit
|
||||
Referrer Policy is set.</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<!-- Common global functions for referrer-policy tests. -->
|
||||
<script src="../generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Check that sub-resource gets the referrer URL when no explicit Referrer
|
||||
Policy is set.</h1>
|
||||
|
||||
<p>This page loads sub-resources (iframes) and waits for messages containing
|
||||
referrer URLs from children.</p>
|
||||
|
||||
<script>
|
||||
var documentUrl = document.location.toString();
|
||||
|
||||
// Referrer policy can also be defined via meta tag of parent.
|
||||
// TODO(burnik): For now we use the DOM element itself as we expect it not
|
||||
// to be explicitly defined on the page. We should use the content
|
||||
// attribute value instead.
|
||||
var documentMetaReferrer = document.querySelector("meta[name=referrer]");
|
||||
|
||||
// The referrer URL should be this document's URL adjusted according to
|
||||
// this section:
|
||||
// https://w3c.github.io/webappsec/specs/referrer-policy/#strip-url
|
||||
var expectedReferrerUrl = stripUrlForUseAsReferrer(documentUrl);
|
||||
|
||||
// Path to the sub-resource page which reports back it's own context.
|
||||
var subresourceUrlPath = "/referrer-policy/no-referrer-policy" +
|
||||
"/no-referrer-policy.subresource.py";
|
||||
|
||||
// Define all the test definitions here to create correspoding test
|
||||
// arrangements. Each test arrangement will have it's own iframe and ID
|
||||
// passed by URL. The ID should be unique as it identifies the message
|
||||
// coming back from the iframe and matches the corressponding test to be
|
||||
// run.
|
||||
var scenarios = [
|
||||
{
|
||||
id: "same-origin",
|
||||
url: location.protocol + "//" + location.hostname + ":" +
|
||||
location.port + subresourceUrlPath,
|
||||
metaReferrer: documentMetaReferrer,
|
||||
expectedReferrerUrl: expectedReferrerUrl,
|
||||
description: "Refrerer URL is passed to sub-resource (iframe) of " +
|
||||
"same-origin."
|
||||
},
|
||||
{
|
||||
id: "cross-origin",
|
||||
url: location.protocol + "//www1." + location.hostname + ":" +
|
||||
location.port + subresourceUrlPath,
|
||||
metaReferrer: documentMetaReferrer,
|
||||
expectedReferrerUrl: expectedReferrerUrl,
|
||||
description: "Refrerer URL is passed to sub-resource (iframe) of " +
|
||||
"cross-origin."
|
||||
}
|
||||
];
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Rest of the script arranges and runs all the tests defined above.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Creates a test arrangement from a test scenario.
|
||||
function arrangeScenario(scenario) {
|
||||
var test = async_test(scenario.description);
|
||||
var subresourceUrl = scenario.url + "?id=" + scenario.id;
|
||||
var testArrangement = {
|
||||
scenario:scenario,
|
||||
test:test,
|
||||
subresourceUrl:subresourceUrl
|
||||
};
|
||||
|
||||
return testArrangement;
|
||||
}
|
||||
|
||||
// Asserts the values for an iframe response message and matched test
|
||||
// arrangement.
|
||||
function assertScenario(message, testArrangement) {
|
||||
// Defense: Making sure the message and test arrangement are up to date.
|
||||
testArrangement.test.step(function() {
|
||||
assert_equals(Object.keys(message).length, 4);
|
||||
assert_own_property(message, "id");
|
||||
assert_own_property(message, "location");
|
||||
assert_own_property(message, "referrer");
|
||||
assert_own_property(message, "headers");
|
||||
assert_own_property(message.headers, "referer");
|
||||
|
||||
assert_equals(Object.keys(testArrangement).length, 3);
|
||||
assert_own_property(testArrangement, "scenario");
|
||||
assert_own_property(testArrangement, "test");
|
||||
assert_own_property(testArrangement, "subresourceUrl");
|
||||
|
||||
assert_equals(Object.keys(testArrangement.scenario).length, 5);
|
||||
assert_own_property(testArrangement.scenario, "id");
|
||||
assert_own_property(testArrangement.scenario, "url");
|
||||
assert_own_property(testArrangement.scenario, "metaReferrer");
|
||||
assert_own_property(testArrangement.scenario, "expectedReferrerUrl");
|
||||
assert_own_property(testArrangement.scenario, "description");
|
||||
}, "Running a valid test scenario.");
|
||||
|
||||
testArrangement.test.step(function() {
|
||||
// TODO(burnik): This check should be specified by the scenario
|
||||
// itself. For now we only expect that there is no CSP so neither is
|
||||
// the referrer policy explicitly defined via HTTP headers.
|
||||
assert_not_exists(message.headers, "content-security-policy",
|
||||
"No referrer policy is set.");
|
||||
|
||||
// The meta defined refferer should also not exist.
|
||||
assert_equals(testArrangement.scenario.metaReferrer, null);
|
||||
}, "No referrer policy is explicity defined via HTTP headers or meta.")
|
||||
|
||||
testArrangement.test.step(function() {
|
||||
// Sanity check - location of iframe matches reported location.
|
||||
assert_equals(message.location, testArrangement.subresourceUrl,
|
||||
"Child reported location.");
|
||||
|
||||
// Child reports the referrer URL available from DOM.
|
||||
assert_equals(message.referrer,
|
||||
testArrangement.scenario.expectedReferrerUrl,
|
||||
"Child reported referrer.");
|
||||
|
||||
// Also check the request headers reported from the server.
|
||||
assert_equals(message.headers.referer,
|
||||
testArrangement.scenario.expectedReferrerUrl,
|
||||
"Child reported referrer (from server).");
|
||||
|
||||
}, "Referrer URL is passed to the sub-resource (iframe).");
|
||||
|
||||
testArrangement.test.done();
|
||||
}
|
||||
|
||||
// Using a map to easily find and run the test corresponding to the
|
||||
// received message ID (iframe).
|
||||
var testArrangementMap = {};
|
||||
|
||||
// With this handler we receive all the messages from the iframes.
|
||||
// We identify the source and appropriate test arrangement to be run via
|
||||
// the provided message ID.
|
||||
window.addEventListener("message", function (event) {
|
||||
var childMessage = event.data;
|
||||
var testArrangement = testArrangementMap[childMessage.id];
|
||||
// Run the test for this sub-resource.
|
||||
assertScenario(childMessage, testArrangement);
|
||||
});
|
||||
|
||||
// Map all test arrangements by ID and append iframes.
|
||||
for (var i in scenarios) {
|
||||
var testArrangement = arrangeScenario(scenarios[i]);
|
||||
testArrangementMap[scenarios[i].id] = testArrangement;
|
||||
appendIframeToBody(testArrangement.subresourceUrl);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,15 @@
|
|||
import os, json
|
||||
|
||||
def main(request, response):
|
||||
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||
template_basename = "no-referrer-policy.subresource.template.html"
|
||||
template_filename = os.path.join(script_directory, template_basename);
|
||||
|
||||
with open(template_filename) as f:
|
||||
template = f.read()
|
||||
|
||||
headers_as_json = json.dumps(request.headers)
|
||||
exported_headers = "var SERVER_REQUEST_HEADERS = " + headers_as_json + ";"
|
||||
rendered_html = template % {"headers": headers_as_json}
|
||||
|
||||
return response.headers, rendered_html
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>This page reports back it's request details the parent frame</title>
|
||||
<!-- Common global functions for referrer-policy tests. -->
|
||||
<script src="../generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h2>This page reports back it's request details to the parent frame.</h2>
|
||||
|
||||
<script>
|
||||
// Notice: This is filled in from server side.
|
||||
var SERVER_REQUEST_HEADERS = %(headers)s;
|
||||
|
||||
var query = parseUrlQueryString(document.location.search)
|
||||
|
||||
// Note: Read the ID from the query section of this page's URL.
|
||||
// The ID is used to identify the sender of the message in the parent.
|
||||
var pageInfo = {
|
||||
id: query.id,
|
||||
location: document.location.toString(),
|
||||
referrer: document.referrer,
|
||||
headers: SERVER_REQUEST_HEADERS
|
||||
};
|
||||
|
||||
// Notify parent frame.
|
||||
parent.postMessage(pageInfo, "*");
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -56,6 +56,19 @@ function constValue (cnt) {
|
|||
return cnt.value;
|
||||
}
|
||||
|
||||
function minOverloadLength(overloads) {
|
||||
if (!overloads.length) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return overloads.map(function(attr) {
|
||||
return attr.arguments ? attr.arguments.filter(function(arg) {
|
||||
return !arg.optional && !arg.variadic;
|
||||
}).length : 0;
|
||||
})
|
||||
.reduce(function(m, n) { return Math.min(m, n); });
|
||||
}
|
||||
|
||||
/// IdlArray ///
|
||||
// Entry point
|
||||
self.IdlArray = function()
|
||||
|
@ -754,22 +767,7 @@ IdlInterface.prototype.test_self = function()
|
|||
|
||||
var constructors = this.extAttrs
|
||||
.filter(function(attr) { return attr.name == "Constructor"; });
|
||||
var expected_length;
|
||||
if (!constructors.length) {
|
||||
// "If the [Constructor] extended attribute, does not appear on
|
||||
// the interface definition, then the value is 0."
|
||||
expected_length = 0;
|
||||
} else {
|
||||
// "Otherwise, the value is determined as follows: . . .
|
||||
// "Return the length of the shortest argument list of the
|
||||
// entries in S."
|
||||
expected_length = constructors.map(function(attr) {
|
||||
return attr.arguments ? attr.arguments.filter(function(arg) {
|
||||
return !arg.optional;
|
||||
}).length : 0;
|
||||
})
|
||||
.reduce(function(m, n) { return Math.min(m, n); });
|
||||
}
|
||||
var expected_length = minOverloadLength(constructors);
|
||||
assert_equals(self[this.name].length, expected_length, "wrong value for " + this.name + ".length");
|
||||
}.bind(this), this.name + " interface object length");
|
||||
}
|
||||
|
@ -1122,12 +1120,10 @@ IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject
|
|||
// ". . .
|
||||
// "Return the length of the shortest argument list of the
|
||||
// entries in S."
|
||||
//
|
||||
// TODO: Doesn't handle overloading or variadic arguments.
|
||||
assert_equals(memberHolderObject[member.name].length,
|
||||
member.arguments.filter(function(arg) {
|
||||
return !arg.optional;
|
||||
}).length,
|
||||
minOverloadLength(this.members.filter(function(m) {
|
||||
return m.type == "operation" && m.name == member.name;
|
||||
})),
|
||||
"property has wrong .length");
|
||||
|
||||
// Make some suitable arguments
|
||||
|
@ -1460,13 +1456,12 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
|
|||
{
|
||||
assert_false(member.name in obj);
|
||||
}
|
||||
|
||||
var minLength = minOverloadLength(this.members.filter(function(m) {
|
||||
return m.type == "operation" && m.name == member.name;
|
||||
}));
|
||||
var args = [];
|
||||
for (var i = 0; i < member.arguments.length; i++)
|
||||
{
|
||||
if (member.arguments[i].optional)
|
||||
{
|
||||
break;
|
||||
}
|
||||
for (var i = 0; i < minLength; i++) {
|
||||
assert_throws(new TypeError(), function()
|
||||
{
|
||||
obj[member.name].apply(obj, args);
|
||||
|
|
|
@ -368,8 +368,20 @@ policies and contribution forms [3].
|
|||
self.addEventListener("message",
|
||||
function(event) {
|
||||
if (event.data.type && event.data.type === "connect") {
|
||||
if (event.ports && event.ports[0]) {
|
||||
// If a MessageChannel was passed, then use it to
|
||||
// send results back to the main window. This
|
||||
// allows the tests to work even if the browser
|
||||
// does not fully support MessageEvent.source in
|
||||
// ServiceWorkers yet.
|
||||
this_obj._add_message_port(event.ports[0]);
|
||||
event.ports[0].start();
|
||||
} else {
|
||||
// If there is no MessageChannel, then attempt to
|
||||
// use the MessageEvent.source to send results
|
||||
// back to the main window.
|
||||
this_obj._add_message_port(event.source);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1476,15 +1488,24 @@ policies and contribution forms [3].
|
|||
var message_port;
|
||||
|
||||
if (is_service_worker(worker)) {
|
||||
if (window.MessageChannel) {
|
||||
// The ServiceWorker's implicit MessagePort is currently not
|
||||
// reliably accessible from the ServiceWorkerGlobalScope due to
|
||||
// Blink setting MessageEvent.source to null for messages sent via
|
||||
// ServiceWorker.postMessage(). Until that's resolved, create an
|
||||
// explicit MessageChannel and pass one end to the worker.
|
||||
// Blink setting MessageEvent.source to null for messages sent
|
||||
// via ServiceWorker.postMessage(). Until that's resolved,
|
||||
// create an explicit MessageChannel and pass one end to the
|
||||
// worker.
|
||||
var message_channel = new MessageChannel();
|
||||
message_port = message_channel.port1;
|
||||
message_port.start();
|
||||
worker.postMessage({type: "connect"}, [message_channel.port2]);
|
||||
} else {
|
||||
// If MessageChannel is not available, then try the
|
||||
// ServiceWorker.postMessage() approach using MessageEvent.source
|
||||
// on the other end.
|
||||
message_port = navigator.serviceWorker;
|
||||
worker.postMessage({type: "connect"});
|
||||
}
|
||||
} else if (is_shared_worker(worker)) {
|
||||
message_port = worker.port;
|
||||
} else {
|
||||
|
@ -2335,7 +2356,15 @@ policies and contribution forms [3].
|
|||
AssertionError.prototype = Object.create(Error.prototype);
|
||||
|
||||
AssertionError.prototype.get_stack = function() {
|
||||
var lines = new Error().stack.split("\n");
|
||||
var stack = new Error().stack;
|
||||
if (!stack) {
|
||||
try {
|
||||
throw new Error();
|
||||
} catch (e) {
|
||||
stack = e.stack;
|
||||
}
|
||||
}
|
||||
var lines = stack.split("\n");
|
||||
var rv = [];
|
||||
var re = /\/resources\/testharness\.js/;
|
||||
var i = 0;
|
||||
|
|
|
@ -103,14 +103,6 @@ var vary_entries = [
|
|||
request: new Request('http://example.com/c'),
|
||||
response: new Response('',
|
||||
{headers: {'Vary': 'Cookies'}})
|
||||
},
|
||||
|
||||
{
|
||||
name: 'vary_wildcard',
|
||||
request: new Request('http://example.com/c',
|
||||
{headers: {'Cookies': 'x', 'X-Key': '1'}}),
|
||||
response: new Response('',
|
||||
{headers: {'Vary': '*'}})
|
||||
}
|
||||
];
|
||||
|
||||
|
@ -311,7 +303,6 @@ prepopulated_cache_test(vary_entries, function(cache, entries) {
|
|||
assert_array_equivalent(
|
||||
result,
|
||||
[
|
||||
entries.vary_wildcard.response,
|
||||
entries.vary_cookie_absent.response
|
||||
],
|
||||
'Cache.matchAll should exclude matches if a vary header is ' +
|
||||
|
@ -328,7 +319,6 @@ prepopulated_cache_test(vary_entries, function(cache, entries) {
|
|||
assert_array_equivalent(
|
||||
result,
|
||||
[
|
||||
entries.vary_wildcard.response
|
||||
],
|
||||
'Cache.matchAll should exclude matches if a vary header is ' +
|
||||
'missing in the cached request, but is present in the query ' +
|
||||
|
@ -355,7 +345,6 @@ prepopulated_cache_test(vary_entries, function(cache, entries) {
|
|||
assert_object_in_array(
|
||||
result,
|
||||
[
|
||||
entries.vary_wildcard.response,
|
||||
entries.vary_cookie_absent.response
|
||||
],
|
||||
'Cache.match should honor "Vary" header.');
|
||||
|
@ -372,7 +361,6 @@ prepopulated_cache_test(vary_entries, function(cache, entries) {
|
|||
entries.vary_cookie_is_cookie.response,
|
||||
entries.vary_cookie_is_good.response,
|
||||
entries.vary_cookie_absent.response,
|
||||
entries.vary_wildcard.response
|
||||
],
|
||||
'Cache.matchAll should honor "ignoreVary" parameter.');
|
||||
});
|
||||
|
|
|
@ -283,12 +283,35 @@ cache_test(function(cache) {
|
|||
'[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
|
||||
'Response.bodyUsed should be initially false.');
|
||||
return response.text().then(function() {
|
||||
assert_false(
|
||||
assert_true(
|
||||
response.bodyUsed,
|
||||
'[https://fetch.spec.whatwg.org/#concept-body-consume-body] ' +
|
||||
'The text() method should not set "body passed" flag.');
|
||||
return cache.put(new Request(test_url), response);
|
||||
'The text() method should set "body used" flag.');
|
||||
return assert_promise_rejects(
|
||||
cache.put(new Request(test_url), response),
|
||||
new TypeError,
|
||||
'[https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#cache-put] ' +
|
||||
'Cache put should reject with TypeError when Response ' +
|
||||
'body is already used.');
|
||||
});
|
||||
}, 'Cache.put with a used response body');
|
||||
|
||||
cache_test(function(cache) {
|
||||
return assert_promise_rejects(
|
||||
cache.put(new Request(test_url),
|
||||
new Response(test_body, { headers: { VARY: '*' }})),
|
||||
new TypeError(),
|
||||
'Cache.put should reject VARY:* Responses with a TypeError.');
|
||||
}, 'Cache.put with a VARY:* Response');
|
||||
|
||||
cache_test(function(cache) {
|
||||
return assert_promise_rejects(
|
||||
cache.put(new Request(test_url),
|
||||
new Response(test_body,
|
||||
{ headers: { VARY: 'Accept-Language,*' }})),
|
||||
new TypeError(),
|
||||
'Cache.put should reject Responses with an embedded VARY:* with a ' +
|
||||
'TypeError.');
|
||||
}, 'Cache.put with an embedded VARY:* Response');
|
||||
|
||||
done();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache.add and Cache.addAll</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../service-workers/resources/test-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache.delete</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../service-workers/resources/test-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage.keys</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../service-workers/resources/test-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage.match</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../service-workers/resources/test-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../service-workers/resources/test-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: Cache.add and Cache.addAll</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: Cache.delete</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: CacheStorage.keys</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: CacheStorage.match</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: CacheStorage</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache Storage: Verify access in sandboxed iframes</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../resources/testharness-helpers.js"></script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache.add and Cache.addAll</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Cache.delete</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage.keys</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage.match</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CacheStorage</title>
|
||||
<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Web Animations API: AnimationTimeline tests</title>
|
||||
<title>Web Animations API: DocumentTimeline tests</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
|
@ -1,15 +1,18 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Web Animations API: AnimationTimeline tests</title>
|
||||
<title>Web Animations API: DocumentTimeline 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>
|
||||
<div id="log"></div>
|
||||
<script type="text/plain" id="AnimationTimeline-IDL">
|
||||
<script type="text/plain" id="DocumentTimeline-IDL">
|
||||
interface AnimationTimeline {
|
||||
readonly attribute double? currentTime;
|
||||
};
|
||||
|
||||
interface DocumentTimeline : AnimationTimeline {
|
||||
};
|
||||
</script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
@ -18,8 +21,8 @@ var idlArray;
|
|||
test(function() {
|
||||
idlArray = new IdlArray();
|
||||
idlArray.add_idls(
|
||||
document.getElementById('AnimationTimeline-IDL').textContent);
|
||||
idlArray.add_objects( { AnimationTimeline: ['document.timeline'] } );
|
||||
document.getElementById('DocumentTimeline-IDL').textContent);
|
||||
idlArray.add_objects( { DocumentTimeline: ['document.timeline'] } );
|
||||
});
|
||||
idlArray.test();
|
||||
|
||||
|
|
|
@ -13,20 +13,18 @@ document.body.appendChild(iframe);
|
|||
</script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
var t = async_test();
|
||||
onload = t.step_func(function() {
|
||||
onload = function() {
|
||||
window[0].postMessage(1, location.href, []);
|
||||
window[1].postMessage(2, url, []);
|
||||
var i = 0;
|
||||
onmessage = t.step_func(function(e) {
|
||||
onmessage = function(e) {
|
||||
i++;
|
||||
assert_equals(e.data[0], i);
|
||||
assert_equals(e.data[1], location.protocol + '//' + location.host);
|
||||
if (i === 2) {
|
||||
t.done();
|
||||
done();
|
||||
}
|
||||
});
|
||||
setTimeout(t.step_func(function() { assert_unreached("Only got " + i + " events before timeout, expected 2") }), 1000);
|
||||
});
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
@ -13,20 +13,18 @@ document.body.appendChild(iframe);
|
|||
</script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
var t = async_test();
|
||||
onload = t.step_func(function() {
|
||||
onload = function() {
|
||||
window[0].postMessage(1, '*', []);
|
||||
window[1].postMessage(2, '*', []);
|
||||
var i = 0;
|
||||
onmessage = t.step_func(function(e) {
|
||||
onmessage = function(e) {
|
||||
i++;
|
||||
assert_equals(e.data[0], i);
|
||||
assert_equals(e.data[1], location.protocol + '//' + location.host);
|
||||
if (i === 2) {
|
||||
t.done();
|
||||
done();
|
||||
}
|
||||
});
|
||||
setTimeout(t.step_func(function() { assert_unreached("Only got " + i + " events before timeout, expected 2") }), 1000);
|
||||
});
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
@ -13,20 +13,18 @@ document.body.appendChild(iframe);
|
|||
</script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
var t = async_test();
|
||||
onload = t.step_func(function() {
|
||||
onload = function() {
|
||||
window[0].postMessage(1, location.href);
|
||||
window[1].postMessage(2, url);
|
||||
var i = 0;
|
||||
onmessage = t.step_func(function(e) {
|
||||
onmessage = function(e) {
|
||||
i++;
|
||||
assert_equals(e.data[0], i);
|
||||
assert_equals(e.data[1], location.protocol + '//' + location.host);
|
||||
if (i == 2) {
|
||||
t.done();
|
||||
done();
|
||||
}
|
||||
});
|
||||
setTimeout(t.step_func(function() {assert_unreached("Only got " + i + " events before timeout, expected 2")}), 1000);
|
||||
});
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
@ -13,20 +13,18 @@ document.body.appendChild(iframe);
|
|||
</script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
var t = async_test();
|
||||
onload = t.step_func(function() {
|
||||
onload = function() {
|
||||
window[0].postMessage(1, '*');
|
||||
window[1].postMessage(2, '*');
|
||||
var i = 0;
|
||||
onmessage = t.step_func(function(e) {
|
||||
onmessage = function(e) {
|
||||
i++;
|
||||
assert_equals(e.data[0], i);
|
||||
assert_equals(e.data[1], location.protocol + '//' + location.host);
|
||||
if (i === 2) {
|
||||
t.done();
|
||||
done();
|
||||
}
|
||||
});
|
||||
setTimeout(t.step_func(function() { assert_unreached("Only got " + i + " events before timeout, expected 2")}), 1000);
|
||||
});
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
149
tests/wpt/web-platform-tests/webrtc/no-media-call.html
Normal file
149
tests/wpt/web-platform-tests/webrtc/no-media-call.html
Normal file
|
@ -0,0 +1,149 @@
|
|||
<!doctype html>
|
||||
<!--
|
||||
This test uses no media, and thus does not require fake media devices.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>RTCPeerConnection No-Media Connection Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<h2>iceConnectionState info</h2>
|
||||
<div id="stateinfo">
|
||||
</div>
|
||||
|
||||
<!-- These files are in place when executing on W3C. -->
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/vendor-prefix.js"
|
||||
data-prefixed-objects=
|
||||
'[{"ancestors":["window"], "name":"RTCPeerConnection"},
|
||||
{"ancestors":["window"], "name":"RTCSessionDescription"},
|
||||
{"ancestors":["window"], "name":"RTCIceCandidate"}]'
|
||||
>
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var test = async_test('Can set up a basic WebRTC call with no data.');
|
||||
|
||||
var gFirstConnection = null;
|
||||
var gSecondConnection = null;
|
||||
|
||||
var onOfferCreated = test.step_func(function(offer) {
|
||||
// TODO: Switch to promise-based interface.
|
||||
gFirstConnection.setLocalDescription(offer, ignoreSuccess,
|
||||
failed('setLocalDescription first'));
|
||||
|
||||
// This would normally go across the application's signaling solution.
|
||||
// In our case, the "signaling" is to call this function.
|
||||
receiveCall(offer.sdp);
|
||||
});
|
||||
|
||||
function receiveCall(offerSdp) {
|
||||
|
||||
var parsedOffer = new RTCSessionDescription({ type: 'offer',
|
||||
sdp: offerSdp });
|
||||
// These functions use the legacy interface extensions to RTCPeerConnection.
|
||||
// TODO: Switch to promise-based interfaces.
|
||||
gSecondConnection.setRemoteDescription(parsedOffer,
|
||||
function() {
|
||||
gSecondConnection.createAnswer(onAnswerCreated,
|
||||
failed('createAnswer'));
|
||||
},
|
||||
failed('setRemoteDescription second'));
|
||||
};
|
||||
|
||||
var onAnswerCreated = test.step_func(function(answer) {
|
||||
gSecondConnection.setLocalDescription(answer, ignoreSuccess,
|
||||
failed('setLocalDescription second'));
|
||||
|
||||
// Similarly, this would go over the application's signaling solution.
|
||||
handleAnswer(answer.sdp);
|
||||
});
|
||||
|
||||
function handleAnswer(answerSdp) {
|
||||
var parsedAnswer = new RTCSessionDescription({ type: 'answer',
|
||||
sdp: answerSdp });
|
||||
gFirstConnection.setRemoteDescription(parsedAnswer, ignoreSuccess,
|
||||
failed('setRemoteDescription first'));
|
||||
};
|
||||
|
||||
var onIceCandidateToFirst = test.step_func(function(event) {
|
||||
// If event.candidate is null = no more candidates.
|
||||
if (event.candidate) {
|
||||
var candidate = new RTCIceCandidate(event.candidate);
|
||||
gSecondConnection.addIceCandidate(candidate);
|
||||
}
|
||||
});
|
||||
|
||||
var onIceCandidateToSecond = test.step_func(function(event) {
|
||||
if (event.candidate) {
|
||||
var candidate = new RTCIceCandidate(event.candidate);
|
||||
gFirstConnection.addIceCandidate(candidate);
|
||||
}
|
||||
});
|
||||
|
||||
var onRemoteStream = test.step_func(function(event) {
|
||||
assert_unreached('WebRTC received a stream when there was none');
|
||||
});
|
||||
|
||||
var onIceConnectionStateChange = test.step_func(function(event) {
|
||||
assert_equals(event.type, 'iceconnectionstatechange');
|
||||
var stateinfo = document.getElementById('stateinfo');
|
||||
stateinfo.innerHTML = 'First: ' + gFirstConnection.iceConnectionState
|
||||
+ '<br>Second: ' + gSecondConnection.iceConnectionState;
|
||||
// Note: All these combinations are legal states indicating that the
|
||||
// call has connected. All browsers should end up in completed/completed,
|
||||
// but as of this moment, we've chosen to terminate the test early.
|
||||
// TODO: Revise test to ensure completed/completed is reached.
|
||||
if (gFirstConnection.iceConnectionState == 'connected' &&
|
||||
gSecondConnection.iceConnectionState == 'connected') {
|
||||
test.done()
|
||||
}
|
||||
if (gFirstConnection.iceConnectionState == 'connected' &&
|
||||
gSecondConnection.iceConnectionState == 'completed') {
|
||||
test.done()
|
||||
}
|
||||
if (gFirstConnection.iceConnectionState == 'completed' &&
|
||||
gSecondConnection.iceConnectionState == 'connected') {
|
||||
test.done()
|
||||
}
|
||||
if (gFirstConnection.iceConnectionState == 'completed' &&
|
||||
gSecondConnection.iceConnectionState == 'completed') {
|
||||
test.done()
|
||||
}
|
||||
});
|
||||
|
||||
// Returns a suitable error callback.
|
||||
function failed(function_name) {
|
||||
return test.step_func(function() {
|
||||
assert_unreached('WebRTC called error callback for ' + function_name);
|
||||
});
|
||||
}
|
||||
|
||||
// Returns a suitable do-nothing.
|
||||
function ignoreSuccess(function_name) {
|
||||
}
|
||||
|
||||
// This function starts the test.
|
||||
test.step(function() {
|
||||
gFirstConnection = new RTCPeerConnection(null);
|
||||
gFirstConnection.onicecandidate = onIceCandidateToFirst;
|
||||
gFirstConnection.oniceconnectionstatechange = onIceConnectionStateChange;
|
||||
|
||||
gSecondConnection = new RTCPeerConnection(null);
|
||||
gSecondConnection.onicecandidate = onIceCandidateToSecond;
|
||||
gSecondConnection.onaddstream = onRemoteStream;
|
||||
gSecondConnection.oniceconnectionstatechange = onIceConnectionStateChange;
|
||||
|
||||
// The offerToReceiveVideo is necessary and sufficient to make
|
||||
// an actual connection.
|
||||
// TODO: Use a promise-based API. This is legacy.
|
||||
gFirstConnection.createOffer(onOfferCreated, failed('createOffer'),
|
||||
{offerToReceiveVideo: true});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -4,19 +4,19 @@
|
|||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
async_test(function(t) {
|
||||
async_test(function() {
|
||||
var testResult;
|
||||
var worker = new Worker('./support/WorkerTerminate.js');
|
||||
worker.onmessage = function(e) {
|
||||
worker.onmessage = this.step_func(function(e) {
|
||||
testResult = e.data;
|
||||
if (testResult >= 10000) {
|
||||
worker.terminate();
|
||||
worker.onmessage = t.unreached_func('Unexpected message event');
|
||||
setTimeout(t.step_func_done(function() {
|
||||
worker.onmessage = this.unreached_func('Unexpected message event');
|
||||
setTimeout(this.step_func_done(function() {
|
||||
assert_equals(testResult, 10000);
|
||||
}), 100);
|
||||
}
|
||||
};
|
||||
});
|
||||
worker.postMessage("ping");
|
||||
});
|
||||
</script>
|
||||
|
|
|
@ -12,23 +12,15 @@ close();
|
|||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
async_test(function() {
|
||||
var gotMessage = false;
|
||||
var gotError = false;
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
gotMessage = true;
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
gotError = true;
|
||||
};
|
||||
worker.postMessage(1);
|
||||
setTimeout(this.step_func(function() {
|
||||
assert_false(gotMessage, 'got message');
|
||||
assert_true(gotError, 'got error');
|
||||
this.done();
|
||||
}), 500);
|
||||
});
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
assert_unreached("Got message");
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
assert_unreached("Got error");
|
||||
};
|
||||
worker.postMessage(1);
|
||||
setTimeout(done, 2000);
|
||||
</script>
|
||||
<!--
|
||||
*/
|
||||
|
|
|
@ -18,22 +18,14 @@ var interval2 = setInterval(function() {
|
|||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
async_test(function() {
|
||||
var gotMessage = false;
|
||||
var gotError = false;
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
gotMessage = true;
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
gotError = true;
|
||||
};
|
||||
setTimeout(this.step_func(function() {
|
||||
assert_false(gotMessage, 'got message');
|
||||
assert_true(gotError, 'got error');
|
||||
this.done();
|
||||
}), 500);
|
||||
});
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
assert_unreached("Got message");
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
assert_unreached("Got error");
|
||||
};
|
||||
setTimeout(done, 2000);
|
||||
</script>
|
||||
<!--
|
||||
*/
|
||||
|
|
|
@ -14,27 +14,15 @@ setTimeout(x, 0);
|
|||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
setup({allow_uncaught_exception: true});
|
||||
|
||||
async_test(function() {
|
||||
var gotMessage = false;
|
||||
var gotError = false;
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
gotMessage = true;
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
gotError = true;
|
||||
};
|
||||
setTimeout(this.step_func(function() {
|
||||
assert_false(gotMessage, 'got message');
|
||||
assert_true(gotError, 'got error');
|
||||
this.done();
|
||||
}), 500);
|
||||
});
|
||||
var worker = new Worker('#');
|
||||
worker.onmessage = function(e) {
|
||||
assert_unreached("Got message");
|
||||
};
|
||||
worker.onerror = function(e) {
|
||||
assert_unreached("Got error");
|
||||
};
|
||||
setTimeout(done, 2000);
|
||||
</script>
|
||||
<!--
|
||||
*/
|
||||
//-->
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue