blob: ddd3ed2878623a160dada92dea4449ce75eba68f [file]
/*
* Copyright (C) 2026 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "CSSLightDarkImageValue.h"
#include "CSSKeywordValue.h"
#include "Document.h"
#include "StyleBuilderState.h"
#include "StyleColorImage.h"
namespace WebCore {
Ref<CSSLightDarkImageValue> CSSLightDarkImageValue::create(Ref<CSSValue>&& lightValue, Ref<CSSValue>&& darkValue)
{
return adoptRef(*new CSSLightDarkImageValue(WTF::move(lightValue), WTF::move(darkValue)));
}
CSSLightDarkImageValue::CSSLightDarkImageValue(Ref<CSSValue>&& lightValue, Ref<CSSValue>&& darkValue)
: CSSValue { ClassType::LightDarkImage }
, m_lightValue { WTF::move(lightValue) }
, m_darkValue { WTF::move(darkValue) }
{
}
CSSLightDarkImageValue::~CSSLightDarkImageValue() = default;
String CSSLightDarkImageValue::customCSSText(const CSS::SerializationContext& context) const
{
return makeString("light-dark("_s, m_lightValue->cssText(context), ", "_s, m_darkValue->cssText(context), ')');
}
bool CSSLightDarkImageValue::equals(const CSSLightDarkImageValue& other) const
{
return compareCSSValue(m_lightValue, other.m_lightValue)
&& compareCSSValue(m_darkValue, other.m_darkValue);
}
static RefPtr<Style::Image> resolveImageOrNone(const CSSValue& value, const Style::BuilderState& state)
{
if (auto* keyword = dynamicDowncast<CSSKeywordValue>(value); keyword && keyword->valueID() == CSSValueNone)
return Style::ColorImage::create(Style::Color { WebCore::Color::transparentBlack });
return state.createStyleImage(value);
}
RefPtr<Style::Image> CSSLightDarkImageValue::createStyleImage(const Style::BuilderState& state) const
{
CheckedRef style = state.style();
bool isDark = state.document().useDarkAppearance(style.ptr());
Ref activeValue = isDark ? m_darkValue.get() : m_lightValue.get();
return resolveImageOrNone(activeValue, state);
}
IterationStatus CSSLightDarkImageValue::customVisitChildren(NOESCAPE const Function<IterationStatus(CSSValue&)>& func) const
{
if (func(m_lightValue) == IterationStatus::Done)
return IterationStatus::Done;
return func(m_darkValue);
}
} // namespace WebCore