diff options
Diffstat (limited to 'layout/style/nsComputedDOMStyle.h')
-rw-r--r-- | layout/style/nsComputedDOMStyle.h | 749 |
1 files changed, 749 insertions, 0 deletions
diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h new file mode 100644 index 000000000..223b29a14 --- /dev/null +++ b/layout/style/nsComputedDOMStyle.h @@ -0,0 +1,749 @@ +/* -*- 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; + +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 StyleType { + eDefaultOnly, // Only includes UA and user sheets + eAll // Includes all stylesheets + }; + + nsComputedDOMStyle(mozilla::dom::Element* aElement, + const nsAString& aPseudoElt, + nsIPresShell* aPresShell, + StyleType aStyleType); + + virtual nsINode *GetParentObject() override + { + return mContent; + } + + static already_AddRefed<nsStyleContext> + GetStyleContextForElement(mozilla::dom::Element* aElement, nsIAtom* aPseudo, + nsIPresShell* aPresShell, + StyleType aStyleType = eAll); + + static already_AddRefed<nsStyleContext> + GetStyleContextForElementNoFlush(mozilla::dom::Element* aElement, + nsIAtom* aPseudo, + nsIPresShell* aPresShell, + StyleType aStyleType = eAll); + + 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; + + 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); + +#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, + uint8_t aFullCorner); + + already_AddRefed<CSSValue> GetOffsetWidthFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetAbsoluteOffset(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetRelativeOffset(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetStickyOffset(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetStaticOffset(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetPaddingWidthFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetBorderColorsFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetBorderStyleFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetBorderWidthFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetBorderColorFor(mozilla::css::Side aSide); + + already_AddRefed<CSSValue> GetMarginWidthFor(mozilla::css::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); + + already_AddRefed<CSSValue> GetBackgroundList( + uint8_t nsStyleImageLayers::Layer::* aMember, + uint32_t nsStyleImageLayers::* aCount, + const nsStyleImageLayers& aLayers, + const KTableEntry aTable[]); + + 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(); + + /* 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> 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> DoGetTextOrientation(); + already_AddRefed<CSSValue> DoGetTextOverflow(); + already_AddRefed<CSSValue> DoGetTextTransform(); + already_AddRefed<CSSValue> DoGetTextShadow(); + 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> DoGetTextSizeAdjust(); + 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> 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> 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); + + nsDOMCSSValueList* GetROCSSValueList(bool aCommaDelimited); + + /* 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); + + template<typename ReferenceBox> + already_AddRefed<CSSValue> + GetShapeSource(const mozilla::StyleShapeSource<ReferenceBox>& 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 kind of styles we should be returning. + */ + StyleType mStyleType; + + /** + * 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; + +#ifdef DEBUG + bool mFlushedPendingReflows; +#endif +}; + +already_AddRefed<nsComputedDOMStyle> +NS_NewComputedDOMStyle(mozilla::dom::Element* aElement, + const nsAString& aPseudoElt, + nsIPresShell* aPresShell, + nsComputedDOMStyle::StyleType aStyleType = + nsComputedDOMStyle::eAll); + +#endif /* nsComputedDOMStyle_h__ */ |