Chromium Code Reviews| 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 |