Title: [133252] trunk
Revision
133252
Author
fisch...@chromium.org
Date
2012-11-01 18:38:30 -0700 (Thu, 01 Nov 2012)

Log Message

HTMLMediaPlayer should free m_player when src is set/changed
https://bugs.webkit.org/show_bug.cgi?id=99647

Reviewed by Eric Carlson.

.:

* ManualTests/media-players-are-dropped-on-error.html: Added.
    Various scenarios are tested to make sure players aren't
    leaked in different ways for each of them.

Source/WebCore:

New ManualTest added; manual since leaking media players doesn't have layoutTestController-visible effects.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::parseAttribute): clearMediaPlayer() when src is set/changed
(WebCore::HTMLMediaElement::userCancelledLoad): use new clearMediaPlayer() helper
(WebCore::HTMLMediaElement::clearMediaPlayer): clear m_player and associated timers/flags
(WebCore):
(WebCore::HTMLMediaElement::createMediaPlayer): whitespace-only change
* html/HTMLMediaElement.h: new method: createMediaPlayer().
(HTMLMediaElement):

Modified Paths

Added Paths

Diff

Modified: trunk/ChangeLog (133251 => 133252)


--- trunk/ChangeLog	2012-11-02 01:36:33 UTC (rev 133251)
+++ trunk/ChangeLog	2012-11-02 01:38:30 UTC (rev 133252)
@@ -1,3 +1,14 @@
+2012-11-01  Ami Fischman  <fisch...@chromium.org>
+
+        HTMLMediaPlayer should free m_player when src is set/changed
+        https://bugs.webkit.org/show_bug.cgi?id=99647
+
+        Reviewed by Eric Carlson.
+
+        * ManualTests/media-players-are-dropped-on-error.html: Added.
+            Various scenarios are tested to make sure players aren't
+            leaked in different ways for each of them.
+
 2012-11-01  Beth Dakin  <bda...@apple.com>
 
         https://bugs.webkit.org/show_bug.cgi?id=100917

Added: trunk/ManualTests/media-players-are-dropped-on-error.html (0 => 133252)


--- trunk/ManualTests/media-players-are-dropped-on-error.html	                        (rev 0)
+++ trunk/ManualTests/media-players-are-dropped-on-error.html	2012-11-02 01:38:30 UTC (rev 133252)
@@ -0,0 +1,40 @@
+<html>
+<head>
+<script>
+var urls = [
+    "file:///does not exist oh noes/test.mp4",
+    "../LayoutTests/media/content/test-25fps.mp4"
+];
+var kickoffFunctions = [
+    "load",
+    "play"
+];
+
+var mediaElementHolder = [];
+
+function releaseAndAddMediaElements() {
+    for (var i = 0; i < mediaElementHolder.length; ++i)
+        mediaElementHolder[i].src = ""
+    mediaElementHolder = [];
+
+    for (var i = 0; i < 5; ++i) {
+        for (var url in urls) {
+            for (var kickoffFunction in kickoffFunctions) {
+                var a = document.createElement('video');
+                a.controls = "controls";
+                a.src = ""
+                eval("a." + kickoffFunctions[kickoffFunction] + "();");
+                mediaElementHolder.push(a);
+            }
+        }
+    }
+}
+</script>
+</head>
+<body _onload_="setInterval('releaseAndAddMediaElements()', 100)">
+    Test that media players aren't leaked on error.
+    Load this page and verify the number of threads used by the browser doesn't
+    seem unreasonable (e.g. chrome uses 4-5 threads per video tag so staying
+    under 100 threads is "success", since this instantiates 20 &lt;video&gt; elements).
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (133251 => 133252)


--- trunk/Source/WebCore/ChangeLog	2012-11-02 01:36:33 UTC (rev 133251)
+++ trunk/Source/WebCore/ChangeLog	2012-11-02 01:38:30 UTC (rev 133252)
@@ -1,3 +1,21 @@
+2012-11-01  Ami Fischman  <fisch...@chromium.org>
+
+        HTMLMediaPlayer should free m_player when src is set/changed
+        https://bugs.webkit.org/show_bug.cgi?id=99647
+
+        Reviewed by Eric Carlson.
+
+        New ManualTest added; manual since leaking media players doesn't have layoutTestController-visible effects.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::parseAttribute): clearMediaPlayer() when src is set/changed
+        (WebCore::HTMLMediaElement::userCancelledLoad): use new clearMediaPlayer() helper
+        (WebCore::HTMLMediaElement::clearMediaPlayer): clear m_player and associated timers/flags
+        (WebCore):
+        (WebCore::HTMLMediaElement::createMediaPlayer): whitespace-only change
+        * html/HTMLMediaElement.h: new method: createMediaPlayer().
+        (HTMLMediaElement):
+
 2012-11-01  Tom Sepez  <tse...@chromium.org>
 
         XSS blocker false positive when page contains <iframe src=""

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (133251 => 133252)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-11-02 01:36:33 UTC (rev 133251)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-11-02 01:38:30 UTC (rev 133252)
@@ -363,8 +363,10 @@
 {
     if (attribute.name() == srcAttr) {
         // Trigger a reload, as long as the 'src' attribute is present.
-        if (fastHasAttribute(srcAttr))
+        if (fastHasAttribute(srcAttr)) {
+            clearMediaPlayer(MediaResource);
             scheduleLoad(MediaResource);
+        }
     } else if (attribute.name() == controlsAttr)
         configureMediaControls();
 #if PLATFORM(MAC)
@@ -3669,13 +3671,7 @@
     // If the media data fetching process is aborted by the user:
 
     // 1 - The user agent should cancel the fetching process.
-#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
-    m_player.clear();
-#endif
-    stopPeriodicTimers();
-    m_loadTimer.stop();
-    m_loadState = WaitingForSource;
-    m_pendingLoadFlags = 0;
+    clearMediaPlayer(-1);
 
     // 2 - Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORTED.
     m_error = MediaError::create(MediaError::MEDIA_ERR_ABORTED);
@@ -3713,6 +3709,18 @@
 #endif
 }
 
+void HTMLMediaElement::clearMediaPlayer(unsigned flags)
+{
+#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+    m_player.clear();
+#endif
+    stopPeriodicTimers();
+    m_loadTimer.stop();
+
+    m_pendingLoadFlags &= ~flags;
+    m_loadState = WaitingForSource;
+}
+
 bool HTMLMediaElement::canSuspend() const
 {
     return true; 
@@ -4263,7 +4271,7 @@
     if (m_audioSourceNode)
         m_audioSourceNode->lock();
 #endif
-        
+
     m_player = MediaPlayer::create(this);
 
 #if ENABLE(MEDIA_SOURCE)

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (133251 => 133252)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2012-11-02 01:36:33 UTC (rev 133251)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2012-11-02 01:38:30 UTC (rev 133252)
@@ -464,6 +464,7 @@
     void scheduleNextSourceChild();
     void loadNextSourceChild();
     void userCancelledLoad();
+    void clearMediaPlayer(unsigned flags);
     bool havePotentialSourceChild();
     void noneSupported();
     void mediaEngineError(PassRefPtr<MediaError> err);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to