Bug 1182113 - Test XSLT serviceworker load. r=bkelly

This commit is contained in:
Albert Crespell 2015-09-10 12:42:02 +02:00
parent 776abda05a
commit a6b399a434
5 changed files with 186 additions and 0 deletions

View File

@ -162,6 +162,8 @@ support-files =
eventsource/*
sw_clients/file_blob_upload_frame.html
redirect_post.sjs
xslt_worker.js
xslt/*
[test_app_protocol.html]
skip-if = release_build
@ -250,6 +252,7 @@ skip-if = toolkit == "android" || toolkit == "gonk"
[test_workerupdatefoundevent.html]
[test_opaque_intercept.html]
[test_fetch_event_client_postmessage.html]
[test_xslt.html]
[test_escapedSlashes.html]
[test_eventsource_intercept.html]
[test_not_intercept_plugin.html]

View File

@ -0,0 +1,113 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<head>
<title>Bug 1182113 - Test service worker XSLT interception</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content"></div>
<pre id="test"></pre>
<script class="testbody" type="text/javascript">
var registration;
var worker;
function start() {
return navigator.serviceWorker.register("xslt_worker.js",
{ scope: "./" })
.then((swr) => registration = swr);
}
function unregister() {
return registration.unregister().then(function(result) {
ok(result, "Unregister should return true.");
}, function(e) {
dump("Unregistering the SW failed with " + e + "\n");
});
}
function getXmlString(xmlObject) {
serializer = new XMLSerializer();
return serializer.serializeToString(iframe.contentDocument);
}
function synthetic() {
content = document.getElementById("content");
ok(content, "parent exists.");
iframe = document.createElement("iframe");
content.appendChild(iframe);
iframe.setAttribute('src', "xslt/test.xml");
var p = new Promise(function(res, rej) {
iframe.onload = function(e) {
dump("Set request mode\n");
registration.active.postMessage("synthetic");
xmlString = getXmlString(iframe.contentDocument);
ok(!xmlString.includes("Error"), "Load synthetic cross origin XSLT should be allowed");
res();
};
});
return p;
}
function cors() {
var p = new Promise(function(res, rej) {
iframe.onload = function(e) {
xmlString = getXmlString(iframe.contentDocument);
ok(!xmlString.includes("Error"), "Load CORS cross origin XSLT should be allowed");
res();
};
});
registration.active.postMessage("cors");
iframe.setAttribute('src', "xslt/test.xml");
return p;
}
function opaque() {
var p = new Promise(function(res, rej) {
iframe.onload = function(e) {
xmlString = getXmlString(iframe.contentDocument);
ok(xmlString.includes("Error"), "Load opaque cross origin XSLT should not be allowed");
res();
};
});
registration.active.postMessage("opaque");
iframe.setAttribute('src', "xslt/test.xml");
return p;
}
function runTest() {
start()
.then(synthetic)
.then(opaque)
.then(cors)
.then(unregister)
.catch(function(e) {
ok(false, "Some test failed with error " + e);
}).then(SimpleTest.finish);
}
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [
["dom.serviceWorkers.exemptFromPerDomainMax", true],
["dom.serviceWorkers.interception.enabled", true],
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
]}, runTest);
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,6 @@
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<result>
<Title>Example</Title>
<Error>Error</Error>
</result>

View File

@ -0,0 +1,12 @@
function handleRequest(request, response) {
response.setHeader("Content-Type", "application/xslt+xml", false);
response.setHeader("Access-Control-Allow-Origin", "*");
var body = request.queryString;
if (!body) {
response.setStatusLine(null, 500, "Invalid querystring");
return;
}
response.write(unescape(body));
}

View File

@ -0,0 +1,52 @@
var testType = 'synthetic';
var xslt = "<?xml version=\"1.0\"?> " +
"<xsl:stylesheet version=\"1.0\"" +
" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
" <xsl:template match=\"node()|@*\">" +
" <xsl:copy>" +
" <xsl:apply-templates select=\"node()|@*\"/>" +
" </xsl:copy>" +
" </xsl:template>" +
" <xsl:template match=\"Error\"/>" +
"</xsl:stylesheet>";
onfetch = function(event) {
if (event.request.url.includes('test.xsl')) {
if (testType == 'synthetic') {
if (event.request.mode != 'cors') {
event.respondWith(Response.error());
return;
}
event.respondWith(Promise.resolve(
new Response(xslt, { headers: {'Content-Type': 'application/xslt+xml'}})
));
}
else if (testType == 'cors') {
if (event.request.mode != 'cors') {
event.respondWith(Response.error());
return;
}
var url = "http://example.com/tests/dom/workers/test/serviceworkers/xslt/xslt.sjs?" + escape(xslt);
event.respondWith(fetch(url, { mode: 'cors' }));
}
else if (testType == 'opaque') {
if (event.request.mode != 'cors') {
event.respondWith(Response.error());
return;
}
var url = "http://example.com/tests/dom/workers/test/serviceworkers/xslt/xslt.sjs?" + escape(xslt);
event.respondWith(fetch(url, { mode: 'no-cors' }));
}
else {
event.respondWith(Response.error());
}
}
};
onmessage = function(event) {
testType = event.data;
};