Title: [221277] trunk
Revision
221277
Author
[email protected]
Date
2017-08-28 15:38:13 -0700 (Mon, 28 Aug 2017)

Log Message

WebRTC MediaStream created without tracks does not update active state after tracks are added
https://bugs.webkit.org/show_bug.cgi?id=175434

Patch by Youenn Fablet <[email protected]> on 2017-08-28
Reviewed by Eric Carlson.

Source/WebCore:

Covered by updated test.

Removing active/inactive events.
active attribute is still kept and is updated synchronously on every track change.

* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::MediaStream):
(WebCore::MediaStream::activeStatusChanged):
(WebCore::MediaStream::internalAddTrack):
(WebCore::MediaStream::updateActiveState):
(WebCore::MediaStream::hasPendingActivity const):
(WebCore::MediaStream::scheduleActiveStateChange): Deleted.
(WebCore::MediaStream::activityEventTimerFired): Deleted.
* Modules/mediastream/MediaStream.h:
* Modules/mediastream/MediaStream.idl:

LayoutTests:

* fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt:
* fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt:
* fast/mediastream/MediaStream-add-remove-tracks-expected.txt:
* fast/mediastream/MediaStream-add-remove-tracks.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (221276 => 221277)


--- trunk/LayoutTests/ChangeLog	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/LayoutTests/ChangeLog	2017-08-28 22:38:13 UTC (rev 221277)
@@ -1,3 +1,15 @@
+2017-08-28  Youenn Fablet  <[email protected]>
+
+        WebRTC MediaStream created without tracks does not update active state after tracks are added
+        https://bugs.webkit.org/show_bug.cgi?id=175434
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt:
+        * fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt:
+        * fast/mediastream/MediaStream-add-remove-tracks-expected.txt:
+        * fast/mediastream/MediaStream-add-remove-tracks.html:
+
 2017-08-28  Brent Fulgham  <[email protected]>
 
         Disable access to secure cookies if an HTTPS site loads mixed content (Part 2: Header Requests)

Modified: trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt (221276 => 221277)


--- trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt	2017-08-28 22:38:13 UTC (rev 221277)
@@ -1,3 +1,3 @@
 
-FAIL check clone track after captureStream() assert_equals: expected true but got false
+FAIL check clone track after captureStream() cloned_track.requestFrame is not a function. (In 'cloned_track.requestFrame()', 'cloned_track.requestFrame' is undefined)
 

Modified: trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt (221276 => 221277)


--- trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/LayoutTests/fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt	2017-08-28 22:38:13 UTC (rev 221277)
@@ -1,5 +1,5 @@
 
-FAIL check <canvas> captureStream(undefined) assert_equals: expected true but got false
-FAIL check <canvas> captureStream(0) assert_equals: expected true but got false
-FAIL check <canvas> captureStream(30) assert_equals: expected true but got false
+PASS check <canvas> captureStream(undefined) 
+PASS check <canvas> captureStream(0) 
+PASS check <canvas> captureStream(30) 
 

Modified: trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks-expected.txt (221276 => 221277)


--- trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks-expected.txt	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks-expected.txt	2017-08-28 22:38:13 UTC (rev 221277)
@@ -3,6 +3,8 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+PASS streamCopy.active is false
+PASS streamCopy.active is true
 PASS stream1.active is true
 PASS stream1.getAudioTracks().length is 1
 PASS stream1.getVideoTracks().length is 1
@@ -47,12 +49,8 @@
 *** remove all tracks, stream will become inactive
 PASS stream2.getAudioTracks().length is 0
 PASS stream2.getVideoTracks().length is 0
-
-*** active attribute is still true (until event is fired)
-FAIL stream2.active should be true. Was false.
-
-Stream2 is active.
-FAIL stream2.active should be true. Was false.
+PASS stream2.active is false
+PASS stream2.active is false
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks.html (221276 => 221277)


--- trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks.html	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/LayoutTests/fast/mediastream/MediaStream-add-remove-tracks.html	2017-08-28 22:38:13 UTC (rev 221277)
@@ -11,6 +11,7 @@
             description("Test adding and removing tracks.");
 
             var stream1;
+            var streamCopy;
             var stream2;
             var audioTrack;
             var videoTrack;
@@ -37,24 +38,6 @@
                 testFailed("\"addtrack\" or \"removetrack\" events should not fire as a result of local addTrack() or removeTrack() operations.");
             }
 
-            function shouldFireActive() {
-                debug("<br>Stream2 is active.");
-                shouldBe('stream2.active', 'true');
-                finishJSTest();
-            }
-
-            function shouldFireInActive() {
-                debug("<br>Stream2 is inactive.");
-                shouldBe('stream2.active', 'false');
-
-                debug("<br>*** add non-ended track");
-                shouldNotBe('audioTrack.readyState', '"ended"');
-                tryAddTrack(stream2, audioTrack);
-
-                debug("<br>*** active attribute is still false (until event is fired)");
-                shouldBe('stream2.active', 'false');
-            }
-
             function gotStream2(s) {
                 stream2 = s;
 
@@ -69,8 +52,10 @@
                 stream1._onaddtrack_ = shouldNotFire;
                 stream1._onremovetrack_ = shouldNotFire;
 
-                stream2._onactive_ = shouldFireActive;
-                stream2._oninactive_ = shouldFireInActive;
+                setTimeout(() => {
+                    shouldBe('stream2.active', 'false');
+                    finishJSTest();
+                }, 1000);
 
                 audioTrack = stream1.getAudioTracks()[0];
                 videoTrack = stream1.getVideoTracks()[0];
@@ -125,12 +110,17 @@
                 shouldBe('stream2.getAudioTracks().length', '0');
                 shouldBe('stream2.getVideoTracks().length', '0');
 
-                debug("<br>*** active attribute is still true (until event is fired)");
-                shouldBe('stream2.active', 'true');
+                shouldBe('stream2.active', 'false');
             }
 
             function gotStream1(s) {
                 stream1 = s;
+
+                streamCopy = new MediaStream();
+                shouldBe('streamCopy.active', 'false');
+                streamCopy.addTrack(stream1.getVideoTracks()[0]);
+                shouldBe('streamCopy.active', 'true');
+
                 getUserMedia("allow", {audio:true, video:true}, gotStream2);
             }
 

Modified: trunk/Source/WebCore/ChangeLog (221276 => 221277)


--- trunk/Source/WebCore/ChangeLog	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/Source/WebCore/ChangeLog	2017-08-28 22:38:13 UTC (rev 221277)
@@ -1,3 +1,26 @@
+2017-08-28  Youenn Fablet  <[email protected]>
+
+        WebRTC MediaStream created without tracks does not update active state after tracks are added
+        https://bugs.webkit.org/show_bug.cgi?id=175434
+
+        Reviewed by Eric Carlson.
+
+        Covered by updated test.
+
+        Removing active/inactive events.
+        active attribute is still kept and is updated synchronously on every track change.
+
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::MediaStream::MediaStream):
+        (WebCore::MediaStream::activeStatusChanged):
+        (WebCore::MediaStream::internalAddTrack):
+        (WebCore::MediaStream::updateActiveState):
+        (WebCore::MediaStream::hasPendingActivity const):
+        (WebCore::MediaStream::scheduleActiveStateChange): Deleted.
+        (WebCore::MediaStream::activityEventTimerFired): Deleted.
+        * Modules/mediastream/MediaStream.h:
+        * Modules/mediastream/MediaStream.idl:
+
 2017-08-28  Andy Estes  <[email protected]>
 
         [Cocoa] Upstream CFNetwork-related WebKitSystemInterface functions

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (221276 => 221277)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2017-08-28 22:38:13 UTC (rev 221277)
@@ -77,7 +77,6 @@
 MediaStream::MediaStream(ScriptExecutionContext& context, const MediaStreamTrackVector& tracks)
     : ActiveDOMObject(&context)
     , m_private(MediaStreamPrivate::create(createTrackPrivateVector(tracks)))
