| 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..66da446160c494e7f15833692f92d2b904ade6e5 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"
|
| @@ -50,9 +55,9 @@ private:
|
| * modify target size
|
| * oubservationSizeOutOfSync == true
|
| */
|
| -class ResizeObservationUnitTest : public SimTest { };
|
| +class ResizeObserverUnitTest : public SimTest { };
|
|
|
| -TEST_F(ResizeObservationUnitTest, ObserveSchedulesFrame)
|
| +TEST_F(ResizeObserverUnitTest, ResizeObservationSize)
|
| {
|
| SimRequest mainResource("https://example.com/", "text/html");
|
| loadURL("https://example.com/");
|
| @@ -95,4 +100,51 @@ TEST_F(ResizeObservationUnitTest, ObserveSchedulesFrame)
|
| ASSERT_EQ(svgObservation->targetDepth() - domObservation->targetDepth(), (size_t)1);
|
| }
|
|
|
| +TEST_F(ResizeObserverUnitTest, TestMemoryLeaks)
|
| +{
|
| +
|
| + ResizeObserverController& controller = document().ensureResizeObserverController();
|
| + const 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
|
|
|