2019-04-25 08:02:20 +03:00
|
|
|
/* -*- 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_PresShellForwards_h
|
|
|
|
#define mozilla_PresShellForwards_h
|
|
|
|
|
|
|
|
#include "mozilla/TypedEnumBits.h"
|
|
|
|
|
|
|
|
struct CapturingContentInfo;
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
class PresShell;
|
|
|
|
|
|
|
|
// Flags to pass to PresShell::SetCapturingContent().
|
|
|
|
enum class CaptureFlags {
|
|
|
|
None = 0,
|
|
|
|
// When assigning capture, ignore whether capture is allowed or not.
|
|
|
|
IgnoreAllowedState = 1 << 0,
|
|
|
|
// Set if events should be targeted at the capturing content or its children.
|
|
|
|
RetargetToElement = 1 << 1,
|
|
|
|
// Set if the current capture wants drags to be prevented.
|
|
|
|
PreventDragStart = 1 << 2,
|
|
|
|
// Set when the mouse is pointer locked, and events are sent to locked
|
|
|
|
// element.
|
|
|
|
PointerLock = 1 << 3,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(CaptureFlags)
|
|
|
|
|
|
|
|
enum class ResizeReflowOptions : uint32_t {
|
|
|
|
NoOption = 0,
|
|
|
|
// the resulting BSize can be less than the given one, producing
|
|
|
|
// shrink-to-fit sizing in the block dimension
|
|
|
|
BSizeLimit = 1 << 0,
|
Bug 1583534 - Further simplify PresShell::ResizeReflow. r=botond
In particular, not let ResizeReflow take the old and new size. Most of the
callers pass dummy values anyway.
Instead, use the old size of the layout viewport. This ensures we fire resize
events only if the layout viewport actually changes.
This is important because the first resize of the mobile viewport manager
after a navigation has an "old size" of 0x0, even though the layout viewport
is initialized on presshell initialization to the right size.
Thus, we fire resize events unnecessarily in that case, which is the root cause
for bug 1528052.
To do this, we need to shuffle a bit of code in nsDocumentViewer that deals with
delayed resizes, to set the visible area _and_ invalidate layout, rather than
setting the visible area and _then_ relying on doing a resize reflow.
Further cleanup is possible, though not required for my android resizing fix, so
will do separately.
Differential Revision: https://phabricator.services.mozilla.com/D46944
--HG--
extra : moz-landing-system : lando
2019-09-25 22:12:44 +03:00
|
|
|
// Invalidate layout, but don't reflow.
|
|
|
|
//
|
|
|
|
// TODO(emilio): Ideally this should just become the default, or we should
|
|
|
|
// unconditionally not reflow and rely on the caller to do so, having a
|
|
|
|
// separate API for shrink-to-fit.
|
Bug 1551659 - Remove MVMContext::ResizeEventFlag and related code. r=botond,hiro
D46944 / bug 1583534 is what fixes the root cause of bug 1528052 by not
having the first call to ResizeReflow have a wrong old size of 0x0.
This removes the code that bug introduces to suppress resize events, which
fixes this bug. I think our behavior now is pretty sane.
In particular, consider the test-case:
<!doctype html>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<a href="" target="_blank">Open me in a separate tab</a>
<pre id="log"></pre>
<script>
// This shouldn't be needed, but otherwise Fenix doesn't show the tooltip on
// longpress...
document.querySelector("a").href = location.href;
function logSize() {
log.innerText += window.innerWidth + "x" + window.innerHeight + "\n";
}
logSize();
onresize = logSize;
</script>
(Hosted at https://crisal.io/tmp/gecko-mobile-resize.html for convenience)
Right now on trunk, when you click the link from GVE or Fenix, we're only
getting an initial size of 0x0 (which is not great, btw), and only after first
paint we get the real device size, but content doesn't get a resize event.
This is obviously wrong, every time the layout viewport changes we should fire
resize events.
Pages that get opened in new tabs and get refreshed when resized may get an
extra reload with this approach, but this seems not avoidable unless widget sets
the viewport size right in advance (which from discussion with snorp and agi
doesn't seem possible in the general case).
What used to happen is that we were triggering a redundant resize reflow from
the initial paint which didn't update the layout viewport (because the content
viewer and co had the right viewport from the previous navigation).
Now that we optimize those away, I think our behavior should be correct.
Differential Revision: https://phabricator.services.mozilla.com/D46956
--HG--
extra : moz-landing-system : lando
2019-09-25 22:35:29 +03:00
|
|
|
SuppressReflow = 1 << 1,
|
2019-04-25 08:02:20 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(ResizeReflowOptions)
|
|
|
|
|
|
|
|
// This is actually pref-controlled, but we use this value if we fail to get
|
|
|
|
// the pref for any reason.
|
|
|
|
#define PAINTLOCK_EVENT_DELAY 5
|
|
|
|
|
2019-04-25 08:04:15 +03:00
|
|
|
enum class IntrinsicDirty {
|
|
|
|
// XXXldb eResize should be renamed
|
|
|
|
Resize, // don't mark any intrinsic widths dirty
|
|
|
|
TreeChange, // mark intrinsic widths dirty on aFrame and its ancestors
|
|
|
|
StyleChange, // Do eTreeChange, plus all of aFrame's descendants
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ReflowRootHandling {
|
|
|
|
PositionOrSizeChange, // aFrame is changing position or size
|
|
|
|
NoPositionOrSizeChange, // ... NOT changing ...
|
|
|
|
InferFromBitToAdd, // is changing iff (aBitToAdd == NS_FRAME_IS_DIRTY)
|
|
|
|
|
|
|
|
// Note: With eStyleChange, these can also apply to out-of-flows
|
|
|
|
// in addition to aFrame.
|
|
|
|
};
|
|
|
|
|
|
|
|
// WhereToScroll should be 0 ~ 100 or -1. When it's in 0 ~ 100, it means
|
|
|
|
// percentage of scrollTop/scrollLeft in scrollHeight/scrollWidth.
|
2019-04-30 03:07:49 +03:00
|
|
|
// See the comment for constructor of ScrollAxis for the detail.
|
2019-04-25 08:04:15 +03:00
|
|
|
typedef int16_t WhereToScroll;
|
|
|
|
static const WhereToScroll kScrollToTop = 0;
|
|
|
|
static const WhereToScroll kScrollToLeft = 0;
|
|
|
|
static const WhereToScroll kScrollToCenter = 50;
|
|
|
|
static const WhereToScroll kScrollToBottom = 100;
|
|
|
|
static const WhereToScroll kScrollToRight = 100;
|
|
|
|
static const WhereToScroll kScrollMinimum = -1;
|
|
|
|
|
2019-04-30 03:07:49 +03:00
|
|
|
// See the comment for constructor of ScrollAxis for the detail.
|
2019-04-25 08:04:15 +03:00
|
|
|
enum class WhenToScroll : uint8_t {
|
|
|
|
Always,
|
|
|
|
IfNotVisible,
|
|
|
|
IfNotFullyVisible,
|
|
|
|
};
|
|
|
|
|
2019-04-30 03:07:49 +03:00
|
|
|
struct ScrollAxis final {
|
|
|
|
/**
|
|
|
|
* aWhere:
|
|
|
|
* Either a percentage or a special value. PresShell defines:
|
|
|
|
* * (Default) kScrollMinimum = -1: The visible area is scrolled the
|
|
|
|
* minimum amount to show as much as possible of the frame. This won't
|
|
|
|
* hide any initially visible part of the frame.
|
|
|
|
* * kScrollToTop = 0: The frame's upper edge is aligned with the top edge
|
|
|
|
* of the visible area.
|
|
|
|
* * kScrollToBottom = 100: The frame's bottom edge is aligned with the
|
|
|
|
* bottom edge of the visible area.
|
|
|
|
* * kScrollToLeft = 0: The frame's left edge is aligned with the left edge
|
|
|
|
* of the visible area.
|
|
|
|
* * kScrollToRight = 100: The frame's right edge is aligned* with the right
|
|
|
|
* edge of the visible area.
|
|
|
|
* * kScrollToCenter = 50: The frame is centered along the axis the
|
|
|
|
* ScrollAxis is used for.
|
|
|
|
*
|
|
|
|
* Other values are treated as a percentage, and the point*"percent"
|
|
|
|
* down the frame is placed at the point "percent" down the visible area.
|
|
|
|
*
|
|
|
|
* aWhen:
|
|
|
|
* * (Default) WhenToScroll::IfNotFullyVisible: Move the frame only if it is
|
|
|
|
* not fully visible (including if it's not visible at all). Note that
|
|
|
|
* in this case if the frame is too large to fit in view, it will only
|
|
|
|
* be scrolled if more of it can fit than is already in view.
|
|
|
|
* * WhenToScroll::IfNotVisible: Move the frame only if none of it is
|
|
|
|
* visible.
|
|
|
|
* * WhenToScroll::Always: Move the frame regardless of its current
|
|
|
|
* visibility.
|
|
|
|
*
|
|
|
|
* aOnlyIfPerceivedScrollableDirection:
|
|
|
|
* If the direction is not a perceived scrollable direction (i.e. no
|
|
|
|
* scrollbar showing and less than one device pixel of scrollable
|
|
|
|
* distance), don't scroll. Defaults to false.
|
|
|
|
*/
|
|
|
|
explicit ScrollAxis(WhereToScroll aWhere = kScrollMinimum,
|
|
|
|
WhenToScroll aWhen = WhenToScroll::IfNotFullyVisible,
|
|
|
|
bool aOnlyIfPerceivedScrollableDirection = false)
|
|
|
|
: mWhereToScroll(aWhere),
|
|
|
|
mWhenToScroll(aWhen),
|
|
|
|
mOnlyIfPerceivedScrollableDirection(
|
|
|
|
aOnlyIfPerceivedScrollableDirection) {}
|
|
|
|
|
|
|
|
WhereToScroll mWhereToScroll;
|
|
|
|
WhenToScroll mWhenToScroll;
|
|
|
|
bool mOnlyIfPerceivedScrollableDirection : 1;
|
|
|
|
};
|
|
|
|
|
2019-04-25 08:04:15 +03:00
|
|
|
enum class ScrollFlags {
|
|
|
|
None = 0,
|
|
|
|
ScrollFirstAncestorOnly = 1 << 0,
|
|
|
|
ScrollOverflowHidden = 1 << 1,
|
|
|
|
ScrollNoParentFrames = 1 << 2,
|
|
|
|
ScrollSmooth = 1 << 3,
|
|
|
|
ScrollSmoothAuto = 1 << 4,
|
|
|
|
ScrollSnap = 1 << 5,
|
|
|
|
IgnoreMarginAndPadding = 1 << 6,
|
|
|
|
// ScrollOverflowHidden | ScrollNoParentFrames
|
|
|
|
AnchorScrollFlags = (1 << 1) | (1 << 2),
|
2019-07-09 08:34:27 +03:00
|
|
|
ALL_BITS = (1 << 7) - 1,
|
2019-04-25 08:04:15 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(ScrollFlags)
|
|
|
|
|
2019-04-25 08:04:23 +03:00
|
|
|
// See comment at declaration of RenderDocument() for the detail.
|
|
|
|
enum class RenderDocumentFlags {
|
|
|
|
None = 0,
|
|
|
|
IsUntrusted = 1 << 0,
|
|
|
|
IgnoreViewportScrolling = 1 << 1,
|
|
|
|
DrawCaret = 1 << 2,
|
|
|
|
UseWidgetLayers = 1 << 3,
|
|
|
|
AsyncDecodeImages = 1 << 4,
|
|
|
|
DocumentRelative = 1 << 5,
|
|
|
|
DrawWindowNotFlushing = 1 << 6,
|
2020-06-23 15:43:21 +03:00
|
|
|
UseHighQualityScaling = 1 << 7,
|
2019-04-25 08:04:23 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(RenderDocumentFlags)
|
|
|
|
|
|
|
|
// See comment at declaration of RenderSelection() for the detail.
|
|
|
|
enum class RenderImageFlags {
|
|
|
|
None = 0,
|
|
|
|
IsImage = 1 << 0,
|
|
|
|
AutoScale = 1 << 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(RenderImageFlags)
|
|
|
|
|
|
|
|
enum class ResolutionChangeOrigin : uint8_t {
|
|
|
|
Apz,
|
2020-05-31 00:34:39 +03:00
|
|
|
Test,
|
2019-08-13 01:21:51 +03:00
|
|
|
MainThreadRestore,
|
|
|
|
MainThreadAdjustment,
|
2019-04-25 08:04:23 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
// See comment at declaration of AddCanvasBackgroundColorItem() for the detail.
|
|
|
|
enum class AddCanvasBackgroundColorFlags {
|
|
|
|
None = 0,
|
|
|
|
ForceDraw = 1 << 0,
|
|
|
|
AddForSubDocument = 1 << 1,
|
|
|
|
AppendUnscrolledOnly = 1 << 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(AddCanvasBackgroundColorFlags)
|
|
|
|
|
|
|
|
enum class PaintFlags {
|
|
|
|
None = 0,
|
|
|
|
/* Update the layer tree and paint PaintedLayers. If this is not specified,
|
|
|
|
* we may still have to do it if the layer tree lost PaintedLayer contents
|
|
|
|
* we need for compositing. */
|
|
|
|
PaintLayers = 1 << 0,
|
|
|
|
/* Composite layers to the window. */
|
|
|
|
PaintComposite = 1 << 1,
|
|
|
|
/* Sync-decode images. */
|
|
|
|
PaintSyncDecodeImages = 1 << 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(PaintFlags)
|
|
|
|
|
|
|
|
// See comment at declaration of ScheduleViewManagerFlush() for the detail.
|
|
|
|
enum class PaintType { Default, DelayedCompress };
|
|
|
|
|
2019-05-01 05:28:25 +03:00
|
|
|
// This is a private enum class of PresShell, but currently,
|
|
|
|
// MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS isn't available in class definition.
|
|
|
|
// Therefore, we need to put this here.
|
|
|
|
enum class RenderingStateFlags : uint8_t {
|
|
|
|
None = 0,
|
|
|
|
IgnoringViewportScrolling = 1 << 0,
|
|
|
|
DrawWindowNotFlushing = 1 << 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(RenderingStateFlags)
|
|
|
|
|
2019-11-22 00:36:59 +03:00
|
|
|
// The state of the dynamic toolbar on Mobile.
|
|
|
|
enum class DynamicToolbarState {
|
|
|
|
None, // No dynamic toolbar, i.e. the toolbar is static or there is
|
|
|
|
// no available toolbar.
|
|
|
|
Expanded, // The dynamic toolbar is expanded to the maximum height.
|
|
|
|
InTransition, // The dynamic toolbar is being shown/hidden.
|
|
|
|
Collapsed, // The dynamic toolbar is collapsed to zero height.
|
|
|
|
};
|
|
|
|
|
2019-04-25 08:02:20 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
|
|
|
|
enum class VerifyReflowFlags {
|
|
|
|
None = 0,
|
|
|
|
On = 1 << 0,
|
|
|
|
Noisy = 1 << 1,
|
|
|
|
All = 1 << 2,
|
|
|
|
DumpCommands = 1 << 3,
|
|
|
|
NoisyCommands = 1 << 4,
|
|
|
|
ReallyNoisyCommands = 1 << 5,
|
|
|
|
DuringResizeReflow = 1 << 6,
|
|
|
|
};
|
|
|
|
|
|
|
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(VerifyReflowFlags)
|
|
|
|
|
|
|
|
#endif // #ifdef DEBUG
|
|
|
|
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // #ifndef mozilla_PresShellForwards_h
|