blob: 5f655ead62e6b6ee47b559aa2f6019e30f84f21e [file] [log] [blame]
/*
* Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
* Copyright (C) 2004-2017 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#include "config.h"
#include "StyleRareNonInheritedData.h"
#include "ContentData.h"
#include "RenderCounter.h"
#include "RenderStyle.h"
#include "ShadowData.h"
#include "StyleCustomPropertyData.h"
#include "StyleFilterData.h"
#include "StyleTransformData.h"
#include "StyleImage.h"
#include "StyleResolver.h"
#include <wtf/PointerComparison.h>
#include <wtf/RefPtr.h>
#include <wtf/text/TextStream.h>
namespace WebCore {
DEFINE_ALLOCATOR_WITH_HEAP_IDENTIFIER(StyleRareNonInheritedData);
StyleRareNonInheritedData::StyleRareNonInheritedData()
: opacity(RenderStyle::initialOpacity())
, aspectRatioWidth(RenderStyle::initialAspectRatioWidth())
, aspectRatioHeight(RenderStyle::initialAspectRatioHeight())
, containIntrinsicWidth(RenderStyle::initialContainIntrinsicWidth())
, containIntrinsicHeight(RenderStyle::initialContainIntrinsicHeight())
, contain(RenderStyle::initialContainment())
, perspective(RenderStyle::initialPerspective())
, perspectiveOriginX(RenderStyle::initialPerspectiveOriginX())
, perspectiveOriginY(RenderStyle::initialPerspectiveOriginY())
, lineClamp(RenderStyle::initialLineClamp())
, initialLetter(RenderStyle::initialInitialLetter())
, deprecatedFlexibleBox(StyleDeprecatedFlexibleBoxData::create())
, flexibleBox(StyleFlexibleBoxData::create())
, marquee(StyleMarqueeData::create())
, multiCol(StyleMultiColData::create())
, transform(StyleTransformData::create())
, filter(StyleFilterData::create())
#if ENABLE(FILTERS_LEVEL_2)
, backdropFilter(StyleFilterData::create())
#endif
, grid(StyleGridData::create())
, gridItem(StyleGridItemData::create())
, overscrollBehaviorX(static_cast<unsigned>(RenderStyle::initialOverscrollBehaviorX()))
, overscrollBehaviorY(static_cast<unsigned>(RenderStyle::initialOverscrollBehaviorY()))
, willChange(RenderStyle::initialWillChange())
, mask(FillLayer::create(FillLayerType::Mask))
, maskBoxImage(NinePieceImage::Type::Mask)
, objectPosition(RenderStyle::initialObjectPosition())
, shapeOutside(RenderStyle::initialShapeOutside())
, shapeMargin(RenderStyle::initialShapeMargin())
, shapeImageThreshold(RenderStyle::initialShapeImageThreshold())
, order(RenderStyle::initialOrder())
, clipPath(RenderStyle::initialClipPath())
, visitedLinkBackgroundColor(RenderStyle::initialBackgroundColor())
, alignContent(RenderStyle::initialContentAlignment())
, alignItems(RenderStyle::initialDefaultAlignment())
, alignSelf(RenderStyle::initialSelfAlignment())
, justifyContent(RenderStyle::initialContentAlignment())
, justifyItems(RenderStyle::initialJustifyItems())
, justifySelf(RenderStyle::initialSelfAlignment())
, customProperties(StyleCustomPropertyData::create())
, rotate(RenderStyle::initialRotate())
, scale(RenderStyle::initialScale())
, translate(RenderStyle::initialTranslate())
, offsetPath(RenderStyle::initialOffsetPath())
, touchActions(RenderStyle::initialTouchActions())
, pageSizeType(PAGE_SIZE_AUTO)
, transformStyle3D(static_cast<unsigned>(RenderStyle::initialTransformStyle3D()))
, transformStyleForcedToFlat(false)
, backfaceVisibility(static_cast<unsigned>(RenderStyle::initialBackfaceVisibility()))
, userDrag(static_cast<unsigned>(RenderStyle::initialUserDrag()))
, textOverflow(static_cast<unsigned>(RenderStyle::initialTextOverflow()))
, useSmoothScrolling(static_cast<unsigned>(RenderStyle::initialUseSmoothScrolling()))
, appearance(static_cast<unsigned>(RenderStyle::initialAppearance()))
, effectiveAppearance(static_cast<unsigned>(RenderStyle::initialAppearance()))
, textDecorationStyle(static_cast<unsigned>(RenderStyle::initialTextDecorationStyle()))
, aspectRatioType(static_cast<unsigned>(RenderStyle::initialAspectRatioType()))
#if ENABLE(CSS_COMPOSITING)
, effectiveBlendMode(static_cast<unsigned>(RenderStyle::initialBlendMode()))
, isolation(static_cast<unsigned>(RenderStyle::initialIsolation()))
#endif
#if ENABLE(APPLE_PAY)
, applePayButtonStyle(static_cast<unsigned>(RenderStyle::initialApplePayButtonStyle()))
, applePayButtonType(static_cast<unsigned>(RenderStyle::initialApplePayButtonType()))
#endif
, objectFit(static_cast<unsigned>(RenderStyle::initialObjectFit()))
, breakBefore(static_cast<unsigned>(RenderStyle::initialBreakBetween()))
, breakAfter(static_cast<unsigned>(RenderStyle::initialBreakBetween()))
, breakInside(static_cast<unsigned>(RenderStyle::initialBreakInside()))
, resize(static_cast<unsigned>(RenderStyle::initialResize()))
, inputSecurity(static_cast<unsigned>(RenderStyle::initialInputSecurity()))
, hasAttrContent(false)
, isNotFinal(false)
, containIntrinsicWidthType(static_cast<unsigned>(RenderStyle::initialContainIntrinsicWidthType()))
, containIntrinsicHeightType(static_cast<unsigned>(RenderStyle::initialContainIntrinsicHeightType()))
, containerType(static_cast<unsigned>(RenderStyle::initialContainerType()))
, columnGap(RenderStyle::initialColumnGap())
, rowGap(RenderStyle::initialRowGap())
, offsetDistance(RenderStyle::initialOffsetDistance())
, offsetPosition(RenderStyle::initialOffsetPosition())
, offsetAnchor(RenderStyle::initialOffsetAnchor())
, offsetRotate(RenderStyle::initialOffsetRotate())
{
}
inline StyleRareNonInheritedData::StyleRareNonInheritedData(const StyleRareNonInheritedData& o)
: RefCounted<StyleRareNonInheritedData>()
, opacity(o.opacity)
, aspectRatioWidth(o.aspectRatioWidth)
, aspectRatioHeight(o.aspectRatioHeight)
, containIntrinsicWidth(o.containIntrinsicWidth)
, containIntrinsicHeight(o.containIntrinsicHeight)
, contain(o.contain)
, perspective(o.perspective)
, perspectiveOriginX(o.perspectiveOriginX)
, perspectiveOriginY(o.perspectiveOriginY)
, lineClamp(o.lineClamp)
, initialLetter(o.initialLetter)
, deprecatedFlexibleBox(o.deprecatedFlexibleBox)
, flexibleBox(o.flexibleBox)
, marquee(o.marquee)
, multiCol(o.multiCol)
, transform(o.transform)
, filter(o.filter)
#if ENABLE(FILTERS_LEVEL_2)
, backdropFilter(o.backdropFilter)
#endif
, grid(o.grid)
, gridItem(o.gridItem)
, scrollMargin(o.scrollMargin)
, scrollPadding(o.scrollPadding)
, scrollSnapType(o.scrollSnapType)
, scrollSnapAlign(o.scrollSnapAlign)
, scrollSnapStop(o.scrollSnapStop)
, overscrollBehaviorX(o.overscrollBehaviorX)
, overscrollBehaviorY(o.overscrollBehaviorY)
, content(o.content ? o.content->clone() : nullptr)
, counterDirectives(o.counterDirectives ? makeUnique<CounterDirectiveMap>(*o.counterDirectives) : nullptr)
, altText(o.altText)
, boxShadow(o.boxShadow ? makeUnique<ShadowData>(*o.boxShadow) : nullptr)
, willChange(o.willChange)
, boxReflect(o.boxReflect)
, animations(o.animations ? o.animations->copy() : o.animations)
, transitions(o.transitions ? o.transitions->copy() : o.transitions)
, mask(o.mask)
, maskBoxImage(o.maskBoxImage)
, pageSize(o.pageSize)
, objectPosition(o.objectPosition)
, shapeOutside(o.shapeOutside)
, shapeMargin(o.shapeMargin)
, shapeImageThreshold(o.shapeImageThreshold)
, order(o.order)
, clipPath(o.clipPath)
, textDecorationColor(o.textDecorationColor)
, visitedLinkTextDecorationColor(o.visitedLinkTextDecorationColor)
, visitedLinkBackgroundColor(o.visitedLinkBackgroundColor)
, visitedLinkOutlineColor(o.visitedLinkOutlineColor)
, visitedLinkBorderLeftColor(o.visitedLinkBorderLeftColor)
, visitedLinkBorderRightColor(o.visitedLinkBorderRightColor)
, visitedLinkBorderTopColor(o.visitedLinkBorderTopColor)
, visitedLinkBorderBottomColor(o.visitedLinkBorderBottomColor)
, alignContent(o.alignContent)
, alignItems(o.alignItems)
, alignSelf(o.alignSelf)
, justifyContent(o.justifyContent)
, justifyItems(o.justifyItems)
, justifySelf(o.justifySelf)
, customProperties(o.customProperties)
, customPaintWatchedProperties(o.customPaintWatchedProperties)
, rotate(o.rotate)
, scale(o.scale)
, translate(o.translate)
, offsetPath(o.offsetPath)
, touchActions(o.touchActions)
, pageSizeType(o.pageSizeType)
, transformStyle3D(o.transformStyle3D)
, transformStyleForcedToFlat(o.transformStyleForcedToFlat)
, backfaceVisibility(o.backfaceVisibility)
, userDrag(o.userDrag)
, textOverflow(o.textOverflow)
, useSmoothScrolling(o.useSmoothScrolling)
, appearance(o.appearance)
, effectiveAppearance(o.effectiveAppearance)
, textDecorationStyle(o.textDecorationStyle)
, aspectRatioType(o.aspectRatioType)
#if ENABLE(CSS_COMPOSITING)
, effectiveBlendMode(o.effectiveBlendMode)
, isolation(o.isolation)
#endif
#if ENABLE(APPLE_PAY)
, applePayButtonStyle(o.applePayButtonStyle)
, applePayButtonType(o.applePayButtonType)
#endif
, objectFit(o.objectFit)
, breakBefore(o.breakBefore)
, breakAfter(o.breakAfter)
, breakInside(o.breakInside)
, resize(o.resize)
, inputSecurity(o.inputSecurity)
, hasAttrContent(o.hasAttrContent)
, isNotFinal(o.isNotFinal)
, containIntrinsicWidthType(o.containIntrinsicWidthType)
, containIntrinsicHeightType(o.containIntrinsicHeightType)
, containerType(o.containerType)
, containerNames(o.containerNames)
, columnGap(o.columnGap)
, rowGap(o.rowGap)
, offsetDistance(o.offsetDistance)
, offsetPosition(o.offsetPosition)
, offsetAnchor(o.offsetAnchor)
, offsetRotate(o.offsetRotate)
{
}
Ref<StyleRareNonInheritedData> StyleRareNonInheritedData::copy() const
{
return adoptRef(*new StyleRareNonInheritedData(*this));
}
StyleRareNonInheritedData::~StyleRareNonInheritedData() = default;
bool StyleRareNonInheritedData::operator==(const StyleRareNonInheritedData& o) const
{
return opacity == o.opacity
&& aspectRatioWidth == o.aspectRatioWidth
&& aspectRatioHeight == o.aspectRatioHeight
&& containIntrinsicWidth == o.containIntrinsicWidth
&& containIntrinsicHeight == o.containIntrinsicHeight
&& contain == o.contain
&& perspective == o.perspective
&& perspectiveOriginX == o.perspectiveOriginX
&& perspectiveOriginY == o.perspectiveOriginY
&& lineClamp == o.lineClamp
&& initialLetter == o.initialLetter
&& deprecatedFlexibleBox == o.deprecatedFlexibleBox
&& flexibleBox == o.flexibleBox
&& marquee == o.marquee
&& multiCol == o.multiCol
&& transform == o.transform
&& filter == o.filter
#if ENABLE(FILTERS_LEVEL_2)
&& backdropFilter == o.backdropFilter
#endif
&& grid == o.grid
&& gridItem == o.gridItem
&& scrollMargin == o.scrollMargin
&& scrollPadding == o.scrollPadding
&& scrollSnapType == o.scrollSnapType
&& scrollSnapAlign == o.scrollSnapAlign
&& scrollSnapStop == o.scrollSnapStop
&& overscrollBehaviorX == o.overscrollBehaviorX
&& overscrollBehaviorY == o.overscrollBehaviorY
&& contentDataEquivalent(o)
&& arePointingToEqualData(counterDirectives, o.counterDirectives)
&& altText == o.altText
&& arePointingToEqualData(boxShadow, o.boxShadow)
&& arePointingToEqualData(willChange, o.willChange)
&& arePointingToEqualData(boxReflect, o.boxReflect)
&& arePointingToEqualData(animations, o.animations)
&& arePointingToEqualData(transitions, o.transitions)
&& mask == o.mask
&& maskBoxImage == o.maskBoxImage
&& pageSize == o.pageSize
&& objectPosition == o.objectPosition
&& arePointingToEqualData(shapeOutside, o.shapeOutside)
&& shapeMargin == o.shapeMargin
&& shapeImageThreshold == o.shapeImageThreshold
&& order == o.order
&& arePointingToEqualData(clipPath, o.clipPath)
&& textDecorationColor == o.textDecorationColor
&& visitedLinkTextDecorationColor == o.visitedLinkTextDecorationColor
&& visitedLinkBackgroundColor == o.visitedLinkBackgroundColor
&& visitedLinkOutlineColor == o.visitedLinkOutlineColor
&& visitedLinkBorderLeftColor == o.visitedLinkBorderLeftColor
&& visitedLinkBorderRightColor == o.visitedLinkBorderRightColor
&& visitedLinkBorderTopColor == o.visitedLinkBorderTopColor
&& visitedLinkBorderBottomColor == o.visitedLinkBorderBottomColor
&& alignContent == o.alignContent
&& alignItems == o.alignItems
&& alignSelf == o.alignSelf
&& justifyContent == o.justifyContent
&& justifyItems == o.justifyItems
&& justifySelf == o.justifySelf
&& customProperties == o.customProperties
&& customPaintWatchedProperties == o.customPaintWatchedProperties
&& pageSizeType == o.pageSizeType
&& transformStyle3D == o.transformStyle3D
&& transformStyleForcedToFlat == o.transformStyleForcedToFlat
&& backfaceVisibility == o.backfaceVisibility
&& userDrag == o.userDrag
&& textOverflow == o.textOverflow
&& useSmoothScrolling == o.useSmoothScrolling
&& appearance == o.appearance
&& effectiveAppearance == o.effectiveAppearance
&& textDecorationStyle == o.textDecorationStyle
&& arePointingToEqualData(rotate, o.rotate)
&& arePointingToEqualData(scale, o.scale)
&& arePointingToEqualData(translate, o.translate)
&& arePointingToEqualData(offsetPath, o.offsetPath)
&& touchActions == o.touchActions
#if ENABLE(CSS_COMPOSITING)
&& effectiveBlendMode == o.effectiveBlendMode
&& isolation == o.isolation
#endif
#if ENABLE(APPLE_PAY)
&& applePayButtonStyle == o.applePayButtonStyle
&& applePayButtonType == o.applePayButtonType
#endif
&& aspectRatioType == o.aspectRatioType
&& objectFit == o.objectFit
&& breakAfter == o.breakAfter
&& breakBefore == o.breakBefore
&& breakInside == o.breakInside
&& resize == o.resize
&& inputSecurity == o.inputSecurity
&& hasAttrContent == o.hasAttrContent
&& isNotFinal == o.isNotFinal
&& containIntrinsicWidthType == o.containIntrinsicWidthType
&& containIntrinsicHeightType == o.containIntrinsicHeightType
&& containerType == o.containerType
&& containerNames == o.containerNames
&& columnGap == o.columnGap
&& rowGap == o.rowGap
&& offsetDistance == o.offsetDistance
&& offsetPosition == o.offsetPosition
&& offsetAnchor == o.offsetAnchor
&& offsetRotate == o.offsetRotate;
}
bool StyleRareNonInheritedData::contentDataEquivalent(const StyleRareNonInheritedData& other) const
{
auto* a = content.get();
auto* b = other.content.get();
while (a && b && *a == *b) {
a = a->next();
b = b->next();
}
return !a && !b;
}
bool StyleRareNonInheritedData::hasFilters() const
{
return !filter->operations.isEmpty();
}
OptionSet<Containment> StyleRareNonInheritedData::effectiveContainment() const
{
auto containment = contain;
switch (static_cast<ContainerType>(containerType)) {
case ContainerType::None:
break;
case ContainerType::Size:
containment.add({ Containment::Layout, Containment::Style, Containment::Size });
break;
case ContainerType::InlineSize:
containment.add({ Containment::Layout, Containment::Style, Containment::InlineSize });
break;
};
return containment;
}
#if ENABLE(FILTERS_LEVEL_2)
bool StyleRareNonInheritedData::hasBackdropFilters() const
{
return !backdropFilter->operations.isEmpty();
}
#endif
} // namespace WebCore