blob: d0804ceedffe4a05ca38bf09025ff7d60e14c805 [file] [log] [blame]
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_RESIZE_OBSERVER_RESIZE_OBSERVER_CONTROLLER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_RESIZE_OBSERVER_RESIZE_OBSERVER_CONTROLLER_H_
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/supplementable.h"
namespace blink {
class LocalDOMWindow;
class ResizeObserver;
// ResizeObserverController keeps track of all ResizeObservers
// in a single window.
//
// The observation API is used to integrate ResizeObserver
// and the event loop. It delivers notification in a loop.
// In each iteration, only notifications deeper than the
// shallowest notification from previous iteration are delivered.
class CORE_EXPORT ResizeObserverController final
: public GarbageCollected<ResizeObserverController>,
public Supplement<LocalDOMWindow> {
public:
static const size_t kDepthBottom = 4096;
static const char kSupplementName[];
static ResizeObserverController* From(LocalDOMWindow&);
static ResizeObserverController* FromIfExists(LocalDOMWindow&);
ResizeObserverController();
void AddObserver(ResizeObserver&);
// observation API
// Returns min depth of shallowest observed node, kDepthLimit if none.
size_t GatherObservations();
// Returns true if gatherObservations has skipped observations
// because they were too shallow.
bool SkippedObservations();
void DeliverObservations();
void ClearObservations();
void ClearMinDepth() { min_depth_ = 0; }
bool IsLoopLimitErrorDispatched() const {
return loop_limit_error_dispatched;
}
void SetLoopLimitErrorDispatched(bool is_dispatched) {
loop_limit_error_dispatched = is_dispatched;
}
void Trace(Visitor*) const override;
// For testing only.
const HeapLinkedHashSet<WeakMember<ResizeObserver>>& Observers() {
return observers_;
}
private:
// Active observers
HeapLinkedHashSet<WeakMember<ResizeObserver>> observers_;
// Minimum depth for observations to be active
size_t min_depth_ = 0;
// Used to prevent loop limit errors from being dispatched twice for the
// same lifecycle update
bool loop_limit_error_dispatched = false;
};
} // namespace blink
#endif