Bug 1130275 - correct promise chaining for EME mochitests. r=edwin.

This commit is contained in:
JW Wang 2015-02-06 19:16:28 +08:00
parent 42b559fb41
commit 90745eb17f
3 changed files with 88 additions and 47 deletions

View File

@ -223,31 +223,48 @@ function SetupEME(test, token, params)
videoType: test.type,
}
];
navigator.requestMediaKeySystemAccess(KEYSYSTEM_TYPE, options)
.then(function(keySystemAccess) {
return keySystemAccess.createMediaKeys();
}, bail(token + " Failed to request key system access."))
.then(function(mediaKeys) {
Log(token, "created MediaKeys object ok");
mediaKeys.sessions = [];
return v.setMediaKeys(mediaKeys);
}, bail("failed to create MediaKeys object"))
function chain(promise, onReject) {
return promise.then(function(value) {
return Promise.resolve(value);
}).catch(function(reason) {
onReject(reason);
return Promise.reject();
})
}
.then(function() {
Log(token, "set MediaKeys on <video> element ok");
var sessionType = (params && params.sessionType) ? params.sessionType : "temporary";
var session = v.mediaKeys.createSession(sessionType);
if (params && params.onsessioncreated) {
params.onsessioncreated(session);
}
session.addEventListener("message", UpdateSessionFunc(test, token, sessionType));
return session.generateRequest(ev.initDataType, ev.initData);
}, onSetKeysFail)
var p = navigator.requestMediaKeySystemAccess(KEYSYSTEM_TYPE, options);
var r = bail(token + " Failed to request key system access.");
chain(p, r)
.then(function(keySystemAccess) {
var p = keySystemAccess.createMediaKeys();
var r = bail(token + " Failed to create MediaKeys object");
return chain(p, r);
})
.then(function() {
Log(token, "generated request");
}, bail(token + " Failed to request key system access2."));
.then(function(mediaKeys) {
Log(token, "created MediaKeys object ok");
mediaKeys.sessions = [];
var p = v.setMediaKeys(mediaKeys);
return chain(p, onSetKeysFail);
})
.then(function() {
Log(token, "set MediaKeys on <video> element ok");
var sessionType = (params && params.sessionType) ? params.sessionType : "temporary";
var session = v.mediaKeys.createSession(sessionType);
if (params && params.onsessioncreated) {
params.onsessioncreated(session);
}
session.addEventListener("message", UpdateSessionFunc(test, token, sessionType));
var p = session.generateRequest(ev.initDataType, ev.initData);
var r = bail(token + ": session.generateRequest failed");
return chain(p, r);
})
.then(function() {
Log(token, ": session.generateRequest succeeded");
});
});
return v;
}

View File

@ -30,7 +30,7 @@ function UsableKeyIdsMatch(usableKeyIds, expectedKeyIds) {
function AwaitAllKeysUsable(session, keys, token) {
return new Promise(function(resolve, reject) {
function listener(event) {
function check() {
var map = session.keyStatuses;
var usableKeyIds = [];
for (var [key, val] of map.entries()) {
@ -38,25 +38,26 @@ function AwaitAllKeysUsable(session, keys, token) {
usableKeyIds.push(key);
}
if (UsableKeyIdsMatch(usableKeyIds, keys)) {
Log(token, "resolving AwaitAllKeysUsable promise");
session.removeEventListener("keystatuseschange", listener);
session.removeEventListener("keystatuseschange", check);
resolve();
}
}
session.addEventListener("keystatuseschange", listener);
session.addEventListener("keystatuseschange", check);
check(); // in case all keys are already usable
});
}
function AwaitAllKeysNotUsable(session, token) {
return new Promise(function(resolve, reject) {
function listener(event) {
function check() {
var map = session.keyStatuses;
if (map.size == 0) {
session.removeEventListener("keystatuseschange", listener);
session.removeEventListener("keystatuseschange", check);
resolve();
}
}
session.addEventListener("keystatuseschange", listener);
session.addEventListener("keystatuseschange", check);
check(); // in case all keys are already removed
});
}
@ -77,52 +78,69 @@ function startTest(test, token)
// Once the session has loaded and has all its keys usable, close
// all sessions without calling remove() on them.
AwaitAllKeysUsable(session, test.keys, token).then(
function() {
sessionId = session.sessionId;
Log(token, "Closing session with id=" + sessionId);
session.close();
}
);
AwaitAllKeysUsable(session, test.keys, token)
.then(function() {
sessionId = session.sessionId;
Log(token, "Closing session with id=" + sessionId);
return session.close();
})
// Once the session is closed, reload the MediaKeys and reload the session
session.closed.then(function() {
return navigator.requestMediaKeySystemAccess(KEYSYSTEM_TYPE)
}, bail("close promise rejected"))
.then(function() {
return navigator.requestMediaKeySystemAccess(KEYSYSTEM_TYPE);
})
.then(function(requestedKeySystemAccess) {
keySystemAccess = requestedKeySystemAccess;
return keySystemAccess.createMediaKeys();
}, bail(token + " Failed to request key system access."))
})
.then(function(mediaKeys) {
Log(token, "re-created MediaKeys object ok");
recreatedSession = mediaKeys.createSession("persistent");
Log(token, "Created recreatedSession, loading sessionId=" + sessionId);
return Promise.all([AwaitAllKeysUsable(recreatedSession, test.keys, token), recreatedSession.load(sessionId)]);
}, bail(token + " failed to create mediaKeys"))
return recreatedSession.load(sessionId);
})
.then(function(suceeded) {
if (suceeded) {
return Promise.resolve();
} else {
return Promise.reject("Fail to load recreatedSession, sessionId=" + sessionId);
}
})
.then(function() {
return AwaitAllKeysUsable(recreatedSession, test.keys, token);
})
.then(function() {
Log(token, "re-loaded persistent session, all keys still usable");
return Promise.all([AwaitAllKeysNotUsable(recreatedSession, token), recreatedSession.remove()]);
}, bail(token + " failed to get reload session or keys"))
})
.then(function() {
Log(token, "removed session, all keys unusable.");
// Attempt to recreate the session, the attempt should fail.
return keySystemAccess.createMediaKeys();
}, bail(token + " failed to remove session"))
})
.then(function(mediaKeys) {
Log(token, "re-re-created MediaKeys object ok");
// Trying to load the removed persistent session should fail.
return mediaKeys.createSession("persistent").load(sessionId);
}, bail(token + " failed to create mediaKeys"))
})
.then(function(suceeded) {
is(suceeded, false, token + " we expect the third session creation to fail, as the session should have been removed.");
manager.finished(token);
}, bail(token + " failure to load session."));
})
.catch(function(reason) {
// Catch rejections if any.
ok(false, token + " rejected, reason=" + reason);
manager.finished(token);
});
},
sessionType: "persistent",

View File

@ -88,7 +88,13 @@ function startTest(test, token)
manager.finished(token);
});
LoadTest(test, v, token).then(function(){v.play();}, bail(token + " failed to load"));
LoadTest(test, v, token)
.then(function() {
v.play();
}).catch(function() {
ok(false, token + " failed to load");
manager.finished(token);
});
}
function beginTest() {