Bug 1781046 - Add internal ResizeObserver for last remembered size. r=emilio
In a follow-up, it will take care of updating the last remembered size as described in https://drafts.csswg.org/css-sizing-4/#last-remembered Differential Revision: https://phabricator.services.mozilla.com/D154325
This commit is contained in:
@@ -2521,6 +2521,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(Document)
|
|||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOnloadBlocker)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOnloadBlocker)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLazyLoadImageObserver)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLazyLoadImageObserver)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLazyLoadImageObserverViewport)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLazyLoadImageObserverViewport)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLastRememberedSizeObserver)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMImplementation)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMImplementation)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImageMaps)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImageMaps)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOrientationPendingPromise)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOrientationPendingPromise)
|
||||||
@@ -2640,6 +2641,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Document)
|
|||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDisplayDocument)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDisplayDocument)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLazyLoadImageObserver)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLazyLoadImageObserver)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLazyLoadImageObserverViewport)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLazyLoadImageObserverViewport)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLastRememberedSizeObserver)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFontFaceSet)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFontFaceSet)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mReadyForIdle)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mReadyForIdle)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocumentL10n)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocumentL10n)
|
||||||
@@ -15789,6 +15791,27 @@ void Document::IncLazyLoadImageReachViewport(bool aLoading) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResizeObserver& Document::EnsureLastRememberedSizeObserver() {
|
||||||
|
if (!mLastRememberedSizeObserver) {
|
||||||
|
mLastRememberedSizeObserver =
|
||||||
|
ResizeObserver::CreateLastRememberedSizeObserver(*this);
|
||||||
|
}
|
||||||
|
return *mLastRememberedSizeObserver;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Document::ObserveForLastRememberedSize(Element& aElement) {
|
||||||
|
// Options are initialized with ResizeObserverBoxOptions::Content_box by
|
||||||
|
// default, which is what we want.
|
||||||
|
static ResizeObserverOptions options;
|
||||||
|
EnsureLastRememberedSizeObserver().Observe(aElement, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Document::UnobserveForLastRememberedSize(Element& aElement) {
|
||||||
|
if (mLastRememberedSizeObserver) {
|
||||||
|
mLastRememberedSizeObserver->Unobserve(aElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Document::NotifyLayerManagerRecreated() {
|
void Document::NotifyLayerManagerRecreated() {
|
||||||
NotifyActivityChanged();
|
NotifyActivityChanged();
|
||||||
EnumerateSubDocuments([](Document& aSubDoc) {
|
EnumerateSubDocuments([](Document& aSubDoc) {
|
||||||
|
|||||||
@@ -3748,6 +3748,13 @@ class Document : public nsINode,
|
|||||||
void IncLazyLoadImageStarted() { ++mLazyLoadImageStarted; }
|
void IncLazyLoadImageStarted() { ++mLazyLoadImageStarted; }
|
||||||
void IncLazyLoadImageReachViewport(bool aLoading);
|
void IncLazyLoadImageReachViewport(bool aLoading);
|
||||||
|
|
||||||
|
ResizeObserver* GetLastRememberedSizeObserver() {
|
||||||
|
return mLastRememberedSizeObserver;
|
||||||
|
}
|
||||||
|
ResizeObserver& EnsureLastRememberedSizeObserver();
|
||||||
|
void ObserveForLastRememberedSize(Element&);
|
||||||
|
void UnobserveForLastRememberedSize(Element&);
|
||||||
|
|
||||||
// Dispatch a runnable related to the document.
|
// Dispatch a runnable related to the document.
|
||||||
nsresult Dispatch(TaskCategory aCategory,
|
nsresult Dispatch(TaskCategory aCategory,
|
||||||
already_AddRefed<nsIRunnable>&& aRunnable) final;
|
already_AddRefed<nsIRunnable>&& aRunnable) final;
|
||||||
@@ -5113,6 +5120,10 @@ class Document : public nsINode,
|
|||||||
// Used to measure how effective the lazyload thresholds are.
|
// Used to measure how effective the lazyload thresholds are.
|
||||||
RefPtr<DOMIntersectionObserver> mLazyLoadImageObserverViewport;
|
RefPtr<DOMIntersectionObserver> mLazyLoadImageObserverViewport;
|
||||||
|
|
||||||
|
// ResizeObserver for storing and removing the last remembered size.
|
||||||
|
// @see {@link https://drafts.csswg.org/css-sizing-4/#last-remembered}
|
||||||
|
RefPtr<ResizeObserver> mLastRememberedSizeObserver;
|
||||||
|
|
||||||
// Stack of top layer elements.
|
// Stack of top layer elements.
|
||||||
nsTArray<nsWeakPtr> mTopLayer;
|
nsTArray<nsWeakPtr> mTopLayer;
|
||||||
|
|
||||||
|
|||||||
@@ -295,6 +295,18 @@ void ResizeObserver::Observe(Element& aTarget,
|
|||||||
observation =
|
observation =
|
||||||
new ResizeObservation(aTarget, *this, aOptions.mBox,
|
new ResizeObservation(aTarget, *this, aOptions.mBox,
|
||||||
frame ? frame->GetWritingMode() : WritingMode());
|
frame ? frame->GetWritingMode() : WritingMode());
|
||||||
|
if (this == mDocument->GetLastRememberedSizeObserver()) {
|
||||||
|
// Resize observations are initialized with a (0, 0) mLastReportedSize,
|
||||||
|
// this means that the callback won't be called if the element is 0x0.
|
||||||
|
// But we need it called for handling the last remembered size, so set
|
||||||
|
// mLastReportedSize to an invalid size to ensure IsActive() is true
|
||||||
|
// for the current element size.
|
||||||
|
// See https://github.com/w3c/csswg-drafts/issues/3664 about doing this in
|
||||||
|
// the general case, then we won't need this hack for the last remembered
|
||||||
|
// size, and will have consistency with IntersectionObserver.
|
||||||
|
observation->UpdateLastReportedSize(gfx::Size(-1, -1));
|
||||||
|
MOZ_ASSERT(observation->IsActive());
|
||||||
|
}
|
||||||
mObservationList.insertBack(observation);
|
mObservationList.insertBack(observation);
|
||||||
|
|
||||||
// Per the spec, we need to trigger notification in event loop that
|
// Per the spec, we need to trigger notification in event loop that
|
||||||
@@ -491,6 +503,17 @@ void ResizeObserverEntry::SetDevicePixelContentSize(const gfx::Size& aSize) {
|
|||||||
mDevicePixelContentBoxSize = new ResizeObserverSize(mOwner, aSize, wm);
|
mDevicePixelContentBoxSize = new ResizeObserverSize(mOwner, aSize, wm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void LastRememberedSizeCallback(
|
||||||
|
const Sequence<OwningNonNull<ResizeObserverEntry>>& aEntries,
|
||||||
|
ResizeObserver& aObserver) {
|
||||||
|
// TODO.
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static */ already_AddRefed<ResizeObserver>
|
||||||
|
ResizeObserver::CreateLastRememberedSizeObserver(Document& aDocument) {
|
||||||
|
return do_AddRef(new ResizeObserver(aDocument, LastRememberedSizeCallback));
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ResizeObserverSize, mOwner)
|
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ResizeObserverSize, mOwner)
|
||||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(ResizeObserverSize)
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(ResizeObserverSize)
|
||||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(ResizeObserverSize)
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(ResizeObserverSize)
|
||||||
|
|||||||
@@ -180,6 +180,9 @@ class ResizeObserver final : public nsISupports, public nsWrapperCache {
|
|||||||
*/
|
*/
|
||||||
MOZ_CAN_RUN_SCRIPT uint32_t BroadcastActiveObservations();
|
MOZ_CAN_RUN_SCRIPT uint32_t BroadcastActiveObservations();
|
||||||
|
|
||||||
|
static already_AddRefed<ResizeObserver> CreateLastRememberedSizeObserver(
|
||||||
|
Document&);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
~ResizeObserver() { Disconnect(); }
|
~ResizeObserver() { Disconnect(); }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user