| 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 | 
|  |