gecko-dev/dom/base/VisualViewport.h
Emilio Cobos Álvarez e0f0653a49 Bug 1958952 - Make resize event handling more in line with the spec. r=smaug
This makes regular and visual viewport event handling happen as per
spec, on a per-document basis, in the same order as all the other
rendering steps. This is very easy to do after bug 1958942.

Note we don't need to deal with "delayed" events by hand now. Now those
are dealt with via the "rendering suppression" mechanism
Document::IsRenderingSuppressed() will return true when events are
suppressed, and schedule another rendering update when unsuppressed if
needed.

Differential Revision: https://phabricator.services.mozilla.com/D244655
2025-04-10 00:54:09 +00:00

95 lines
3.3 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef mozilla_dom_VisualViewport_h
#define mozilla_dom_VisualViewport_h
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/WeakPtr.h"
#include "mozilla/dom/VisualViewportBinding.h"
#include "Units.h"
class nsPresContext;
namespace mozilla {
class PresShell;
namespace dom {
/* Visual Viewport API spec:
* https://wicg.github.io/visual-viewport/#the-visualviewport-interface */
class VisualViewport final : public mozilla::DOMEventTargetHelper {
public:
explicit VisualViewport(nsPIDOMWindowInner* aWindow);
double OffsetLeft() const;
double OffsetTop() const;
double PageLeft() const;
double PageTop() const;
MOZ_CAN_RUN_SCRIPT double Width() const;
MOZ_CAN_RUN_SCRIPT double Height() const;
double Scale() const;
IMPL_EVENT_HANDLER(resize)
IMPL_EVENT_HANDLER(scroll)
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
void PostResizeEvent();
MOZ_CAN_RUN_SCRIPT void FireResizeEvent();
void PostScrollEvent(const nsPoint& aPrevVisualOffset,
const nsPoint& aPrevLayoutOffset);
class VisualViewportScrollEvent : public Runnable {
public:
NS_DECL_NSIRUNNABLE
VisualViewportScrollEvent(VisualViewport* aViewport,
nsPresContext* aPresContext,
const nsPoint& aPrevVisualOffset,
const nsPoint& aPrevLayoutOffset);
bool HasPresContext(nsPresContext* aContext) const;
void Revoke();
nsPoint PrevVisualOffset() const { return mPrevVisualOffset; }
nsPoint PrevLayoutOffset() const { return mPrevLayoutOffset; }
private:
VisualViewport* mViewport;
WeakPtr<nsPresContext> mPresContext;
// The VisualViewport "scroll" event is supposed to be fired only when the
// *relative* offset between visual and layout viewport changes. The two
// viewports are updated independently from each other, though, so the only
// thing we can do is note the fact that one of the inputs into the relative
// visual viewport offset changed and then check the offset again at the
// next refresh driver tick, just before the event is going to fire.
// Hopefully, at this point both visual and layout viewport positions have
// been updated, so that we're able to tell whether the relative offset did
// in fact change or not.
const nsPoint mPrevVisualOffset;
const nsPoint mPrevLayoutOffset;
};
private:
virtual ~VisualViewport();
MOZ_CAN_RUN_SCRIPT CSSSize VisualViewportSize() const;
CSSPoint VisualViewportOffset() const;
CSSPoint LayoutViewportOffset() const;
Document* GetDocument() const;
PresShell* GetPresShell() const;
nsPresContext* GetPresContext() const;
MOZ_CAN_RUN_SCRIPT void FireScrollEvent();
RefPtr<VisualViewportScrollEvent> mScrollEvent;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_VisualViewport_h