Bug 1347437 - test case.
MozReview-Commit-ID: 1gEuXLrkKRQ
--- 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>