summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_midflight_redirect_blocked.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/test_midflight_redirect_blocked.html')
-rw-r--r--dom/media/test/test_midflight_redirect_blocked.html87
1 files changed, 87 insertions, 0 deletions
diff --git a/dom/media/test/test_midflight_redirect_blocked.html b/dom/media/test/test_midflight_redirect_blocked.html
new file mode 100644
index 0000000000..ea85673b45
--- /dev/null
+++ b/dom/media/test/test_midflight_redirect_blocked.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test mid-flight cross site redirects are blocked</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ </head>
+ <body>
+ <pre id='test'>
+ <script class="testbody" type='application/javascript'>
+
+ function testIfLoadsToMetadata(test, useCors) {
+ return new Promise(function(resolve, reject) {
+ var elemType = getMajorMimeType(test.type);
+ var element = document.createElement(elemType);
+
+ if (useCors) {
+ element.crossOrigin = "anonymous";
+ }
+
+ // Log events for debugging.
+ [
+ "suspend", "play", "canplay", "canplaythrough", "loadstart",
+ "loadedmetadata", "loadeddata", "playing", "ended", "error",
+ "stalled", "emptied", "abort", "waiting", "pause"
+ ].forEach((eventName) => {
+ element.addEventListener(eventName, (event)=> {
+ info(test.name + " " + event.type);
+ });
+ });
+
+ element.addEventListener("loadedmetadata", ()=>{
+ resolve(true);
+ removeNodeAndSource(element);
+ });
+
+ element.addEventListener("error", ()=>{
+ resolve(false);
+ removeNodeAndSource(element);
+ });
+
+ // Note: request redirect before the end of metadata, otherwise we won't
+ // error before metadata has loaded if mixed origins are allowed.
+ element.src = "midflight-redirect.sjs?resource=" + test.name
+ + (useCors ? "&cors" : "")
+ + "&type=" + test.type
+ + "&redirectAt=200";
+ element.preload = "metadata";
+ document.body.appendChild(element);
+ element.load()
+ });
+ }
+
+ let v = document.createElement("video");
+ const testCases = gSmallTests.filter(t => v.canPlayType(t.type));
+
+ async function testMediaLoad(message, {useCors}) {
+ for (let test of testCases) {
+ let loaded = await testIfLoadsToMetadata(test, useCors);
+ is(loaded, useCors, test.name + " " + message);
+ }
+ }
+
+ async function runTest() {
+ try {
+ SimpleTest.info("Test that all media do not play without CORS...");
+ await testMediaLoad("expected to be blocked", {useCors: false});
+
+ SimpleTest.info("Test that all media play if CORS used...");
+ await testMediaLoad("expected to play with CORS", {useCors: true});
+ } catch (e) {
+ info("Exception " + e.message);
+ ok(false, "Threw exception " + e.message);
+ }
+ SimpleTest.finish();
+ }
+
+ SimpleTest.waitForExplicitFinish();
+
+ addLoadEvent(runTest);
+
+ </script>
+ </pre>
+ </body>
+</html>