Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(551)

Unified Diff: third_party/WebKit/Source/core/html/shadow/MediaControlsLeakTest.cpp

Issue 2736853003: Media: fix memory leak because of the document holding on an EventListener. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/shadow/MediaControlsLeakTest.cpp
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsLeakTest.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlsLeakTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a6b3704fc131498a615a12af7fdf02b2b378f77a
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsLeakTest.cpp
@@ -0,0 +1,78 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/html/shadow/MediaControls.h"
+
+#include "core/dom/Document.h"
+#include "core/html/HTMLVideoElement.h"
+#include "core/testing/DummyPageHolder.h"
+#include "platform/geometry/IntSize.h"
+#include "platform/heap/ThreadState.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+class MediaControlsLeakTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ m_pageHolder = DummyPageHolder::create(IntSize(800, 600));
+ Document& document = this->document();
+
+ document.write("<body><video controls></video></body>");
+ m_video = toHTMLVideoElement(document.querySelector("video"));
+ m_controls = m_video->mediaControls();
+ }
+
+ Document& document() { return m_pageHolder->document(); }
+ HTMLVideoElement* video() { return m_video; }
+ MediaControls* controls() { return m_controls; }
+
+ private:
+ std::unique_ptr<DummyPageHolder> m_pageHolder;
+ WeakPersistent<HTMLVideoElement> m_video;
+ WeakPersistent<MediaControls> m_controls;
+};
+
+TEST_F(MediaControlsLeakTest, RemovingFromDocumentCollectsAll) {
+ ASSERT_NE(video(), nullptr);
+ EXPECT_TRUE(video()->hasEventListeners());
+ EXPECT_NE(controls(), nullptr);
+ EXPECT_TRUE(document().hasEventListeners());
+
+ document().body()->setInnerHTML("");
+
+ // When removed from the document, the event listeners should have been
+ // dropped.
+ EXPECT_FALSE(document().hasEventListeners());
+ // The video element should still have some event listeners.
+ EXPECT_TRUE(video()->hasEventListeners());
+
+ ThreadState::current()->collectAllGarbage();
+
+ // They have been GC'd.
+ EXPECT_EQ(video(), nullptr);
+ EXPECT_EQ(controls(), nullptr);
+}
+
+TEST_F(MediaControlsLeakTest, ReInsertingInDocumentCollectsControls) {
+ ASSERT_NE(video(), nullptr);
+ EXPECT_TRUE(video()->hasEventListeners());
+ EXPECT_NE(controls(), nullptr);
+ EXPECT_TRUE(document().hasEventListeners());
+
+ // This should be a no-op.
+ document().body()->removeChild(video());
+ document().body()->appendChild(video());
+
+ EXPECT_TRUE(document().hasEventListeners());
+ EXPECT_TRUE(video()->hasEventListeners());
+
+ ThreadState::current()->collectAllGarbage();
+
+ ASSERT_NE(video(), nullptr);
+ EXPECT_NE(controls(), nullptr);
+ EXPECT_EQ(controls(), video()->mediaControls());
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698