/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// XXX Avoid including this here by moving function bodies to the cpp file #include"nsPIDOMWindow.h"
namespace mozilla { class ErrorResult;
namespace dom {
class Element;
// The logical size in pixels. // Note: if LogicalPixelSize have usages other than ResizeObserver in the // future, it might be better to change LogicalSize into a template class, and // use it to implement LogicalPixelSize. class LogicalPixelSize { public:
LogicalPixelSize() = default;
LogicalPixelSize(WritingMode aWM, const gfx::Size& aSize) {
mSize = aSize; if (aWM.IsVertical()) {
std::swap(mSize.width, mSize.height);
}
}
// For the internal implementation in ResizeObserver. Normally, this is owned by // ResizeObserver. class ResizeObservation final : public LinkedListElement<ResizeObservation> { public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(ResizeObservation)
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(ResizeObservation)
// The latest recorded of observed target. // This will be CSS pixels for border-box/content-box, or device pixels for // device-pixel-content-box.
AutoTArray<LogicalPixelSize, 1> mLastReportedSize;
};
/** * ResizeObserver interfaces and algorithms are based on * https://drafts.csswg.org/resize-observer/#api
*/ class ResizeObserver final : public nsISupports, public nsWrapperCache { public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(ResizeObserver)
/** * Gather all observations which have an observed target with size changed * since last BroadcastActiveObservations() in this ResizeObserver. * An observation will be skipped if the depth of its observed target is less * or equal than aDepth. All gathered observations will be added to * mActiveTargets.
*/ void GatherActiveObservations(uint32_t aDepth);
/** * Returns whether this ResizeObserver has any active observations * since last GatherActiveObservations().
*/ bool HasActiveObservations() const { return !mActiveTargets.IsEmpty(); }
/** * Returns whether this ResizeObserver has any skipped observations * since last GatherActiveObservations().
*/ bool HasSkippedObservations() const { return mHasSkippedTargets; }
/** * Invoke the callback function in JavaScript for all active observations * and pass the sequence of ResizeObserverEntry so JavaScript can access them. * The active observations' mLastReportedSize fields will be updated, and * mActiveTargets will be cleared. It also returns the shallowest depth of * elements from active observations or numeric_limits<uint32_t>::max() if * there are not any active observations.
*/
MOZ_CAN_RUN_SCRIPT uint32_t BroadcastActiveObservations();
/** * Returns |aTarget|'s size in the form of gfx::Size (in pixels). * If the target is an SVG that does not participate in CSS layout, * its width and height are determined from bounding box. Otherwise, the * relevant box is determined according to the |aBox| parameter. * * If dom.resize_observer.support_fragments is enabled, or if * |aForceFragmentHandling| is true then the function reports the size of all * fragments, and not just the first one. * * https://www.w3.org/TR/resize-observer-1/#calculate-box-size
*/ static AutoTArray<LogicalPixelSize, 1> CalculateBoxSize(
Element* aTarget, ResizeObserverBoxOptions aBox, bool aForceFragmentHandling = false);
protected:
~ResizeObserver() { Disconnect(); }
nsCOMPtr<nsPIDOMWindowInner> mOwner; // The window's document at the time of ResizeObserver creation.
RefPtr<Document> mDocument;
RefPtr<ResizeObserverCallback> mCallback;
nsTArray<RefPtr<ResizeObservation>> mActiveTargets; // The spec uses a list to store the skipped targets. However, it seems what // we want is to check if there are any skipped targets (i.e. existence). // Therefore, we use a boolean value to represent the existence of skipped // targets. bool mHasSkippedTargets = false;
// Combination of HashTable and LinkedList so we can iterate through // the elements of HashTable in order of insertion time, so we can deliver // observations in the correct order // FIXME: it will be nice if we have our own data structure for this in the // future, and mObservationMap should be considered the "owning" storage for // the observations, so it'd be better to drop mObservationList later.
nsRefPtrHashtable<nsPtrHashKey<Element>, ResizeObservation> mObservationMap;
LinkedList<ResizeObservation> mObservationList;
};
/** * ResizeObserverEntry is the entry that contains the information for observed * elements. This object is the one that's visible to JavaScript in callback * function that is fired by ResizeObserver.
*/ class ResizeObserverEntry final : public nsISupports, public nsWrapperCache { public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(ResizeObserverEntry)
/** * Returns the DOMRectReadOnly of target's content rect so it can be * accessed from JavaScript in callback function of ResizeObserver.
*/
DOMRectReadOnly* ContentRect() const { return mContentRect; }
/** * Returns target's logical border-box size, content-box size, and * device-pixel-content-box as an array of ResizeObserverSize.
*/ void GetBorderBoxSize(nsTArray<RefPtr<ResizeObserverSize>>& aRetVal) const; void GetContentBoxSize(nsTArray<RefPtr<ResizeObserverSize>>& aRetVal) const; void GetDevicePixelContentBoxSize(
nsTArray<RefPtr<ResizeObserverSize>>& aRetVal) const;
private:
~ResizeObserverEntry() = default;
// Set borderBoxSize. void SetBorderBoxSize(const nsTArray<LogicalPixelSize>& aSize); // Set contentRect and contentBoxSize. void SetContentRectAndSize(const nsTArray<LogicalPixelSize>& aSize); // Set devicePixelContentBoxSize. void SetDevicePixelContentSize(const nsTArray<LogicalPixelSize>& aSize);
class ResizeObserverSize final : public nsISupports, public nsWrapperCache { public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(ResizeObserverSize)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.