<!
DOCTYPE HTML>
<
html>
<
head>
<
META HTTP-EQUIV=
"Content-Type" CONTENT=
"text/html; charset=utf-8">
<
title>Test for File urls</
title>
<
script src=
"/tests/SimpleTest/SimpleTest.js"></
script>
<
link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css" />
</
head>
<
body onload=
"start()">
<p id=
"display">
<
iframe id=inner></
iframe>
<
iframe id=
iframe></
iframe>
<
img id=
img onload=
"gen.next(event);">
<
audio id=
audio onloadeddata=
"gen.next(event);">
</p>
<
div id=
"content" style=
"display: none">
</
div>
<
pre id=
"test">
<
script class=
"testbody" type=
"application/javascript">
try {
URL.createObjectURL(undefined);
} catch(e) { }
window.addEventListener(
"message", function(e) {
gen.next(JSON.parse(e.data));
});
const innerSameSiteURI =
"file_mozfiledataurl_inner.html";
const innerCrossSiteURI =
"http://example.com/tests/dom/file/tests/file_mozfiledataurl_inner.html"
var fileNames = [
"file_mozfiledataurl_img.jpg",
"file_mozfiledataurl_audio.ogg",
"file_mozfiledataurl_doc.html",
"file_mozfiledataurl_text.txt"];
function start() {
let xhr = new XMLHttpRequest;
xhr.open(
"GET",
"/dynamic/getMyDirectory.sjs", false);
xhr.send();
let basePath = xhr.responseText;
let fullFileNames = [];
for (let name of fileNames) {
fullFileNames.push(basePath + name);
}
var script = SpecialPowers.loadChromeScript(SimpleTest.getTestFileURL(
"create_file_objects.js"));
script.addMessageListener(
"created-file-objects", function handler(files) {
script.removeMessageListener(
"created-file-objects", handler);
gen = runTest(files);
gen.next();
});
script.sendAsyncMessage(
"create-file-objects", {fileNames: fullFileNames});
};
SimpleTest.waitForExplicitFinish();
SimpleTest.expectAssertions(0, 3);
function* runTest([imgFile, audioFile, docFile, xhrFile]) {
inner = document.getElementById(
'inner');
img = document.getElementById(
'img');
audio = document.getElementById(
'audio');
iframe = document.getElementById(
'iframe');
inner.onload = function() { gen.next(
"inner loaded"); };
// Attempt to load a image in this document
var fileurl = URL.createObjectURL(imgFile);
img.src = fileurl;
var e = (yield);
is(e.type,
"load",
"loaded successfully");
is(
img.width, 120,
"correct width");
is(
img.height, 90,
"correct height");
// Revoke url and attempt to load a image in this document
img.src =
"file_mozfiledataurl_img.jpg";
is((yield).type,
"load",
"successfull reset image");
URL.revokeObjectURL(fileurl);
todo(false,
"urls need to act like 404s, not fail to parse");
/*
img.src = fileurl;
var e = (yield);
is(e.type,
"error",
"failed successfully");
isnot(
img.width, 120,
"correct error width");
isnot(
img.height, 90,
"correct error height");
*/
// Generate new fileurl and make sure it
's different from the old
var oldFileurl = fileurl;
fileurl = URL.createObjectURL(imgFile);
isnot(fileurl, oldFileurl,
"URL.createObjectURL generated the same url twice");
// Attempt to load an image in a different same-origin document
inner.src = innerSameSiteURI;
yield undefined;
inner.contentWindow.postMessage(JSON.stringify({
img:fileurl}),
"*");
var res = (yield);
is(res.type,
"load",
"loaded successfully");
is(res.width, 120,
"correct width");
is(res.height, 90,
"correct height");
// Attempt to load an image in a different cross-origin document
inner.src = innerCrossSiteURI;
yield undefined;
inner.contentWindow.postMessage(JSON.stringify({
img:fileurl}),
"*");
var res = (yield);
is(res.type,
"error",
"failed successfully");
isnot(res.width, 120,
"correct error width");
isnot(res.height, 90,
"correct error height");
// Attempt to load an
audio in this document
fileurl = URL.createObjectURL(audioFile);
audio.src = fileurl;
var e = (yield);
is(e.type,
"loadeddata",
"loaded successfully");
// Revoke url and attempt to load a
audio in this document
audio.src =
"file_mozfiledataurl_audio.ogg";
is((yield).type,
"loadeddata",
"successfully reset audio");
URL.revokeObjectURL(fileurl);
todo(false,
"urls need to act like 404s, not fail to parse");
/*
img.src = fileurl;
var e = (yield);
is(e.type,
"error",
"failed successfully");
isnot(
img.width, 120,
"correct error width");
isnot(
img.height, 90,
"correct error height");
*/
// Generate new fileurl and make sure it
's different from the old
var oldFileurl = fileurl;
fileurl = URL.createObjectURL(audioFile);
isnot(fileurl, oldFileurl,
"URL.createObjectURL generated the same url twice");
// Attempt to load an
audio in a different same-origin document
inner.src = innerSameSiteURI;
yield undefined;
inner.contentWindow.postMessage(JSON.stringify({
audio:fileurl}),
"*");
var res = (yield);
is(res.type,
"loadeddata",
"loaded successfully");
// Attempt to load an
audio in a different cross-origin document
inner.src = innerCrossSiteURI;
yield undefined;
inner.contentWindow.postMessage(JSON.stringify({
audio:fileurl}),
"*");
var res = (yield);
is(res.type,
"error",
"failed successfully");
// Attempt to load a
HTML document in an
iframe in this document
iframe.onload = function() { gen.next(); };
iframe.src =
"file_mozfiledataurl_doc.html";
yield undefined;
is(
iframe.contentDocument.getElementsByTagName(
"p")[0].textContent,
"This here is a document!",
"iframe loaded successfully");
is(
iframe.contentDocument.getElementById(
"img").width, 120,
"image in iframe width");
is(
iframe.contentDocument.getElementById(
"img").height, 90,
"image in iframe height");
// Attempt to load a
HTML document in an
iframe in this document, using file url
fileurl = URL.createObjectURL(docFile);
iframe.src = fileurl;
yield undefined;
is(
iframe.contentDocument.getElementsByTagName(
"p")[0].textContent,
"This here is a document!",
"iframe loaded successfully");
isnot(
iframe.contentDocument.getElementById(
"img").width, 120,
"failed image in iframe width");
isnot(
iframe.contentDocument.getElementById(
"img").height, 90,
"failed image in iframe height");
// Attempt to load a
HTML document in an
iframe in inner document
inner.src = innerSameSiteURI;
is((yield),
"inner loaded",
"correct gen.next()");
inner.contentWindow.postMessage(JSON.stringify({
iframe:
"file_mozfiledataurl_doc.html"}),
"*");
var res = (yield);
is(res.type,
"load",
"loaded successfully");
is(res.text,
"This here is a document!",
"loaded successfully");
is(res.imgWidth, 120,
"correct width");
// Attempt to load a
HTML document in an
iframe in inner document, using file url
inner.contentWindow.postMessage(JSON.stringify({
iframe:fileurl}),
"*");
var res = (yield);
is(res.type,
"load",
"loaded successfully");
is(res.text,
"This here is a document!",
"loaded successfully");
isnot(res.imgWidth, 120,
"correct width");
// Attempt to load a
HTML document in an
iframe in inner cross-site document, using file url
inner.src = innerCrossSiteURI;
is((yield),
"inner loaded",
"correct gen.next()");
inner.contentWindow.postMessage(JSON.stringify({
iframe:fileurl}),
"*");
var res = (yield);
is(res.type,
"error",
"load failed successfully");
// Attempt to load file url using XHR
fileurl = URL.createObjectURL(xhrFile);
xhr = new XMLHttpRequest;
xhr.onload = function() { gen.next(
"XHR finished"); };
xhr.open(
"GET", fileurl);
xhr.send();
is((yield),
"XHR finished",
"correct gen.next()");
xhr.responseText ==
"Yarr, here be plaintext file, ya landlubber\n";
// Attempt to load file url using XHR in inner document
inner.src = innerSameSiteURI;
is((yield),
"inner loaded",
"correct gen.next()");
inner.contentWindow.postMessage(JSON.stringify({xhr:fileurl}),
"*");
var res = (yield);
is(res.didThrow, undefined,
"load successful");
is(res.text,
"Yarr, here be plaintext file, ya landlubber\n",
"load successful");
// Attempt to load file url using XHR
inner.src = innerCrossSiteURI;
is((yield),
"inner loaded",
"correct gen.next()");
inner.contentWindow.postMessage(JSON.stringify({xhr:fileurl}),
"*");
var res = (yield);
is(res.didError, true,
"load failed successfully");
SimpleTest.finish();
}
</
script>
</
pre>
</
body>
</
html>