Files
tubestation/layout/style/nsComputedDOMStyle.h
Daisuke Akatsuka 4e8abff7f9 Bug 1210796 - Part 1a: Add GetUnanimatedComputedStyle into nsIDOMWindowUtils to use in animationinspector of devtools. r=birtles,heycam
In this patch, we implement nsIDOMWindowUtils::GetUnanimatedComputedStyle
which returns computed value of given CSS property without animation rule.  This
method is used from the DevTools animation inspector to fill in keyframe values
when the property value is null (indicating that the underlying/base value is
being used).

In order to implement this, we extend nsComputedDOMStyle constructor to fetch
the computed style minus animation style (i.e. the base style). This is somewhat
complicated by the fact that for discrete animation.
StyleAnimationValue::ExtractComputedValue may return ‘unset’, ‘initial’ or
‘inherit’. For example, if the author uses the 'unset' 'initial' or 'inherit'
keyword for a discrete property (e.g. 'align-content’), ExtractComputedValue
returns the keywords as-is. Furthermore, if the user does not set any specific
keyword, ExtractComputedValue returns ‘unset’.  We use this new
nsComputedDOMStyle mechanism to resolve these keywords into a valid keyword for
computed style in the same way as other properties (e.g. ‘opacity’).

MozReview-Commit-ID: HffJ9SCDf2k
2017-04-18 12:15:47 +09:00

769 lines
31 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
/* DOM object returned from element.getComputedStyle() */
#ifndef nsComputedDOMStyle_h__
#define nsComputedDOMStyle_h__
#include "mozilla/ArenaRefPtr.h"
#include "mozilla/ArenaRefPtrInlines.h"
#include "mozilla/Attributes.h"
#include "mozilla/StyleComplexColor.h"
#include "nsCOMPtr.h"
#include "nscore.h"
#include "nsCSSProps.h"
#include "nsDOMCSSDeclaration.h"
#include "nsStyleContext.h"
#include "nsIWeakReferenceUtils.h"
#include "mozilla/gfx/Types.h"
#include "nsCoord.h"
#include "nsColor.h"
#include "nsIContent.h"
#include "nsStyleStruct.h"
#include "mozilla/WritingModes.h"
namespace mozilla {
namespace dom {
class Element;
} // namespace dom
struct ComputedGridTrackInfo;
} // namespace mozilla
struct nsComputedStyleMap;
class nsIFrame;
class nsIPresShell;
class nsDOMCSSValueList;
struct nsMargin;
class nsROCSSPrimitiveValue;
class nsStyleCoord;
class nsStyleCorners;
struct nsStyleFilter;
class nsStyleGradient;
struct nsStyleImage;
class nsStyleSides;
struct nsTimingFunction;
class nsComputedDOMStyle final : public nsDOMCSSDeclaration
, public nsStubMutationObserver
{
private:
// Convenience typedefs:
typedef nsCSSProps::KTableEntry KTableEntry;
typedef mozilla::dom::CSSValue CSSValue;
typedef mozilla::StyleGeometryBox StyleGeometryBox;
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsComputedDOMStyle,
nsICSSDeclaration)
NS_DECL_NSICSSDECLARATION
NS_DECL_NSIDOMCSSSTYLEDECLARATION_HELPER
virtual already_AddRefed<CSSValue>
GetPropertyCSSValue(const nsAString& aProp, mozilla::ErrorResult& aRv)
override;
using nsICSSDeclaration::GetPropertyCSSValue;
virtual void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aPropName) override;
enum AnimationFlag {
eWithAnimation,
eWithoutAnimation,
};
nsComputedDOMStyle(mozilla::dom::Element* aElement,
const nsAString& aPseudoElt,
nsIPresShell* aPresShell,
AnimationFlag aFlag = eWithAnimation);
virtual nsINode *GetParentObject() override
{
return mContent;
}
static already_AddRefed<nsStyleContext>
GetStyleContext(mozilla::dom::Element* aElement, nsIAtom* aPseudo,
nsIPresShell* aPresShell);
static already_AddRefed<nsStyleContext>
GetStyleContextNoFlush(mozilla::dom::Element* aElement,
nsIAtom* aPseudo,
nsIPresShell* aPresShell)
{
return DoGetStyleContextNoFlush(aElement,
aPseudo,
aPresShell,
eWithAnimation);
}
static already_AddRefed<nsStyleContext>
GetUnanimatedStyleContextNoFlush(mozilla::dom::Element* aElement,
nsIAtom* aPseudo,
nsIPresShell* aPresShell)
{
return DoGetStyleContextNoFlush(aElement,
aPseudo,
aPresShell,
eWithoutAnimation);
}
static nsIPresShell*
GetPresShellForContent(nsIContent* aContent);
// Helper for nsDOMWindowUtils::GetVisitedDependentComputedStyle
void SetExposeVisitedStyle(bool aExpose) {
NS_ASSERTION(aExpose != mExposeVisitedStyle, "should always be changing");
mExposeVisitedStyle = aExpose;
}
// nsDOMCSSDeclaration abstract methods which should never be called
// on a nsComputedDOMStyle object, but must be defined to avoid
// compile errors.
virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation) override;
virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock*) override;
virtual nsIDocument* DocToUpdate() override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
mozilla::URLExtraData* GetURLData() const final;
static already_AddRefed<nsROCSSPrimitiveValue>
MatrixToCSSValue(const mozilla::gfx::Matrix4x4& aMatrix);
static void RegisterPrefChangeCallbacks();
static void UnregisterPrefChangeCallbacks();
// nsIMutationObserver
NS_DECL_NSIMUTATIONOBSERVER_PARENTCHAINCHANGED
private:
virtual ~nsComputedDOMStyle();
void AssertFlushedPendingReflows() {
NS_ASSERTION(mFlushedPendingReflows,
"property getter should have been marked layout-dependent");
}
nsMargin GetAdjustedValuesForBoxSizing();
// Helper method for DoGetTextAlign[Last].
already_AddRefed<CSSValue> CreateTextAlignValue(uint8_t aAlign,
bool aAlignTrue,
const KTableEntry aTable[]);
// This indicates error by leaving mStyleContext null.
void UpdateCurrentStyleSources(bool aNeedsLayoutFlush);
void ClearCurrentStyleSources();
// Helper functions called by UpdateCurrentStyleSources.
void ClearStyleContext();
void SetResolvedStyleContext(RefPtr<nsStyleContext>&& aContext);
void SetFrameStyleContext(nsStyleContext* aContext);
static already_AddRefed<nsStyleContext>
DoGetStyleContextNoFlush(mozilla::dom::Element* aElement,
nsIAtom* aPseudo,
nsIPresShell* aPresShell,
AnimationFlag aAnimationFlag);
#define STYLE_STRUCT(name_, checkdata_cb_) \
const nsStyle##name_ * Style##name_() { \
return mStyleContext->Style##name_(); \
}
#include "nsStyleStructList.h"
#undef STYLE_STRUCT
already_AddRefed<CSSValue> GetEllipseRadii(const nsStyleCorners& aRadius,
mozilla::Corner aFullCorner);
already_AddRefed<CSSValue> GetOffsetWidthFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetAbsoluteOffset(mozilla::Side aSide);
already_AddRefed<CSSValue> GetRelativeOffset(mozilla::Side aSide);
already_AddRefed<CSSValue> GetStickyOffset(mozilla::Side aSide);
already_AddRefed<CSSValue> GetStaticOffset(mozilla::Side aSide);
already_AddRefed<CSSValue> GetPaddingWidthFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetBorderColorsFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetBorderStyleFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetBorderWidthFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetBorderColorFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetMarginWidthFor(mozilla::Side aSide);
already_AddRefed<CSSValue> GetSVGPaintFor(bool aFill);
// Appends all aLineNames (may be empty) space-separated to aResult.
void AppendGridLineNames(nsString& aResult,
const nsTArray<nsString>& aLineNames);
// Appends aLineNames as a CSSValue* to aValueList. If aLineNames is empty
// a value ("[]") is only appended if aSuppressEmptyList is false.
void AppendGridLineNames(nsDOMCSSValueList* aValueList,
const nsTArray<nsString>& aLineNames,
bool aSuppressEmptyList = true);
// Appends aLineNames1/2 (if non-empty) as a CSSValue* to aValueList.
void AppendGridLineNames(nsDOMCSSValueList* aValueList,
const nsTArray<nsString>& aLineNames1,
const nsTArray<nsString>& aLineNames2);
already_AddRefed<CSSValue> GetGridTrackSize(const nsStyleCoord& aMinSize,
const nsStyleCoord& aMaxSize);
already_AddRefed<CSSValue> GetGridTemplateColumnsRows(
const nsStyleGridTemplate& aTrackList,
const mozilla::ComputedGridTrackInfo* aTrackInfo);
already_AddRefed<CSSValue> GetGridLine(const nsStyleGridLine& aGridLine);
bool GetLineHeightCoord(nscoord& aCoord);
already_AddRefed<CSSValue> GetCSSShadowArray(nsCSSShadowArray* aArray,
const nscolor& aDefaultColor,
bool aIsBoxShadow);
void GetCSSGradientString(const nsStyleGradient* aGradient,
nsAString& aString);
void GetImageRectString(nsIURI* aURI,
const nsStyleSides& aCropRect,
nsString& aString);
already_AddRefed<CSSValue> GetScrollSnapPoints(const nsStyleCoord& aCoord);
void AppendTimingFunction(nsDOMCSSValueList *aValueList,
const nsTimingFunction& aTimingFunction);
bool ShouldHonorMinSizeAutoInAxis(mozilla::PhysicalAxis aAxis);
/* Properties queryable as CSSValues.
* To avoid a name conflict with nsIDOM*CSS2Properties, these are all
* DoGetXXX instead of GetXXX.
*/
already_AddRefed<CSSValue> DoGetAppearance();
already_AddRefed<CSSValue> DoGetMozAppearance();
/* Box properties */
already_AddRefed<CSSValue> DoGetBoxAlign();
already_AddRefed<CSSValue> DoGetBoxDecorationBreak();
already_AddRefed<CSSValue> DoGetBoxDirection();
already_AddRefed<CSSValue> DoGetBoxFlex();
already_AddRefed<CSSValue> DoGetBoxOrdinalGroup();
already_AddRefed<CSSValue> DoGetBoxOrient();
already_AddRefed<CSSValue> DoGetBoxPack();
already_AddRefed<CSSValue> DoGetBoxSizing();
already_AddRefed<CSSValue> DoGetWidth();
already_AddRefed<CSSValue> DoGetHeight();
already_AddRefed<CSSValue> DoGetMaxHeight();
already_AddRefed<CSSValue> DoGetMaxWidth();
already_AddRefed<CSSValue> DoGetMinHeight();
already_AddRefed<CSSValue> DoGetMinWidth();
already_AddRefed<CSSValue> DoGetMixBlendMode();
already_AddRefed<CSSValue> DoGetIsolation();
already_AddRefed<CSSValue> DoGetObjectFit();
already_AddRefed<CSSValue> DoGetObjectPosition();
already_AddRefed<CSSValue> DoGetLeft();
already_AddRefed<CSSValue> DoGetTop();
already_AddRefed<CSSValue> DoGetRight();
already_AddRefed<CSSValue> DoGetBottom();
already_AddRefed<CSSValue> DoGetStackSizing();
/* Font properties */
already_AddRefed<CSSValue> DoGetColor();
already_AddRefed<CSSValue> DoGetFontFamily();
already_AddRefed<CSSValue> DoGetFontFeatureSettings();
already_AddRefed<CSSValue> DoGetFontVariationSettings();
already_AddRefed<CSSValue> DoGetFontKerning();
already_AddRefed<CSSValue> DoGetFontLanguageOverride();
already_AddRefed<CSSValue> DoGetFontSize();
already_AddRefed<CSSValue> DoGetFontSizeAdjust();
already_AddRefed<CSSValue> DoGetOsxFontSmoothing();
already_AddRefed<CSSValue> DoGetFontStretch();
already_AddRefed<CSSValue> DoGetFontStyle();
already_AddRefed<CSSValue> DoGetFontSynthesis();
already_AddRefed<CSSValue> DoGetFontVariant();
already_AddRefed<CSSValue> DoGetFontVariantAlternates();
already_AddRefed<CSSValue> DoGetFontVariantCaps();
already_AddRefed<CSSValue> DoGetFontVariantEastAsian();
already_AddRefed<CSSValue> DoGetFontVariantLigatures();
already_AddRefed<CSSValue> DoGetFontVariantNumeric();
already_AddRefed<CSSValue> DoGetFontVariantPosition();
already_AddRefed<CSSValue> DoGetFontWeight();
/* Grid properties */
already_AddRefed<CSSValue> DoGetGridAutoFlow();
already_AddRefed<CSSValue> DoGetGridAutoColumns();
already_AddRefed<CSSValue> DoGetGridAutoRows();
already_AddRefed<CSSValue> DoGetGridTemplateAreas();
already_AddRefed<CSSValue> DoGetGridTemplateColumns();
already_AddRefed<CSSValue> DoGetGridTemplateRows();
already_AddRefed<CSSValue> DoGetGridColumnStart();
already_AddRefed<CSSValue> DoGetGridColumnEnd();
already_AddRefed<CSSValue> DoGetGridRowStart();
already_AddRefed<CSSValue> DoGetGridRowEnd();
already_AddRefed<CSSValue> DoGetGridColumnGap();
already_AddRefed<CSSValue> DoGetGridRowGap();
/* StyleImageLayer properties */
already_AddRefed<CSSValue> DoGetImageLayerImage(const nsStyleImageLayers& aLayers);
already_AddRefed<CSSValue> DoGetImageLayerPosition(const nsStyleImageLayers& aLayers);
already_AddRefed<CSSValue> DoGetImageLayerPositionX(const nsStyleImageLayers& aLayers);
already_AddRefed<CSSValue> DoGetImageLayerPositionY(const nsStyleImageLayers& aLayers);
already_AddRefed<CSSValue> DoGetImageLayerRepeat(const nsStyleImageLayers& aLayers);
already_AddRefed<CSSValue> DoGetImageLayerSize(const nsStyleImageLayers& aLayers);
/* Background properties */
already_AddRefed<CSSValue> DoGetBackgroundAttachment();
already_AddRefed<CSSValue> DoGetBackgroundColor();
already_AddRefed<CSSValue> DoGetBackgroundImage();
already_AddRefed<CSSValue> DoGetBackgroundPosition();
already_AddRefed<CSSValue> DoGetBackgroundPositionX();
already_AddRefed<CSSValue> DoGetBackgroundPositionY();
already_AddRefed<CSSValue> DoGetBackgroundRepeat();
already_AddRefed<CSSValue> DoGetBackgroundClip();
already_AddRefed<CSSValue> DoGetBackgroundBlendMode();
already_AddRefed<CSSValue> DoGetBackgroundOrigin();
already_AddRefed<CSSValue> DoGetBackgroundSize();
/* Mask properties */
already_AddRefed<CSSValue> DoGetMask();
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
already_AddRefed<CSSValue> DoGetMaskImage();
already_AddRefed<CSSValue> DoGetMaskPosition();
already_AddRefed<CSSValue> DoGetMaskPositionX();
already_AddRefed<CSSValue> DoGetMaskPositionY();
already_AddRefed<CSSValue> DoGetMaskRepeat();
already_AddRefed<CSSValue> DoGetMaskClip();
already_AddRefed<CSSValue> DoGetMaskOrigin();
already_AddRefed<CSSValue> DoGetMaskSize();
already_AddRefed<CSSValue> DoGetMaskMode();
already_AddRefed<CSSValue> DoGetMaskComposite();
#endif
/* Padding properties */
already_AddRefed<CSSValue> DoGetPaddingTop();
already_AddRefed<CSSValue> DoGetPaddingBottom();
already_AddRefed<CSSValue> DoGetPaddingLeft();
already_AddRefed<CSSValue> DoGetPaddingRight();
/* Table Properties */
already_AddRefed<CSSValue> DoGetBorderCollapse();
already_AddRefed<CSSValue> DoGetBorderSpacing();
already_AddRefed<CSSValue> DoGetCaptionSide();
already_AddRefed<CSSValue> DoGetEmptyCells();
already_AddRefed<CSSValue> DoGetTableLayout();
already_AddRefed<CSSValue> DoGetVerticalAlign();
/* Border Properties */
already_AddRefed<CSSValue> DoGetBorderTopStyle();
already_AddRefed<CSSValue> DoGetBorderBottomStyle();
already_AddRefed<CSSValue> DoGetBorderLeftStyle();
already_AddRefed<CSSValue> DoGetBorderRightStyle();
already_AddRefed<CSSValue> DoGetBorderTopWidth();
already_AddRefed<CSSValue> DoGetBorderBottomWidth();
already_AddRefed<CSSValue> DoGetBorderLeftWidth();
already_AddRefed<CSSValue> DoGetBorderRightWidth();
already_AddRefed<CSSValue> DoGetBorderTopColor();
already_AddRefed<CSSValue> DoGetBorderBottomColor();
already_AddRefed<CSSValue> DoGetBorderLeftColor();
already_AddRefed<CSSValue> DoGetBorderRightColor();
already_AddRefed<CSSValue> DoGetBorderBottomColors();
already_AddRefed<CSSValue> DoGetBorderLeftColors();
already_AddRefed<CSSValue> DoGetBorderRightColors();
already_AddRefed<CSSValue> DoGetBorderTopColors();
already_AddRefed<CSSValue> DoGetBorderBottomLeftRadius();
already_AddRefed<CSSValue> DoGetBorderBottomRightRadius();
already_AddRefed<CSSValue> DoGetBorderTopLeftRadius();
already_AddRefed<CSSValue> DoGetBorderTopRightRadius();
already_AddRefed<CSSValue> DoGetFloatEdge();
/* Border Image */
already_AddRefed<CSSValue> DoGetBorderImageSource();
already_AddRefed<CSSValue> DoGetBorderImageSlice();
already_AddRefed<CSSValue> DoGetBorderImageWidth();
already_AddRefed<CSSValue> DoGetBorderImageOutset();
already_AddRefed<CSSValue> DoGetBorderImageRepeat();
/* Box Shadow */
already_AddRefed<CSSValue> DoGetBoxShadow();
/* Window Shadow */
already_AddRefed<CSSValue> DoGetWindowShadow();
/* Margin Properties */
already_AddRefed<CSSValue> DoGetMarginTopWidth();
already_AddRefed<CSSValue> DoGetMarginBottomWidth();
already_AddRefed<CSSValue> DoGetMarginLeftWidth();
already_AddRefed<CSSValue> DoGetMarginRightWidth();
/* Outline Properties */
already_AddRefed<CSSValue> DoGetOutlineWidth();
already_AddRefed<CSSValue> DoGetOutlineStyle();
already_AddRefed<CSSValue> DoGetOutlineColor();
already_AddRefed<CSSValue> DoGetOutlineOffset();
already_AddRefed<CSSValue> DoGetOutlineRadiusBottomLeft();
already_AddRefed<CSSValue> DoGetOutlineRadiusBottomRight();
already_AddRefed<CSSValue> DoGetOutlineRadiusTopLeft();
already_AddRefed<CSSValue> DoGetOutlineRadiusTopRight();
/* Content Properties */
already_AddRefed<CSSValue> DoGetContent();
already_AddRefed<CSSValue> DoGetCounterIncrement();
already_AddRefed<CSSValue> DoGetCounterReset();
/* Quotes Properties */
already_AddRefed<CSSValue> DoGetQuotes();
/* z-index */
already_AddRefed<CSSValue> DoGetZIndex();
/* List properties */
already_AddRefed<CSSValue> DoGetListStyleImage();
already_AddRefed<CSSValue> DoGetListStylePosition();
already_AddRefed<CSSValue> DoGetListStyleType();
already_AddRefed<CSSValue> DoGetImageRegion();
/* Text Properties */
already_AddRefed<CSSValue> DoGetInitialLetter();
already_AddRefed<CSSValue> DoGetLineHeight();
already_AddRefed<CSSValue> DoGetRubyAlign();
already_AddRefed<CSSValue> DoGetRubyPosition();
already_AddRefed<CSSValue> DoGetTextAlign();
already_AddRefed<CSSValue> DoGetTextAlignLast();
already_AddRefed<CSSValue> DoGetTextCombineUpright();
already_AddRefed<CSSValue> DoGetTextDecoration();
already_AddRefed<CSSValue> DoGetTextDecorationColor();
already_AddRefed<CSSValue> DoGetTextDecorationLine();
already_AddRefed<CSSValue> DoGetTextDecorationStyle();
already_AddRefed<CSSValue> DoGetTextEmphasisColor();
already_AddRefed<CSSValue> DoGetTextEmphasisPosition();
already_AddRefed<CSSValue> DoGetTextEmphasisStyle();
already_AddRefed<CSSValue> DoGetTextIndent();
already_AddRefed<CSSValue> DoGetTextJustify();
already_AddRefed<CSSValue> DoGetTextOrientation();
already_AddRefed<CSSValue> DoGetTextOverflow();
already_AddRefed<CSSValue> DoGetTextShadow();
already_AddRefed<CSSValue> DoGetTextSizeAdjust();
already_AddRefed<CSSValue> DoGetTextTransform();
already_AddRefed<CSSValue> DoGetLetterSpacing();
already_AddRefed<CSSValue> DoGetWordSpacing();
already_AddRefed<CSSValue> DoGetWhiteSpace();
already_AddRefed<CSSValue> DoGetWordBreak();
already_AddRefed<CSSValue> DoGetOverflowWrap();
already_AddRefed<CSSValue> DoGetHyphens();
already_AddRefed<CSSValue> DoGetTabSize();
already_AddRefed<CSSValue> DoGetWebkitTextFillColor();
already_AddRefed<CSSValue> DoGetWebkitTextStrokeColor();
already_AddRefed<CSSValue> DoGetWebkitTextStrokeWidth();
/* Visibility properties */
already_AddRefed<CSSValue> DoGetColorAdjust();
already_AddRefed<CSSValue> DoGetOpacity();
already_AddRefed<CSSValue> DoGetPointerEvents();
already_AddRefed<CSSValue> DoGetVisibility();
already_AddRefed<CSSValue> DoGetWritingMode();
/* Direction properties */
already_AddRefed<CSSValue> DoGetDirection();
already_AddRefed<CSSValue> DoGetUnicodeBidi();
/* Display properties */
already_AddRefed<CSSValue> DoGetBinding();
already_AddRefed<CSSValue> DoGetClear();
already_AddRefed<CSSValue> DoGetFloat();
already_AddRefed<CSSValue> DoGetDisplay();
already_AddRefed<CSSValue> DoGetContain();
already_AddRefed<CSSValue> DoGetPosition();
already_AddRefed<CSSValue> DoGetClip();
already_AddRefed<CSSValue> DoGetImageOrientation();
already_AddRefed<CSSValue> DoGetWillChange();
already_AddRefed<CSSValue> DoGetOverflow();
already_AddRefed<CSSValue> DoGetOverflowX();
already_AddRefed<CSSValue> DoGetOverflowY();
already_AddRefed<CSSValue> DoGetOverflowClipBox();
already_AddRefed<CSSValue> DoGetResize();
already_AddRefed<CSSValue> DoGetPageBreakAfter();
already_AddRefed<CSSValue> DoGetPageBreakBefore();
already_AddRefed<CSSValue> DoGetPageBreakInside();
already_AddRefed<CSSValue> DoGetTouchAction();
already_AddRefed<CSSValue> DoGetTransform();
already_AddRefed<CSSValue> DoGetTransformBox();
already_AddRefed<CSSValue> DoGetTransformOrigin();
already_AddRefed<CSSValue> DoGetPerspective();
already_AddRefed<CSSValue> DoGetBackfaceVisibility();
already_AddRefed<CSSValue> DoGetPerspectiveOrigin();
already_AddRefed<CSSValue> DoGetTransformStyle();
already_AddRefed<CSSValue> DoGetOrient();
already_AddRefed<CSSValue> DoGetScrollBehavior();
already_AddRefed<CSSValue> DoGetScrollSnapType();
already_AddRefed<CSSValue> DoGetScrollSnapTypeX();
already_AddRefed<CSSValue> DoGetScrollSnapTypeY();
already_AddRefed<CSSValue> DoGetScrollSnapPointsX();
already_AddRefed<CSSValue> DoGetScrollSnapPointsY();
already_AddRefed<CSSValue> DoGetScrollSnapDestination();
already_AddRefed<CSSValue> DoGetScrollSnapCoordinate();
already_AddRefed<CSSValue> DoGetShapeOutside();
/* User interface properties */
already_AddRefed<CSSValue> DoGetCaretColor();
already_AddRefed<CSSValue> DoGetCursor();
already_AddRefed<CSSValue> DoGetForceBrokenImageIcon();
already_AddRefed<CSSValue> DoGetIMEMode();
already_AddRefed<CSSValue> DoGetUserFocus();
already_AddRefed<CSSValue> DoGetUserInput();
already_AddRefed<CSSValue> DoGetUserModify();
already_AddRefed<CSSValue> DoGetUserSelect();
already_AddRefed<CSSValue> DoGetWindowDragging();
/* Column properties */
already_AddRefed<CSSValue> DoGetColumnCount();
already_AddRefed<CSSValue> DoGetColumnFill();
already_AddRefed<CSSValue> DoGetColumnSpan();
already_AddRefed<CSSValue> DoGetColumnWidth();
already_AddRefed<CSSValue> DoGetColumnGap();
already_AddRefed<CSSValue> DoGetColumnRuleWidth();
already_AddRefed<CSSValue> DoGetColumnRuleStyle();
already_AddRefed<CSSValue> DoGetColumnRuleColor();
/* CSS Transitions */
already_AddRefed<CSSValue> DoGetTransitionProperty();
already_AddRefed<CSSValue> DoGetTransitionDuration();
already_AddRefed<CSSValue> DoGetTransitionDelay();
already_AddRefed<CSSValue> DoGetTransitionTimingFunction();
/* CSS Animations */
already_AddRefed<CSSValue> DoGetAnimationName();
already_AddRefed<CSSValue> DoGetAnimationDuration();
already_AddRefed<CSSValue> DoGetAnimationDelay();
already_AddRefed<CSSValue> DoGetAnimationTimingFunction();
already_AddRefed<CSSValue> DoGetAnimationDirection();
already_AddRefed<CSSValue> DoGetAnimationFillMode();
already_AddRefed<CSSValue> DoGetAnimationIterationCount();
already_AddRefed<CSSValue> DoGetAnimationPlayState();
/* CSS Flexbox properties */
already_AddRefed<CSSValue> DoGetFlexBasis();
already_AddRefed<CSSValue> DoGetFlexDirection();
already_AddRefed<CSSValue> DoGetFlexGrow();
already_AddRefed<CSSValue> DoGetFlexShrink();
already_AddRefed<CSSValue> DoGetFlexWrap();
/* CSS Flexbox/Grid properties */
already_AddRefed<CSSValue> DoGetOrder();
/* CSS Box Alignment properties */
already_AddRefed<CSSValue> DoGetAlignContent();
already_AddRefed<CSSValue> DoGetAlignItems();
already_AddRefed<CSSValue> DoGetAlignSelf();
already_AddRefed<CSSValue> DoGetJustifyContent();
already_AddRefed<CSSValue> DoGetJustifyItems();
already_AddRefed<CSSValue> DoGetJustifySelf();
/* SVG properties */
already_AddRefed<CSSValue> DoGetFill();
already_AddRefed<CSSValue> DoGetStroke();
already_AddRefed<CSSValue> DoGetMarkerEnd();
already_AddRefed<CSSValue> DoGetMarkerMid();
already_AddRefed<CSSValue> DoGetMarkerStart();
already_AddRefed<CSSValue> DoGetStrokeDasharray();
already_AddRefed<CSSValue> DoGetStrokeDashoffset();
already_AddRefed<CSSValue> DoGetStrokeWidth();
already_AddRefed<CSSValue> DoGetVectorEffect();
already_AddRefed<CSSValue> DoGetFillOpacity();
already_AddRefed<CSSValue> DoGetFloodOpacity();
already_AddRefed<CSSValue> DoGetStopOpacity();
already_AddRefed<CSSValue> DoGetStrokeMiterlimit();
already_AddRefed<CSSValue> DoGetStrokeOpacity();
already_AddRefed<CSSValue> DoGetClipRule();
already_AddRefed<CSSValue> DoGetFillRule();
already_AddRefed<CSSValue> DoGetStrokeLinecap();
already_AddRefed<CSSValue> DoGetStrokeLinejoin();
already_AddRefed<CSSValue> DoGetTextAnchor();
already_AddRefed<CSSValue> DoGetColorInterpolation();
already_AddRefed<CSSValue> DoGetColorInterpolationFilters();
already_AddRefed<CSSValue> DoGetDominantBaseline();
already_AddRefed<CSSValue> DoGetImageRendering();
already_AddRefed<CSSValue> DoGetShapeRendering();
already_AddRefed<CSSValue> DoGetTextRendering();
already_AddRefed<CSSValue> DoGetFloodColor();
already_AddRefed<CSSValue> DoGetLightingColor();
already_AddRefed<CSSValue> DoGetStopColor();
already_AddRefed<CSSValue> DoGetClipPath();
already_AddRefed<CSSValue> DoGetFilter();
already_AddRefed<CSSValue> DoGetMaskType();
already_AddRefed<CSSValue> DoGetPaintOrder();
/* Custom properties */
already_AddRefed<CSSValue> DoGetCustomProperty(const nsAString& aPropertyName);
/* Helper functions */
void SetToRGBAColor(nsROCSSPrimitiveValue* aValue, nscolor aColor);
void SetValueFromComplexColor(nsROCSSPrimitiveValue* aValue,
const mozilla::StyleComplexColor& aColor);
void SetValueToStyleImage(const nsStyleImage& aStyleImage,
nsROCSSPrimitiveValue* aValue);
void SetValueToPositionCoord(const mozilla::Position::Coord& aCoord,
nsROCSSPrimitiveValue* aValue);
void SetValueToPosition(const mozilla::Position& aPosition,
nsDOMCSSValueList* aValueList);
void SetValueToURLValue(const mozilla::css::URLValueData* aURL,
nsROCSSPrimitiveValue* aValue);
/**
* A method to get a percentage base for a percentage value. Returns true
* if a percentage base value was determined, false otherwise.
*/
typedef bool (nsComputedDOMStyle::*PercentageBaseGetter)(nscoord&);
/**
* Method to set aValue to aCoord. If aCoord is a percentage value and
* aPercentageBaseGetter is not null, aPercentageBaseGetter is called. If it
* returns true, the percentage base it outputs in its out param is used
* to compute an nscoord value. If the getter is null or returns false,
* the percent value of aCoord is set as a percent value on aValue. aTable,
* if not null, is the keyword table to handle eStyleUnit_Enumerated. When
* calling SetAppUnits on aValue (for coord or percent values), the value
* passed in will be clamped to be no less than aMinAppUnits and no more than
* aMaxAppUnits.
*
* XXXbz should caller pass in some sort of bitfield indicating which units
* can be expected or something?
*/
void SetValueToCoord(nsROCSSPrimitiveValue* aValue,
const nsStyleCoord& aCoord,
bool aClampNegativeCalc,
PercentageBaseGetter aPercentageBaseGetter = nullptr,
const KTableEntry aTable[] = nullptr,
nscoord aMinAppUnits = nscoord_MIN,
nscoord aMaxAppUnits = nscoord_MAX);
/**
* If aCoord is a eStyleUnit_Coord returns the nscoord. If it's
* eStyleUnit_Percent, attempts to resolve the percentage base and returns
* the resulting nscoord. If it's some other unit or a percentge base can't
* be determined, returns aDefaultValue.
*/
nscoord StyleCoordToNSCoord(const nsStyleCoord& aCoord,
PercentageBaseGetter aPercentageBaseGetter,
nscoord aDefaultValue,
bool aClampNegativeCalc);
bool GetCBContentWidth(nscoord& aWidth);
bool GetCBContentHeight(nscoord& aWidth);
bool GetScrollFrameContentWidth(nscoord& aWidth);
bool GetScrollFrameContentHeight(nscoord& aHeight);
bool GetFrameBoundsWidthForTransform(nscoord &aWidth);
bool GetFrameBoundsHeightForTransform(nscoord &aHeight);
bool GetFrameBorderRectWidth(nscoord& aWidth);
bool GetFrameBorderRectHeight(nscoord& aHeight);
/* Helper functions for computing the filter property style. */
void SetCssTextToCoord(nsAString& aCssText, const nsStyleCoord& aCoord);
already_AddRefed<CSSValue> CreatePrimitiveValueForStyleFilter(
const nsStyleFilter& aStyleFilter);
already_AddRefed<CSSValue>
GetShapeSource(const mozilla::StyleShapeSource& aShapeSource,
const KTableEntry aBoxKeywordTable[]);
template<typename ReferenceBox>
already_AddRefed<CSSValue>
CreatePrimitiveValueForShapeSource(
const mozilla::StyleBasicShape* aStyleBasicShape,
ReferenceBox aReferenceBox,
const KTableEntry aBoxKeywordTable[]);
// Helper function for computing basic shape styles.
already_AddRefed<CSSValue> CreatePrimitiveValueForBasicShape(
const mozilla::StyleBasicShape* aStyleBasicShape);
void BoxValuesToString(nsAString& aString,
const nsTArray<nsStyleCoord>& aBoxValues);
void BasicShapeRadiiToString(nsAString& aCssText,
const nsStyleCorners& aCorners);
static nsComputedStyleMap* GetComputedStyleMap();
// We don't really have a good immutable representation of "presentation".
// Given the way GetComputedStyle is currently used, we should just grab the
// 0th presshell, if any, from the document.
nsWeakPtr mDocumentWeak;
nsCOMPtr<nsIContent> mContent;
/**
* Strong reference to the style context we access data from. This can be
* either a style context we resolved ourselves or a style context we got
* from our frame.
*
* If we got the style context from the frame, we clear out mStyleContext
* in ClearCurrentStyleSources. If we resolved one ourselves, then
* ClearCurrentStyleSources leaves it in mStyleContext for use the next
* time this nsComputedDOMStyle object is queried. UpdateCurrentStyleSources
* in this case will check that the style context is still valid to be used,
* by checking whether flush styles results in any restyles having been
* processed.
*
* Since an ArenaRefPtr is used to hold the style context, it will be cleared
* if the pres arena from which it was allocated goes away.
*/
mozilla::ArenaRefPtr<nsStyleContext> mStyleContext;
nsCOMPtr<nsIAtom> mPseudo;
/*
* While computing style data, the primary frame for mContent --- named "outer"
* because we should use it to compute positioning data. Null
* otherwise.
*/
nsIFrame* mOuterFrame;
/*
* While computing style data, the "inner frame" for mContent --- the frame
* which we should use to compute margin, border, padding and content data. Null
* otherwise.
*/
nsIFrame* mInnerFrame;
/*
* While computing style data, the presshell we're working with. Null
* otherwise.
*/
nsIPresShell* mPresShell;
/**
* The nsComputedDOMStyle generation at the time we last resolved a style
* context and stored it in mStyleContext.
*/
uint64_t mStyleContextGeneration;
bool mExposeVisitedStyle;
/**
* Whether we resolved a style context last time we called
* UpdateCurrentStyleSources. Initially false.
*/
bool mResolvedStyleContext;
/**
* Whether we include animation rules in the computed style.
*/
AnimationFlag mAnimationFlag;
#ifdef DEBUG
bool mFlushedPendingReflows;
#endif
};
already_AddRefed<nsComputedDOMStyle>
NS_NewComputedDOMStyle(mozilla::dom::Element* aElement,
const nsAString& aPseudoElt,
nsIPresShell* aPresShell,
nsComputedDOMStyle::AnimationFlag aFlag =
nsComputedDOMStyle::eWithAnimation);
#endif /* nsComputedDOMStyle_h__ */