Bug 1253905 - Dispatch cuechange to HTMLMediaElement as well as TrackElements and TextTracks. r?rillian draft
authorChris Pearce <cpearce@mozilla.com>
Mon, 14 Mar 2016 06:33:57 +0800
changeset 339852 08a1a37f4a03eee6bb2f356bd08a9b7bddf4ee28
parent 339851 deabb8751ca25ef3f81b873cc14efdf34209b10a
child 516057 0b0cd217e9ca33c5a8cf74f2e8ec82636d4518ef
push id12809
push usercpearce@mozilla.com
push dateSun, 13 Mar 2016 22:34:41 +0000
reviewersrillian
bugs1253905
milestone48.0a1
Bug 1253905 - Dispatch cuechange to HTMLMediaElement as well as TrackElements and TextTracks. r?rillian MozReview-Commit-ID: 5zxVT3sH1gC
dom/html/HTMLTrackElement.cpp
dom/html/HTMLTrackElement.h
dom/media/TextTrack.cpp
dom/media/test/test_texttrackevents_video.html
--- a/dom/html/HTMLTrackElement.cpp
+++ b/dom/html/HTMLTrackElement.cpp
@@ -328,15 +328,24 @@ HTMLTrackElement::DispatchTrustedEvent(c
   if (!doc) {
     return;
   }
   nsContentUtils::DispatchTrustedEvent(doc, static_cast<nsIContent*>(this),
                                        aName, false, false);
 }
 
 void
+HTMLTrackElement::DispatchCueChange()
+{
+  DispatchTrackRunnable(NS_LITERAL_STRING("cuechange"));
+  if (mMediaParent) {
+    mMediaParent->DispatchAsyncEvent(NS_LITERAL_STRING("cuechange"));
+  }
+}
+
+void
 HTMLTrackElement::DropChannel()
 {
   mChannel = nullptr;
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/HTMLTrackElement.h
+++ b/dom/html/HTMLTrackElement.h
@@ -118,16 +118,17 @@ public:
                               bool aCompileEventHandlers) override;
   virtual void UnbindFromTree(bool aDeep, bool aNullParent) override;
 
   // Check enabling preference.
   static bool IsWebVTTEnabled();
 
   void DispatchTrackRunnable(const nsString& aEventName);
   void DispatchTrustedEvent(const nsAString& aName);
+  void DispatchCueChange();
 
   void DropChannel();
 
 protected:
   virtual ~HTMLTrackElement();
 
   virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
   void OnChannelRedirect(nsIChannel* aChannel, nsIChannel* aNewChannel,
--- a/dom/media/TextTrack.cpp
+++ b/dom/media/TextTrack.cpp
@@ -175,25 +175,25 @@ TextTrack::UpdateActiveCueList()
   // added, that have valid start and end times for the current playback time.
   // We can stop iterating safely once we encounter a cue that does not have
   // a valid start time as the cue list is sorted.
   for (; mCuePos < mCueList->Length() &&
          (*mCueList)[mCuePos]->StartTime() <= playbackTime; mCuePos++) {
     if ((*mCueList)[mCuePos]->EndTime() >= playbackTime) {
       mActiveCueList->AddCue(*(*mCueList)[mCuePos]);
       hasChanged = true;
-      }
     }
+  }
 
-    if (hasChanged) {
-      RefPtr<AsyncEventDispatcher> asyncDispatcher =
-        new AsyncEventDispatcher(this, NS_LITERAL_STRING("cuechange"), false);
-      asyncDispatcher->PostDOMEvent();
-      if (mTrackElement) {
-        mTrackElement->DispatchTrackRunnable(NS_LITERAL_STRING("cuechange"));
+  if (hasChanged) {
+    RefPtr<AsyncEventDispatcher> asyncDispatcher =
+      new AsyncEventDispatcher(this, NS_LITERAL_STRING("cuechange"), false);
+    asyncDispatcher->PostDOMEvent();
+    if (mTrackElement) {
+      mTrackElement->DispatchCueChange();
     }
   }
 }
 
 TextTrackCueList*
 TextTrack::GetActiveCues() {
   if (mMode != TextTrackMode::Disabled) {
     UpdateActiveCueList();
--- a/dom/media/test/test_texttrackevents_video.html
+++ b/dom/media/test/test_texttrackevents_video.html
@@ -24,16 +24,17 @@ SpecialPowers.pushPrefEnv({"set": [["med
     trackElement.src = "sequential.vtt";
     trackElement.kind = "subtitles";
     trackElement.default = true;
     document.getElementById("content").appendChild(video);
     video.appendChild(trackElement);
 
     var trackElementCueChangeCount = 0;
     var trackCueChangeCount = 0;
+    var videoElementCueChangeCount = 0;
 
     video.addEventListener("loadedmetadata", function run_tests() {
       // Re-queue run_tests() at the end of the event loop until the track
       // element has loaded its data.
       if (trackElement.readyState == 1) {
         return setTimeout(run_tests, 0);
       }
       is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
@@ -42,24 +43,29 @@ SpecialPowers.pushPrefEnv({"set": [["med
       trackElement.track.oncuechange = function() {
         ++trackElementCueChangeCount;
       };
 
       trackElement.addEventListener("cuechange", function() {
         ++trackCueChangeCount;
       });
 
+      video.addEventListener("cuechange", function() {
+        ++videoElementCueChangeCount;
+      });
+
       video.play();
     });
 
     video.addEventListener('ended', function() {
       // Should be fired 6 times, as there are 3 cues, with a change event
       // for when it is activated/deactivated (6 events total)
       is(trackElementCueChangeCount, 6, "TrackElement should fire cue change 6 times.");
       is(trackCueChangeCount, 6, "TrackElement.track should fire cue change 6 times.");
+      is(videoElementCueChangeCount, 6, "Video element should fire cue change 6 times.");
       SimpleTest.finish()
     })
   }
 );
 </script>
 </pre>
 </body>
 </html>