--- a/dom/media/test/manifest.js
+++ b/dom/media/test/manifest.js
@@ -454,38 +454,50 @@ var gOggTrackInfoResults = {
"audio-gaps-short.ogg" : {
"audio_id":"1",
"audio_kind":"main",
"audio_language":"",
"audio_label":""
}
};
-// Converts a path/filename to a file:// URI which we can load from disk.
+// Returns a promise that resolves to a function that converts
+// relative paths to absolute, to test loading files from file: URIs.
// Optionally checks whether the file actually exists on disk at the location
// we've specified.
-function fileUriToSrc(path, mustExist) {
- // android mochitest doesn't support file://
- if (manifestNavigator().appVersion.indexOf("Android") != -1 || SpecialPowers.Services.appinfo.name == "B2G")
- return path;
+function makeAbsolutePathConverter() {
+ const url = SimpleTest.getTestFileURL('chromeHelper.js');
+ const script = SpecialPowers.loadChromeScript(url);
+ return new Promise((resolve, reject) => {
+ script.addMessageListener('media-test:cwd', cwd => {
+ if (!cwd) {
+ ok(false, "Failed to find path to test files");
+ }
+
+ resolve((path, mustExist) => {
+ // android mochitest doesn't support file://
+ if (manifestNavigator().appVersion.indexOf("Android") != -1 || SpecialPowers.Services.appinfo.name == "B2G")
+ return path;
- const Ci = SpecialPowers.Ci;
- const Cc = SpecialPowers.Cc;
- const Cr = SpecialPowers.Cr;
- var dirSvc = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties);
- var f = dirSvc.get("CurWorkD", Ci.nsIFile);
- var split = path.split("/");
- for(var i = 0; i < split.length; ++i) {
- f.append(split[i]);
- }
- if (mustExist && !f.exists()) {
- ok(false, "We expected '" + path + "' to exist, but it doesn't!");
- }
- return f.path;
+ const { Ci, Cc } = SpecialPowers;
+ var f = Cc["@mozilla.org/file/local;1"]
+ .createInstance(Ci.nsIFile);
+ f.initWithPath(cwd);
+ var split = path.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ f.append(split[i]);
+ }
+ if (mustExist && !f.exists()) {
+ ok(false, "We expected '" + path + "' to exist, but it doesn't!");
+ }
+ return f.path;
+ });
+ });
+ script.sendAsyncMessage('media-test:getcwd');
+ });
}
// Returns true if two TimeRanges are equal, false otherwise
function range_equals(r1, r2) {
if (r1.length != r2.length) {
return false;
}
for (var i = 0; i < r1.length; i++) {
@@ -494,58 +506,60 @@ function range_equals(r1, r2) {
}
}
return true;
}
// These are URIs to files that we use to check that we don't leak any state
// or other information such that script can determine stuff about a user's
// environment. Used by test_info_leak.
-var gInfoLeakTests = [
- {
- type: 'video/ogg',
- src: fileUriToSrc("tests/dom/media/test/320x240.ogv", true),
- },{
- type: 'video/ogg',
- src: fileUriToSrc("tests/dom/media/test/404.ogv", false),
- }, {
- type: 'audio/x-wav',
- src: fileUriToSrc("tests/dom/media/test/r11025_s16_c1.wav", true),
- }, {
- type: 'audio/x-wav',
- src: fileUriToSrc("tests/dom/media/test/404.wav", false),
- }, {
- type: 'audio/ogg',
- src: fileUriToSrc("tests/dom/media/test/bug461281.ogg", true),
- }, {
- type: 'audio/ogg',
- src: fileUriToSrc("tests/dom/media/test/404.ogg", false),
- }, {
- type: 'video/webm',
- src: fileUriToSrc("tests/dom/media/test/seek.webm", true),
- }, {
- type: 'video/webm',
- src: fileUriToSrc("tests/dom/media/test/404.webm", false),
- }, {
- type: 'video/ogg',
- src: 'http://localhost/404.ogv',
- }, {
- type: 'audio/x-wav',
- src: 'http://localhost/404.wav',
- }, {
- type: 'video/webm',
- src: 'http://localhost/404.webm',
- }, {
- type: 'video/ogg',
- src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
- }, {
- type: 'audio/ogg',
- src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
- }
-];
+function makeInfoLeakTests() {
+ return makeAbsolutePathConverter().then(fileUriToSrc => [
+ {
+ type: 'video/ogg',
+ src: fileUriToSrc("tests/dom/media/test/320x240.ogv", true),
+ },{
+ type: 'video/ogg',
+ src: fileUriToSrc("tests/dom/media/test/404.ogv", false),
+ }, {
+ type: 'audio/x-wav',
+ src: fileUriToSrc("tests/dom/media/test/r11025_s16_c1.wav", true),
+ }, {
+ type: 'audio/x-wav',
+ src: fileUriToSrc("tests/dom/media/test/404.wav", false),
+ }, {
+ type: 'audio/ogg',
+ src: fileUriToSrc("tests/dom/media/test/bug461281.ogg", true),
+ }, {
+ type: 'audio/ogg',
+ src: fileUriToSrc("tests/dom/media/test/404.ogg", false),
+ }, {
+ type: 'video/webm',
+ src: fileUriToSrc("tests/dom/media/test/seek.webm", true),
+ }, {
+ type: 'video/webm',
+ src: fileUriToSrc("tests/dom/media/test/404.webm", false),
+ }, {
+ type: 'video/ogg',
+ src: 'http://localhost/404.ogv',
+ }, {
+ type: 'audio/x-wav',
+ src: 'http://localhost/404.wav',
+ }, {
+ type: 'video/webm',
+ src: 'http://localhost/404.webm',
+ }, {
+ type: 'video/ogg',
+ src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
+ }, {
+ type: 'audio/ogg',
+ src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
+ }
+ ]);
+}
// These are files that must fire an error during load or playback, and do not
// cause a crash. Used by test_playback_errors, which expects one error event
// and no ended event. Put files of the same type together in this list so if
// something crashes we have some idea of which backend is responsible.
var gErrorTests = [
{ name:"bogus.wav", type:"audio/x-wav" },
{ name:"bogus.ogv", type:"video/ogg" },
--- a/dom/media/test/test_info_leak.html
+++ b/dom/media/test/test_info_leak.html
@@ -30,29 +30,31 @@ var manager = new MediaTestManager;
var gEventTypes = [ 'loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
var gExpectedEvents = ['loadstart', 'error'];
function createTestArray() {
var tests = [];
var tmpVid = document.createElement("video");
- for (var testNum=0; testNum<gInfoLeakTests.length; testNum++) {
- var test = gInfoLeakTests[testNum];
- if (!tmpVid.canPlayType(test.type)) {
- continue;
- }
+ return makeInfoLeakTests().then(infoLeakTests => {
+ for (var testNum=0; testNum < infoLeakTests.length; testNum++) {
+ var test = infoLeakTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
- var t = new Object;
- t.name = test.src;
- t.type = test.type;
+ var t = new Object;
+ t.name = test.src;
+ t.type = test.type;
- tests.push(t);
- }
- return tests;
+ tests.push(t);
+ }
+ return tests;
+ })
}
function log(msg) {
info(msg);
var l = document.getElementById('log');
l.innerHTML += msg + "<br>";
}
@@ -155,15 +157,17 @@ function checkState(v) {
function startTest(test, token) {
manager.started(token);
log("Testing: " + test.type + " @ " + test.name);
createMedia(test.type, test.name, token);
}
-manager.runTests(createTestArray(), startTest);
+createTestArray().then(testArray => {
+ manager.runTests(testArray, startTest);
+});
</script>
</pre>
</body>
</html>