Title: [113460] trunk/Source/WebCore
Revision
113460
Author
[email protected]
Date
2012-04-06 11:07:10 -0700 (Fri, 06 Apr 2012)

Log Message

MediaStream API: MediaStreams stops proper cleanup to take place during a page reload.
https://bugs.webkit.org/show_bug.cgi?id=83143

Reviewed by Adam Barth.

To fix this I have converted MediaStream and LocalMediaStream to be ActiveDOMObjects.

Have no idea how to write a test that succesfully verifies this. I have done manual testing
to verify that proper tear-down now takes place.

* Modules/mediastream/LocalMediaStream.cpp:
(WebCore::LocalMediaStream::create):
(WebCore::LocalMediaStream::stopFunction):
(WebCore):
* Modules/mediastream/LocalMediaStream.h:
(LocalMediaStream):
* Modules/mediastream/LocalMediaStream.idl:
* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::create):
(WebCore::MediaStream::MediaStream):
(WebCore::MediaStream::scriptExecutionContext):
* Modules/mediastream/MediaStream.h:
(MediaStream):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (113459 => 113460)


--- trunk/Source/WebCore/ChangeLog	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/ChangeLog	2012-04-06 18:07:10 UTC (rev 113460)
@@ -1,3 +1,29 @@
+2012-04-06  Tommy Widenflycht  <[email protected]>
+
+        MediaStream API: MediaStreams stops proper cleanup to take place during a page reload.
+        https://bugs.webkit.org/show_bug.cgi?id=83143
+
+        Reviewed by Adam Barth.
+
+        To fix this I have converted MediaStream and LocalMediaStream to be ActiveDOMObjects.
+
+        Have no idea how to write a test that succesfully verifies this. I have done manual testing
+        to verify that proper tear-down now takes place.
+
+        * Modules/mediastream/LocalMediaStream.cpp:
+        (WebCore::LocalMediaStream::create):
+        (WebCore::LocalMediaStream::stopFunction):
+        (WebCore):
+        * Modules/mediastream/LocalMediaStream.h:
+        (LocalMediaStream):
+        * Modules/mediastream/LocalMediaStream.idl:
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::MediaStream::create):
+        (WebCore::MediaStream::MediaStream):
+        (WebCore::MediaStream::scriptExecutionContext):
+        * Modules/mediastream/MediaStream.h:
+        (MediaStream):
+
 2012-04-06  Dan Bernstein  <[email protected]>
 
         <rdar://problem/10912476> Pixel access canvas APIs do not work transparently with high-DPI backing store

Modified: trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.cpp (113459 => 113460)


--- trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.cpp	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.cpp	2012-04-06 18:07:10 UTC (rev 113460)
@@ -35,7 +35,9 @@
 
 PassRefPtr<LocalMediaStream> LocalMediaStream::create(ScriptExecutionContext* context, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources)
 {
-    return adoptRef(new LocalMediaStream(context, audioSources, videoSources));
+    RefPtr<LocalMediaStream> stream = adoptRef(new LocalMediaStream(context, audioSources, videoSources));
+    stream->suspendIfNeeded();
+    return stream.release();
 }
 
 LocalMediaStream::LocalMediaStream(ScriptExecutionContext* context, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources)
@@ -44,6 +46,11 @@
 {
 }
 
+void LocalMediaStream::stopFunction()
+{
+    stop();
+}
+
 void LocalMediaStream::stop()
 {
     if (!m_stopTimer.isActive())

Modified: trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.h (113459 => 113460)


--- trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.h	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.h	2012-04-06 18:07:10 UTC (rev 113460)
@@ -38,10 +38,13 @@
     static PassRefPtr<LocalMediaStream> create(ScriptExecutionContext*, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources);
     virtual ~LocalMediaStream();
 
-    void stop();
+    void stopFunction();
 
+    // ActiveDOMObject
+    virtual void stop() OVERRIDE;
+
     // EventTarget
-    virtual const AtomicString& interfaceName() const;
+    virtual const AtomicString& interfaceName() const OVERRIDE;
 
 private:
     LocalMediaStream(ScriptExecutionContext*, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources);

Modified: trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.idl (113459 => 113460)


--- trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.idl	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/Modules/mediastream/LocalMediaStream.idl	2012-04-06 18:07:10 UTC (rev 113460)
@@ -30,7 +30,7 @@
         EventTarget,
         JSGenerateToJSObject
     ] LocalMediaStream : MediaStream {
-        void stop();
+        [ImplementedAs=stopFunction] void stop();
     };
 
 }

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (113459 => 113460)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2012-04-06 18:07:10 UTC (rev 113460)
@@ -76,16 +76,21 @@
 
     RefPtr<MediaStreamDescriptor> descriptor = MediaStreamDescriptor::create(createCanonicalUUIDString(), audioSources, videoSources);
     MediaStreamCenter::instance().didConstructMediaStream(descriptor.get());
