blob: 25d46c9dc77bd1bf0c0c1b6aaf1ea37847a75609 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/resize_observer/resize_observer_controller.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/resize_observer/resize_observer.h"
namespace blink {
const char ResizeObserverController::kSupplementName[] =
"ResizeObserverController";
ResizeObserverController* ResizeObserverController::From(
LocalDOMWindow& window) {
auto* controller = FromIfExists(window);
if (!controller) {
controller = MakeGarbageCollected<ResizeObserverController>(window);
Supplement<LocalDOMWindow>::ProvideTo(window, controller);
}
return controller;
}
ResizeObserverController* ResizeObserverController::FromIfExists(
LocalDOMWindow& window) {
return Supplement<LocalDOMWindow>::From<ResizeObserverController>(window);
}
ResizeObserverController::ResizeObserverController(LocalDOMWindow& window)
: Supplement(window) {}
void ResizeObserverController::AddObserver(ResizeObserver& observer) {
switch (observer.Delivery()) {
case ResizeObserver::DeliveryTime::kInsertionOrder:
observers_.insert(&observer);
break;
case ResizeObserver::DeliveryTime::kBeforeOthers:
observers_.PrependOrMoveToFirst(&observer);
break;
}
}
size_t ResizeObserverController::GatherObservations() {
size_t shallowest = ResizeObserverController::kDepthBottom;
for (auto& observer : observers_) {
size_t depth = observer->GatherObservations(min_depth_);
if (depth < shallowest)
shallowest = depth;
}
min_depth_ = shallowest;
return min_depth_;
}
bool ResizeObserverController::SkippedObservations() {
for (auto& observer : observers_) {
if (observer->SkippedObservations())
return true;
}
return false;
}
void ResizeObserverController::DeliverObservations() {
// Copy is needed because m_observers might get modified during
// deliverObservations.
HeapVector<Member<ResizeObserver>> observers(observers_);
for (auto& observer : observers) {
if (observer) {
observer->DeliverObservations();
}
}
}
void ResizeObserverController::ClearObservations() {
for (auto& observer : observers_)
observer->ClearObservations();
}
void ResizeObserverController::Trace(Visitor* visitor) const {
Supplement<LocalDOMWindow>::Trace(visitor);
visitor->Trace(observers_);
}
} // namespace blink