Bug 1347437 - test case. draft
authorJW Wang <jwwang@mozilla.com>
Wed, 15 Mar 2017 11:26:33 +0800
changeset 498707 1680059f2c8cd9c47bb10feec793980cbfad2395
parent 498706 71cd56db606ebee6cc7e7234940e325b72d72842
child 549220 19678b24e0e2415cfba87d410fcd53a08d16cdee
push id49273
push userjwwang@mozilla.com
push dateWed, 15 Mar 2017 06:32:04 +0000
bugs1347437
milestone55.0a1
Bug 1347437 - test case. MozReview-Commit-ID: 1gEuXLrkKRQ
dom/html/HTMLMediaElement.cpp
dom/media/test/test_events.html
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -6047,16 +6047,26 @@ nsresult HTMLMediaElement::DispatchAsync
   nsCOMPtr<nsIRunnable> event;
 
   if (aName.EqualsLiteral("playing")) {
     event = new nsNotifyAboutPlayingRunner(this, TakePendingPlayPromises());
   } else {
     event = new nsAsyncEventRunner(aName, this);
   }
 
+  if (aName.EqualsLiteral("loadedmetadata")) {
+    nsCOMPtr<nsIRunnable> r1 = new nsAsyncEventRunner(NS_LITERAL_STRING("preloadedmetadata"), this);
+    nsCOMPtr<nsIRunnable> r2 = event.forget();
+    event = NS_NewRunnableFunction([r1, r2]() {
+      r1->Run(); // Fire 'preloadedmetadata'.
+      // We should have a checkpoint to run micro tasks here.
+      r2->Run(); // Fire 'loadedmetadata'.
+    });
+  }
+
   OwnerDoc()->Dispatch("HTMLMediaElement::DispatchAsyncEvent",
                        TaskCategory::Other,
                        event.forget());
 
   if ((aName.EqualsLiteral("play") || aName.EqualsLiteral("playing"))) {
     mPlayTime.Start();
     if (IsHidden()) {
       HiddenVideoStart();
new file mode 100644
--- /dev/null
+++ b/dom/media/test/test_events.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test playback events</title>
+</head>
+<body>
+<p id="msg"></p>
+<video id="v1" controls src="gizmo.mp4"></video>
+
+<script type="text/javascript">
+
+function log(x) {
+  msg.innerHTML += x + "<br>";
+}
+
+v1.addEventListener("loadedmetadata", function(e) {
+  log(`got ${e.type} event.`);
+});
+
+v1.addEventListener("preloadedmetadata", function(e) {
+  log(`got ${e.type} event.`);
+  Promise.resolve().then(function() {
+    log("Promise resolved.");
+  })
+});
+
+</script>
+
+</body>
+</html>