/* -*- 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 nsLayoutUtils_h__#define nsLayoutUtils_h__#include"LayoutConstants.h"#include"mozilla/MemoryReporting.h"#include"mozilla/ArrayUtils.h"#include"mozilla/LookAndFeel.h"#include"mozilla/Maybe.h"#include"mozilla/RelativeTo.h"#include"mozilla/StaticPrefs_nglayout.h"#include"mozilla/SurfaceFromElementResult.h"#include"mozilla/SVGImageContext.h"#include"mozilla/ToString.h"#include"mozilla/TypedEnumBits.h"#include"mozilla/UniquePtr.h"#include"mozilla/WritingModes.h"#include"mozilla/layout/FrameChildList.h"#include"mozilla/layers/ScrollableLayerGuid.h"#include"mozilla/gfx/2D.h"#include"gfxPoint.h"#include"nsBoundingMetrics.h"#include"nsCSSPropertyIDSet.h"#include"nsThreadUtils.h"#include"Units.h"#include"mozilla/layers/LayersTypes.h"#include<limits>#include<algorithm>// If you're thinking of adding a new include here, please try hard to not.// This header file gets included just about everywhere and adding headers here// can dramatically increase avoidable build activity. Try instead:// - using a forward declaration// - putting the include in the .cpp file, if it is only needed by the body// - putting your new functions in some other less-widely-used headerclassgfxContext;classgfxFontEntry;classimgIContainer;classnsFrameList;classnsPresContext;classnsIContent;classnsIPrincipal;classnsIWidget;classnsAtom;classnsIScrollableFrame;classnsRegion;enumnsChangeHint:uint32_t;classnsFontMetrics;classnsFontFaceList;classnsIImageLoadingContent;classnsBlockFrame;classnsContainerFrame;classnsView;classnsIFrame;classnsPIDOMWindowOuter;classimgIRequest;structnsStyleFont;namespacemozilla{classnsDisplayItem;classnsDisplayList;classnsDisplayListBuilder;enumclassnsDisplayListBuilderMode:uint8_t;structAspectRatio;classComputedStyle;classDisplayPortUtils;classPresShell;enumclassPseudoStyleType:uint8_t;classEventListenerManager;enumclassLayoutFrameType:uint8_t;structIntrinsicSize;classReflowOutput;classWritingMode;classDisplayItemClip;classEffectSet;structActiveScrolledRoot;enumclassScrollOrigin:uint8_t;enumclassStyleImageOrientation:uint8_t;enumclassStyleSystemFont:uint8_t;enumclassStyleScrollbarWidth:uint8_t;structOverflowAreas;namespacedom{classCanvasRenderingContext2D;classDOMRectList;classDocument;classElement;classEvent;classHTMLImageElement;classHTMLCanvasElement;classHTMLVideoElement;classInspectorFontFace;classOffscreenCanvas;classSelection;}// namespace domnamespacegfx{structRectCornerRadii;enumclassShapedTextFlags:uint16_t;}// namespace gfxnamespaceimage{classImageIntRegion;structResolution;}// namespace imagenamespacelayers{structFrameMetrics;structScrollMetadata;classImage;classStackingContextHelper;classLayer;classWebRenderLayerManager;}// namespace layers}// namespace mozilla// Flags to customize the behavior of nsLayoutUtils::DrawString.enumclassDrawStringFlags{Default=0x0,ForceHorizontal=0x1// Forces the text to be drawn horizontally.};MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(DrawStringFlags)namespacemozilla{classRectCallback{public:virtualvoidAddRect(constnsRect&aRect)=0;};}// namespace mozilla/** * nsLayoutUtils is a namespace class used for various helper * functions that are useful in multiple places in layout. The goal * is not to define multiple copies of the same static helper. */classnsLayoutUtils{typedefmozilla::AspectRatioAspectRatio;typedefmozilla::ComputedStyleComputedStyle;typedefmozilla::LengthPercentageLengthPercentage;typedefmozilla::LengthPercentageOrAutoLengthPercentageOrAuto;typedefmozilla::dom::DOMRectListDOMRectList;typedefmozilla::layers::LayerLayer;typedefmozilla::layers::StackingContextHelperStackingContextHelper;typedefmozilla::IntrinsicSizeIntrinsicSize;typedefmozilla::RelativeToRelativeTo;typedefmozilla::ScrollOriginScrollOrigin;typedefmozilla::ViewportTypeViewportType;typedefmozilla::gfx::SourceSurfaceSourceSurface;typedefmozilla::gfx::sRGBColorsRGBColor;typedefmozilla::gfx::DrawTargetDrawTarget;typedefmozilla::gfx::ExtendModeExtendMode;typedefmozilla::gfx::SamplingFilterSamplingFilter;typedefmozilla::gfx::FloatFloat;typedefmozilla::gfx::PointPoint;typedefmozilla::gfx::RectRect;typedefmozilla::gfx::RectDoubleRectDouble;typedefmozilla::gfx::SizeSize;typedefmozilla::gfx::Matrix4x4Matrix4x4;typedefmozilla::gfx::Matrix4x4FlaggedMatrix4x4Flagged;typedefmozilla::gfx::RectCornerRadiiRectCornerRadii;typedefmozilla::gfx::StrokeOptionsStrokeOptions;typedefmozilla::image::ImgDrawResultImgDrawResult;usingnsDisplayItem=mozilla::nsDisplayItem;usingnsDisplayList=mozilla::nsDisplayList;usingnsDisplayListBuilder=mozilla::nsDisplayListBuilder;usingnsDisplayListBuilderMode=mozilla::nsDisplayListBuilderMode;public:typedefmozilla::layers::FrameMetricsFrameMetrics;typedefmozilla::layers::ScrollMetadataScrollMetadata;typedefmozilla::layers::ScrollableLayerGuid::ViewIDViewID;typedefmozilla::CSSPointCSSPoint;typedefmozilla::CSSSizeCSSSize;typedefmozilla::CSSIntSizeCSSIntSize;typedefmozilla::CSSRectCSSRect;typedefmozilla::ScreenMarginScreenMargin;typedefmozilla::LayoutDeviceIntSizeLayoutDeviceIntSize;typedefmozilla::LayoutDeviceRectLayoutDeviceRect;typedefmozilla::PresShellPresShell;typedefmozilla::StyleGeometryBoxStyleGeometryBox;typedefmozilla::SVGImageContextSVGImageContext;typedefmozilla::LogicalSizeLogicalSize;/** * Finds previously assigned ViewID for the given content element, if any. * Returns whether a ViewID was previously assigned. */staticboolFindIDFor(constnsIContent*aContent,ViewID*aOutViewId);/** * Finds previously assigned or generates a unique ViewID for the given * content element. */staticViewIDFindOrCreateIDFor(nsIContent*aContent);/** * Find content for given ID. */staticnsIContent*FindContentFor(ViewIDaId);/** * Find the scrollable frame for a given content element. */staticnsIScrollableFrame*FindScrollableFrameFor(nsIContent*aContent);/** * Find the scrollable frame for a given ID. */staticnsIScrollableFrame*FindScrollableFrameFor(ViewIDaId);/** * Helper for FindScrollableFrameFor(), also used in DisplayPortUtils. * Most clients should use FindScrollableFrameFor(). */staticnsIFrame*GetScrollFrameFromContent(nsIContent*aContent);/** * Find the ID for a given scrollable frame. */staticViewIDFindIDForScrollableFrame(nsIScrollableFrame*aScrollable);/** * Notify the scroll frame with the given scroll id that its scroll offset * is being sent to APZ as part of a paint-skip transaction. * * Normally, this notification happens during painting, after calls to * ComputeScrollMetadata(). During paint-skipping that code is skipped, * but it's still important for the scroll frame to be notified for * correctness of relative scroll updates, so the code that sends the * empty paint-skip transaction needs to call this. */staticvoidNotifyPaintSkipTransaction(ViewIDaScrollId);/** * Use heuristics to figure out the child list that * aChildFrame is currently in. */staticmozilla::layout::FrameChildListIDGetChildListNameFor(nsIFrame*aChildFrame);/** * Returns the ::before pseudo-element for aContent, if any. */staticmozilla::dom::Element*GetBeforePseudo(constnsIContent*aContent);/** * Returns the frame corresponding to the ::before pseudo-element for * aContent, if any. */staticnsIFrame*GetBeforeFrame(constnsIContent*aContent);/** * Returns the ::after pseudo-element for aContent, if any. */staticmozilla::dom::Element*GetAfterPseudo(constnsIContent*aContent);/** * Returns the frame corresponding to the ::after pseudo-element for aContent, * if any. */staticnsIFrame*GetAfterFrame(constnsIContent*aContent);/** * Returns the ::marker pseudo-element for aContent, if any. */staticmozilla::dom::Element*GetMarkerPseudo(constnsIContent*aContent);/** * Returns the frame corresponding to the ::marker pseudo-element for * aContent, if any. */staticnsIFrame*GetMarkerFrame(constnsIContent*aContent);#ifdef ACCESSIBILITY/** * Set aText to the spoken text for the given ::marker content (aContent) * if it has a frame, or the empty string otherwise. */staticvoidGetMarkerSpokenText(constnsIContent*aContent,nsAString&aText);#endif/** * Given a frame, search up the frame tree until we find an * ancestor that (or the frame itself) is of type aFrameType, if any. * * @param aFrame the frame to start at * @param aFrameType the frame type to look for * @param aStopAt a frame to stop at after we checked it * @return a frame of the given type or nullptr if no * such ancestor exists */staticnsIFrame*GetClosestFrameOfType(nsIFrame*aFrame,mozilla::LayoutFrameTypeaFrameType,nsIFrame*aStopAt=nullptr);/** * Given a frame, search up the frame tree until we find an * ancestor that (or the frame itself) is a "Page" frame, if any. * * @param aFrame the frame to start at * @return a frame of type mozilla::LayoutFrameType::Page or nullptr if no * such ancestor exists */staticnsIFrame*GetPageFrame(nsIFrame*aFrame);/** * Given a frame which is the primary frame for an element, * return the frame that has the non-pseudoelement ComputedStyle for * the content. * This is aPrimaryFrame itself except for tableWrapper frames. * * Given a non-null input, this will return null if and only if its * argument is a table wrapper frame that is mid-destruction (and its * table frame has been destroyed). */staticnsIFrame*GetStyleFrame(nsIFrame*aPrimaryFrame);staticconstnsIFrame*GetStyleFrame(constnsIFrame*aPrimaryFrame);/** * Given a content node, * return the frame that has the non-pseudoelement ComputedStyle for * the content. May return null. * This is aContent->GetPrimaryFrame() except for tableWrapper frames. */staticnsIFrame*GetStyleFrame(constnsIContent*aContent);/** * Returns the placeholder size for when the scrollbar is unthemed. */staticmozilla::CSSIntCoordUnthemedScrollbarSize(mozilla::StyleScrollbarWidth);/** * The inverse of GetStyleFrame. Returns |aStyleFrame| unless it is an inner * table frame, in which case the table wrapper frame is returned. */staticnsIFrame*GetPrimaryFrameFromStyleFrame(nsIFrame*aStyleFrame);staticconstnsIFrame*GetPrimaryFrameFromStyleFrame(constnsIFrame*aStyleFrame);/** * Similar to nsIFrame::IsPrimaryFrame except that this will return true * for the inner table frame rather than for its wrapper frame. */staticboolIsPrimaryStyleFrame(constnsIFrame*aFrame);#ifdef DEBUG// TODO: remove, see bug 598468.staticboolgPreventAssertInCompareTreePosition;#endif // DEBUG/** * CompareTreePosition determines whether aContent1 comes before or * after aContent2 in a preorder traversal of the content tree. * * @param aCommonAncestor either null, or a common ancestor of * aContent1 and aContent2. Actually this is * only a hint; if it's not an ancestor of * aContent1 or aContent2, this function will * still work, but it will be slower than * normal. * @return < 0 if aContent1 is before aContent2 * > 0 if aContent1 is after aContent2, * 0 otherwise (meaning they're the same, or they're in * different documents) */staticint32_tCompareTreePosition(nsIContent*aContent1,nsIContent*aContent2,constnsIContent*aCommonAncestor=nullptr){returnDoCompareTreePosition(aContent1,aContent2,-1,1,aCommonAncestor);}/* * More generic version of |CompareTreePosition|. |aIf1Ancestor| * gives the value to return when 1 is an ancestor of 2, and likewise * for |aIf2Ancestor|. Passing (-1, 1) gives preorder traversal * order, and (1, -1) gives postorder traversal order. */staticint32_tDoCompareTreePosition(nsIContent*aContent1,nsIContent*aContent2,int32_taIf1Ancestor,int32_taIf2Ancestor,constnsIContent*aCommonAncestor=nullptr);/** * CompareTreePosition determines whether aFrame1 comes before or * after aFrame2 in a preorder traversal of the frame tree, where out * of flow frames are treated as children of their placeholders. This is * basically the same ordering as DoCompareTreePosition(nsIContent*) except * that it handles anonymous content properly and there are subtleties with * continuations. * * @param aCommonAncestor either null, or a common ancestor of * aContent1 and aContent2. Actually this is * only a hint; if it's not an ancestor of * aContent1 or aContent2, this function will * still work, but it will be slower than * normal. * @return < 0 if aContent1 is before aContent2 * > 0 if aContent1 is after aContent2, * 0 otherwise (meaning they're the same, or they're in * different frame trees) */staticint32_tCompareTreePosition(nsIFrame*aFrame1,nsIFrame*aFrame2,nsIFrame*aCommonAncestor=nullptr){returnDoCompareTreePosition(aFrame1,aFrame2,-1,1,aCommonAncestor);}staticint32_tCompareTreePosition(nsIFrame*aFrame1,nsIFrame*aFrame2,nsTArray<nsIFrame*>&aFrame2Ancestors,nsIFrame*aCommonAncestor=nullptr){returnDoCompareTreePosition(aFrame1,aFrame2,aFrame2Ancestors,-1,1,aCommonAncestor);}/* * More generic version of |CompareTreePosition|. |aIf1Ancestor| * gives the value to return when 1 is an ancestor of 2, and likewise * for |aIf2Ancestor|. Passing (-1, 1) gives preorder traversal * order, and (1, -1) gives postorder traversal order. */staticint32_tDoCompareTreePosition(nsIFrame*aFrame1,nsIFrame*aFrame2,int32_taIf1Ancestor,int32_taIf2Ancestor,nsIFrame*aCommonAncestor=nullptr);staticnsIFrame*FillAncestors(nsIFrame*aFrame,nsIFrame*aStopAtAncestor,nsTArray<nsIFrame*>*aAncestors);staticint32_tDoCompareTreePosition(nsIFrame*aFrame1,nsIFrame*aFrame2,nsTArray<nsIFrame*>&aFrame2Ancestors,int32_taIf1Ancestor,int32_taIf2Ancestor,nsIFrame*aCommonAncestor);/** * LastContinuationWithChild gets the last continuation in aFrame's chain * that has a child, or the first continuation if the frame has no children. */staticnsContainerFrame*LastContinuationWithChild(nsContainerFrame*aFrame);/** * GetLastSibling simply finds the last sibling of aFrame, or returns nullptr * if aFrame is null. */staticnsIFrame*GetLastSibling(nsIFrame*aFrame);/** * FindSiblingViewFor locates the child of aParentView that aFrame's * view should be inserted 'above' (i.e., before in sibling view * order). This is the first child view of aParentView whose * corresponding content is before aFrame's content (view siblings * are in reverse content order). */staticnsView*FindSiblingViewFor(nsView*aParentView,nsIFrame*aFrame);/** * Get the parent of aFrame. If aFrame is the root frame for a document, * and the document has a parent document in the same view hierarchy, then * we try to return the subdocumentframe in the parent document. * @param aCrossDocOffset [in/out] if non-null, then as we cross documents * an extra offset may be required and it will be added to aCrossDocOffset. * Be careful dealing with this extra offset as it is in app units of the * parent document, which may have a different app units per dev pixel ratio * than the child document. * Note that, while this function crosses document boundaries, it (naturally) * cannot cross process boundaries. */staticnsIFrame*GetCrossDocParentFrameInProcess(constnsIFrame*aFrame,nsPoint*aCrossDocOffset=nullptr);/** * Does the same thing as GetCrossDocParentFrameInProcess(). * The purpose of having two functions is to more easily track which call * sites have been audited to consider out-of-process iframes (bug 1599913). * Once all call sites have been audited, this function can be removed. */staticnsIFrame*GetCrossDocParentFrame(constnsIFrame*aFrame,nsPoint*aCrossDocOffset=nullptr);/** * IsProperAncestorFrame checks whether aAncestorFrame is an ancestor * of aFrame and not equal to aFrame. * @param aCommonAncestor nullptr, or a common ancestor of aFrame and * aAncestorFrame. If non-null, this can bound the search and speed up * the function */staticboolIsProperAncestorFrame(constnsIFrame*aAncestorFrame,constnsIFrame*aFrame,constnsIFrame*aCommonAncestor=nullptr);/** * Like IsProperAncestorFrame, but looks across document boundaries. * * Just like IsAncestorFrameCrossDoc, except that it returns false when * aFrame == aAncestorFrame. * TODO: Once after we fixed bug 1715932, this function should be removed. */staticboolIsProperAncestorFrameCrossDoc(constnsIFrame*aAncestorFrame,constnsIFrame*aFrame,constnsIFrame*aCommonAncestor=nullptr);/** * Like IsProperAncestorFrame, but looks across document boundaries. * * Just like IsAncestorFrameCrossDoc, except that it returns false when * aFrame == aAncestorFrame. */staticboolIsProperAncestorFrameCrossDocInProcess(constnsIFrame*aAncestorFrame,constnsIFrame*aFrame,constnsIFrame*aCommonAncestor=nullptr);/** * IsAncestorFrameCrossDoc checks whether aAncestorFrame is an ancestor * of aFrame or equal to aFrame, looking across document boundaries. * @param aCommonAncestor nullptr, or a common ancestor of aFrame and * aAncestorFrame. If non-null, this can bound the search and speed up * the function. * * Just like IsProperAncestorFrameCrossDoc, except that it returns true when * aFrame == aAncestorFrame. * * TODO: Bug 1700245, all call sites of this function will be eventually * replaced by IsAncestorFrameCrossDocInProcess. */staticboolIsAncestorFrameCrossDoc(constnsIFrame*aAncestorFrame,constnsIFrame*aFrame,constnsIFrame*aCommonAncestor=nullptr);/** * IsAncestorFrameCrossDocInProcess checks whether aAncestorFrame is an * ancestor of aFrame or equal to aFrame, looking across document boundaries * in the same process. * @param aCommonAncestor nullptr, or a common ancestor of aFrame and * aAncestorFrame. If non-null, this can bound the search and speed up * the function. * * Just like IsProperAncestorFrameCrossDoc, except that it returns true when * aFrame == aAncestorFrame. * * NOTE: This function doesn't return true even if |aAncestorFrame| and * |aFrame| is in the same process but they are not directly connected, e.g. * both |aAncestorFrame| and |aFrame| in A domain documents, but there's * another an iframe document domain B, such as A1 -> B1 ->A2 document tree. */staticboolIsAncestorFrameCrossDocInProcess(constnsIFrame*aAncestorFrame,constnsIFrame*aFrame,constnsIFrame*aCommonAncestor=nullptr);staticmozilla::SideBitsGetSideBitsAndAdjustAnchorForFixedPositionContent(constnsIFrame*aViewportFrame,constnsIFrame*aFixedPosFrame,mozilla::LayerPoint*aAnchor,constRect*aAnchorRect);staticmozilla::SideBitsGetSideBitsForFixedPositionContent(constnsIFrame*aFixedPosFrame);/** * Get the scroll id for the root scrollframe of the presshell of the given * prescontext. Returns NULL_SCROLL_ID if it couldn't be found. */staticViewIDScrollIdForRootScrollFrame(nsPresContext*aPresContext);/** * GetScrollableFrameFor returns the scrollable frame for a scrolled frame */staticnsIScrollableFrame*GetScrollableFrameFor(constnsIFrame*aScrolledFrame);/** * GetNearestScrollableFrameForDirection locates the first ancestor of * aFrame (or aFrame itself) that is scrollable with overflow:scroll or * overflow:auto in the given direction and where either the scrollbar for * that direction is visible or the frame can be scrolled by some * positive amount in that direction. * The search extends across document boundaries. * * @param aFrame the frame to start with * @param aDirection Whether it's for horizontal or vertical scrolling. * @return the nearest scrollable frame or nullptr if not found */staticnsIScrollableFrame*GetNearestScrollableFrameForDirection(nsIFrame*aFrame,mozilla::layers::ScrollDirectionsaDirections);enum{/** * If the SCROLLABLE_SAME_DOC flag is set, then we only walk the frame tree * up to the root frame in the current document. */SCROLLABLE_SAME_DOC=0x01,/** * If the SCROLLABLE_INCLUDE_HIDDEN flag is set then we allow * overflow:hidden scrollframes to be returned as scrollable frames. */SCROLLABLE_INCLUDE_HIDDEN=0x02,/** * If the SCROLLABLE_ONLY_ASYNC_SCROLLABLE flag is set, then we only * want to match scrollable frames for which WantAsyncScroll() returns * true. */SCROLLABLE_ONLY_ASYNC_SCROLLABLE=0x04,/** * If the SCROLLABLE_ALWAYS_MATCH_ROOT flag is set, then we will always * return the root scrollable frame for the root document (in the current * process) if we encounter it, whether or not it is async scrollable or * overflow: hidden. */SCROLLABLE_ALWAYS_MATCH_ROOT=0x08,/** * If the SCROLLABLE_FIXEDPOS_FINDS_ROOT flag is set, then for fixed-pos * frames return the root scrollable frame for that document. */SCROLLABLE_FIXEDPOS_FINDS_ROOT=0x10,/** * If the SCROLLABLE_STOP_AT_PAGE flag is set, then we stop searching * for scrollable ancestors when seeing a nsPageFrame. This can be used * to avoid finding the viewport scroll frame in Print Preview (which * would be undesirable as a 'position:sticky' container for content). */SCROLLABLE_STOP_AT_PAGE=0x20,/** * If the SCROLLABLE_FOLLOW_OOF_TO_PLACEHOLDER flag is set, we navigate * from out-of-flow frames to their placeholder frame rather than their * parent frame. * Note, fixed-pos frames are out-of-flow frames, but * SCROLLABLE_FIXEDPOS_FINDS_ROOT takes precedence over this. */SCROLLABLE_FOLLOW_OOF_TO_PLACEHOLDER=0x40};/** * GetNearestScrollableFrame locates the first ancestor of aFrame * (or aFrame itself) that is scrollable with overflow:scroll or * overflow:auto in some direction. * * @param aFrame the frame to start with * @param aFlags if SCROLLABLE_SAME_DOC is set, do not search across * document boundaries. If SCROLLABLE_INCLUDE_HIDDEN is set, include * frames scrollable with overflow:hidden. * @return the nearest scrollable frame or nullptr if not found */staticnsIScrollableFrame*GetNearestScrollableFrame(nsIFrame*aFrame,uint32_taFlags=0);/** * GetScrolledRect returns the range of allowable scroll offsets * for aScrolledFrame, assuming the scrollable overflow area is * aScrolledFrameOverflowArea and the scrollport size is aScrollPortSize. */staticnsRectGetScrolledRect(nsIFrame*aScrolledFrame,constnsRect&aScrolledFrameOverflowArea,constnsSize&aScrollPortSize,mozilla::StyleDirection);/** * HasPseudoStyle returns true if aContent (whose primary style * context is aComputedStyle) has the aPseudoElement pseudo-style * attached to it; returns false otherwise. * * @param aContent the content node we're looking at * @param aComputedStyle aContent's ComputedStyle * @param aPseudoElement the id of the pseudo style we care about * @param aPresContext the presentation context * @return whether aContent has aPseudoElement style attached to it */staticboolHasPseudoStyle(nsIContent*aContent,ComputedStyle*aComputedStyle,mozilla::PseudoStyleTypeaPseudoElement,nsPresContext*aPresContext);/** * If this frame is a placeholder for a float, then return the float, * otherwise return nullptr. aPlaceholder must be a placeholder frame. */staticnsIFrame*GetFloatFromPlaceholder(nsIFrame*aPlaceholder);// Combine aNewBreakType with aOrigBreakType, but limit the break types// to StyleClear::Left, Right, Both.staticmozilla::StyleClearCombineBreakType(mozilla::StyleClearaOrigBreakType,mozilla::StyleClearaNewBreakType);/** * Get the coordinates of a given DOM mouse event, relative to a given * frame. Works only for DOM events generated by WidgetGUIEvents. * @param aDOMEvent the event * @param aFrame the frame to make coordinates relative to * @return the point, or (NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) if * for some reason the coordinates for the mouse are not known (e.g., * the event is not a GUI event). */staticnsPointGetDOMEventCoordinatesRelativeTo(mozilla::dom::Event*aDOMEvent,nsIFrame*aFrame);/** * Get the coordinates of a given native mouse event, relative to a given * frame. * @param aEvent the event * @param aFrame the frame to make coordinates relative to * @return the point, or (NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) if * for some reason the coordinates for the mouse are not known (e.g., * the event is not a GUI event). */staticnsPointGetEventCoordinatesRelativeTo(constmozilla::WidgetEvent*aEvent,RelativeToaFrame);/** * Get the coordinates of a given point relative to an event and a * given frame. * @param aEvent the event * @param aPoint the point to get the coordinates relative to * @param aFrame the frame to make coordinates relative to * @return the point, or (NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) if * for some reason the coordinates for the mouse are not known (e.g., * the event is not a GUI event). */staticnsPointGetEventCoordinatesRelativeTo(constmozilla::WidgetEvent*aEvent,constmozilla::LayoutDeviceIntPoint&aPoint,RelativeToaFrame);/** * Get the coordinates of a given point relative to a widget and a * given frame. * @param aWidget the event src widget * @param aPoint the point to get the coordinates relative to * @param aFrame the frame to make coordinates relative to * @return the point, or (NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) if * for some reason the coordinates for the mouse are not known (e.g., * the event is not a GUI event). */staticnsPointGetEventCoordinatesRelativeTo(nsIWidget*aWidget,constmozilla::LayoutDeviceIntPoint&aPoint,RelativeToaFrame);/** * Get the popup frame of a given native mouse event. * @param aPresContext only check popups within aPresContext or a descendant * @param aEvent the event. * @return Null, if there is no popup frame at the point, otherwise, * returns top-most popup frame at the point. */staticnsIFrame*GetPopupFrameForEventCoordinates(nsPresContext*aPresContext,constmozilla::WidgetEvent*aEvent);/** * Get container and offset if aEvent collapses Selection. * @param aPresShell The PresShell handling aEvent. * @param aEvent The event having coordinates where you want to * collapse Selection. * @param aContainer Returns the container node at the point. * Set nullptr if you don't need this. * @param aOffset Returns offset in the container node at the point. * Set nullptr if you don't need this. */MOZ_CAN_RUN_SCRIPTstaticvoidGetContainerAndOffsetAtEvent(PresShell*aPresShell,constmozilla::WidgetEvent*aEvent,nsIContent**aContainer,int32_t*aOffset);/** * Translate from widget coordinates to the view's coordinates * @param aPresContext the PresContext for the view * @param aWidget the widget * @param aPt the point relative to the widget * @param aView view to which returned coordinates are relative * @return the point in the view's coordinates */staticnsPointTranslateWidgetToView(nsPresContext*aPresContext,nsIWidget*aWidget,constmozilla::LayoutDeviceIntPoint&aPt,nsView*aView);/** * Translate from view coordinates to the widget's coordinates. * @param aPresContext the PresContext for the view * @param aView the view * @param aPt the point relative to the view * @param aViewportType whether the point is in visual or layout coordinates * @param aWidget the widget to which returned coordinates are relative * @return the point in the view's coordinates */staticmozilla::LayoutDeviceIntPointTranslateViewToWidget(nsPresContext*aPresContext,nsView*aView,nsPointaPt,ViewportTypeaViewportType,nsIWidget*aWidget);staticmozilla::LayoutDeviceIntPointWidgetToWidgetOffset(nsIWidget*aFromWidget,nsIWidget*aToWidget);enumclassFrameForPointOption{/** * When set, paint suppression is ignored, so we'll return non-root page * elements even if paint suppression is stopping them from painting. */IgnorePaintSuppression=1,/** * When set, clipping due to the root scroll frame (and any other viewport- * related clipping) is ignored. */IgnoreRootScrollFrame,/** * When set, return only content in the same document as aFrame. */IgnoreCrossDoc,/** * When set, return only content that is actually visible. */OnlyVisible,};structFrameForPointOptions{usingBits=mozilla::EnumSet<FrameForPointOption>;BitsmBits;// If mBits contains OnlyVisible, what is the opacity threshold which we// consider "opaque enough" to clobber stuff underneath.floatmVisibleThreshold;FrameForPointOptions(BitsaBits,floataVisibleThreshold):mBits(aBits),mVisibleThreshold(aVisibleThreshold){};MOZ_IMPLICITFrameForPointOptions(BitsaBits):FrameForPointOptions(aBits,1.0f){}FrameForPointOptions():FrameForPointOptions(Bits()){};};/** * Given aFrame, the root frame of a stacking context, find its descendant * frame under the point aPt that receives a mouse event at that location, * or nullptr if there is no such frame. * @param aPt the point, relative to the frame origin, in either visual * or layout coordinates depending on aRelativeTo.mViewportType */staticnsIFrame*GetFrameForPoint(RelativeToaRelativeTo,nsPointaPt,constFrameForPointOptions&={});/** * Given aFrame, the root frame of a stacking context, find all descendant * frames under the area of a rectangle that receives a mouse event, * or nullptr if there is no such frame. * @param aRect the rect, relative to the frame origin, in either visual * or layout coordinates depending on aRelativeTo.mViewportType * @param aOutFrames an array to add all the frames found */staticnsresultGetFramesForArea(RelativeToaRelativeTo,constnsRect&aRect,nsTArray<nsIFrame*>&aOutFrames,constFrameForPointOptions&={});/** * Transform aRect relative to aFrame up to the coordinate system of * aAncestor. Computes the bounding-box of the true quadrilateral. * Pass non-null aPreservesAxisAlignedRectangles and it will be set to true if * we only need to use a 2d transform that PreservesAxisAlignedRectangles(). * The corner positions of aRect are treated as meaningful even if aRect is * empty. * * |aMatrixCache| allows for optimizations in recomputing the same matrix over * and over. The argument can be one of the following values: * * nullptr (the default) - No optimization; the transform matrix is computed * on every call to this function. * * non-null pointer to an empty Maybe<Matrix4x4> - Upon return, the Maybe is * filled with the transform matrix that was computed. This can then be passed * in to subsequent calls with the same source and destination frames to avoid * recomputing the matrix. * * non-null pointer to a non-empty Matrix4x4 - The provided matrix will be * used as the transform matrix and applied to the rect. */staticnsRectTransformFrameRectToAncestor(constnsIFrame*aFrame,constnsRect&aRect,constnsIFrame*aAncestor,bool*aPreservesAxisAlignedRectangles=nullptr,mozilla::Maybe<Matrix4x4Flagged>*aMatrixCache=nullptr,boolaStopAtStackingContextAndDisplayPortAndOOFFrame=false,nsIFrame**aOutAncestor=nullptr){returnTransformFrameRectToAncestor(aFrame,aRect,RelativeTo{aAncestor},aPreservesAxisAlignedRectangles,aMatrixCache,aStopAtStackingContextAndDisplayPortAndOOFFrame,aOutAncestor);}staticnsRectTransformFrameRectToAncestor(constnsIFrame*aFrame,constnsRect&aRect,RelativeToaAncestor,bool*aPreservesAxisAlignedRectangles=nullptr,mozilla::Maybe<Matrix4x4Flagged>*aMatrixCache=nullptr,boolaStopAtStackingContextAndDisplayPortAndOOFFrame=false,nsIFrame**aOutAncestor=nullptr);/** * Gets the transform for aFrame relative to aAncestor. Pass null for * aAncestor to go up to the root frame. Including nsIFrame::IN_CSS_UNITS * flag in aFlags will return CSS pixels, by default it returns device * pixels. * More info can be found in nsIFrame::GetTransformMatrix. * * Some notes on the possible combinations of |aFrame.mViewportType| and * |aAncestor.mViewportType|: * * | aFrame. | aAncestor. | Notes * | mViewportType | mViewportType | * ========================================================================== * | Layout | Layout | Commonplace, when both source and target * | | | are inside zoom boundary. * | | | * | | | Could also happen in non-e10s setups * | | | when both source and target are outside * | | | the zoom boundary and the code is * | | | oblivious to the existence of a zoom * | | | boundary. * ========================================================================== * | Layout | Visual | Commonplace, used when hit testing visual * | | | coordinates (e.g. coming from user input * | | | events). We expected to encounter a * | | | zoomed content root during traversal and * | | | apply a layout-to-visual transform. * ========================================================================== * | Visual | Layout | Should never happen, will assert. * ========================================================================== * | Visual | Visual | In e10s setups, should only happen if * | | | aFrame and aAncestor are both the * | | | RCD viewport frame. * | | | * | | | In non-e10s setups, could happen with * | | | different frames if they are both * | | | outside the zoom boundary. * ========================================================================== */staticMatrix4x4FlaggedGetTransformToAncestor(RelativeToaFrame,RelativeToaAncestor,uint32_taFlags=0,nsIFrame**aOutAncestor=nullptr);/** * Gets the scale factors of the transform for aFrame relative to the root * frame if this transform is 2D, or the identity scale factors otherwise. */staticgfxSizeGetTransformToAncestorScale(constnsIFrame*aFrame);/** * Gets the scale factors of the transform for aFrame relative to the root * frame if this transform is 2D, or the identity scale factors otherwise. * If some frame on the path from aFrame to the display root frame may have an * animated scale, returns the identity scale factors. */staticgfxSizeGetTransformToAncestorScaleExcludingAnimated(nsIFrame*aFrame);/** * Find the nearest common ancestor frame for aFrame1 and aFrame2. The * ancestor frame could be cross-doc. */staticconstnsIFrame*FindNearestCommonAncestorFrame(constnsIFrame*aFrame1,constnsIFrame*aFrame2);/** * Find the nearest common ancestor frame for aFrame1 and aFrame2, assuming * that they are within the same block. * * Returns null if they are not within the same block. */staticconstnsIFrame*FindNearestCommonAncestorFrameWithinBlock(constnsTextFrame*aFrame1,constnsTextFrame*aFrame2);/** * Whether author-specified borders / backgrounds disable theming for a given * appearance value. */staticboolAuthorSpecifiedBorderBackgroundDisablesTheming(mozilla::StyleAppearance);/** * Transforms a list of CSSPoints from aFromFrame to aToFrame, taking into * account all relevant transformations on the frames up to (but excluding) * their nearest common ancestor. * If we encounter a transform that we need to invert but which is * non-invertible, we return NONINVERTIBLE_TRANSFORM. If the frames have * no common ancestor, we return NO_COMMON_ANCESTOR. * If this returns TRANSFORM_SUCCEEDED, the points in aPoints are transformed * in-place, otherwise they are untouched. */enumTransformResult{TRANSFORM_SUCCEEDED,NO_COMMON_ANCESTOR,NONINVERTIBLE_TRANSFORM};staticTransformResultTransformPoints(nsIFrame*aFromFrame,nsIFrame*aToFrame,uint32_taPointCount,CSSPoint*aPoints);/** * Same as above function, but transform points in app units and * handle 1 point per call. */staticTransformResultTransformPoint(RelativeToaFromFrame,RelativeToaToFrame,nsPoint&aPoint);/** * Transforms a rect from aFromFrame to aToFrame. In app units. * Returns the bounds of the actual rect if the transform requires rotation * or anything complex like that. */staticTransformResultTransformRect(constnsIFrame*aFromFrame,constnsIFrame*aToFrame,nsRect&aRect);/** * Converts app units to pixels (with optional snapping) and appends as a * translation to aTransform. */staticvoidPostTranslate(Matrix4x4&aTransform,constnsPoint&aOrigin,floataAppUnitsPerPixel,boolaRounded);/* * Whether the frame should snap to grid. This will end up being passed * as the aRounded parameter in PostTranslate above. SVG frames should * not have their translation rounded. */staticboolShouldSnapToGrid(constnsIFrame*aFrame);/** * Get the border-box of aElement's primary frame, transformed it to be * relative to aFrame. */staticnsRectGetRectRelativeToFrame(mozilla::dom::Element*aElement,nsIFrame*aFrame);/** * Returns true if aRect with border inflation of size aInflateSize contains * aPoint. */staticboolContainsPoint(constnsRect&aRect,constnsPoint&aPoint,nscoordaInflateSize);/** * Clamp aRect relative to aFrame to the scroll frames boundary searching from * aFrame. */staticnsRectClampRectToScrollFrames(nsIFrame*aFrame,constnsRect&aRect);/** * Return true if a "layer transform" could be computed for aFrame, * and optionally return the computed transform. The returned * transform is what would be set on the layer currently if a layers * transaction were opened at the time this helper is called. */staticboolGetLayerTransformForFrame(nsIFrame*aFrame,Matrix4x4Flagged*aTransform);/** * Given a point in the global coordinate space, returns that point expressed * in the coordinate system of aFrame. This effectively inverts all * transforms between this point and the root frame. * * @param aFromType Specifies whether |aPoint| is in layout or visual * coordinates. * @param aFrame The frame that acts as the coordinate space container. * @param aPoint The point, in global layout or visual coordinates (as per * |aFromType|, to get in the frame-local space. * @return aPoint, expressed in aFrame's canonical coordinate space. */staticnsPointTransformRootPointToFrame(ViewportTypeaFromType,RelativeToaFrame,constnsPoint&aPoint){returnTransformAncestorPointToFrame(aFrame,aPoint,RelativeTo{nullptr,aFromType});}/** * Transform aPoint relative to aAncestor down to the coordinate system of * aFrame. */staticnsPointTransformAncestorPointToFrame(RelativeToaFrame,constnsPoint&aPoint,RelativeToaAncestor);/** * Helper function that, given a rectangle and a matrix, returns the smallest * rectangle containing the image of the source rectangle. * * @param aBounds The rectangle to transform. * @param aMatrix The matrix to transform it with. * @param aFactor The number of app units per graphics unit. * @return The smallest rect that contains the image of aBounds. */staticnsRectMatrixTransformRect(constnsRect&aBounds,constMatrix4x4&aMatrix,floataFactor);staticnsRectMatrixTransformRect(constnsRect&aBounds,constMatrix4x4Flagged&aMatrix,floataFactor);/** * Helper function that, given a point and a matrix, returns the image * of that point under the matrix transform. * * @param aPoint The point to transform. * @param aMatrix The matrix to transform it with. * @param aFactor The number of app units per graphics unit. * @return The image of the point under the transform. */staticnsPointMatrixTransformPoint(constnsPoint&aPoint,constMatrix4x4&aMatrix,floataFactor);/** * Given a graphics rectangle in graphics space, return a rectangle in * app space that contains the graphics rectangle, rounding out as necessary. * * @param aRect The graphics rect to round outward. * @param aFactor The number of app units per graphics unit. * @return The smallest rectangle in app space that contains aRect. */template<typenameT>staticnsRectRoundGfxRectToAppRect(constT&aRect,constfloataFactor);/** * Returns a subrectangle of aContainedRect that is entirely inside the * rounded rect. Complex cases are handled conservatively by returning a * smaller rect than necessary. */staticnsRegionRoundedRectIntersectRect(constnsRect&aRoundedRect,constnscoordaRadii[8],constnsRect&aContainedRect);staticnsIntRegionRoundedRectIntersectIntRect(constnsIntRect&aRoundedRect,constRectCornerRadii&aCornerRadii,constnsIntRect&aContainedRect);/** * Return whether any part of aTestRect is inside of the rounded * rectangle formed by aBounds and aRadii (which are indexed by the * enum HalfCorner constants in gfx/2d/Types.h). This is precise. */staticboolRoundedRectIntersectsRect(constnsRect&aRoundedRect,constnscoordaRadii[8],constnsRect&aTestRect);enumclassPaintFrameFlags:uint32_t{InTransform=0x01,SyncDecodeImages=0x02,WidgetLayers=0x04,IgnoreSuppression=0x08,DocumentRelative=0x10,HideCaret=0x20,ToWindow=0x40,ExistingTransaction=0x80,NoComposite=0x100,Compressed=0x200,ForWebRender=0x400,UseHighQualityScaling=0x800,ResetViewportScrolling=0x1000,};/** * Given aFrame, the root frame of a stacking context, paint it and its * descendants to aRenderingContext. * @param aRenderingContext a rendering context translated so that (0,0) * is the origin of aFrame; for best results, (0,0) should transform * to pixel-aligned coordinates. This can be null, in which case * aFrame must be a "display root" (root frame for a root document, * or the root of a popup) with an associated widget and we draw using * the layer manager for the frame's widget. * @param aDirtyRegion the region that must be painted, in the coordinates * of aFrame. * @param aBackstop paint the dirty area with this color before drawing * the actual content; pass NS_RGBA(0,0,0,0) to draw no background. * @param aBuilderMode Passed through to the display-list builder. * @param aFlags if PAINT_IN_TRANSFORM is set, then we assume * this is inside a transform or SVG foreignObject. If * PAINT_SYNC_DECODE_IMAGES is set, we force synchronous decode on all * images. If PAINT_WIDGET_LAYERS is set, aFrame must be a display root, * and we will use the frame's widget's layer manager to paint * even if aRenderingContext is non-null. This is useful if you want * to force rendering to use the widget's layer manager for testing * or speed. PAINT_WIDGET_LAYERS must be set if aRenderingContext is null. * If PAINT_DOCUMENT_RELATIVE is used, the visible region is interpreted * as being relative to the document (normally it's relative to the CSS * viewport) and the document is painted as if no scrolling has occured. * Only considered if PresShell::IgnoringViewportScrolling is true. * If ResetViewportScrolling is used, then the root scroll frame's scroll * position is set to 0 during painting, so that position:fixed elements * are drawn in their initial position. * PAINT_TO_WINDOW sets painting to window to true on the display list * builder even if we can't tell that we are painting to the window. * If PAINT_EXISTING_TRANSACTION is set, then BeginTransaction() has already * been called on aFrame's widget's layer manager and should not be * called again. * If PAINT_COMPRESSED is set, the FrameLayerBuilder should be set to * compressed mode to avoid short cut optimizations. * * So there are three possible behaviours: * 1) PAINT_WIDGET_LAYERS is set and aRenderingContext is null; we paint * by calling BeginTransaction on the widget's layer manager. * 2) PAINT_WIDGET_LAYERS is set and aRenderingContext is non-null; we * paint by calling BeginTransactionWithTarget on the widget's layer * manager. * 3) PAINT_WIDGET_LAYERS is not set and aRenderingContext is non-null; * we paint by construct a BasicLayerManager and calling * BeginTransactionWithTarget on it. This is desirable if we're doing * something like drawWindow in a mode where what gets rendered doesn't * necessarily correspond to what's visible in the window; we don't * want to mess up the widget's layer tree. */staticvoidPaintFrame(gfxContext*aRenderingContext,nsIFrame*aFrame,constnsRegion&aDirtyRegion,nscoloraBackstop,nsDisplayListBuilderModeaBuilderMode,PaintFrameFlagsaFlags=PaintFrameFlags(0));/** * Uses a binary search for find where the cursor falls in the line of text * It also keeps track of the part of the string that has already been * measured so it doesn't have to keep measuring the same text over and over. * * @param "aBaseWidth" contains the width in twips of the portion * of the text that has already been measured, and aBaseInx contains * the index of the text that has already been measured. * * @param aTextWidth returns (in twips) the length of the text that falls * before the cursor aIndex contains the index of the text where the cursor * falls. */staticboolBinarySearchForPosition(DrawTarget*aDrawTarget,nsFontMetrics&aFontMetrics,constchar16_t*aText,int32_taBaseWidth,int32_taBaseInx,int32_taStartInx,int32_taEndInx,int32_taCursorPos,int32_t&aIndex,int32_t&aTextWidth);classBoxCallback{public:BoxCallback()=default;virtualvoidAddBox(nsIFrame*aFrame)=0;boolmIncludeCaptionBoxForTable=true;// Whether we are in a continuation or ib-split-sibling of the target we're// measuring. This is useful because if we know we're in the target subtree// and measuring against it we can avoid finding the common ancestor.boolmInTargetContinuation=false;};/** * Collect all CSS boxes associated with aFrame and its * continuations, "drilling down" through table wrapper frames and * some anonymous blocks since they're not real CSS boxes. * If aFrame is null, no boxes are returned. * SVG frames return a single box, themselves. */staticvoidGetAllInFlowBoxes(nsIFrame*aFrame,BoxCallback*aCallback);/** * Like GetAllInFlowBoxes, but doesn't include continuations. */staticvoidAddBoxesForFrame(nsIFrame*aFrame,BoxCallback*aCallback);/** * Find the first frame descendant of aFrame (including aFrame) which is * not an anonymous frame that getBoxQuads/getClientRects should ignore. */staticnsIFrame*GetFirstNonAnonymousFrame(nsIFrame*aFrame);structRectAccumulator:publicmozilla::RectCallback{nsRectmResultRect;nsRectmFirstRect;boolmSeenFirstRect;RectAccumulator();virtualvoidAddRect(constnsRect&aRect)override;};structRectListBuilder:publicmozilla::RectCallback{DOMRectList*mRectList;explicitRectListBuilder(DOMRectList*aList);virtualvoidAddRect(constnsRect&aRect)override;};staticnsIFrame*GetContainingBlockForClientRect(nsIFrame*aFrame);enum{RECTS_ACCOUNT_FOR_TRANSFORMS=0x01,// Two bits for specifying which box type to use.// With neither bit set (default), use the border box.RECTS_USE_CONTENT_BOX=0x02,RECTS_USE_PADDING_BOX=0x04,RECTS_USE_MARGIN_BOX=0x06,// both bits setRECTS_WHICH_BOX_MASK=0x06// bitmask for these two bits};/** * Collect all CSS boxes (content, padding, border, or margin) associated * with aFrame and its continuations, "drilling down" through table wrapper * frames and some anonymous blocks since they're not real CSS boxes. * The boxes are positioned relative to aRelativeTo (taking scrolling * into account) and passed to the callback in frame-tree order. * If aFrame is null, no boxes are returned. * For SVG frames, returns one rectangle, the bounding box. * If aFlags includes RECTS_ACCOUNT_FOR_TRANSFORMS, then when converting * the boxes into aRelativeTo coordinates, transforms (including CSS * and SVG transforms) are taken into account. * If aFlags includes one of RECTS_USE_CONTENT_BOX, RECTS_USE_PADDING_BOX, * or RECTS_USE_MARGIN_BOX, the corresponding type of box is used. * Otherwise (by default), the border box is used. */staticvoidGetAllInFlowRects(nsIFrame*aFrame,constnsIFrame*aRelativeTo,mozilla::RectCallback*aCallback,uint32_taFlags=0);staticvoidGetAllInFlowRectsAndTexts(nsIFrame*aFrame,constnsIFrame*aRelativeTo,mozilla::RectCallback*aCallback,mozilla::dom::Sequence<nsString>*aTextList,uint32_taFlags=0);/** * Computes the union of all rects returned by GetAllInFlowRects. If * the union is empty, returns the first rect. * If aFlags includes RECTS_ACCOUNT_FOR_TRANSFORMS, then when converting * the boxes into aRelativeTo coordinates, transforms (including CSS * and SVG transforms) are taken into account. * If aFlags includes one of RECTS_USE_CONTENT_BOX, RECTS_USE_PADDING_BOX, * or RECTS_USE_MARGIN_BOX, the corresponding type of box is used. * Otherwise (by default), the border box is used. */staticnsRectGetAllInFlowRectsUnion(nsIFrame*aFrame,constnsIFrame*aRelativeTo,uint32_taFlags=0);enum{EXCLUDE_BLUR_SHADOWS=0x01};/** * Takes a text-shadow array from the style properties of a given nsIFrame and * computes the union of those shadows along with the given initial rect. * If there are no shadows, the initial rect is returned. */staticnsRectGetTextShadowRectsUnion(constnsRect&aTextAndDecorationsRect,nsIFrame*aFrame,uint32_taFlags=0);/** * Computes the destination rect that a given replaced element should render * into, based on its CSS 'object-fit' and 'object-position' properties. * * @param aConstraintRect The constraint rect that we have at our disposal, * which would e.g. be exactly filled by the image * if we had "object-fit: fill". * @param aIntrinsicSize The replaced content's intrinsic size, as reported * by nsIFrame::GetIntrinsicSize(). * @param aIntrinsicRatio The replaced content's intrinsic ratio, as reported * by nsIFrame::GetIntrinsicRatio(). * @param aStylePos The nsStylePosition struct that contains the 'object-fit' * and 'object-position' values that we should rely on. * (This should usually be the nsStylePosition for the * replaced element in question, but not always. For * example, a <video>'s poster-image has a dedicated * anonymous element & child-frame, but we should still use * the <video>'s 'object-fit' and 'object-position' values.) * @param aAnchorPoint [out] A point that should be pixel-aligned by functions * like nsLayoutUtils::DrawImage. See documentation * in nsCSSRendering.h for ComputeObjectAnchorPoint. * @return The nsRect into which we should render the replaced content (using * the same coordinate space as the passed-in aConstraintRect). */staticnsRectComputeObjectDestRect(constnsRect&aConstraintRect,constIntrinsicSize&aIntrinsicSize,constAspectRatio&aIntrinsicRatio,constnsStylePosition*aStylePos,nsPoint*aAnchorPoint=nullptr);/** * Get the font metrics corresponding to the frame's style data. * @param aFrame the frame * @param aSizeInflation number to multiply font size by */staticalready_AddRefed<nsFontMetrics>GetFontMetricsForFrame(constnsIFrame*aFrame,floataSizeInflation);staticalready_AddRefed<nsFontMetrics>GetInflatedFontMetricsForFrame(constnsIFrame*aFrame){returnGetFontMetricsForFrame(aFrame,FontSizeInflationFor(aFrame));}/** * Get the font metrics corresponding to the given style data. * @param aComputedStyle the style data * @param aSizeInflation number to multiply font size by */staticalready_AddRefed<nsFontMetrics>GetFontMetricsForComputedStyle(ComputedStyle*aComputedStyle,nsPresContext*aPresContext,floataSizeInflation=1.0f,uint8_taVariantWidth=NS_FONT_VARIANT_WIDTH_NORMAL);/** * Get the font metrics of emphasis marks corresponding to the given * style data. The result is same as GetFontMetricsForComputedStyle * except that the font size is scaled down to 50%. * @param aComputedStyle the style data * @param aInflation number to multiple font size by */staticalready_AddRefed<nsFontMetrics>GetFontMetricsOfEmphasisMarks(ComputedStyle*aComputedStyle,nsPresContext*aPresContext,floataInflation){returnGetFontMetricsForComputedStyle(aComputedStyle,aPresContext,aInflation*0.5f);}/** * Find the immediate child of aParent whose frame subtree contains * aDescendantFrame. Returns null if aDescendantFrame is not a descendant * of aParent. */staticnsIFrame*FindChildContainingDescendant(nsIFrame*aParent,nsIFrame*aDescendantFrame);/** * Find the nearest ancestor that's a block */staticnsBlockFrame*FindNearestBlockAncestor(nsIFrame*aFrame);/** * Find the nearest ancestor that's not for generated content. Will return * aFrame if aFrame is not for generated content. */staticnsIFrame*GetNonGeneratedAncestor(nsIFrame*aFrame);/* * Whether the frame is an nsBlockFrame which is not a wrapper block. */staticboolIsNonWrapperBlock(nsIFrame*aFrame);/** * If aFrame is an out of flow frame, return its placeholder, otherwise * return its parent. */staticnsIFrame*GetParentOrPlaceholderFor(constnsIFrame*aFrame);/** * If aFrame is an out of flow frame, return its placeholder, otherwise * return its (possibly cross-doc) parent. */staticnsIFrame*GetParentOrPlaceholderForCrossDoc(constnsIFrame*aFrame);/** * Returns the frame that would act as the parent of aFrame when * descending through the frame tree in display list building. * Usually the same as GetParentOrPlaceholderForCrossDoc, except * that pushed floats are treated as children of their containing * block. */staticnsIFrame*GetDisplayListParent(nsIFrame*aFrame);/** * Get a frame's previous continuation, or, if it doesn't have one, its * previous block-in-inline-split sibling. */staticnsIFrame*GetPrevContinuationOrIBSplitSibling(constnsIFrame*aFrame);/** * Get a frame's next continuation, or, if it doesn't have one, its * block-in-inline-split sibling. */staticnsIFrame*GetNextContinuationOrIBSplitSibling(constnsIFrame*aFrame);/** * Get the first frame in the continuation-plus-ib-split-sibling chain * containing aFrame. */staticnsIFrame*FirstContinuationOrIBSplitSibling(constnsIFrame*aFrame);/** * Get the last frame in the continuation-plus-ib-split-sibling chain * containing aFrame. */staticnsIFrame*LastContinuationOrIBSplitSibling(constnsIFrame*aFrame);/** * Is FirstContinuationOrIBSplitSibling(aFrame) going to return * aFrame? */staticboolIsFirstContinuationOrIBSplitSibling(constnsIFrame*aFrame);/** * Check whether aFrame is a part of the scrollbar or scrollcorner of * the root content. * @param aFrame the checking frame. * @return true if the frame is a part of the scrollbar or scrollcorner of * the root content. */staticboolIsViewportScrollbarFrame(nsIFrame*aFrame);/** * Get the contribution of aFrame to its containing block's intrinsic * size for the given physical axis. This considers the child's intrinsic * width, its 'width', 'min-width', and 'max-width' properties (or 'height' * variations if that's what matches aAxis) and its padding, border and margin * in the corresponding dimension. * @param aPercentageBasis an optional percentage basis (in aFrame's WM). * If the basis is indefinite in a given axis, pass a size with * NS_UNCONSTRAINEDSIZE in that component. * If you pass Nothing() a percentage basis will be calculated from aFrame's * ancestors' computed size in the relevant axis, if needed. * @param aMarginBoxMinSizeClamp make the result fit within this margin-box * size by reducing the *content size* (flooring at zero). This is used for: * https://drafts.csswg.org/css-grid/#min-size-auto */enum{IGNORE_PADDING=0x01,BAIL_IF_REFLOW_NEEDED=0x02,// returns NS_INTRINSIC_ISIZE_UNKNOWN if soMIN_INTRINSIC_ISIZE=0x04,// use min-width/height instead of width/height};staticnscoordIntrinsicForAxis(mozilla::PhysicalAxisaAxis,gfxContext*aRenderingContext,nsIFrame*aFrame,mozilla::IntrinsicISizeTypeaType,constmozilla::Maybe<LogicalSize>&aPercentageBasis=mozilla::Nothing(),uint32_taFlags=0,nscoordaMarginBoxMinSizeClamp=NS_MAXSIZE);/** * Calls IntrinsicForAxis with aFrame's parent's inline physical axis. */staticnscoordIntrinsicForContainer(gfxContext*aRenderingContext,nsIFrame*aFrame,mozilla::IntrinsicISizeTypeaType,uint32_taFlags=0);/** * Get the definite size contribution of aFrame for the given physical axis. * This considers the child's 'min-width' property (or 'min-height' if the * given axis is vertical), and its padding, border, and margin in the * corresponding dimension. If the 'min-' property is 'auto' (and 'overflow' * is 'visible') and the corresponding 'width'/'height' is definite it returns * the "specified size" for: * https://drafts.csswg.org/css-grid/#min-size-auto * Note that the "transferred size" is not handled here; use IntrinsicForAxis. * Note that any percentage in 'width'/'height' makes it count as indefinite. * If the 'min-' property is 'auto' and 'overflow' is not 'visible', then it * calculates the result as if the 'min-' computed value is zero. * Otherwise, return NS_UNCONSTRAINEDSIZE. * * @param aPercentageBasis the percentage basis (in aFrame's WM). * Pass NS_UNCONSTRAINEDSIZE if the basis is indefinite in either/both axes. * @note this behavior is specific to Grid/Flexbox (currently) so aFrame * should be a grid/flex item. */staticnscoordMinSizeContributionForAxis(mozilla::PhysicalAxisaAxis,gfxContext*aRC,nsIFrame*aFrame,mozilla::IntrinsicISizeTypeaType,constLogicalSize&aPercentageBasis,uint32_taFlags=0);/* * Convert LengthPercentage to nscoord when percentages depend on the * containing block size. * @param aPercentBasis The width or height of the containing block * (whichever the client wants to use for resolving percentages). */staticnscoordComputeCBDependentValue(nscoordaPercentBasis,constLengthPercentage&aCoord){NS_WARNING_ASSERTION(aPercentBasis!=NS_UNCONSTRAINEDSIZE,"have unconstrained width or height; this should only result from very ""large sizes, not attempts at intrinsic size calculation");returnaCoord.Resolve(aPercentBasis);}staticnscoordComputeCBDependentValue(nscoordaPercentBasis,constLengthPercentageOrAuto&aCoord){if(aCoord.IsAuto()){return0;}returnComputeCBDependentValue(aPercentBasis,aCoord.AsLengthPercentage());}staticnscoordComputeBSizeDependentValue(nscoordaContainingBlockBSize,constLengthPercentageOrAuto&);staticnscoordComputeBSizeValue(nscoordaContainingBlockBSize,nscoordaContentEdgeToBoxSizingBoxEdge,constLengthPercentage&aCoord){MOZ_ASSERT(aContainingBlockBSize!=nscoord_MAX||!aCoord.HasPercent(),"caller must deal with %% of unconstrained block-size");nscoordresult=aCoord.Resolve(aContainingBlockBSize);// Clamp calc(), and the subtraction for box-sizing.returnstd::max(0,result-aContentEdgeToBoxSizingBoxEdge);}/** * The "extremum length" values (see ExtremumLength) were originally aimed at * inline-size (or width, as it was before logicalization). For now, we return * true for those here, so that we don't call ComputeBSizeValue with value * types that it doesn't understand. (See bug 1113216.) * * FIXME (bug 567039, bug 527285) * This isn't correct for the 'fill' value or for the 'min-*' or 'max-*' * properties, which need to be handled differently by the callers of * IsAutoBSize(). */template<typenameSizeOrMaxSize>staticboolIsAutoBSize(constSizeOrMaxSize&aCoord,nscoordaCBBSize){returnaCoord.BehavesLikeInitialValueOnBlockAxis()||(aCBBSize==nscoord_MAX&&aCoord.HasPercent());}staticboolIsPaddingZero(constLengthPercentage&aLength){// clamp negative calc() to 0returnaLength.Resolve(nscoord_MAX)<=0&&aLength.Resolve(0)<=0;}staticboolIsMarginZero(constLengthPercentage&aLength){returnaLength.Resolve(nscoord_MAX)==0&&aLength.Resolve(0)==0;}staticvoidMarkDescendantsDirty(nsIFrame*aSubtreeRoot);staticvoidMarkIntrinsicISizesDirtyIfDependentOnBSize(nsIFrame*aFrame);/* * Calculate the used values for 'width' and 'height' when width * and height are 'auto'. The tentWidth and tentHeight arguments should be * the result of applying the rules for computing intrinsic sizes and ratios. * as specified by CSS 2.1 sections 10.3.2 and 10.6.2 */staticnsSizeComputeAutoSizeWithIntrinsicDimensions(nscoordminWidth,nscoordminHeight,nscoordmaxWidth,nscoordmaxHeight,nscoordtentWidth,nscoordtentHeight);// Implement nsIFrame::GetPrefISize in terms of nsIFrame::AddInlinePrefISizestaticnscoordPrefISizeFromInline(nsIFrame*aFrame,gfxContext*aRenderingContext);// Implement nsIFrame::GetMinISize in terms of nsIFrame::AddInlineMinISizestaticnscoordMinISizeFromInline(nsIFrame*aFrame,gfxContext*aRenderingContext);// Get a suitable foreground color for painting aColor for aFrame.staticnscolorDarkenColorIfNeeded(nsIFrame*aFrame,nscoloraColor);// Get a suitable foreground color for painting aField for aFrame.// Type of aFrame is made a template parameter because nsIFrame is not// a complete type in the header. Type-safety is not harmed given that// DarkenColorIfNeeded requires an nsIFrame pointer.template<typenameFrame,typenameT,typenameS>staticnscolorGetColor(Frame*aFrame,TS::*aField){nscolorcolor=aFrame->GetVisitedDependentColor(aField);returnDarkenColorIfNeeded(aFrame,color);}// Get a baseline y position in app units that is snapped to device pixels.staticgfxFloatGetSnappedBaselineY(nsIFrame*aFrame,gfxContext*aContext,nscoordaY,nscoordaAscent);// Ditto for an x position (for vertical text). Note that for vertical-rl// writing mode, the ascent value should be negated by the caller.staticgfxFloatGetSnappedBaselineX(nsIFrame*aFrame,gfxContext*aContext,nscoordaX,nscoordaAscent);staticnscoordAppUnitWidthOfString(char16_taC,nsFontMetrics&aFontMetrics,DrawTarget*aDrawTarget){returnAppUnitWidthOfString(&aC,1,aFontMetrics,aDrawTarget);}staticnscoordAppUnitWidthOfString(constnsString&aString,nsFontMetrics&aFontMetrics,DrawTarget*aDrawTarget){returnnsLayoutUtils::AppUnitWidthOfString(aString.get(),aString.Length(),aFontMetrics,aDrawTarget);}staticnscoordAppUnitWidthOfString(constchar16_t*aString,uint32_taLength,nsFontMetrics&aFontMetrics,DrawTarget*aDrawTarget);staticnscoordAppUnitWidthOfStringBidi(constnsString&aString,constnsIFrame*aFrame,nsFontMetrics&aFontMetrics,gfxContext&aContext){returnnsLayoutUtils::AppUnitWidthOfStringBidi(aString.get(),aString.Length(),aFrame,aFontMetrics,aContext);}staticnscoordAppUnitWidthOfStringBidi(constchar16_t*aString,uint32_taLength,constnsIFrame*aFrame,nsFontMetrics&aFontMetrics,gfxContext&aContext);staticboolStringWidthIsGreaterThan(constnsString&aString,nsFontMetrics&aFontMetrics,DrawTarget*aDrawTarget,nscoordaWidth);staticnsBoundingMetricsAppUnitBoundsOfString(constchar16_t*aString,uint32_taLength,nsFontMetrics&aFontMetrics,DrawTarget*aDrawTarget);staticvoidDrawString(constnsIFrame*aFrame,nsFontMetrics&aFontMetrics,gfxContext*aContext,constchar16_t*aString,int32_taLength,nsPointaPoint,ComputedStyle*aComputedStyle=nullptr,DrawStringFlagsaFlags=DrawStringFlags::Default);staticnsPointGetBackgroundFirstTilePos(constnsPoint&aDest,constnsPoint&aFill,constnsSize&aRepeatSize);/** * Supports only LTR or RTL. Bidi (mixed direction) is not supported. */staticvoidDrawUniDirString(constchar16_t*aString,uint32_taLength,constnsPoint&aPoint,nsFontMetrics&aFontMetrics,gfxContext&aContext);/** * Helper function for drawing text-shadow. The callback's job * is to draw whatever needs to be blurred onto the given context. */typedefvoid(*TextShadowCallback)(gfxContext*aCtx,nsPointaShadowOffset,constnscolor&aShadowColor,void*aData);staticvoidPaintTextShadow(constnsIFrame*aFrame,gfxContext*aContext,constnsRect&aTextRect,constnsRect&aDirtyRect,constnscolor&aForegroundColor,TextShadowCallbackaCallback,void*aCallbackData);/** * Gets the baseline to vertically center text from a font within a * line of specified height. * aIsInverted: true if the text is inverted relative to the block * direction, so that the block-dir "ascent" corresponds to font * descent. (Applies to sideways text in vertical-lr mode.) * * Returns the baseline position relative to the top of the line. */staticnscoordGetCenteredFontBaseline(nsFontMetrics*aFontMetrics,nscoordaLineHeight,boolaIsInverted);/** * Derive a baseline of |aFrame| (measured from its top border edge) * from its first in-flow line box (not descending into anything with * 'overflow' not 'visible', potentially including aFrame itself). * * Returns true if a baseline was found (and fills in aResult). * Otherwise returns false. */staticboolGetFirstLineBaseline(mozilla::WritingModeaWritingMode,constnsIFrame*aFrame,nscoord*aResult);/** * Just like GetFirstLineBaseline, except also returns the top and * bottom of the line with the baseline. * * Returns true if a line was found (and fills in aResult). * Otherwise returns false. */structLinePosition{nscoordmBStart,mBaseline,mBEnd;LinePositionoperator+(nscoordaOffset)const{LinePositionresult;result.mBStart=mBStart+aOffset;result.mBaseline=mBaseline+aOffset;result.mBEnd=mBEnd+aOffset;returnresult;}};staticboolGetFirstLinePosition(mozilla::WritingModeaWritingMode,constnsIFrame*aFrame,LinePosition*aResult);/** * Derive a baseline of |aFrame| (measured from its top border edge) * from its last in-flow line box (not descending into anything with * 'overflow' not 'visible', potentially including aFrame itself). * * Returns true if a baseline was found (and fills in aResult). * Otherwise returns false. */staticboolGetLastLineBaseline(mozilla::WritingModeaWritingMode,constnsIFrame*aFrame,nscoord*aResult);/** * Returns a block-dir coordinate relative to this frame's origin that * represents the logical block-end of the frame or its visible content, * whichever is further from the origin. * Relative positioning is ignored and margins and glyph bounds are not * considered. * This value will be >= mRect.BSize() and <= overflowRect.BEnd() unless * relative positioning is applied. */staticnscoordCalculateContentBEnd(mozilla::WritingModeaWritingMode,nsIFrame*aFrame);/** * Gets the closest frame (the frame passed in or one of its parents) that * qualifies as a "layer"; used in DOM0 methods that depends upon that * definition. This is the nearest frame that is either positioned or scrolled * (the child of a scroll frame). */staticnsIFrame*GetClosestLayer(nsIFrame*aFrame);/** * Gets the graphics sampling filter for the frame */staticSamplingFilterGetSamplingFilterForFrame(nsIFrame*aFrame);staticinlinevoidInitDashPattern(StrokeOptions&aStrokeOptions,mozilla::StyleBorderStyleaBorderStyle){if(aBorderStyle==mozilla::StyleBorderStyle::Dotted){staticFloatdot[]={1.f,1.f};aStrokeOptions.mDashLength=MOZ_ARRAY_LENGTH(dot);aStrokeOptions.mDashPattern=dot;}elseif(aBorderStyle==mozilla::StyleBorderStyle::Dashed){staticFloatdash[]={5.f,5.f};aStrokeOptions.mDashLength=MOZ_ARRAY_LENGTH(dash);aStrokeOptions.mDashPattern=dash;}else{aStrokeOptions.mDashLength=0;aStrokeOptions.mDashPattern=nullptr;}}/** * Convert an nsRect to a gfxRect. */staticgfxRectRectToGfxRect(constnsRect&aRect,int32_taAppUnitsPerDevPixel);staticgfxPointPointToGfxPoint(constnsPoint&aPoint,int32_taAppUnitsPerPixel){returngfxPoint(gfxFloat(aPoint.x)/aAppUnitsPerPixel,gfxFloat(aPoint.y)/aAppUnitsPerPixel);}/* N.B. The only difference between variants of the Draw*Image * functions below is the type of the aImage argument. *//** * Draw a background image. The image's dimensions are as specified in aDest; * the image itself is not consulted to determine a size. * See https://wiki.mozilla.org/Gecko:Image_Snapping_and_Rendering * * @param aContext * The context to draw to, already set up with an appropriate scale and * transform for drawing in app units. * @param aForFrame * The nsIFrame that we're drawing this image for. * @param aImage * The image. * @param aDest * The position and scaled area where one copy of the image should be drawn. * This area represents the image itself in its correct position as defined * with the background-position css property. * @param aFill * The area to be filled with copies of the image. * @param aRepeatSize * The distance between the positions of two subsequent repeats of the image. * Sizes larger than aDest.Size() create gaps between the images. * @param aAnchor * A point in aFill which we will ensure is pixel-aligned in the output. * @param aDirty * Pixels outside this area may be skipped. * @param aImageFlags * Image flags of the imgIContainer::FLAG_* variety. * @param aExtendMode * How to extend the image over the dest rect. */staticImgDrawResultDrawBackgroundImage(gfxContext&aContext,nsIFrame*aForFrame,nsPresContext*aPresContext,imgIContainer*aImage,SamplingFilteraSamplingFilter,constnsRect&aDest,constnsRect&aFill,constnsSize&aRepeatSize,constnsPoint&aAnchor,constnsRect&aDirty,uint32_taImageFlags,ExtendModeaExtendMode,floataOpacity);/** * Draw an image. * See https://wiki.mozilla.org/Gecko:Image_Snapping_and_Rendering * @param aRenderingContext Where to draw the image, set up with an * appropriate scale and transform for drawing in * app units. * @param aComputedStyle The ComputedStyle of the nsIFrame (or * pseudo-element) for which this image is being * drawn. * @param aImage The image. * @param aDest Where one copy of the image should mapped to. * @param aFill The area to be filled with copies of the * image. * @param aAnchor A point in aFill which we will ensure is * pixel-aligned in the output. * @param aDirty Pixels outside this area may be skipped. * @param aImageFlags Image flags of the imgIContainer::FLAG_* variety */staticImgDrawResultDrawImage(gfxContext&aContext,ComputedStyle*aComputedStyle,nsPresContext*aPresContext,imgIContainer*aImage,constSamplingFilteraSamplingFilter,constnsRect&aDest,constnsRect&aFill,constnsPoint&aAnchor,constnsRect&aDirty,uint32_taImageFlags,floataOpacity=1.0);/** * Draw a whole image without scaling or tiling. * * @param aRenderingContext Where to draw the image, set up with an * appropriate scale and transform for drawing in * app units. * @param aImage The image. * @param aDest The top-left where the image should be drawn. * @param aDirty If non-null, then pixels outside this area may * be skipped. * @param aSVGContext Optionally provides an SVGImageContext. * Callers should pass an SVGImageContext with at * least the viewport size set if aImage may be of * type imgIContainer::TYPE_VECTOR, or pass * Nothing() if it is of type * imgIContainer::TYPE_RASTER (to save cycles * constructing an SVGImageContext, since this * argument will be ignored for raster images). * @param aImageFlags Image flags of the imgIContainer::FLAG_* variety * @param aSourceArea If non-null, this area is extracted from * the image and drawn at aDest. It's * in appunits. For best results it should * be aligned with image pixels. */staticImgDrawResultDrawSingleUnscaledImage(gfxContext&aContext,nsPresContext*aPresContext,imgIContainer*aImage,constSamplingFilteraSamplingFilter,constnsPoint&aDest,constnsRect*aDirty,constmozilla::Maybe<SVGImageContext>&aSVGContext,uint32_taImageFlags,constnsRect*aSourceArea=nullptr);/** * Draw a whole image without tiling. * * @param aRenderingContext Where to draw the image, set up with an * appropriate scale and transform for drawing in * app units. * @param aImage The image. * @param aDest The area that the image should fill. * @param aDirty Pixels outside this area may be skipped. * @param aSVGContext Optionally provides an SVGImageContext. * Callers should pass an SVGImageContext with at * least the viewport size set if aImage may be of * type imgIContainer::TYPE_VECTOR, or pass * Nothing() if it is of type * imgIContainer::TYPE_RASTER (to save cycles * constructing an SVGImageContext, since this * argument will be ignored for raster images). * @param aImageFlags Image flags of the imgIContainer::FLAG_* * variety. * @param aAnchor If non-null, a point which we will ensure * is pixel-aligned in the output. * @param aSourceArea If non-null, this area is extracted from * the image and drawn in aDest. It's * in appunits. For best results it should * be aligned with image pixels. */staticImgDrawResultDrawSingleImage(gfxContext&aContext,nsPresContext*aPresContext,imgIContainer*aImage,SamplingFilteraSamplingFilter,constnsRect&aDest,constnsRect&aDirty,constmozilla::Maybe<SVGImageContext>&aSVGContext,uint32_taImageFlags,constnsPoint*aAnchorPoint=nullptr,constnsRect*aSourceArea=nullptr);/** * Given an imgIContainer, this method attempts to obtain an intrinsic * px-valued height & width for it. If the imgIContainer has a non-pixel * value for either height or width, this method tries to generate a pixel * value for that dimension using the intrinsic ratio (if available). The * intrinsic ratio will be assigned to aIntrinsicRatio; if there's no * intrinsic ratio then (0, 0) will be assigned. * * This method will always set aGotWidth and aGotHeight to indicate whether * we were able to successfully obtain (or compute) a value for each * dimension. * * NOTE: This method is similar to ComputeSizeWithIntrinsicDimensions. The * difference is that this one is simpler and is suited to places where we * have less information about the frame tree. * * @param aResolution The resolution specified by the author for the image, or * its intrinsic resolution. * * This will affect the intrinsic size size of the image * (so e.g., if resolution is 2, and the image is 100x100, * the intrinsic size of the image will be 50x50). */staticvoidComputeSizeForDrawing(imgIContainer*aImage,constmozilla::image::Resolution&,CSSIntSize&aImageSize,AspectRatio&aIntrinsicRatio,bool&aGotWidth,bool&aGotHeight);/** * Given an imgIContainer, this method attempts to obtain an intrinsic * px-valued height & width for it. If the imgIContainer has a non-pixel * value for either height or width, this method tries to generate a pixel * value for that dimension using the intrinsic ratio (if available). If, * after trying all these methods, no value is available for one or both * dimensions, the corresponding dimension of aFallbackSize is used instead. */staticCSSIntSizeComputeSizeForDrawingWithFallback(imgIContainer*aImage,constmozilla::image::Resolution&,constnsSize&aFallbackSize);/** * Given the image container, frame, and dest rect, determine the best fitting * size to decode the image at, and calculate any necessary SVG parameters. */staticmozilla::gfx::IntSizeComputeImageContainerDrawingParameters(imgIContainer*aImage,nsIFrame*aForFrame,constLayoutDeviceRect&aDestRect,constLayoutDeviceRect&aFillRect,constStackingContextHelper&aSc,uint32_taFlags,mozilla::Maybe<SVGImageContext>&aSVGContext,mozilla::Maybe<mozilla::image::ImageIntRegion>&aRegion);/** * Given a source area of an image (in appunits) and a destination area * that we want to map that source area too, computes the area that * would be covered by the whole image. This is useful for passing to * the aDest parameter of DrawImage, when we want to draw a subimage * of an overall image. */staticnsRectGetWholeImageDestination(constnsSize&aWholeImageSize,constnsRect&aImageSourceArea,constnsRect&aDestArea);/** * Given an image container and an orientation, returns an image container * that contains the same image, reoriented appropriately. May return the * original image container if no changes are needed. * * @param aContainer The image container to apply the orientation to. * @param aOrientation The desired orientation. */staticalready_AddRefed<imgIContainer>OrientImage(imgIContainer*aContainer,constmozilla::StyleImageOrientation&aOrientation);/** * Determine if any corner radius is of nonzero size * @param aCorners the |BorderRadius| object to check * @return true unless all the coordinates are 0%, 0 or null. * * A corner radius with one dimension zero and one nonzero is * treated as a nonzero-radius corner, even though it will end up * being rendered like a zero-radius corner. This is because such * corners are not expected to appear outside of test cases, and it's * simpler to implement the test this way. */staticboolHasNonZeroCorner(constmozilla::BorderRadius&aCorners);/** * Determine if there is any corner radius on corners adjacent to the * given side. */staticboolHasNonZeroCornerOnSide(constmozilla::BorderRadius&aCorners,mozilla::SideaSide);/** * Return the border radius size (width, height) based only on the top-left * corner. This is a special case used for drawing the Windows 10 drop-shadow, * and only supports a specified length (not percentages) on the top-left * corner. */staticLayoutDeviceIntSizeGetBorderRadiusForMenuDropShadow(constnsIFrame*aFrame);/** * Determine if a widget is likely to require transparency or translucency. * @param aBackgroundFrame The frame that the background is set on. For * <window>s, this will be the canvas frame. * @param aCSSRootFrame The frame that holds CSS properties affecting * the widget's transparency. For menupopups, * aBackgroundFrame and aCSSRootFrame will be the * same. * @return a value suitable for passing to SetWindowTranslucency. */staticnsTransparencyModeGetFrameTransparency(nsIFrame*aBackgroundFrame,nsIFrame*aCSSRootFrame);/** * A frame is a popup if it has its own floating window. Menus, panels * and combobox dropdowns are popups. */staticboolIsPopup(constnsIFrame*aFrame);/** * Find the nearest "display root". This is the nearest enclosing * popup frame or the root prescontext's root frame. */staticnsIFrame*GetDisplayRootFrame(nsIFrame*aFrame);staticconstnsIFrame*GetDisplayRootFrame(constnsIFrame*aFrame);/** * Get the reference frame that would be used when constructing a * display item for this frame. Rather than using their own frame * as a reference frame.) * * This duplicates some of the logic of GetDisplayRootFrame above and * of nsDisplayListBuilder::FindReferenceFrameFor. * * If you have an nsDisplayListBuilder, you should get the reference * frame from it instead of calling this. */staticnsIFrame*GetReferenceFrame(nsIFrame*aFrame);/** * Get textrun construction flags determined by a given style; in particular * some combination of: * -- TEXT_DISABLE_OPTIONAL_LIGATURES if letter-spacing is in use * -- TEXT_OPTIMIZE_SPEED if the text-rendering CSS property and font size * and prefs indicate we should be optimizing for speed over quality */staticmozilla::gfx::ShapedTextFlagsGetTextRunFlagsForStyle(ComputedStyle*aComputedStyle,nsPresContext*aPresContext,constnsStyleFont*aStyleFont,constnsStyleText*aStyleText,nscoordaLetterSpacing);/** * Get orientation flags for textrun construction. */staticmozilla::gfx::ShapedTextFlagsGetTextRunOrientFlagsForStyle(ComputedStyle*aComputedStyle);/** * Takes two rectangles whose origins must be the same, and computes * the difference between their union and their intersection as two * rectangles. (This difference is a superset of the difference * between the two rectangles.) */staticvoidGetRectDifferenceStrips(constnsRect&aR1,constnsRect&aR2,nsRect*aHStrip,nsRect*aVStrip);/** * Get a device context that can be used to get up-to-date device * dimensions for the given window. For some reason, this is more * complicated than it ought to be in multi-monitor situations. */staticnsDeviceContext*GetDeviceContextForScreenInfo(nsPIDOMWindowOuter*aWindow);/** * Some frames with 'position: fixed' (nsStyleDisplay::mPosition == * StylePositionProperty::Fixed) are not really fixed positioned, since * they're inside an element with -moz-transform. This function says * whether such an element is a real fixed-pos element. */staticboolIsReallyFixedPos(constnsIFrame*aFrame);/** * This function says whether `aFrame` would really be a fixed positioned * frame if the frame was created with StylePositionProperty::Fixed. * * It is effectively the same as IsReallyFixedPos, but without asserting the * position value. Use it only when you know what you're doing, like when * tearing down the frame tree (where styles may have changed due to * ::first-line reparenting and rule changes at the same time). */staticboolMayBeReallyFixedPos(constnsIFrame*aFrame);/** * Returns true if |aFrame| is inside position:fixed subtree. */staticboolIsInPositionFixedSubtree(constnsIFrame*aFrame);/** * Obtain a SourceSurface from the given DOM element, if possible. * This obtains the most natural surface from the element; that * is, the one that can be obtained with the fewest conversions. * * The flags below can modify the behaviour of this function. The * result is returned as a SurfaceFromElementResult struct, also * defined below. * * Currently, this will do: * - HTML Canvas elements: will return the underlying canvas surface * - HTML Video elements: will return the current video frame * - Image elements: will return the image * * The above results are modified by the below flags (copying, * forcing image surface, etc.). */enum{/* Whether to extract the first frame (as opposed to the current frame) in the case that the element is an image. */SFE_WANT_FIRST_FRAME_IF_IMAGE=1<<0,/* Whether we should skip colorspace/gamma conversion */SFE_NO_COLORSPACE_CONVERSION=1<<1,/* Caller handles SFER::mAlphaType = NonPremult */SFE_ALLOW_NON_PREMULT=1<<2,/* Whether we should skip getting a surface for vector images and return a DirectDrawInfo containing an imgIContainer instead. */SFE_NO_RASTERIZING_VECTORS=1<<3,/* If image type is vector, the return surface size will same as element size, not image's intrinsic size. */SFE_USE_ELEMENT_SIZE_IF_VECTOR=1<<4,/* Ensure that the returned surface has a size that matches the * SurfaceFromElementResult::mSize. This is mostly a convenience thing so * that callers who want this don't have to deal with it themselves. * The surface might be different for, e.g., a EXIF-scaled raster image, if * we don't rescale during decode. */SFE_EXACT_SIZE_SURFACE=1<<6,};// This function can be called on any thread.staticmozilla::SurfaceFromElementResultSurfaceFromOffscreenCanvas(mozilla::dom::OffscreenCanvas*aOffscreenCanvas,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);staticmozilla::SurfaceFromElementResultSurfaceFromOffscreenCanvas(mozilla::dom::OffscreenCanvas*aOffscreenCanvas,uint32_taSurfaceFlags=0){RefPtr<DrawTarget>target=nullptr;returnSurfaceFromOffscreenCanvas(aOffscreenCanvas,aSurfaceFlags,target);}staticmozilla::SurfaceFromElementResultSurfaceFromElement(mozilla::dom::Element*aElement,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);staticmozilla::SurfaceFromElementResultSurfaceFromElement(mozilla::dom::Element*aElement,uint32_taSurfaceFlags=0){RefPtr<DrawTarget>target=nullptr;returnSurfaceFromElement(aElement,aSurfaceFlags,target);}// There are a bunch of callers of SurfaceFromElement. Just mark it asMOZ_CAN_RUN_SCRIPT_BOUNDARYstaticmozilla::SurfaceFromElementResultSurfaceFromElement(nsIImageLoadingContent*aElement,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);// Need an HTMLImageElement overload, because otherwise the// nsIImageLoadingContent and mozilla::dom::Element overloads are ambiguous// for HTMLImageElement.staticmozilla::SurfaceFromElementResultSurfaceFromElement(mozilla::dom::HTMLImageElement*aElement,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);staticmozilla::SurfaceFromElementResultSurfaceFromElement(mozilla::dom::HTMLCanvasElement*aElement,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);staticmozilla::SurfaceFromElementResultSurfaceFromElement(mozilla::dom::HTMLVideoElement*aElement,uint32_taSurfaceFlags,RefPtr<DrawTarget>&aTarget);/** * When the document is editable by contenteditable attribute of its root * content or body content. * * Be aware, this returns nullptr if it's in designMode. * * For example: * * <html contenteditable="true"><body></body></html> * returns the <html>. * * <html><body contenteditable="true"></body></html> * <body contenteditable="true"></body> * With these cases, this returns the <body>. * NOTE: The latter case isn't created normally, however, it can be * created by script with XHTML. * * <body><p contenteditable="true"></p></body> * returns nullptr because <body> isn't editable. */staticmozilla::dom::Element*GetEditableRootContentByContentEditable(mozilla::dom::Document*aDocument);staticvoidAddExtraBackgroundItems(nsDisplayListBuilder*aBuilder,nsDisplayList*aList,nsIFrame*aFrame,constnsRect&aCanvasArea,constnsRegion&aVisibleRegion,nscoloraBackstop);/** * Returns true if the passed in prescontext needs the dark grey background * that goes behind the page of a print preview presentation. */staticboolNeedsPrintPreviewBackground(nsPresContext*aPresContext);/** * Types used by the helpers for InspectorUtils.getUsedFontFaces. * The API returns an array (UsedFontFaceList) that owns the * InspectorFontFace instances, but during range traversal we also * want to maintain a mapping from gfxFontEntry to InspectorFontFace * records, so use a temporary hashtable for that. */typedefnsTArray<mozilla::UniquePtr<mozilla::dom::InspectorFontFace>>UsedFontFaceList;typedefnsTHashMap<nsPtrHashKey<gfxFontEntry>,mozilla::dom::InspectorFontFace*>UsedFontFaceTable;/** * Adds all font faces used in the frame tree starting from aFrame * to the list aFontFaceList. * aMaxRanges: maximum number of text ranges to record for each face. */staticnsresultGetFontFacesForFrames(nsIFrame*aFrame,UsedFontFaceList&aResult,UsedFontFaceTable&aFontFaces,uint32_taMaxRanges,boolaSkipCollapsedWhitespace);/** * Adds all font faces used within the specified range of text in aFrame, * and optionally its continuations, to the list in aFontFaceList. * Pass 0 and INT32_MAX for aStartOffset and aEndOffset to specify the * entire text is to be considered. * aMaxRanges: maximum number of text ranges to record for each face. */staticvoidGetFontFacesForText(nsIFrame*aFrame,int32_taStartOffset,int32_taEndOffset,boolaFollowContinuations,UsedFontFaceList&aResult,UsedFontFaceTable&aFontFaces,uint32_taMaxRanges,boolaSkipCollapsedWhitespace);/** * Walks the frame tree starting at aFrame looking for textRuns. * If |clear| is true, just clears the TEXT_RUN_MEMORY_ACCOUNTED flag * on each textRun found (and |aMallocSizeOf| is not used). * If |clear| is false, adds the storage used for each textRun to the * total, and sets the TEXT_RUN_MEMORY_ACCOUNTED flag to avoid double- * accounting. (Runs with this flag already set will be skipped.) * Expected usage pattern is therefore to call twice: * (void)SizeOfTextRunsForFrames(rootFrame, nullptr, true); * total = SizeOfTextRunsForFrames(rootFrame, mallocSizeOf, false); */staticsize_tSizeOfTextRunsForFrames(nsIFrame*aFrame,mozilla::MallocSizeOfaMallocSizeOf,boolclear);/** * Returns true if |aFrame| has an animation of a property in |aPropertySet| * regardless of whether any property in the set is overridden by an * !important rule. */staticboolHasAnimationOfPropertySet(constnsIFrame*aFrame,constnsCSSPropertyIDSet&aPropertySet);/** * A variant of the above HasAnimationOfPropertySet that takes an optional * EffectSet parameter as an optimization to save redundant lookups of the * EffectSet. */staticboolHasAnimationOfPropertySet(constnsIFrame*aFrame,constnsCSSPropertyIDSet&aPropertySet,mozilla::EffectSet*aEffectSet);/** * A variant of the above HasAnimationOfPropertySet. This is especially for * tranform-like properties with motion-path. * For transform-like properties with motion-path, we need to check if * offset-path has effect. If we don't have any animation on offset-path and * offset-path is none, there is no effective motion-path, and so we don't * care other offset-* properties. In this case, this function only checks the * rest of transform-like properties (i.e. transform/translate/rotate/scale). */staticboolHasAnimationOfTransformAndMotionPath(constnsIFrame*aFrame);/** * Returns true if |aFrame| has an animation of |aProperty| which is * not overridden by !important rules. */staticboolHasEffectiveAnimation(constnsIFrame*aFrame,nsCSSPropertyIDaProperty);/** * Returns true if |aFrame| has an animation where at least one of the * properties in |aPropertySet| is not overridden by !important rules. * * If |aPropertySet| includes transform-like properties (transform, rotate, * etc.) however, this will return false if any of the transform-like * properties is overriden by an !important rule since these properties should * be combined on the compositor. */staticboolHasEffectiveAnimation(constnsIFrame*aFrame,constnsCSSPropertyIDSet&aPropertySet);/** * Returns all effective animated CSS properties on |aStyleFrame| and its * corresponding primary frame (for content that makes this distinction, * notable display:table content) that can be animated on the compositor. * * Properties that can be animated on the compositor but which are overridden * by !important rules are not returned. * * Unlike HasEffectiveAnimation, however, this does not check the set of * transform-like properties to ensure that if any such properties are * overridden by !important rules, the other transform-like properties are * not run on the compositor (see bug 1534884). */staticnsCSSPropertyIDSetGetAnimationPropertiesForCompositor(constnsIFrame*aStyleFrame);/** * Checks if off-main-thread animations are enabled. */staticboolAreAsyncAnimationsEnabled();/** * Checks if retained display lists are enabled. */staticboolAreRetainedDisplayListsEnabled();staticboolDisplayRootHasRetainedDisplayListBuilder(nsIFrame*aFrame);/** * Find a suitable scale for a element (aFrame's content) over the course of * any animations and transitions of the CSS transform property on the element * that run on the compositor thread. It will check the maximum and minimum * scale during the animations and transitions and return a suitable value for * performance and quality. Will return scale(1,1) if there are no such * animations. Always returns a positive value. * @param aVisibleSize is the size of the area we want to paint * @param aDisplaySize is the size of the display area of the pres context */staticSizeComputeSuitableScaleForAnimation(constnsIFrame*aFrame,constnsSize&aVisibleSize,constnsSize&aDisplaySize);/** * Checks whether we want to use the GPU to scale images when * possible. */staticboolGPUImageScalingEnabled();/** * Unions the overflow areas of the children of aFrame with aOverflowAreas. * aSkipChildLists specifies any child lists that should be skipped. * kSelectPopupList and kPopupList are always skipped. */staticvoidUnionChildOverflow(nsIFrame*aFrame,mozilla::OverflowAreas&aOverflowAreas,mozilla::layout::FrameChildListIDsaSkipChildLists=mozilla::layout::FrameChildListIDs());/** * Return the font size inflation *ratio* for a given frame. This is * the factor by which font sizes should be inflated; it is never * smaller than 1. */staticfloatFontSizeInflationFor(constnsIFrame*aFrame);/** * Perform the first half of the computation of FontSizeInflationFor * (see above). * This includes determining whether inflation should be performed * within this container and returning 0 if it should not be. * * The result is guaranteed not to vary between line participants * (inlines, text frames) within a line. * * The result should not be used directly since font sizes slightly * above the minimum should always be adjusted as done by * FontSizeInflationInner. */staticnscoordInflationMinFontSizeFor(constnsIFrame*aFrame);/** * Perform the second half of the computation done by * FontSizeInflationFor (see above). * * aMinFontSize must be the result of one of the * InflationMinFontSizeFor methods above. */staticfloatFontSizeInflationInner(constnsIFrame*aFrame,nscoordaMinFontSize);staticboolFontSizeInflationEnabled(nsPresContext*aPresContext);/** * Returns true if the nglayout.debug.invalidation pref is set to true. */staticboolInvalidationDebuggingIsEnabled(){returnmozilla::StaticPrefs::nglayout_debug_invalidation()||getenv("MOZ_DUMP_INVALIDATION")!=0;}staticvoidInitialize();staticvoidShutdown();/** * Register an imgIRequest object with a refresh driver. * * @param aPresContext The nsPresContext whose refresh driver we want to * register with. * @param aRequest A pointer to the imgIRequest object which the client wants * to register with the refresh driver. * @param aRequestRegistered A pointer to a boolean value which indicates * whether the given image request is registered. If * *aRequestRegistered is true, then this request will not be * registered again. If the request is registered by this function, * then *aRequestRegistered will be set to true upon the completion of * this function. * */staticvoidRegisterImageRequest(nsPresContext*aPresContext,imgIRequest*aRequest,bool*aRequestRegistered);/** * Register an imgIRequest object with a refresh driver, but only if the * request is for an image that is animated. * * @param aPresContext The nsPresContext whose refresh driver we want to * register with. * @param aRequest A pointer to the imgIRequest object which the client wants * to register with the refresh driver. * @param aRequestRegistered A pointer to a boolean value which indicates * whether the given image request is registered. If * *aRequestRegistered is true, then this request will not be * registered again. If the request is registered by this function, * then *aRequestRegistered will be set to true upon the completion of * this function. * */staticvoidRegisterImageRequestIfAnimated(nsPresContext*aPresContext,imgIRequest*aRequest,bool*aRequestRegistered);/** * Deregister an imgIRequest object from a refresh driver. * * @param aPresContext The nsPresContext whose refresh driver we want to * deregister from. * @param aRequest A pointer to the imgIRequest object with which the client * previously registered and now wants to deregister from the refresh * driver. * @param aRequestRegistered A pointer to a boolean value which indicates * whether the given image request is registered. If * *aRequestRegistered is false, then this request will not be * deregistered. If the request is deregistered by this function, * then *aRequestRegistered will be set to false upon the completion of * this function. */staticvoidDeregisterImageRequest(nsPresContext*aPresContext,imgIRequest*aRequest,bool*aRequestRegistered);/** * Shim to nsCSSFrameConstructor::PostRestyleEvent. Exists so that we * can avoid including nsCSSFrameConstructor.h and all its dependencies * in content files. */staticvoidPostRestyleEvent(mozilla::dom::Element*,mozilla::RestyleHint,nsChangeHintaMinChangeHint);/** * Updates a pair of x and y distances if a given point is closer to a given * rectangle than the original distance values. If aPoint is closer to * aRect than aClosestXDistance and aClosestYDistance indicate, then those * two variables are updated with the distance between aPoint and aRect, * and true is returned. If aPoint is not closer, then aClosestXDistance * and aClosestYDistance are left unchanged, and false is returned. * * Distances are measured in the two dimensions separately; a closer x * distance beats a closer y distance. */template<typenamePointType,typenameRectType,typenameCoordType>staticboolPointIsCloserToRect(PointTypeaPoint,constRectType&aRect,CoordType&aClosestXDistance,CoordType&aClosestYDistance);/** * Computes the box shadow rect for the frame, or returns an empty rect if * there are no shadows. * * @param aFrame Frame to compute shadows for. * @param aFrameSize Size of aFrame (in case it hasn't been set yet). */staticnsRectGetBoxShadowRectForFrame(nsIFrame*aFrame,constnsSize&aFrameSize);#ifdef DEBUG/** * Assert that there are no duplicate continuations of the same frame * within aFrameList. Optimize the tests by assuming that all frames * in aFrameList have parent aContainer. */staticvoidAssertNoDuplicateContinuations(nsIFrame*aContainer,constnsFrameList&aFrameList);/** * Assert that the frame tree rooted at |aSubtreeRoot| is empty, i.e., * that it contains no first-in-flows. */staticvoidAssertTreeOnlyEmptyNextInFlows(nsIFrame*aSubtreeRoot);#endif/** * Helper method to get touch action behaviour from the frame */staticmozilla::StyleTouchActionGetTouchActionFromFrame(nsIFrame*aFrame);/** * Helper method to transform |aBounds| from aFrame to aAncestorFrame, * and combine it with |aPreciseTargetDest| if it is axis-aligned, or * combine it with |aImpreciseTargetDest| if not. The transformed rect is * clipped to |aClip|; if |aClip| has rounded corners, that also causes * the imprecise target to be used. */staticvoidTransformToAncestorAndCombineRegions(constnsRegion&aRegion,nsIFrame*aFrame,constnsIFrame*aAncestorFrame,nsRegion*aPreciseTargetDest,nsRegion*aImpreciseTargetDest,mozilla::Maybe<Matrix4x4Flagged>*aMatrixCache,constmozilla::DisplayItemClip*aClip);/** * Populate aOutSize with the size of the content viewer corresponding * to the given prescontext. Return true if the size was set, false * otherwise. */enumclassSubtractDynamicToolbar{No,Yes};staticboolGetContentViewerSize(constnsPresContext*aPresContext,LayoutDeviceIntSize&aOutSize,SubtractDynamicToolbar=SubtractDynamicToolbar::Yes);private:staticboolUpdateCompositionBoundsForRCDRSF(mozilla::ParentLayerRect&aCompBounds,constnsPresContext*aPresContext);public:/** * Calculate the compostion size for a frame. See FrameMetrics.h for * defintion of composition size (or bounds). * Note that for the root content document's root scroll frame (RCD-RSF), * the returned size does not change as the document's resolution changes, * but for all other frames it does. This means that callers that pass in * a frame that may or may not be the RCD-RSF (which is most callers), * are likely to need special-case handling of the RCD-RSF. */staticnsSizeCalculateCompositionSizeForFrame(nsIFrame*aFrame,boolaSubtractScrollbars=true,constnsSize*aOverrideScrollPortSize=nullptr);/** * Calculate a size suitable for bounding the size of the composition bounds * of scroll frames in the current process. This should be at most the * composition size of the cross-process RCD-RSF, but it may be a tighter * bounding size. * @param aFrame A frame in the (in-process) root content document (or a * descendant of it). * @param aIsRootContentDocRootScrollFrame Whether aFrame is the root * scroll frame of the *cross-process* root content document. * In this case we just use aFrame's own composition size. * @param aMetrics A partially populated FrameMetrics for aFrame. Must have at * least mCompositionBounds, mCumulativeResolution, and * mDevPixelsPerCSSPixel set. */staticCSSSizeCalculateBoundingCompositionSize(constnsIFrame*aFrame,boolaIsRootContentDocRootScrollFrame,constFrameMetrics&aMetrics);/** * Calculate the scrollable rect for a frame. See FrameMetrics.h for * defintion of scrollable rect. aScrollableFrame is the scroll frame to * calculate the scrollable rect for. If it's null then we calculate the * scrollable rect as the rect of the root frame. */staticnsRectCalculateScrollableRectForFrame(constnsIScrollableFrame*aScrollableFrame,constnsIFrame*aRootFrame);/** * Calculate the expanded scrollable rect for a frame. See FrameMetrics.h for * defintion of expanded scrollable rect. */staticnsRectCalculateExpandedScrollableRect(nsIFrame*aFrame);/** * Returns true if the widget owning the given frame uses asynchronous * scrolling. */staticboolUsesAsyncScrolling(nsIFrame*aFrame);/** * Returns true if the widget owning the given frame has builtin APZ support * enabled. */staticboolAsyncPanZoomEnabled(constnsIFrame*aFrame);/** * Returns the current APZ Resolution Scale. When Java Pan/Zoom is * enabled in Fennec it will always return 1.0. */staticfloatGetCurrentAPZResolutionScale(PresShell*aPresShell);/** * Returns true if aDocument should be allowed to use resolution * zooming. */staticboolAllowZoomingForDocument(constmozilla::dom::Document*aDocument);/** * Returns true if we need to disable async scrolling for this particular * element. Note that this does a partial disabling - the displayport still * exists but uses a very small margin, and the compositor doesn't apply the * async transform. However, the content may still be layerized. */staticboolShouldDisableApzForElement(nsIContent*aContent);/** * Log a key/value pair as "additional data" (not associated with a paint) * for APZ testing. * While the data is not associated with a paint, the APZTestData object * is still owned by {Client,WebRender}LayerManager, so we need to be passed * something from which we can derive the layer manager. * This function takes a display list builder as the object to derive the * layer manager from, to facilitate logging test data during display list * building, but other overloads that take other objects could be added if * desired. */staticvoidLogAdditionalTestData(nsDisplayListBuilder*aBuilder,conststd::string&aKey,conststd::string&aValue);/** * Log a key/value pair for APZ testing during a paint. * @param aManager The data will be written to the APZTestData associated * with this layer manager. * @param aScrollId Identifies the scroll frame to which the data pertains. * @param aKey The key under which to log the data. * @param aValue The value of the data to be logged. */staticvoidLogTestDataForPaint(mozilla::layers::WebRenderLayerManager*aManager,ViewIDaScrollId,conststd::string&aKey,conststd::string&aValue){DoLogTestDataForPaint(aManager,aScrollId,aKey,aValue);}/** * A convenience overload of LogTestDataForPaint() that accepts any type * as the value, and passes it through mozilla::ToString() to obtain a string * value. The type passed must support streaming to an std::ostream. */template<typenameValue>staticvoidLogTestDataForPaint(mozilla::layers::WebRenderLayerManager*aManager,ViewIDaScrollId,conststd::string&aKey,constValue&aValue){DoLogTestDataForPaint(aManager,aScrollId,aKey,mozilla::ToString(aValue));}/** * Calculate a basic FrameMetrics with enough fields set to perform some * layout calculations. The fields set are dev-to-css ratio, pres shell * resolution, cumulative resolution, zoom, composition size, root * composition size, scroll offset and scrollable rect. * * Note that for the RCD-RSF, the scroll offset returned is the layout * viewport offset; if you need the visual viewport offset, that needs to * be queried independently via PresShell::GetVisualViewportOffset(). * * By contrast, ComputeFrameMetrics() computes all the fields, but requires * extra inputs and can only be called during frame layer building. */staticFrameMetricsCalculateBasicFrameMetrics(nsIScrollableFrame*aScrollFrame);staticnsIScrollableFrame*GetAsyncScrollableAncestorFrame(nsIFrame*aTarget);staticvoidSetBSizeFromFontMetrics(constnsIFrame*aFrame,mozilla::ReflowOutput&aMetrics,constmozilla::LogicalMargin&aFramePadding,mozilla::WritingModeaLineWM,mozilla::WritingModeaFrameWM);staticboolHasDocumentLevelListenersForApzAwareEvents(PresShell*aPresShell);/** * Returns true if the given scroll origin is "higher priority" than APZ. * In general any content programmatic scrolls (e.g. scrollTo calls) are * higher priority, and take precedence over APZ scrolling. This function * returns true for those, and returns false for other origins like APZ * itself, or scroll position updates from the history restore code. */staticboolCanScrollOriginClobberApz(ScrollOriginaScrollOrigin);staticScrollMetadataComputeScrollMetadata(constnsIFrame*aForFrame,constnsIFrame*aScrollFrame,nsIContent*aContent,constnsIFrame*aReferenceFrame,mozilla::layers::WebRenderLayerManager*aLayerManager,ViewIDaScrollParentId,constnsSize&aScrollPortSize,constmozilla::Maybe<nsRect>&aClipRect,boolaIsRoot);/** * Returns the metadata to put onto the root layer of a layer tree, if one is * needed. The last argument is a callback function to check if the caller * already has a metadata for a given scroll id. */staticmozilla::Maybe<ScrollMetadata>GetRootMetadata(nsDisplayListBuilder*aBuilder,mozilla::layers::WebRenderLayerManager*aLayerManager,conststd::function<bool(ViewID&aScrollId)>&aCallback);/** * If the given scroll frame needs an area excluded from its composition * bounds due to scrollbars, return that area, otherwise return an empty * margin. * There is no need to exclude scrollbars in the following cases: * - If the scroll frame is not the RCD-RSF; in that case, the composition * bounds is calculated based on the scroll port which already excludes * the scrollbar area. * - If the scrollbars are overlay, since then they are drawn on top of the * scrollable content. */staticnsMarginScrollbarAreaToExcludeFromCompositionBoundsFor(constnsIFrame*aScrollFrame);/** * Looks in the layer subtree rooted at aLayer for a metrics with scroll id * aScrollId. Returns true if such is found. */staticboolContainsMetricsWithId(constLayer*aLayer,constViewID&aScrollId);staticboolShouldUseNoScriptSheet(mozilla::dom::Document*);staticboolShouldUseNoFramesSheet(mozilla::dom::Document*);/** * Get the text content inside the frame. This methods traverse the * frame tree and collect the content from text frames. Note that this * method is similiar to nsContentUtils::GetNodeTextContent, but it at * least differs from that method in the following things: * 1. it skips text content inside nodes like style, script, textarea * which don't generate an in-tree text frame for the text; * 2. it skips elements with display property set to none; * 3. it skips out-of-flow elements; * 4. it includes content inside pseudo elements; * 5. it may include part of text content of a node if a text frame * inside is split to different continuations. */staticvoidGetFrameTextContent(nsIFrame*aFrame,nsAString&aResult);/** * Same as GetFrameTextContent but appends the result rather than sets it. */staticvoidAppendFrameTextContent(nsIFrame*aFrame,nsAString&aResult);/** * Takes a selection, and returns selection's bounding rect which is relative * to its root frame. * * @param aSel Selection to check */staticnsRectGetSelectionBoundingRect(constmozilla::dom::Selection*aSel);/** * Calculate the bounding rect of |aContent|, relative to the origin * of the scrolled content of |aRootScrollFrame|. * Where the element is contained inside a scrollable subframe, the * bounding rect is clipped to the bounds of the subframe. * If non-null aOutNearestScrollClip will be filled in with the rect of the * nearest scroll frame (excluding aRootScrollFrame) that is an ancestor of * the frame of aContent, if such exists, in the same coords are the returned * rect. This rect is used to clip the result. */staticCSSRectGetBoundingContentRect(constnsIContent*aContent,constnsIScrollableFrame*aRootScrollFrame,mozilla::Maybe<CSSRect>*aOutNearestScrollClip=nullptr);/** * Similar to GetBoundingContentRect for nsIFrame. */staticCSSRectGetBoundingFrameRect(nsIFrame*aFrame,constnsIScrollableFrame*aRootScrollFrame,mozilla::Maybe<CSSRect>*aOutNearestScrollClip=nullptr);/** * Returns the first ancestor who is a float containing block. */staticnsBlockFrame*GetFloatContainingBlock(nsIFrame*aFrame);/** * Walks up the frame tree from |aForFrame| up to |aTopFrame|, or to the * root of the frame tree if |aTopFrame| is nullptr, and returns true if * a transformed frame is encountered. */staticboolIsTransformed(nsIFrame*aForFrame,nsIFrame*aTopFrame=nullptr);/** * Walk up from aFrame to the cross-doc root, accumulating all the APZ * callback transforms on the content elements encountered along the way. * Return the accumulated value. * XXX: Note that this does not take into account CSS transforms, nor * differences in structure between the frame tree and the layer tree (which * is probably what we *want* to be computing). */staticCSSPointGetCumulativeApzCallbackTransform(nsIFrame*aFrame);/** * Compute a rect to pre-render in cases where we want to render more of * something than what is visible (usually to support async transformation). * @param aFrame the target frame to be pre-rendered * @param aDirtyRect the area that's visible in the coordinate system of * |aFrame|. * @param aOverflow the total size of the thing we're rendering in the * coordinate system of |aFrame|. * @param aPrerenderSize how large of an area we're willing to render in the * coordinate system of the root frame. * @return A rectangle that includes |aDirtyRect|, is clamped to |aOverflow|, * and is no larger than |aPrerenderSize| (unless |aPrerenderSize| is * smaller than |aDirtyRect|, in which case the returned rect will * still include |aDirtyRect| and thus be larger than * |aPrerenderSize|). */staticnsRectComputePartialPrerenderArea(nsIFrame*aFrame,constnsRect&aDirtyRect,constnsRect&aOverflow,constnsSize&aPrerenderSize);/* * Checks whether a node is an invisible break. * If not, returns the first frame on the next line if such a next line * exists. * * @return * true if the node is an invisible break. aNextLineFrame is returned null * in this case. * * false if the node causes a visible break or if the node is no break. * * @param aNextLineFrame * assigned to first frame on the next line if such a next line exists, null * otherwise. */staticboolIsInvisibleBreak(nsINode*aNode,nsIFrame**aNextLineFrame=nullptr);staticnsRectComputeGeometryBox(nsIFrame*,StyleGeometryBox);staticnsRectComputeGeometryBox(nsIFrame*,constmozilla::StyleShapeGeometryBox&);staticnsRectComputeGeometryBox(nsIFrame*,constmozilla::StyleShapeBox&);staticnsPointComputeOffsetToUserSpace(nsDisplayListBuilder*aBuilder,nsIFrame*aFrame);// Callers are responsible to ensure the user-font-set is up-to-date if// aUseUserFontSet is true.staticalready_AddRefed<nsFontMetrics>GetMetricsFor(nsPresContext*aPresContext,boolaIsVertical,constnsStyleFont*aStyleFont,mozilla::LengthaFontSize,boolaUseUserFontSet);staticvoidComputeSystemFont(nsFont*aSystemFont,mozilla::StyleSystemFontaFontID,constnsFont*aDefaultVariableFont,constmozilla::dom::Document*aDocument);staticuint32_tParseFontLanguageOverride(constnsAString&aLangTag);/** * Returns true if there are any preferences or overrides that indicate a * need to handle <meta name="viewport"> tags. */staticboolShouldHandleMetaViewport(constmozilla::dom::Document*);/** * Resolve a CSS <length-percentage> value to a definite size. */template<boolclampNegativeResultToZero>staticnscoordResolveToLength(constLengthPercentage&aLengthPercentage,nscoordaPercentageBasis){nscoordvalue=(aPercentageBasis==NS_UNCONSTRAINEDSIZE)?aLengthPercentage.Resolve(0):aLengthPercentage.Resolve(aPercentageBasis);returnclampNegativeResultToZero?std::max(0,value):value;}/** * Resolve a column-gap/row-gap to a definite size. * @note This method resolves 'normal' to zero. * Callers who want different behavior should handle 'normal' on their own. */staticnscoordResolveGapToLength(constmozilla::NonNegativeLengthPercentageOrNormal&aGap,nscoordaPercentageBasis){if(aGap.IsNormal()){returnnscoord(0);}returnResolveToLength<true>(aGap.AsLengthPercentage(),aPercentageBasis);}/** * Get the computed style from which the scrollbar style should be * used for the given scrollbar part frame. */staticComputedStyle*StyleForScrollbar(nsIFrame*aScrollbarPart);/** * Returns true if |aFrame| is scrolled out of view by a scrollable element in * a cross-process ancestor document. * Note this function only works for frames in out-of-process iframes. **/staticboolFrameIsScrolledOutOfViewInCrossProcess(constnsIFrame*aFrame);/** * Similar to above FrameIsScrolledOutViewInCrossProcess but returns true even * if |aFrame| is not fully scrolled out of view and its visible area width or * height is smaller than |aMargin|. **/staticboolFrameIsMostlyScrolledOutOfViewInCrossProcess(constnsIFrame*aFrame,nscoordaMargin);/** * Expand the height of |aSize| to the size of `vh` units. * * With dynamic toolbar(s) the height for `vh` units is greater than the * ICB height, we need to expand it in some places. **/staticnsSizeExpandHeightForViewportUnits(nsPresContext*aPresContext,constnsSize&aSize);staticCSSSizeExpandHeightForDynamicToolbar(constnsPresContext*aPresContext,constCSSSize&aSize);staticnsSizeExpandHeightForDynamicToolbar(constnsPresContext*aPresContext,constnsSize&aSize);/** * Returns the nsIFrame which clips overflow regions of the given |aFrame|. * Note CSS clip or clip-path isn't accounted for. **/staticnsIFrame*GetNearestOverflowClipFrame(nsIFrame*aFrame);private:/** * Helper function for LogTestDataForPaint(). */staticvoidDoLogTestDataForPaint(mozilla::layers::WebRenderLayerManager*aManager,ViewIDaScrollId,conststd::string&aKey,conststd::string&aValue);staticboolIsAPZTestLoggingEnabled();staticvoidConstrainToCoordValues(gfxFloat&aStart,gfxFloat&aSize);staticvoidConstrainToCoordValues(float&aStart,float&aSize);};MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(nsLayoutUtils::PaintFrameFlags)template<typenamePointType,typenameRectType,typenameCoordType>/* static */boolnsLayoutUtils::PointIsCloserToRect(PointTypeaPoint,constRectType&aRect,CoordType&aClosestXDistance,CoordType&aClosestYDistance){CoordTypefromLeft=aPoint.x-aRect.x;CoordTypefromRight=aPoint.x-aRect.XMost();CoordTypexDistance;if(fromLeft>=0&&fromRight<=0){xDistance=0;}else{xDistance=std::min(abs(fromLeft),abs(fromRight));}if(xDistance<=aClosestXDistance){if(xDistance<aClosestXDistance){aClosestYDistance=std::numeric_limits<CoordType>::max();}CoordTypefromTop=aPoint.y-aRect.y;CoordTypefromBottom=aPoint.y-aRect.YMost();CoordTypeyDistance;if(fromTop>=0&&fromBottom<=0){yDistance=0;}else{yDistance=std::min(abs(fromTop),abs(fromBottom));}if(yDistance<aClosestYDistance){aClosestXDistance=xDistance;aClosestYDistance=yDistance;returntrue;}}returnfalse;}template<typenameT>nsRectnsLayoutUtils::RoundGfxRectToAppRect(constT&aRect,constfloataFactor){// Get a new Rect whose units are app units by scaling by the specified// factor.TscaledRect=aRect;scaledRect.ScaleRoundOut(aFactor);// We now need to constrain our results to the max and min values for coords.ConstrainToCoordValues(scaledRect.x,scaledRect.width);ConstrainToCoordValues(scaledRect.y,scaledRect.height);if(!aRect.Width()){scaledRect.SetWidth(0);}if(!aRect.Height()){scaledRect.SetHeight(0);}// Now typecast everything back. This is guaranteed to be safe.returnnsRect(nscoord(scaledRect.X()),nscoord(scaledRect.Y()),nscoord(scaledRect.Width()),nscoord(scaledRect.Height()));}namespacemozilla{/** * Converts an nsPoint in app units to a Moz2D Point in pixels (whether those * are device pixels or CSS px depends on what the caller chooses to pass as * aAppUnitsPerPixel). */inlinegfx::PointNSPointToPoint(constnsPoint&aPoint,int32_taAppUnitsPerPixel){returngfx::Point(gfx::Float(aPoint.x)/aAppUnitsPerPixel,gfx::Float(aPoint.y)/aAppUnitsPerPixel);}/** * Converts an nsRect in app units to a Moz2D Rect in pixels (whether those * are device pixels or CSS px depends on what the caller chooses to pass as * aAppUnitsPerPixel). */gfx::RectNSRectToRect(constnsRect&aRect,doubleaAppUnitsPerPixel);/** * Converts an nsRect in app units to a Moz2D Rect in pixels (whether those * are device pixels or CSS px depends on what the caller chooses to pass as * aAppUnitsPerPixel). * * The passed DrawTarget is used to additionally snap the returned Rect to * device pixels, if appropriate (as decided and carried out by Moz2D's * MaybeSnapToDevicePixels helper, which this function calls to do any * snapping). */gfx::RectNSRectToSnappedRect(constnsRect&aRect,doubleaAppUnitsPerPixel,constgfx::DrawTarget&aSnapDT);/** * Converts, where possible, an nsRect in app units to a Moz2D Rect in pixels * (whether those are device pixels or CSS px depends on what the caller * chooses to pass as aAppUnitsPerPixel). * * If snapping results in a rectangle with zero width or height, the affected * coordinates are left unsnapped */gfx::RectNSRectToNonEmptySnappedRect(constnsRect&aRect,doubleaAppUnitsPerPixel,constgfx::DrawTarget&aSnapDT);voidStrokeLineWithSnapping(constnsPoint&aP1,constnsPoint&aP2,int32_taAppUnitsPerDevPixel,gfx::DrawTarget&aDrawTarget,constgfx::Pattern&aPattern,constgfx::StrokeOptions&aStrokeOptions=gfx::StrokeOptions(),constgfx::DrawOptions&aDrawOptions=gfx::DrawOptions());namespacelayout{/** * An RAII class which will, for the duration of its lifetime, * **if** the frame given is a container for font size inflation, * set the current inflation container on the pres context to null * (and then, in its destructor, restore the old value). */classAutoMaybeDisableFontInflation{public:explicitAutoMaybeDisableFontInflation(nsIFrame*aFrame);~AutoMaybeDisableFontInflation();private:nsPresContext*mPresContext;boolmOldValue;};}// namespace layout}// namespace mozillaclassnsSetAttrRunnable:publicmozilla::Runnable{public:nsSetAttrRunnable(mozilla::dom::Element*aElement,nsAtom*aAttrName,constnsAString&aValue);nsSetAttrRunnable(mozilla::dom::Element*aElement,nsAtom*aAttrName,int32_taValue);NS_DECL_NSIRUNNABLERefPtr<mozilla::dom::Element>mElement;RefPtr<nsAtom>mAttrName;nsAutoStringmValue;};classnsUnsetAttrRunnable:publicmozilla::Runnable{public:nsUnsetAttrRunnable(mozilla::dom::Element*aElement,nsAtom*aAttrName);NS_DECL_NSIRUNNABLERefPtr<mozilla::dom::Element>mElement;RefPtr<nsAtom>mAttrName;};// This class allows you to easily set any pointer variable and ensure it's// set to nullptr when leaving its scope.template<typenameT>classMOZ_RAIISetAndNullOnExit{public:SetAndNullOnExit(T*&aVariable,T*aValue){aVariable=aValue;mVariable=&aVariable;}~SetAndNullOnExit(){*mVariable=nullptr;}private:T**mVariable;};#endif // nsLayoutUtils_h__