Revert "LibWeb/CSS: Implement 'background-blend-mode'"

This reverts commit a73cd88f0c.

Emitting SaveLayer for each paintable made rasterization a lot slower
on every website because now Skia has to allocate enormous amounts of
temporary surfaces. Let's revert it for now and figure how to implement
it with less aggressive SaveLayer usage.
This commit is contained in:
Aliaksandr Kalenik 2025-03-28 13:45:50 +00:00 committed by Alexander Kalenik
commit 552dd18696
Notes: github-actions[bot] 2025-03-28 16:49:06 +00:00
27 changed files with 199 additions and 303 deletions

View file

@ -296,7 +296,6 @@ struct BackgroundLayerData {
CSS::LengthPercentage size_y { CSS::Length::make_auto() }; CSS::LengthPercentage size_y { CSS::Length::make_auto() };
CSS::Repeat repeat_x { CSS::Repeat::Repeat }; CSS::Repeat repeat_x { CSS::Repeat::Repeat };
CSS::Repeat repeat_y { CSS::Repeat::Repeat }; CSS::Repeat repeat_y { CSS::Repeat::Repeat };
CSS::MixBlendMode blend_mode { CSS::MixBlendMode::Normal };
}; };
struct BorderData { struct BorderData {

View file

@ -443,7 +443,6 @@ Parser::ParseErrorOr<NonnullRefPtr<CSSStyleValue>> Parser::parse_css_value(Prope
return parsed_value.release_nonnull(); return parsed_value.release_nonnull();
return ParseError::SyntaxError; return ParseError::SyntaxError;
case PropertyID::BackgroundAttachment: case PropertyID::BackgroundAttachment:
case PropertyID::BackgroundBlendMode:
case PropertyID::BackgroundClip: case PropertyID::BackgroundClip:
case PropertyID::BackgroundImage: case PropertyID::BackgroundImage:
case PropertyID::BackgroundOrigin: case PropertyID::BackgroundOrigin:

View file

@ -327,14 +327,6 @@
"background-attachment" "background-attachment"
] ]
}, },
"background-blend-mode": {
"animation-type": "none",
"inherited": false,
"initial": "normal",
"valid-types": [
"mix-blend-mode"
]
},
"background-clip": { "background-clip": {
"affects-layout": false, "affects-layout": false,
"animation-type": "repeatable-list", "animation-type": "repeatable-list",

View file

@ -397,7 +397,6 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
auto const& y_positions = computed_style.property(CSS::PropertyID::BackgroundPositionY); auto const& y_positions = computed_style.property(CSS::PropertyID::BackgroundPositionY);
auto const& repeats = computed_style.property(CSS::PropertyID::BackgroundRepeat); auto const& repeats = computed_style.property(CSS::PropertyID::BackgroundRepeat);
auto const& sizes = computed_style.property(CSS::PropertyID::BackgroundSize); auto const& sizes = computed_style.property(CSS::PropertyID::BackgroundSize);
auto const& background_blend_modes = computed_style.property(CSS::PropertyID::BackgroundBlendMode);
auto count_layers = [](auto const& maybe_style_value) -> size_t { auto count_layers = [](auto const& maybe_style_value) -> size_t {
if (maybe_style_value.is_value_list()) if (maybe_style_value.is_value_list())
@ -511,8 +510,6 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
layer.repeat_y = repeat_value->as_background_repeat().repeat_y(); layer.repeat_y = repeat_value->as_background_repeat().repeat_y();
} }
layer.blend_mode = CSS::keyword_to_mix_blend_mode(value_for_layer(background_blend_modes, layer_index)->to_keyword()).value_or(CSS::MixBlendMode::Normal);
layers.append(move(layer)); layers.append(move(layer));
} }

View file

