Don't create events in kEndedState if there are no listeners

Bug: 1308211
Change-Id: Ic4eebcfbd4db84a3c0fb07f19ad628970388824e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4110988
Commit-Queue: Tove Petersson <tovep@chromium.org>
Reviewed-by: Tony Herre <toprice@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1085384}
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
index 5190dbe..eddb054 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
@@ -825,7 +825,14 @@
       EnsureFeatureHandleForScheduler();
       break;
     case MediaStreamSource::kReadyStateEnded:
-      DispatchEvent(*Event::Create(event_type_names::kEnded));
+      // SourceChangedState() may be called in kReadyStateEnded during object
+      // disposal if there are no event listeners (otherwise disposal is blocked
+      // by HasPendingActivity). In that case it is not allowed to create
+      // objects, so check if there are event listeners before the event object
+      // is created.
+      if (HasEventListeners(event_type_names::kEnded)) {
+        DispatchEvent(*Event::Create(event_type_names::kEnded));
+      }
       PropagateTrackEnded();
       feature_handle_for_scheduler_.reset();
       break;