/* -*- 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/. */
aVisitor.mCanHandle = true;
EventTarget* parentTarget = nullptr; // Only our special internal events are allowed to escape the // Visual Viewport and be dispatched further up the DOM tree. if (msg == eMozVisualScroll || msg == eMozVisualResize) { if (nsPIDOMWindowInner* win = GetOwnerWindow()) { if (Document* doc = win->GetExtantDoc()) {
parentTarget = doc;
}
}
}
aVisitor.SetParentTarget(parentTarget, false);
}
// Flush layout, as that may affect the answer below (e.g. scrollbars // may have appeared, decreasing the available viewport size).
RefPtr<const VisualViewport> kungFuDeathGrip(this); if (Document* doc = GetDocument()) {
doc->FlushPendingNotifications(FlushType::Layout);
}
// Fetch the pres shell after the layout flush, as it might have destroyed it. if (PresShell* presShell = GetPresShell()) { if (presShell->IsVisualViewportSizeSet()) {
DynamicToolbarState state = presShell->GetDynamicToolbarState();
size = CSSRect::FromAppUnits(
(state == DynamicToolbarState::InTransition ||
state == DynamicToolbarState::Collapsed)
? presShell->GetVisualViewportSizeUpdatedByDynamicToolbar()
: presShell->GetVisualViewportSize());
} else {
ScrollContainerFrame* sf = presShell->GetRootScrollContainerFrame(); if (sf) {
size = CSSRect::FromAppUnits(sf->GetScrollPortRect().Size());
}
}
} return size;
}
void VisualViewport::PostResizeEvent() {
VVP_LOG("%p: PostResizeEvent (pre-existing: %d)\n", this, !!mResizeEvent);
nsPresContext* presContext = GetPresContext(); if (mResizeEvent && mResizeEvent->HasPresContext(presContext)) { return;
} if (mResizeEvent) { // prescontext changed, so discard the old resize event and queue a new one
mResizeEvent->Revoke();
mResizeEvent = nullptr;
}
// The event constructor will register itself with the refresh driver. if (presContext) {
mResizeEvent = new VisualViewportResizeEvent(this, presContext);
VVP_LOG("%p: PostResizeEvent, created new event\n", this);
}
}
if (mScrollEvent) { // prescontext changed, so discard the old scroll event and queue a new one
mScrollEvent->Revoke();
mScrollEvent = nullptr;
}
// The event constructor will register itself with the refresh driver. if (presContext) {
mScrollEvent = new VisualViewportScrollEvent( this, presContext, aPrevVisualOffset, aPrevLayoutOffset);
VVP_LOG("%p: PostScrollEvent, created new event\n", this);
}
}
if (RefPtr<PresShell> presShell = GetPresShell()) {
RefPtr<nsPresContext> presContext = GetPresContext();
if (presShell->GetVisualViewportOffset() != prevVisualOffset) { // The internal event will be fired whenever the visual viewport's // *absolute* offset changed, i.e. relative to the page.
VVP_LOG("%p: FireScrollEvent, fire mozvisualscroll\n", this);
WidgetEvent mozEvent(true, eMozVisualScroll);
mozEvent.mFlags.mOnlySystemGroupDispatch = true;
EventDispatcher::Dispatch(this, presContext, &mozEvent);
}
// Check whether the relative visual viewport offset actually changed - // maybe both visual and layout viewport scrolled together and there was no // change after all.
nsPoint curRelativeOffset =
presShell->GetVisualViewportOffsetRelativeToLayoutViewport();
nsPoint prevRelativeOffset = prevVisualOffset - prevLayoutOffset;
VVP_LOG( "%p: FireScrollEvent, curRelativeOffset %s, " "prevRelativeOffset %s\n", this, ToString(curRelativeOffset).c_str(),
ToString(prevRelativeOffset).c_str()); if (curRelativeOffset != prevRelativeOffset) {
VVP_LOG("%p, FireScrollEvent, fire VisualViewport scroll\n", this);
WidgetGUIEvent event(true, eScroll, nullptr);
event.mFlags.mBubbles = false;
event.mFlags.mCancelable = false;
EventDispatcher::Dispatch(this, presContext, &event);
}
}
}
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
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.