Index: third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
diff --git a/third_party/WebKit/Source/core/observer/ResizeObserver.cpp b/third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
index 838daca88bc1dc6dca768dfbe4563b65c6920753..f285e0d3e4147e6f762f7e06f56271d36e5afa32 100644 |
--- a/third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
+++ b/third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
@@ -5,9 +5,11 @@ |
#include "core/observer/ResizeObserver.h" |
#include "core/dom/Element.h" |
+#include "core/frame/FrameView.h" |
#include "core/observer/ResizeObservation.h" |
#include "core/observer/ResizeObserverCallback.h" |
#include "core/observer/ResizeObserverController.h" |
+#include "core/observer/ResizeObserverEntry.h" |
namespace blink { |
@@ -25,14 +27,40 @@ ResizeObserver::ResizeObserver(ResizeObserverCallback* callback, Document& docum |
void ResizeObserver::observe(Element* target) |
{ |
+ auto& observerMap = target->ensureResizeObserverData(); |
+ if (observerMap.contains(this)) |
+ return; // Already registered. |
+ |
+ auto observation = new ResizeObservation(target, this); |
+ m_observations.add(observation); |
+ observerMap.set(this, observation); |
+ |
+ if (FrameView* frameView = target->document().view()) |
+ frameView->scheduleAnimation(); |
} |
void ResizeObserver::unobserve(Element* target) |
{ |
+ auto observerMap = target ? target->resizeObserverData() : nullptr; |
+ if (!observerMap) |
+ return; |
+ auto observation = observerMap->find(this); |
+ if (observation != observerMap->end()) { |
+ m_observations.remove((*observation).value); |
+ observerMap->remove(observation); |
+ } |
} |
void ResizeObserver::disconnect() |
{ |
+ ObservationList observations; |
+ m_observations.swap(observations); |
+ |
+ for (auto observation : observations) { |
+ Element* target = (*observation).target(); |
+ if (target) |
+ target->ensureResizeObserverData().remove(this); |
+ } |
} |
DEFINE_TRACE(ResizeObserver) |