Bug 1304249 - Implement MediaKeySession.onkeystatuseschange. r?smaug
MozReview-Commit-ID: 1LnDi1MmXi2
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -2095,16 +2095,17 @@ GK_ATOM(onvolumechange, "onvolumechange"
GK_ATOM(onaddtrack, "onaddtrack")
GK_ATOM(oncontrollerchange, "oncontrollerchange")
GK_ATOM(oncuechange, "oncuechange")
GK_ATOM(onenter, "onenter")
GK_ATOM(onexit, "onexit")
GK_ATOM(onencrypted, "onencrypted")
GK_ATOM(encrypted, "encrypted")
GK_ATOM(onwaitingforkey, "onwaitingforkey")
+GK_ATOM(onkeystatuseschange, "onkeystatuseschange")
GK_ATOM(onremovetrack, "onremovetrack")
GK_ATOM(loadstart, "loadstart")
GK_ATOM(suspend, "suspend")
GK_ATOM(emptied, "emptied")
GK_ATOM(stalled, "stalled")
GK_ATOM(play, "play")
GK_ATOM(pause, "pause")
GK_ATOM(loadedmetadata, "loadedmetadata")
--- a/dom/media/eme/MediaKeySession.cpp
+++ b/dom/media/eme/MediaKeySession.cpp
@@ -478,10 +478,27 @@ MediaKeySession::SetExpiration(double aE
{
EME_LOG("MediaKeySession[%p,'%s'] SetExpiry(%lf)",
this,
NS_ConvertUTF16toUTF8(mSessionId).get(),
aExpiration);
mExpiration = aExpiration;
}
+EventHandlerNonNull*
+MediaKeySession::GetOnkeystatuseschange()
+{
+ EventListenerManager *elm = GetExistingListenerManager();
+ return elm ? elm->GetEventHandler(nsGkAtoms::onkeystatuseschange, EmptyString())
+ : nullptr;
+}
+
+void
+MediaKeySession::SetOnkeystatuseschange(EventHandlerNonNull* handler)
+{
+ EventListenerManager *elm = GetOrCreateListenerManager();
+ if (elm) {
+ elm->SetEventHandler(nsGkAtoms::onkeystatuseschange, EmptyString(), handler);
+ }
+}
+
} // namespace dom
} // namespace mozilla
--- a/dom/media/eme/MediaKeySession.h
+++ b/dom/media/eme/MediaKeySession.h
@@ -89,16 +89,19 @@ public:
void DispatchKeyStatusesChange();
void OnClosed();
bool IsClosed() const;
void SetExpiration(double aExpiry);
+ mozilla::dom::EventHandlerNonNull* GetOnkeystatuseschange();
+ void SetOnkeystatuseschange(mozilla::dom::EventHandlerNonNull* listener);
+
// Process-unique identifier.
uint32_t Token() const;
private:
~MediaKeySession();
void UpdateKeyStatusMap();
--- a/dom/media/test/test_eme_playback.html
+++ b/dom/media/test/test_eme_playback.html
@@ -78,16 +78,26 @@ function startTest(test, token)
var sessions = [];
var v = SetupEME(test, token,
{
onsessioncreated: function(session) {
sessions.push(session);
session.addEventListener("keystatuseschange", KeysChangeFunc(session, test.keys, token), false);
+
+ session.numKeystatuseschangeEvents = 0;
+ session.numOnkeystatuseschangeEvents = 0;
+
+ session.addEventListener("keystatuseschange", function() {
+ session.numKeystatuseschangeEvents += 1;
+ });
+ session.onkeystatuseschange = function() {
+ session.numOnkeystatuseschangeEvents += 1;
+ };
}
}
);
document.body.appendChild(v);
var gotEncrypted = 0;
@@ -124,16 +134,19 @@ function startTest(test, token)
var session = sessions[i];
ok(session.gotKeysChanged,
TimeStamp(token) + " session[" + session.sessionId
+ "] should have received at least one keychange event");
for (var kid in session.keyIdsReceived) {
Log(token, "session[" + session.sessionId + "] key " + kid + " = " + (session.keyIdsReceived[kid] ? "true" : "false"));
if (session.keyIdsReceived[kid]) { keyIdsReceived[kid] = true; }
}
+ ok(session.numKeystatuseschangeEvents > 0, TimeStamp(token) + " should get key status changes");
+ is(session.numKeystatuseschangeEvents, session.numOnkeystatuseschangeEvents,
+ TimeStamp(token) + " should get as many keystatuseschange as onkeystatuseschange");
}
for (var kid in keyIdsReceived) {
ok(keyIdsReceived[kid], TimeStamp(token) + " key with id " + kid + " was usable as expected");
}
v.closeSessions().then(() => manager.finished(token));
});
--- a/dom/webidl/MediaKeySession.webidl
+++ b/dom/webidl/MediaKeySession.webidl
@@ -20,16 +20,18 @@ interface MediaKeySession : EventTarget
readonly attribute DOMString sessionId;
readonly attribute unrestricted double expiration;
readonly attribute Promise<void> closed;
readonly attribute MediaKeyStatusMap keyStatuses;
+ attribute EventHandler onkeystatuseschange;
+
[NewObject]
Promise<void> generateRequest(DOMString initDataType, BufferSource initData);
[NewObject]
Promise<boolean> load(DOMString sessionId);
// session operations
[NewObject]
--- a/testing/web-platform/meta/encrypted-media/idlharness.html.ini
+++ b/testing/web-platform/meta/encrypted-media/idlharness.html.ini
@@ -1,8 +1,5 @@
[idlharness.html]
type: testharness
- [MediaKeySession interface: attribute onkeystatuseschange]
- expected: FAIL
-
[MediaKeySession interface: attribute onmessage]
expected: FAIL