| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..efaae56de77e7337b177baccedec3af1829621a3
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/observer/ResizeObserver.cpp
|
| @@ -0,0 +1,105 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "core/observer/ResizeObserver.h"
|
| +
|
| +#include "core/dom/Element.h"
|
| +#include "core/frame/FrameView.h"
|
| +#include "core/frame/LocalFrame.h"
|
| +#include "core/observer/ResizeObservation.h"
|
| +#include "core/observer/ResizeObserverCallback.h"
|
| +#include "core/observer/ResizeObserverController.h"
|
| +#include "core/observer/ResizeObserverEntry.h"
|
| +
|
| +namespace blink {
|
| +
|
| +ResizeObserver* ResizeObserver::create(Document& document, ResizeObserverCallback* callback)
|
| +{
|
| + auto observer = new ResizeObserver(callback);
|
| + document.ensureResizeObserverController().addObserver(*observer);
|
| + return observer;
|
| +}
|
| +
|
| +ResizeObserver::ResizeObserver(ResizeObserverCallback* callback)
|
| + : m_callback(callback)
|
| +{
|
| +}
|
| +
|
| +void ResizeObserver::observe(Element* target)
|
| +{
|
| + auto observerMap = target ? target->resizeObserverData() : nullptr;
|
| + if (observerMap && observerMap->contains(this))
|
| + return; // Already registered.
|
| + m_observations.add(new ResizeObservation(target, this));
|
| +
|
| + 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);
|
| + }
|
| + m_activeObservations.clear();
|
| +}
|
| +
|
| +bool ResizeObserver::gatherObservations()
|
| +{
|
| + DCHECK(m_activeObservations.isEmpty());
|
| +
|
| + for (auto& observation : m_observations) {
|
| + if (observation->hasResized())
|
| + m_activeObservations.append(*observation);
|
| + }
|
| +
|
| + return !m_activeObservations.isEmpty();
|
| +}
|
| +
|
| +void ResizeObserver::deliverObservations()
|
| +{
|
| + 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->setBroadcastSize(entry->contentSize());
|
| + }
|
| + m_callback->handleEvent(entries, this);
|
| + m_activeObservations.clear();
|
| +}
|
| +
|
| +void ResizeObserver::clearObservations()
|
| +{
|
| + m_activeObservations.clear();
|
| +}
|
| +
|
| +DEFINE_TRACE(ResizeObserver)
|
| +{
|
| + visitor->trace(m_callback);
|
| + visitor->trace(m_observations);
|
| + visitor->trace(m_activeObservations);
|
| +}
|
| +
|
| +} // namespace blink
|
|
|