@ -11,7 +11,6 @@
#include <LibWeb/Layout/TextNode.h> #include <LibWeb/Layout/TextNode.h>
#include <LibWeb/Layout/Viewport.h> #include <LibWeb/Layout/Viewport.h>
#include <LibWeb/Painting/BackgroundPainting.h> #include <LibWeb/Painting/BackgroundPainting.h>
#include <LibWeb/Painting/Blending.h>
#include <LibWeb/Painting/DisplayListRecorder.h> #include <LibWeb/Painting/DisplayListRecorder.h>
#include <LibWeb/Painting/PaintableBox.h> #include <LibWeb/Painting/PaintableBox.h>
@ -78,11 +77,6 @@ void paint_background(PaintContext& context, PaintableBox const& paintable_box,
{ {
auto& display_list_recorder = context.display_list_recorder(); auto& display_list_recorder = context.display_list_recorder();
// https://drafts.fxtf.org/compositing/#background-blend-mode
// Background layers must not blend with the content that is behind the element,
// instead they must act as if they are rendered into an isolated group.
display_list_recorder.save_layer();
DisplayListRecorderStateSaver state { display_list_recorder }; DisplayListRecorderStateSaver state { display_list_recorder };
if (resolved_background.needs_text_clip) { if (resolved_background.needs_text_clip) {
auto display_list = compute_text_clip_paths(context, paintable_box, resolved_background.background_rect.location()); auto display_list = compute_text_clip_paths(context, paintable_box, resolved_background.background_rect.location());
@ -273,11 +267,6 @@ void paint_background(PaintContext& context, PaintableBox const& paintable_box,
} }
}; };
Gfx::CompositingAndBlendingOperator compositing_and_blending_operator = mix_blend_mode_to_compositing_and_blending_operator(layer.blend_mode);
if (compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal) {
display_list_recorder.apply_compositing_and_blending_operator(compositing_and_blending_operator);
}
if (auto color = image.color_if_single_pixel_bitmap(); color.has_value()) { if (auto color = image.color_if_single_pixel_bitmap(); color.has_value()) {
// OPTIMIZATION: If the image is a single pixel, we can just fill the whole area with it. // OPTIMIZATION: If the image is a single pixel, we can just fill the whole area with it.
// However, we must first figure out the real coverage area, taking repeat etc into account. // However, we must first figure out the real coverage area, taking repeat etc into account.
@ -300,13 +289,7 @@ void paint_background(PaintContext& context, PaintableBox const& paintable_box,
image.paint(context, image_device_rect, image_rendering); image.paint(context, image_device_rect, image_rendering);
}); });
} }
if (compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal) {
display_list_recorder.restore();
}
} }
display_list_recorder.restore();
} }
ResolvedBackground resolve_background_layers(Vector<CSS::BackgroundLayerData> const& layers, PaintableBox const& paintable_box, Color background_color, CSSPixelRect const& border_rect, BorderRadiiData const& border_radii) ResolvedBackground resolve_background_layers(Vector<CSS::BackgroundLayerData> const& layers, PaintableBox const& paintable_box, Color background_color, CSSPixelRect const& border_rect, BorderRadiiData const& border_radii)
@ -421,8 +404,7 @@ ResolvedBackground resolve_background_layers(Vector<CSS::BackgroundLayerData> co
.background_positioning_area = background_positioning_area, .background_positioning_area = background_positioning_area,
.image_rect = image_rect, .image_rect = image_rect,
.repeat_x = layer.repeat_x, .repeat_x = layer.repeat_x,
.repeat_y = layer.repeat_y, .repeat_y = layer.repeat_y });
.blend_mode = layer.blend_mode });
} }
return ResolvedBackground { return ResolvedBackground {

View file

@ -24,7 +24,6 @@ struct ResolvedBackgroundLayerData {
CSSPixelRect image_rect; CSSPixelRect image_rect;
CSS::Repeat repeat_x; CSS::Repeat repeat_x;
CSS::Repeat repeat_y; CSS::Repeat repeat_y;
CSS::MixBlendMode blend_mode;
}; };
struct BackgroundBox { struct BackgroundBox {

View file

@ -1,48 +0,0 @@
/*
* Copyright (c) 2025, Glenn Skrzypczak <glenn.skrzypczak@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGfx/CompositingAndBlendingOperator.h>
#include <LibWeb/CSS/Enums.h>
namespace Web::Painting {
#define ENUMERATE_MIX_BLEND_MODES(E) \
E(Normal) \
E(Multiply) \
E(Screen) \
E(Overlay) \
E(Darken) \
E(Lighten) \
E(ColorDodge) \
E(ColorBurn) \
E(HardLight) \
E(SoftLight) \
E(Difference) \
E(Exclusion) \
E(Hue) \
E(Saturation) \
E(Color) \
E(Luminosity) \
E(PlusDarker) \
E(PlusLighter)
static Gfx::CompositingAndBlendingOperator mix_blend_mode_to_compositing_and_blending_operator(CSS::MixBlendMode blend_mode)
{
switch (blend_mode) {
#undef __ENUMERATE
#define __ENUMERATE(blend_mode) \
case CSS::MixBlendMode::blend_mode: \
return Gfx::CompositingAndBlendingOperator::blend_mode;
ENUMERATE_MIX_BLEND_MODES(__ENUMERATE)
#undef __ENUMERATE
default:
VERIFY_NOT_REACHED();
}
}
}

View file

@ -5,7 +5,6 @@
*/ */
#include <LibWeb/Layout/ImageBox.h> #include <LibWeb/Layout/ImageBox.h>
#include <LibWeb/Painting/Blending.h>
#include <LibWeb/Painting/DisplayListRecorder.h> #include <LibWeb/Painting/DisplayListRecorder.h>
#include <LibWeb/Painting/SVGSVGPaintable.h> #include <LibWeb/Painting/SVGSVGPaintable.h>
#include <LibWeb/Painting/StackingContext.h> #include <LibWeb/Painting/StackingContext.h>
@ -61,7 +60,16 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s
auto const& filter = computed_values.filter(); auto const& filter = computed_values.filter();
auto masking_area = svg_box.get_masking_area(); auto masking_area = svg_box.get_masking_area();
Gfx::CompositingAndBlendingOperator compositing_and_blending_operator = mix_blend_mode_to_compositing_and_blending_operator(computed_values.mix_blend_mode()); Gfx::CompositingAndBlendingOperator compositing_and_blending_operator;
switch (computed_values.mix_blend_mode()) {
#undef __ENUMERATE
#define __ENUMERATE(mix_blend_mode) \
case CSS::MixBlendMode::mix_blend_mode: \
compositing_and_blending_operator = Gfx::CompositingAndBlendingOperator::mix_blend_mode; \
break;
ENUMERATE_MIX_BLEND_MODES(__ENUMERATE)
#undef __ENUMERATE
}
auto needs_to_save_state = computed_values.isolation() == CSS::Isolation::Isolate || compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal || svg_box.has_css_transform() || svg_box.get_masking_area().has_value(); auto needs_to_save_state = computed_values.isolation() == CSS::Isolation::Isolate || compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal || svg_box.has_css_transform() || svg_box.get_masking_area().has_value();

View file

@ -14,7 +14,6 @@
#include <LibWeb/Layout/Box.h> #include <LibWeb/Layout/Box.h>
#include <LibWeb/Layout/ReplacedBox.h> #include <LibWeb/Layout/ReplacedBox.h>
#include <LibWeb/Layout/Viewport.h> #include <LibWeb/Layout/Viewport.h>
#include <LibWeb/Painting/Blending.h>
#include <LibWeb/Painting/DisplayListRecorder.h> #include <LibWeb/Painting/DisplayListRecorder.h>
#include <LibWeb/Painting/PaintableBox.h> #include <LibWeb/Painting/PaintableBox.h>
#include <LibWeb/Painting/SVGSVGPaintable.h> #include <LibWeb/Painting/SVGSVGPaintable.h>
@ -317,7 +316,16 @@ void StackingContext::paint(PaintContext& context) const
auto transform_matrix = paintable_box().transform(); auto transform_matrix = paintable_box().transform();
auto transform_origin = paintable_box().transform_origin().to_type<float>(); auto transform_origin = paintable_box().transform_origin().to_type<float>();
Gfx::CompositingAndBlendingOperator compositing_and_blending_operator = mix_blend_mode_to_compositing_and_blending_operator(paintable_box().computed_values().mix_blend_mode()); Gfx::CompositingAndBlendingOperator compositing_and_blending_operator;
switch (paintable_box().computed_values().mix_blend_mode()) {
#undef __ENUMERATE
#define __ENUMERATE(mix_blend_mode) \
case CSS::MixBlendMode::mix_blend_mode: \
compositing_and_blending_operator = Gfx::CompositingAndBlendingOperator::mix_blend_mode; \
break;
ENUMERATE_MIX_BLEND_MODES(__ENUMERATE)
#undef __ENUMERATE
}
DisplayListRecorder::PushStackingContextParams push_stacking_context_params { DisplayListRecorder::PushStackingContextParams push_stacking_context_params {
.opacity = opacity, .opacity = opacity,

View file

@ -12,6 +12,26 @@
namespace Web::Painting { namespace Web::Painting {
#define ENUMERATE_MIX_BLEND_MODES(E) \
E(Normal) \
E(Multiply) \
E(Screen) \
E(Overlay) \
E(Darken) \
E(Lighten) \
E(ColorDodge) \
E(ColorBurn) \
E(HardLight) \
E(SoftLight) \
E(Difference) \
E(Exclusion) \
E(Hue) \
E(Saturation) \
E(Color) \
E(Luminosity) \
E(PlusDarker) \
E(PlusLighter)
class StackingContext { class StackingContext {
friend class ViewportPaintable; friend class ViewportPaintable;

View file

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Reftest Reference</title>
<link rel="author" title="Mirela Budăeș" href="mailto:mbudaes@adobe.com">
<style>
div {
margin: 5px;
width: 130px;
height: 130px;
background: black;/*rgb(0,0,0);*/
display: block;
float: left;
}
</style>
</head>
<body>
<p>Test passes if there is no red square on the screen. <br>
You should see a black square.</p>
<div></div>
</body>
</html>

View file

@ -1,33 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Test: blending between multiple backgrounds (gradient and image) using background-blend-mode</title>
<link rel="author" title="Mirela Budăeș" href="mailto:mbudaes@adobe.com">
<link rel="reviewer" title="Mihai Balan" href="mailto:mibalan@adobe.com">
<link rel="reviewer" title="Rik Cabanier" href="mailto:cabanier@adobe.com">
<link rel="help" href="https://drafts.fxtf.org/compositing-1/#background-blend-mode">
<meta name="assert" content="Test checks that setting background-blend-mode property for an element with two background layers (a gradient and a png image) results in blending between the two layers.">
<link rel="match" href="../../../../../expected/wpt-import/css/compositing/background-blending/reference/background-blend-mode-gradient-image-ref.html">
<style>
div {
margin: 5px;
width: 130px;
height: 130px;
background: url('support/red.png') no-repeat 0 0 /100% 100%, linear-gradient(to right, lime 50%, blue 51%);
/*lime: rgb(0,255,0);
blue: rgb(0,0,255);*/
display: block;
float: left;
background-blend-mode: multiply, normal;
}
</style>
</head>
<body>
<p>Test passes if there is no red square on the screen. <br>
You should see a black square.</p>
<div></div>
<!-- FIXME: Workaround to ensure CSS background-image is loaded before taking screenshot: https://github.com/LadybirdBrowser/ladybird/issues/3448 -->
<img style="display: none;" src="support/red.png" />
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -16,4 +16,4 @@
3. Right click > "Take Full Screenshot" 3. Right click > "Take Full Screenshot"
4. Update the image below: 4. Update the image below:
--> -->
<img src="../images/css-background-clip-text-ref.png"> <img src="../images/css-background-clip-text.png">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 330 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Before After
Before After

View file

@ -77,162 +77,161 @@ All properties associated with getComputedStyle(document.body):
"74": "aspect-ratio", "74": "aspect-ratio",
"75": "backdrop-filter", "75": "backdrop-filter",
"76": "background-attachment", "76": "background-attachment",
"77": "background-blend-mode", "77": "background-clip",
"78": "background-clip", "78": "background-color",
"79": "background-color", "79": "background-image",
"80": "background-image", "80": "background-origin",
"81": "background-origin", "81": "background-position-x",
"82": "background-position-x", "82": "background-position-y",
"83": "background-position-y", "83": "background-repeat",
"84": "background-repeat", "84": "background-size",
"85": "background-size", "85": "block-size",
"86": "block-size", "86": "border-block-end-color",
"87": "border-block-end-color", "87": "border-block-end-style",
"88": "border-block-end-style", "88": "border-block-end-width",
"89": "border-block-end-width", "89": "border-block-start-color",
"90": "border-block-start-color", "90": "border-block-start-style",
"91": "border-block-start-style", "91": "border-block-start-width",
"92": "border-block-start-width", "92": "border-bottom-color",
"93": "border-bottom-color", "93": "border-bottom-left-radius",
"94": "border-bottom-left-radius", "94": "border-bottom-right-radius",
"95": "border-bottom-right-radius", "95": "border-bottom-style",
"96": "border-bottom-style", "96": "border-bottom-width",
"97": "border-bottom-width", "97": "border-inline-end-color",
"98": "border-inline-end-color", "98": "border-inline-end-style",
"99": "border-inline-end-style", "99": "border-inline-end-width",
"100": "border-inline-end-width", "100": "border-inline-start-color",
"101": "border-inline-start-color", "101": "border-inline-start-style",
"102": "border-inline-start-style", "102": "border-inline-start-width",
"103": "border-inline-start-width", "103": "border-left-color",
"104": "border-left-color", "104": "border-left-style",
"105": "border-left-style", "105": "border-left-width",
"106": "border-left-width", "106": "border-right-color",
"107": "border-right-color", "107": "border-right-style",
"108": "border-right-style", "108": "border-right-width",
"109": "border-right-width", "109": "border-top-color",
"110": "border-top-color", "110": "border-top-left-radius",
"111": "border-top-left-radius", "111": "border-top-right-radius",
"112": "border-top-right-radius", "112": "border-top-style",
"113": "border-top-style", "113": "border-top-width",
"114": "border-top-width", "114": "bottom",
"115": "bottom", "115": "box-shadow",
"116": "box-shadow", "116": "box-sizing",
"117": "box-sizing", "117": "clear",
"118": "clear", "118": "clip",
"119": "clip", "119": "clip-path",
"120": "clip-path", "120": "column-count",
"121": "column-count", "121": "column-gap",
"122": "column-gap", "122": "column-span",
"123": "column-span", "123": "column-width",
"124": "column-width", "124": "contain",
"125": "contain", "125": "content",
"126": "content", "126": "content-visibility",
"127": "content-visibility", "127": "counter-increment",
"128": "counter-increment", "128": "counter-reset",
"129": "counter-reset", "129": "counter-set",
"130": "counter-set", "130": "cx",
"131": "cx", "131": "cy",
"132": "cy", "132": "display",
"133": "display", "133": "filter",
"134": "filter", "134": "flex-basis",
"135": "flex-basis", "135": "flex-direction",
"136": "flex-direction", "136": "flex-grow",
"137": "flex-grow", "137": "flex-shrink",
"138": "flex-shrink", "138": "flex-wrap",
"139": "flex-wrap", "139": "float",
"140": "float", "140": "grid-auto-columns",
"141": "grid-auto-columns", "141": "grid-auto-flow",
"142": "grid-auto-flow", "142": "grid-auto-rows",
"143": "grid-auto-rows", "143": "grid-column-end",
"144": "grid-column-end", "144": "grid-column-start",
"145": "grid-column-start", "145": "grid-row-end",
"146": "grid-row-end", "146": "grid-row-start",
"147": "grid-row-start", "147": "grid-template-areas",
"148": "grid-template-areas", "148": "grid-template-columns",
"149": "grid-template-columns", "149": "grid-template-rows",
"150": "grid-template-rows", "150": "height",
"151": "height", "151": "inline-size",
"152": "inline-size", "152": "inset-block-end",
"153": "inset-block-end", "153": "inset-block-start",
"154": "inset-block-start", "154": "inset-inline-end",
"155": "inset-inline-end", "155": "inset-inline-start",
"156": "inset-inline-start", "156": "isolation",
"157": "isolation", "157": "justify-content",
"158": "justify-content", "158": "justify-items",
"159": "justify-items", "159": "justify-self",
"160": "justify-self", "160": "left",
"161": "left", "161": "margin-block-end",
"162": "margin-block-end", "162": "margin-block-start",
"163": "margin-block-start", "163": "margin-bottom",
"164": "margin-bottom", "164": "margin-inline-end",
"165": "margin-inline-end", "165": "margin-inline-start",
"166": "margin-inline-start", "166": "margin-left",
"167": "margin-left", "167": "margin-right",
"168": "margin-right", "168": "margin-top",
"169": "margin-top", "169": "mask-image",
"170": "mask-image", "170": "mask-type",
"171": "mask-type", "171": "max-block-size",
"172": "max-block-size", "172": "max-height",
"173": "max-height", "173": "max-inline-size",
"174": "max-inline-size", "174": "max-width",
"175": "max-width", "175": "min-block-size",
"176": "min-block-size", "176": "min-height",
"177": "min-height", "177": "min-inline-size",
"178": "min-inline-size", "178": "min-width",
"179": "min-width", "179": "mix-blend-mode",
"180": "mix-blend-mode", "180": "object-fit",
"181": "object-fit", "181": "object-position",
"182": "object-position", "182": "opacity",
"183": "opacity", "183": "order",
"184": "order", "184": "outline-color",
"185": "outline-color", "185": "outline-offset",
"186": "outline-offset", "186": "outline-style",
"187": "outline-style", "187": "outline-width",
"188": "outline-width", "188": "overflow-x",
"189": "overflow-x", "189": "overflow-y",
"190": "overflow-y", "190": "padding-block-end",
"191": "padding-block-end", "191": "padding-block-start",
"192": "padding-block-start", "192": "padding-bottom",
"193": "padding-bottom", "193": "padding-inline-end",
"194": "padding-inline-end", "194": "padding-inline-start",
"195": "padding-inline-start", "195": "padding-left",
"196": "padding-left", "196": "padding-right",
"197": "padding-right", "197": "padding-top",
"198": "padding-top", "198": "position",
"199": "position", "199": "r",
"200": "r", "200": "right",
"201": "right", "201": "rotate",
"202": "rotate", "202": "row-gap",
"203": "row-gap", "203": "rx",
"204": "rx", "204": "ry",
"205": "ry", "205": "scale",
"206": "scale", "206": "scrollbar-gutter",
"207": "scrollbar-gutter", "207": "scrollbar-width",
"208": "scrollbar-width", "208": "stop-color",
"209": "stop-color", "209": "stop-opacity",
"210": "stop-opacity", "210": "table-layout",
"211": "table-layout", "211": "text-decoration-color",
"212": "text-decoration-color", "212": "text-decoration-style",
"213": "text-decoration-style", "213": "text-decoration-thickness",
"214": "text-decoration-thickness", "214": "text-overflow",
"215": "text-overflow", "215": "top",
"216": "top", "216": "transform",
"217": "transform", "217": "transform-box",
"218": "transform-box", "218": "transform-origin",
"219": "transform-origin", "219": "transition-delay",
"220": "transition-delay", "220": "transition-duration",
"221": "transition-duration", "221": "transition-property",
"222": "transition-property", "222": "transition-timing-function",
"223": "transition-timing-function", "223": "translate",
"224": "translate", "224": "unicode-bidi",
"225": "unicode-bidi", "225": "user-select",
"226": "user-select", "226": "vertical-align",
"227": "vertical-align", "227": "view-transition-name",
"228": "view-transition-name", "228": "width",
"229": "width", "229": "x",
"230": "x", "230": "y",
"231": "y", "231": "z-index"
"232": "z-index"
} }
All properties associated with document.body.style by default: All properties associated with document.body.style by default:
{} {}

View file

@ -162,8 +162,6 @@ All supported properties and their default values exposed from CSSStylePropertie
'background': 'rgba(0, 0, 0, 0) none 0% 0% auto auto repeat scroll padding-box border-box' 'background': 'rgba(0, 0, 0, 0) none 0% 0% auto auto repeat scroll padding-box border-box'
'backgroundAttachment': 'scroll' 'backgroundAttachment': 'scroll'
'background-attachment': 'scroll' 'background-attachment': 'scroll'
'backgroundBlendMode': 'normal'
'background-blend-mode': 'normal'
'backgroundClip': 'border-box' 'backgroundClip': 'border-box'
'background-clip': 'border-box' 'background-clip': 'border-box'
'backgroundColor': 'rgba(0, 0, 0, 0)' 'backgroundColor': 'rgba(0, 0, 0, 0)'

View file

@ -75,7 +75,6 @@ appearance: none
aspect-ratio: auto aspect-ratio: auto
backdrop-filter: none backdrop-filter: none
background-attachment: scroll background-attachment: scroll
background-blend-mode: normal
background-clip: border-box background-clip: border-box
background-color: rgba(0, 0, 0, 0) background-color: rgba(0, 0, 0, 0)
background-image: none background-image: none
@ -84,7 +83,7 @@ background-position-x: 0%
background-position-y: 0% background-position-y: 0%
background-repeat: repeat background-repeat: repeat
background-size: auto auto background-size: auto auto
block-size: 1204px block-size: 1190px
border-block-end-color: rgb(0, 0, 0) border-block-end-color: rgb(0, 0, 0)
border-block-end-style: none border-block-end-style: none
border-block-end-width: medium border-block-end-width: medium
@ -149,7 +148,7 @@ grid-row-start: auto
grid-template-areas: none grid-template-areas: none
grid-template-columns: none grid-template-columns: none
grid-template-rows: none grid-template-rows: none
height: 2114px height: 2100px
inline-size: 784px inline-size: 784px
inset-block-end: auto inset-block-end: auto
inset-block-start: auto inset-block-start: auto