Bug 1304249 - Implement MediaKeySession.onkeystatuseschange. r?smaug draft
authorChris Pearce <cpearce@mozilla.com>
Wed, 21 Sep 2016 14:31:15 +1200
changeset 415780 f4a11a9eac294c345e93b2f66e88baee0f060b02
parent 415771 e002522efd463acac3dcd71cf08596d66acf482b
child 415796 80119d48344d08773673088e648d310bada2b958
push id29972
push usercpearce@mozilla.com
push dateWed, 21 Sep 2016 02:49:27 +0000
reviewerssmaug
bugs1304249
milestone52.0a1
Bug 1304249 - Implement MediaKeySession.onkeystatuseschange. r?smaug MozReview-Commit-ID: 1LnDi1MmXi2
dom/base/nsGkAtomList.h
dom/media/eme/MediaKeySession.cpp
dom/media/eme/MediaKeySession.h
dom/media/test/test_eme_playback.html
dom/webidl/MediaKeySession.webidl
testing/web-platform/meta/encrypted-media/idlharness.html.ini
--- 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