gecko-dev/dom/media/test/file_access_controls.html
Jean-Yves Avenard 64c70317ce Bug 1383122 - P3. Don't set src attribute to null. r=jwwang
Setting the src attribute to null was incorrect, per spec https://www.w3.org/TR/WebIDL-1/#es-DOMString, if null is passed, this is to be treated as ToString(null), which is "null" (https://tc39.github.io/ecma262/#sec-tostring).
Hence setting src to null will cause a 404 error as it attempts to load "null".

To unload the element, recommended practice is:
Per spec:
https://html.spec.whatwg.org/multipage/media.html#best-practices-for-authors-using-media-elements
"by removing the element's src attribute and any source element descendants, and invoking the element's load() method."

MozReview-Commit-ID: 5Lq13CeDCSZ

--HG--
extra : rebase_source : 806bccb32fa0542ea3be3025a31da97bb331b29c
2017-07-21 19:05:54 +02:00

160 lines
4.9 KiB
HTML

<html>
<head>
<script type="text/javascript" src="manifest.js"></script>
</head>
<body onload="setTimeout(load, 0);" onunload="done()">
<script>
// Page URL: http://example.org/tests/dom/media/test/file_access_controls.html
var gResource = getPlayableVideo(gSmallTests).name;
var gTests = [
{
// Test 0
url: "redirect.sjs?domain=example.com&file="+ gResource,
result: "error",
description: "Won't load when redirected to different domain",
},{
// Test 1
url: "redirect.sjs?domain=example.com&allowed&file=" + gResource,
result: "loadeddata",
description: "Can load when redirected to different domain with allow-origin",
},{
// Test 2
url: "redirect.sjs?domain=test1.example.org&file=" + gResource,
result: "error",
description: "Won't load when redirected to subdomain",
},{
// Test 3
url: "redirect.sjs?domain=test1.example.org&allowed&file=" + gResource,
result: "loadeddata",
description: "Can load when redirected to subdomain with allow-origin",
},{
// Test 4
url: "redirect.sjs?domain=example.org&file=" + gResource,
result: "loadeddata",
description: "Can load when redirected to same domain",
},{
// Test 5
url: "http://example.org/tests/dom/media/test/" + gResource,
result: "loadeddata",
description: "Can load from same domain"
},{
// Test 6
url: "http://example.org:8000/tests/dom/media/test/" + gResource,
result: "error",
description: "Won't load from different port on same domain"
},{
// Test 7
url: "http://example.org:8000/tests/dom/media/test/allowed.sjs?" + gResource,
result: "loadeddata",
description: "Can load from different port on same domain with allow-origin",
},{
// Test 8
url: "http://example.com/tests/dom/media/test/" + gResource,
result: "error",
description: "Won't load cross domain",
},{
// Test 9
url: "http://example.com/tests/dom/media/test/allowed.sjs?" + gResource,
result: "loadeddata",
description: "Can load cross domain with allow-origin",
},{
// Test 10
url: "http://test1.example.org/tests/dom/media/test/allowed.sjs?" + gResource,
result: "loadeddata",
description: "Can load from subdomain with allow-origin",
},{
// Test 11
url: "http://test1.example.org/tests/dom/media/test/" + gResource,
result: "error",
description: "Won't load from subdomain",
}
];
var gTestNum = 0;
var gVideo = null;
var gTestedRemoved = false;
function eventHandler(event) {
//dump((gTestNum - 1) + ": " + event.type + "\n");
var video = event.target;
opener.postMessage({"result": (event.type == video.expectedResult),
"message": video.testDescription + (gTestedRemoved ? " (element not in document)" : " (element in document)")},
"http://mochi.test:8888");
// Make sure any extra events cause an error
video.expectedResult = "<none>";
nextTest();
}
function createVideo() {
var v = document.createElement('video');
v.addEventListener('loadeddata', eventHandler);
v.addEventListener('error', eventHandler);
v.crossOrigin = 'anonymous';
return v;
}
function load() {
opener.postMessage({"result": (window.location.href == "http://example.org/tests/dom/media/test/file_access_controls.html"),
"message": "We must be on a example.org:80"},
"http://mochi.test:8888");
nextTest();
}
function nextTest() {
//dump("nextTest() called, gTestNum="+gTestNum+" gTestedRemoved="+gTestedRemoved+"\n");
if (gTestNum == gTests.length) {
//dump("gTestNum == gTests.length\n");
if (!gTestedRemoved) {
// Repeat all tests with element removed from doc, should get same result.
gTestedRemoved = true;
gTestNum = 0;
} else {
//dump("Exiting...\n");
// We're done, exit the test.
window.close();
return;
}
}
if (gVideo) {
gVideo.remove();
gVideo.removeAttribute("src");
gVideo.load();
}
gVideo = null;
SpecialPowers.forceGC();
gVideo = createVideo();
gVideo.expectedResult = gTests[gTestNum].result;
gVideo.testDescription = gTests[gTestNum].description;
// Uniquify the resource URL to ensure that the resources loaded by earlier or subsequent tests
// don't overlap with the resources we load here, which are loaded with non-default preferences set.
// We also want to make sure that an HTTP fetch actually happens for each testcase.
var url = gTests[gTestNum].url;
var random = Math.floor(Math.random()*1000000000);
url += (url.search(/\?/) < 0 ? "?" : "&") + "rand=" + random;
gVideo.src = url;
//dump("Starting test " + gTestNum + " at " + gVideo.src + " expecting:" + gVideo.expectedResult + "\n");
if (!gTestedRemoved) {
document.body.appendChild(gVideo);
// Will cause load() to be invoked.
} else {
gVideo.load();
}
gTestNum++;
}
function done() {
opener.postMessage({"done": "true"}, "http://mochi.test:8888");
}
</script>
</body>
</html>