-    return adoptRef(new MediaStream(context, descriptor.release()));
+
+    RefPtr<MediaStream> stream = adoptRef(new MediaStream(context, descriptor.release()));
+    stream->suspendIfNeeded();
+    return stream.release();
 }
 
 PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor)
 {
-    return adoptRef(new MediaStream(context, streamDescriptor));
+    RefPtr<MediaStream> stream = adoptRef(new MediaStream(context, streamDescriptor));
+    stream->suspendIfNeeded();
+    return stream.release();
 }
 
 MediaStream::MediaStream(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor)
-    : m_scriptExecutionContext(context)
+    : ActiveDOMObject(context, this)
     , m_descriptor(streamDescriptor)
 {
     m_descriptor->setOwner(this);
@@ -132,7 +137,7 @@
 
 ScriptExecutionContext* MediaStream::scriptExecutionContext() const
 {
-    return m_scriptExecutionContext.get();
+    return ActiveDOMObject::scriptExecutionContext();
 }
 
 EventTargetData* MediaStream::eventTargetData()

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (113459 => 113460)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2012-04-06 18:06:29 UTC (rev 113459)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2012-04-06 18:07:10 UTC (rev 113460)
@@ -28,6 +28,7 @@
 
 #if ENABLE(MEDIA_STREAM)
 
+#include "ActiveDOMObject.h"
 #include "EventTarget.h"
 #include "MediaStreamDescriptor.h"
 #include "MediaStreamTrackList.h"
@@ -38,7 +39,7 @@
 
 class ScriptExecutionContext;
 
-class MediaStream : public RefCounted<MediaStream>, public MediaStreamDescriptorOwner, public EventTarget {
+class MediaStream : public RefCounted<MediaStream>, public MediaStreamDescriptorOwner, public EventTarget, public ActiveDOMObject {
 public:
     // Must match the constants in the .idl file.
     enum ReadyState {
@@ -63,8 +64,8 @@
     MediaStreamDescriptor* descriptor() const { return m_descriptor.get(); }
 
     // EventTarget
-    virtual const AtomicString& interfaceName() const;
-    virtual ScriptExecutionContext* scriptExecutionContext() const;
+    virtual const AtomicString& interfaceName() const OVERRIDE;
+    virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE;
 
     using RefCounted<MediaStream>::ref;
     using RefCounted<MediaStream>::deref;
@@ -72,19 +73,17 @@
 protected:
     MediaStream(ScriptExecutionContext*, PassRefPtr<MediaStreamDescriptor>);
 
-    // EventTarget implementation.
-    virtual EventTargetData* eventTargetData();
-    virtual EventTargetData* ensureEventTargetData();
+    // EventTarget
+    virtual EventTargetData* eventTargetData() OVERRIDE;
+    virtual EventTargetData* ensureEventTargetData() OVERRIDE;
 
 private:
-    // EventTarget implementation.
-    virtual void refEventTarget() { ref(); }
-    virtual void derefEventTarget() { deref(); }
+    // EventTarget
+    virtual void refEventTarget() OVERRIDE { ref(); }
+    virtual void derefEventTarget() OVERRIDE { deref(); }
 
     EventTargetData m_eventTargetData;
 
-    RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
-
     RefPtr<MediaStreamTrackList> m_audioTracks;
     RefPtr<MediaStreamTrackList> m_videoTracks;
     RefPtr<MediaStreamDescriptor> m_descriptor;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to