Bug 1304250 - Implement MediaKeySession.onmessage. r?smaug draft
authorChris Pearce <cpearce@mozilla.com>
Wed, 21 Sep 2016 14:56:20 +1200
changeset 415796 80119d48344d08773673088e648d310bada2b958
parent 415780 f4a11a9eac294c345e93b2f66e88baee0f060b02
child 531706 2d9b5f9ec911126236a3dd421f17e9a13fb7ef07
push id29975
push usercpearce@mozilla.com
push dateWed, 21 Sep 2016 03:04:25 +0000
reviewerssmaug
bugs1304250
milestone52.0a1
Bug 1304250 - Implement MediaKeySession.onmessage. r?smaug MozReview-Commit-ID: FDpvsoFwy6C
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/media/eme/MediaKeySession.cpp
+++ b/dom/media/eme/MediaKeySession.cpp
@@ -495,10 +495,27 @@ void
 MediaKeySession::SetOnkeystatuseschange(EventHandlerNonNull* handler)
 {
   EventListenerManager *elm = GetOrCreateListenerManager();
   if (elm) {
     elm->SetEventHandler(nsGkAtoms::onkeystatuseschange, EmptyString(), handler);
   }
 }
 
+EventHandlerNonNull*
+MediaKeySession::GetOnmessage()
+{
+  EventListenerManager *elm = GetExistingListenerManager();
+  return elm ? elm->GetEventHandler(nsGkAtoms::onmessage, EmptyString())
+             : nullptr;
+}
+
+void
+MediaKeySession::SetOnmessage(EventHandlerNonNull* handler)
+{
+  EventListenerManager *elm = GetOrCreateListenerManager();
+  if (elm) {
+    elm->SetEventHandler(nsGkAtoms::onmessage, EmptyString(), handler);
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/media/eme/MediaKeySession.h
+++ b/dom/media/eme/MediaKeySession.h
@@ -92,16 +92,19 @@ public:
 
   bool IsClosed() const;
 
   void SetExpiration(double aExpiry);
 
   mozilla::dom::EventHandlerNonNull* GetOnkeystatuseschange();
   void SetOnkeystatuseschange(mozilla::dom::EventHandlerNonNull* listener);
 
+  mozilla::dom::EventHandlerNonNull* GetOnmessage();
+  void SetOnmessage(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
@@ -88,16 +88,25 @@ function startTest(test, token)
         session.numOnkeystatuseschangeEvents = 0;
 
         session.addEventListener("keystatuseschange", function() {
           session.numKeystatuseschangeEvents += 1;
         });
         session.onkeystatuseschange = function() {
           session.numOnkeystatuseschangeEvents += 1;
         };
+
+        session.numMessageEvents = 0;
+        session.numOnMessageEvents = 0;
+        session.addEventListener("message", function() {
+          session.numMessageEvents += 1;
+        });
+        session.onmessage = function() {
+          session.numOnMessageEvents += 1;
+        };
       }
     }
   );
 
   document.body.appendChild(v);
 
   var gotEncrypted = 0;
 
@@ -137,16 +146,20 @@ function startTest(test, token)
          + "] 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");
+
+      ok(session.numMessageEvents > 0, TimeStamp(token) + " should get message events");
+      is(session.numMessageEvents, session.numOnMessageEvents,
+         TimeStamp(token) + " should get as many message as onmessage events");
     }
     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
@@ -22,16 +22,18 @@ interface MediaKeySession : EventTarget 
   readonly attribute unrestricted double expiration;
 
   readonly attribute Promise<void> closed;
 
   readonly attribute MediaKeyStatusMap keyStatuses;
 
   attribute EventHandler onkeystatuseschange;
 
+  attribute EventHandler onmessage;
+
   [NewObject]
   Promise<void> generateRequest(DOMString initDataType, BufferSource initData);
 
   [NewObject]
   Promise<boolean> load(DOMString sessionId);
 
   // session operations
   [NewObject]
deleted file mode 100644
--- a/testing/web-platform/meta/encrypted-media/idlharness.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[idlharness.html]
-  type: testharness
-  [MediaKeySession interface: attribute onmessage]
-    expected: FAIL
-