-    , m_activityEventTimer(*this, &MediaStream::activityEventTimerFired)
     , m_mediaSession(PlatformMediaSession::create(*this))
 {
     // This constructor preserves MediaStreamTrack instances and must be used by calls originating
@@ -97,7 +96,6 @@
 MediaStream::MediaStream(ScriptExecutionContext& context, Ref<MediaStreamPrivate>&& streamPrivate)
     : ActiveDOMObject(&context)
     , m_private(WTFMove(streamPrivate))
-    , m_activityEventTimer(*this, &MediaStream::activityEventTimerFired)
     , m_mediaSession(PlatformMediaSession::create(*this))
 {
     setIsActive(m_private->active());
@@ -193,9 +191,7 @@
 
 void MediaStream::activeStatusChanged()
 {
-    // Schedule the active state change and event dispatch since this callback may be called
-    // synchronously from the DOM API (e.g. as a result of addTrack()).
-    scheduleActiveStateChange();
+    updateActiveState();
 }
 
 void MediaStream::didAddTrack(MediaStreamTrackPrivate& trackPrivate)
@@ -230,6 +226,8 @@
     auto& track = *result.iterator->value;
     track.addObserver(*this);
 
+    updateActiveState();
+
     if (streamModifier == StreamModifier::DomAPI)
         m_private->addTrack(&track.privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
     else
@@ -246,6 +244,8 @@
 
     track->removeObserver(*this);
 
+    updateActiveState();
+
     if (streamModifier == StreamModifier::DomAPI)
         m_private->removeTrack(track->privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
     else
@@ -352,7 +352,7 @@
     }
 }
 
-void MediaStream::scheduleActiveStateChange()
+void MediaStream::updateActiveState()
 {
     bool active = false;
     for (auto& track : m_trackSet.values()) {
@@ -366,23 +366,8 @@
         return;
 
     setIsActive(active);
-
-    const AtomicString& eventName = m_isActive ? eventNames().inactiveEvent : eventNames().activeEvent;
-    m_scheduledActivityEvents.append(Event::create(eventName, false, false));
-
-    if (!m_activityEventTimer.isActive())
-        m_activityEventTimer.startOneShot(0_s);
 }
 
-void MediaStream::activityEventTimerFired()
-{
-    Vector<Ref<Event>> events;
-    events.swap(m_scheduledActivityEvents);
-
-    for (auto& event : events)
-        dispatchEvent(event);
-}
-
 URLRegistry& MediaStream::registry() const
 {
     return MediaStreamRegistry::shared();
@@ -497,7 +482,7 @@
 
 bool MediaStream::hasPendingActivity() const
 {
-    return m_isActive || !m_scheduledActivityEvents.isEmpty();
+    return m_isActive;
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (221276 => 221277)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2017-08-28 22:38:13 UTC (rev 221277)
@@ -159,7 +159,7 @@
     const char* activeDOMObjectName() const final;
     bool canSuspendForDocumentSuspension() const final;
 
-    void scheduleActiveStateChange();
+    void updateActiveState();
     void activityEventTimerFired();
     void setIsActive(bool);
     void statusDidChange();
@@ -170,9 +170,6 @@
 
     HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
 
-    Timer m_activityEventTimer;
-    Vector<Ref<Event>> m_scheduledActivityEvents;
-
     Vector<Observer*> m_observers;
     std::unique_ptr<PlatformMediaSession> m_mediaSession;
 

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.idl (221276 => 221277)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.idl	2017-08-28 22:23:08 UTC (rev 221276)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.idl	2017-08-28 22:38:13 UTC (rev 221277)
@@ -50,10 +50,5 @@
 
     attribute EventHandler onaddtrack;
     attribute EventHandler onremovetrack;
-
-    // FIXME 169871: legacy or remove?
-    attribute EventHandler onactive;
-    // FIXME 169871: legacy or remove?
-    attribute EventHandler oninactive;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to