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;