Chromium Code Reviews| 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 f285e0d3e4147e6f762f7e06f56271d36e5afa32..15a62862af3980f69ae4d596acbb45196a1b58fe 100644 |
| --- a/third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
| +++ b/third_party/WebKit/Source/core/observer/ResizeObserver.cpp |
| @@ -20,6 +20,8 @@ ResizeObserver* ResizeObserver::create(Document& document, ResizeObserverCallbac |
| ResizeObserver::ResizeObserver(ResizeObserverCallback* callback, Document& document) |
| : m_callback(callback) |
| + , m_skippedObservations(false) |
| + , m_elementSizeChanged(false) |
| { |
| m_controller = &document.ensureResizeObserverController(); |
| m_controller->addObserver(*this); |
| @@ -61,12 +63,65 @@ void ResizeObserver::disconnect() |
| if (target) |
| target->ensureResizeObserverData().remove(this); |
| } |
| + clearObservations(); |
| +} |
| + |
| +size_t ResizeObserver::gatherObservations(size_t deeperThan) |
|
ikilpatrick
2016/07/28 21:48:40
Ok, so we should store the m_observations in an or
atotic1
2016/07/29 20:04:16
TBD: wrote a lenghty reply.
|
| +{ |
| + DCHECK(m_activeObservations.isEmpty()); |
| + |
| + size_t minObservedDepth = ResizeObserverController::kDepthBottom; |
| + if (!m_elementSizeChanged) |
| + return minObservedDepth; |
| + for (auto& observation : m_observations) { |
| + if (!observation->observationSizeOutOfSync()) |
| + continue; |
| + auto depth = observation->targetDepth(); |
|
ikilpatrick
2016/07/28 21:48:40
This is currently O(n*m*o) which we'll want to fix
atotic1
2016/07/29 20:04:16
TBD: wrote a lenghty reply.
|
| + if (depth > deeperThan) { |
| + m_activeObservations.append(*observation); |
| + minObservedDepth = std::min(minObservedDepth, depth); |
| + } else { |
| + m_skippedObservations = true; |
| + } |
| + } |
| + return minObservedDepth; |
| +} |
| + |
| +void ResizeObserver::deliverObservations() |
| +{ |
| + m_elementSizeChanged = m_skippedObservations; |
|
ikilpatrick
2016/07/29 23:18:38
Why does this flag get set here & like this? Poten
atotic1
2016/07/30 03:16:29
Added:
// We can only clear this flag after all ob
|
| + if (m_activeObservations.size() == 0) |
| + return; |
| + |
| + HeapVector<Member<ResizeObserverEntry>> entries; |
| + |
| + for (auto& observation : m_activeObservations) { |
| + auto entry = new ResizeObserverEntry(observation->target()); |
| + entries.append(entry); |
| + observation->setObservationSize(entry->contentSize()); |
| + } |
| + m_callback->handleEvent(entries, this); |
| + clearObservations(); |
| +} |
| + |
| +void ResizeObserver::clearObservations() |
| +{ |
| + m_activeObservations.clear(); |
| + m_skippedObservations = false; |
| +} |
| + |
| +void ResizeObserver::elementSizeChanged() |
| +{ |
| + m_elementSizeChanged = true; |
| + if (m_controller) |
| + m_controller->observerChanged(); |
| } |
| DEFINE_TRACE(ResizeObserver) |
| { |
| visitor->trace(m_callback); |
| visitor->trace(m_observations); |
| + visitor->trace(m_activeObservations); |
| visitor->trace(m_controller); |
| } |