mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-03 09:48:38 +02:00
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
95 lines
3.3 KiB
C++
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
|