Index: third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp |
diff --git a/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp |
index e78a0ebdabefd197f680f3cab007d3ca9501afb1..6600dddd11cce1b3115b083ea3e7adfc7b5919a5 100644 |
--- a/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp |
+++ b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp |
@@ -4,9 +4,14 @@ |
#include "core/observer/ResizeObserver.h" |
+#include "bindings/core/v8/ScriptController.h" |
+#include "bindings/core/v8/ScriptSourceCode.h" |
+#include "bindings/core/v8/V8GCController.h" |
#include "core/observer/ResizeObservation.h" |
#include "core/observer/ResizeObserverCallback.h" |
+#include "core/observer/ResizeObserverController.h" |
#include "platform/testing/UnitTestHelpers.h" |
+#include "public/web/WebHeap.h" |
#include "web/WebViewImpl.h" |
#include "web/tests/sim/SimCompositor.h" |
#include "web/tests/sim/SimDisplayItemList.h" |
@@ -95,4 +100,52 @@ TEST_F(ResizeObservationUnitTest, ObserveSchedulesFrame) |
ASSERT_EQ(svgObservation->targetDepth() - domObservation->targetDepth(), (size_t)1); |
} |
+class ResizeObserverMemoryTest : public SimTest {}; |
esprehn
2016/08/30 21:25:23
You don't need a new SimTest class for each one. N
atotic1
2016/08/31 19:05:15
Done.
|
+TEST_F(ResizeObserverMemoryTest, TestMemoryLeaks) |
+{ |
+ |
+ ResizeObserverController& controller = document().ensureResizeObserverController(); |
+ HeapHashSet<WeakMember<ResizeObserver>>& observers = controller.observers(); |
+ ASSERT_EQ(observers.size(), 0U); |
+ v8::HandleScope scope(v8::Isolate::GetCurrent()); |
+ |
+ ScriptController& script = document().executingFrame()->script(); |
+ |
+ // |
+ // Test whether ResizeObserver is kept alive by direct JS reference |
+ // |
+ script.executeScriptInMainWorldAndReturnValue( |
+ ScriptSourceCode("var ro = new ResizeObserver( entries => {});"), |
+ ScriptController::ExecuteScriptWhenScriptsDisabled); |
+ ASSERT_EQ(observers.size(), 1U); |
+ script.executeScriptInMainWorldAndReturnValue( |
+ ScriptSourceCode("ro = undefined;"), |
+ ScriptController::ExecuteScriptWhenScriptsDisabled); |
+ V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent()); |
+ WebHeap::collectAllGarbageForTesting(); |
+ ASSERT_EQ(observers.isEmpty(), true); |
+ |
+ // |
+ // Test whether ResizeObserver is kept alive by an Element |
+ // |
+ script.executeScriptInMainWorldAndReturnValue( |
+ ScriptSourceCode( |
+ "var ro = new ResizeObserver( () => {});" |
+ "var el = document.createElement('div');" |
+ "ro.observe(el);" |
+ "ro = undefined;" |
+ ), |
+ ScriptController::ExecuteScriptWhenScriptsDisabled); |
+ ASSERT_EQ(observers.size(), 1U); |
+ V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent()); |
+ WebHeap::collectAllGarbageForTesting(); |
+ ASSERT_EQ(observers.size(), 1U); |
+ script.executeScriptInMainWorldAndReturnValue( |
+ ScriptSourceCode("el = undefined;"), |
+ ScriptController::ExecuteScriptWhenScriptsDisabled); |
+ V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent()); |
+ WebHeap::collectAllGarbageForTesting(); |
+ ASSERT_EQ(observers.isEmpty(), true); |
+} |
+ |
} // namespace blink |