mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
LibWeb: Return CSS::StyleProperties::property
results by reference
This removes unnecessary reference counting.
This commit is contained in:
parent
acc74f5e72
commit
635d4842d1
Notes:
github-actions[bot]
2024-11-08 10:22:25 +00:00
Author: https://github.com/yyny Commit: https://github.com/LadybirdBrowser/ladybird/commit/635d4842d1e Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2136 Reviewed-by: https://github.com/AtkinsSJ ✅
10 changed files with 437 additions and 436 deletions
|
@ -939,8 +939,8 @@ static CSS::RequiredInvalidationAfterStyleChange compute_required_invalidation(H
|
|||
if (!old_and_new_properties.get(i))
|
||||
continue;
|
||||
auto property_id = static_cast<CSS::PropertyID>(i);
|
||||
auto old_value = old_properties.get(property_id).value_or({});
|
||||
auto new_value = new_properties.get(property_id).value_or({});
|
||||
auto const* old_value = old_properties.get(property_id).value_or({});
|
||||
auto const* new_value = new_properties.get(property_id).value_or({});
|
||||
if (!old_value && !new_value)
|
||||
continue;
|
||||
invalidation |= compute_property_invalidation(property_id, old_value, new_value);
|
||||
|
|
|
@ -208,7 +208,7 @@ RefPtr<CSSStyleValue const> ResolvedCSSStyleDeclaration::style_value_for_propert
|
|||
return {};
|
||||
};
|
||||
|
||||
auto get_computed_value = [this](PropertyID property_id) {
|
||||
auto get_computed_value = [this](PropertyID property_id) -> auto const& {
|
||||
if (m_pseudo_element.has_value())
|
||||
return m_element->pseudo_element_computed_css_values(m_pseudo_element.value())->property(property_id);
|
||||
return m_element->computed_css_values()->property(property_id);
|
||||
|
@ -261,8 +261,8 @@ RefPtr<CSSStyleValue const> ResolvedCSSStyleDeclaration::style_value_for_propert
|
|||
// -> line-height
|
||||
// The resolved value is normal if the computed value is normal, or the used value otherwise.
|
||||
case PropertyID::LineHeight: {
|
||||
auto line_height = get_computed_value(property_id);
|
||||
if (line_height->is_keyword() && line_height->to_keyword() == Keyword::Normal)
|
||||
auto const& line_height = get_computed_value(property_id);
|
||||
if (line_height.is_keyword() && line_height.to_keyword() == Keyword::Normal)
|
||||
return line_height;
|
||||
return LengthStyleValue::create(Length::make_px(layout_node.computed_values().line_height()));
|
||||
}
|
||||
|
@ -581,14 +581,14 @@ Optional<StyleProperty> ResolvedCSSStyleDeclaration::property(PropertyID propert
|
|||
auto style = m_element->document().style_computer().compute_style(const_cast<DOM::Element&>(*m_element), m_pseudo_element);
|
||||
|
||||
// FIXME: This is a stopgap until we implement shorthand -> longhand conversion.
|
||||
auto value = style.maybe_null_property(property_id);
|
||||
auto const* value = style.maybe_null_property(property_id);
|
||||
if (!value) {
|
||||
dbgln("FIXME: ResolvedCSSStyleDeclaration::property(property_id={:#x}) No value for property ID in newly computed style case.", to_underlying(property_id));
|
||||
return {};
|
||||
}
|
||||
return StyleProperty {
|
||||
.property_id = property_id,
|
||||
.value = value.release_nonnull(),
|
||||
.value = *value,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -597,7 +597,7 @@ Optional<StyleProperty> ResolvedCSSStyleDeclaration::property(PropertyID propert
|
|||
return {};
|
||||
return StyleProperty {
|
||||
.property_id = property_id,
|
||||
.value = value.release_nonnull(),
|
||||
.value = *value,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1182,9 +1182,9 @@ static void compute_transitioned_properties(StyleProperties const& style, DOM::E
|
|||
element.clear_transitions();
|
||||
element.set_cached_transition_property_source(*source_declaration);
|
||||
|
||||
auto transition_properties_value = style.property(PropertyID::TransitionProperty);
|
||||
auto transition_properties = transition_properties_value->is_value_list()
|
||||
? transition_properties_value->as_value_list().values()
|
||||
auto const& transition_properties_value = style.property(PropertyID::TransitionProperty);
|
||||
auto transition_properties = transition_properties_value.is_value_list()
|
||||
? transition_properties_value.as_value_list().values()
|
||||
: StyleValueVector { transition_properties_value };
|
||||
|
||||
Vector<Vector<PropertyID>> properties;
|
||||
|
@ -1219,7 +1219,7 @@ static void compute_transitioned_properties(StyleProperties const& style, DOM::E
|
|||
}
|
||||
|
||||
auto normalize_transition_length_list = [&properties, &style](PropertyID property, auto make_default_value) {
|
||||
auto style_value = style.maybe_null_property(property);
|
||||
auto const* style_value = style.maybe_null_property(property);
|
||||
StyleValueVector list;
|
||||
|
||||
if (!style_value || !style_value->is_value_list() || style_value->as_value_list().size() == 0) {
|
||||
|
@ -1268,14 +1268,14 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
for (auto i = to_underlying(CSS::first_longhand_property_id); i <= to_underlying(CSS::last_longhand_property_id); ++i) {
|
||||
auto property_id = static_cast<CSS::PropertyID>(i);
|
||||
auto matching_transition_properties = element.property_transition_attributes(property_id);
|
||||
auto before_change_value = previous_style.property(property_id, StyleProperties::WithAnimationsApplied::No);
|
||||
auto after_change_value = new_style.property(property_id, StyleProperties::WithAnimationsApplied::No);
|
||||
auto const& before_change_value = previous_style.property(property_id, StyleProperties::WithAnimationsApplied::No);
|
||||
auto const& after_change_value = new_style.property(property_id, StyleProperties::WithAnimationsApplied::No);
|
||||
|
||||
auto existing_transition = element.property_transition(property_id);
|
||||
bool has_running_transition = existing_transition && !existing_transition->is_finished();
|
||||
bool has_completed_transition = existing_transition && existing_transition->is_finished();
|
||||
|
||||
auto start_a_transition = [&](auto start_time, auto end_time, auto start_value, auto end_value, auto reversing_adjusted_start_value, auto reversing_shortening_factor) {
|
||||
auto start_a_transition = [&](auto start_time, auto end_time, auto const& start_value, auto const& end_value, auto const& reversing_adjusted_start_value, auto reversing_shortening_factor) {
|
||||
dbgln_if(CSS_TRANSITIONS_DEBUG, "Starting a transition of {} from {} to {}", string_from_property_id(property_id), start_value->to_string(), end_value->to_string());
|
||||
|
||||
auto transition = CSSTransition::start_a_transition(element, property_id, document().transition_generation(),
|
||||
|
@ -1289,7 +1289,7 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
// - the element does not have a running transition for the property,
|
||||
(!has_running_transition) &&
|
||||
// - the before-change style is different from the after-change style for that property, and the values for the property are transitionable,
|
||||
(!before_change_value->equals(after_change_value) && property_values_are_transitionable(property_id, before_change_value, after_change_value)) &&
|
||||
(!before_change_value.equals(after_change_value) && property_values_are_transitionable(property_id, before_change_value, after_change_value)) &&
|
||||
// - the element does not have a completed transition for the property
|
||||
// or the end value of the completed transition is different from the after-change style for the property,
|
||||
(!has_completed_transition || !existing_transition->transition_end_value()->equals(after_change_value)) &&
|
||||
|
@ -1312,13 +1312,13 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
auto end_time = start_time + matching_transition_properties->duration;
|
||||
|
||||
// - start value is the value of the transitioning property in the before-change style,
|
||||
auto start_value = before_change_value;
|
||||
auto const& start_value = before_change_value;
|
||||
|
||||
// - end value is the value of the transitioning property in the after-change style,
|
||||
auto end_value = after_change_value;
|
||||
auto const& end_value = after_change_value;
|
||||
|
||||
// - reversing-adjusted start value is the same as the start value, and
|
||||
auto reversing_adjusted_start_value = start_value;
|
||||
auto const& reversing_adjusted_start_value = start_value;
|
||||
|
||||
// - reversing shortening factor is 1.
|
||||
double reversing_shortening_factor = 1;
|
||||
|
@ -1349,7 +1349,7 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
// there is a matching transition-property value,
|
||||
// and the end value of the running transition is not equal to the value of the property in the after-change style, then:
|
||||
if (has_running_transition && matching_transition_properties.has_value() && !existing_transition->transition_end_value()->equals(after_change_value)) {
|
||||
dbgln_if(CSS_TRANSITIONS_DEBUG, "Transition step 4. existing end value = {}, after change value = {}", existing_transition->transition_end_value()->to_string(), after_change_value->to_string());
|
||||
dbgln_if(CSS_TRANSITIONS_DEBUG, "Transition step 4. existing end value = {}, after change value = {}", existing_transition->transition_end_value()->to_string(), after_change_value.to_string());
|
||||
// 1. If the current value of the property in the running transition is equal to the value of the property in the after-change style,
|
||||
// or if these two values are not transitionable,
|
||||
// then implementations must cancel the running transition.
|
||||
|
@ -1401,10 +1401,10 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
auto end_time = start_time + (matching_transition_properties->duration * reversing_shortening_factor);
|
||||
|
||||
// - start value is the current value of the property in the running transition,
|
||||
auto start_value = current_value;
|
||||
auto const& start_value = current_value;
|
||||
|
||||
// - end value is the value of the property in the after-change style,
|
||||
auto end_value = after_change_value;
|
||||
auto const& end_value = after_change_value;
|
||||
|
||||
start_a_transition(start_time, end_time, start_value, end_value, reversing_adjusted_start_value, reversing_shortening_factor);
|
||||
}
|
||||
|
@ -1425,13 +1425,13 @@ void StyleComputer::start_needed_transitions(StyleProperties const& previous_sty
|
|||
auto end_time = start_time + matching_transition_properties->duration;
|
||||
|
||||
// - start value is the current value of the property in the running transition,
|
||||
auto start_value = current_value;
|
||||
auto const& start_value = current_value;
|
||||
|
||||
// - end value is the value of the property in the after-change style,
|
||||
auto end_value = after_change_value;
|
||||
auto const& end_value = after_change_value;
|
||||
|
||||
// - reversing-adjusted start value is the same as the start value, and
|
||||
auto reversing_adjusted_start_value = start_value;
|
||||
auto const& reversing_adjusted_start_value = start_value;
|
||||
|
||||
// - reversing shortening factor is 1.
|
||||
double reversing_shortening_factor = 1;
|
||||
|
@ -1528,8 +1528,8 @@ void StyleComputer::compute_cascaded_values(StyleProperties& style, DOM::Element
|
|||
|
||||
// Animation declarations [css-animations-2]
|
||||
auto animation_name = [&]() -> Optional<String> {
|
||||
auto animation_name = style.maybe_null_property(PropertyID::AnimationName);
|
||||
if (animation_name.is_null())
|
||||
auto const* animation_name = style.maybe_null_property(PropertyID::AnimationName);
|
||||
if (!animation_name)
|
||||
return OptionalNone {};
|
||||
if (animation_name->is_string())
|
||||
return animation_name->as_string().string_value().to_string();
|
||||
|
@ -1687,20 +1687,20 @@ void StyleComputer::compute_defaulted_values(StyleProperties& style, DOM::Elemen
|
|||
|
||||
// https://www.w3.org/TR/css-color-4/#resolving-other-colors
|
||||
// In the color property, the used value of currentcolor is the inherited value.
|
||||
auto color = style.property(CSS::PropertyID::Color);
|
||||
if (color->to_keyword() == Keyword::Currentcolor) {
|
||||
color = get_inherit_value(document().realm(), CSS::PropertyID::Color, element, pseudo_element);
|
||||
style.set_property(CSS::PropertyID::Color, color);
|
||||
auto const& color = style.property(CSS::PropertyID::Color);
|
||||
if (color.to_keyword() == Keyword::Currentcolor) {
|
||||
auto const& inherited_value = get_inherit_value(document().realm(), CSS::PropertyID::Color, element, pseudo_element);
|
||||
style.set_property(CSS::PropertyID::Color, inherited_value);
|
||||
}
|
||||
}
|
||||
|
||||
Length::FontMetrics StyleComputer::calculate_root_element_font_metrics(StyleProperties const& style) const
|
||||
{
|
||||
auto root_value = style.property(CSS::PropertyID::FontSize);
|
||||
auto const& root_value = style.property(CSS::PropertyID::FontSize);
|
||||
|
||||
auto font_pixel_metrics = style.first_available_computed_font().pixel_metrics();
|
||||
Length::FontMetrics font_metrics { m_default_font_metrics.font_size, font_pixel_metrics };
|
||||
font_metrics.font_size = root_value->as_length().length().to_px(viewport_rect(), font_metrics, font_metrics);
|
||||
font_metrics.font_size = root_value.as_length().length().to_px(viewport_rect(), font_metrics, font_metrics);
|
||||
font_metrics.line_height = style.compute_line_height(viewport_rect(), font_metrics, font_metrics);
|
||||
|
||||
return font_metrics;
|
||||
|
@ -1823,9 +1823,9 @@ RefPtr<Gfx::FontCascadeList const> StyleComputer::compute_font_for_style_values(
|
|||
auto parent_font_size = [&]() -> CSSPixels {
|
||||
if (!parent_element || !parent_element->computed_css_values().has_value())
|
||||
return font_size_in_px;
|
||||
auto value = parent_element->computed_css_values()->property(CSS::PropertyID::FontSize);
|
||||
if (value->is_length()) {
|
||||
auto length = value->as_length().length();
|
||||
auto const& value = parent_element->computed_css_values()->property(CSS::PropertyID::FontSize);
|
||||
if (value.is_length()) {
|
||||
auto length = value.as_length().length();
|
||||
if (length.is_absolute() || length.is_relative()) {
|
||||
Length::FontMetrics font_metrics { font_size_in_px, font_pixel_metrics };
|
||||
return length.to_px(viewport_rect(), font_metrics, m_root_element_font_metrics);
|
||||
|
@ -2064,11 +2064,11 @@ void StyleComputer::compute_font(StyleProperties& style, DOM::Element const* ele
|
|||
compute_defaulted_property_value(style, element, CSS::PropertyID::FontWeight, pseudo_element);
|
||||
compute_defaulted_property_value(style, element, CSS::PropertyID::LineHeight, pseudo_element);
|
||||
|
||||
auto font_family = style.property(CSS::PropertyID::FontFamily);
|
||||
auto font_size = style.property(CSS::PropertyID::FontSize);
|
||||
auto font_style = style.property(CSS::PropertyID::FontStyle);
|
||||
auto font_weight = style.property(CSS::PropertyID::FontWeight);
|
||||
auto font_width = style.property(CSS::PropertyID::FontWidth);
|
||||
auto const& font_family = style.property(CSS::PropertyID::FontFamily);
|
||||
auto const& font_size = style.property(CSS::PropertyID::FontSize);
|
||||
auto const& font_style = style.property(CSS::PropertyID::FontStyle);
|
||||
auto const& font_weight = style.property(CSS::PropertyID::FontWeight);
|
||||
auto const& font_width = style.property(CSS::PropertyID::FontWidth);
|
||||
|
||||
auto font_list = compute_font_for_style_values(element, pseudo_element, font_family, font_size, font_style, font_weight, font_width, style.math_depth());
|
||||
VERIFY(font_list);
|
||||
|
@ -2077,7 +2077,7 @@ void StyleComputer::compute_font(StyleProperties& style, DOM::Element const* ele
|
|||
RefPtr<Gfx::Font const> const found_font = font_list->first();
|
||||
|
||||
style.set_property(CSS::PropertyID::FontSize, LengthStyleValue::create(CSS::Length::make_px(CSSPixels::nearest_value_for(found_font->pixel_size()))));
|
||||
style.set_property(CSS::PropertyID::FontWeight, NumberStyleValue::create(font_weight->to_font_weight()));
|
||||
style.set_property(CSS::PropertyID::FontWeight, NumberStyleValue::create(font_weight.to_font_weight()));
|
||||
|
||||
style.set_computed_font_list(*font_list);
|
||||
|
||||
|
@ -2099,7 +2099,7 @@ void StyleComputer::absolutize_values(StyleProperties& style) const
|
|||
style.first_available_computed_font().pixel_metrics()
|
||||
};
|
||||
|
||||
auto font_size = style.property(CSS::PropertyID::FontSize)->as_length().length().to_px(viewport_rect(), font_metrics, m_root_element_font_metrics);
|
||||
auto font_size = style.property(CSS::PropertyID::FontSize).as_length().length().to_px(viewport_rect(), font_metrics, m_root_element_font_metrics);
|
||||
font_metrics.font_size = font_size;
|
||||
|
||||
// NOTE: Percentage line-height values are relative to the font-size of the element.
|
||||
|
@ -2134,8 +2134,8 @@ void StyleComputer::resolve_effective_overflow_values(StyleProperties& style) co
|
|||
// https://www.w3.org/TR/css-overflow-3/#overflow-control
|
||||
// The visible/clip values of overflow compute to auto/hidden (respectively) if one of overflow-x or
|
||||
// overflow-y is neither visible nor clip.
|
||||
auto overflow_x = keyword_to_overflow(style.property(PropertyID::OverflowX)->to_keyword());
|
||||
auto overflow_y = keyword_to_overflow(style.property(PropertyID::OverflowY)->to_keyword());
|
||||
auto overflow_x = keyword_to_overflow(style.property(PropertyID::OverflowX).to_keyword());
|
||||
auto overflow_y = keyword_to_overflow(style.property(PropertyID::OverflowY).to_keyword());
|
||||
auto overflow_x_is_visible_or_clip = overflow_x == Overflow::Visible || overflow_x == Overflow::Clip;
|
||||
auto overflow_y_is_visible_or_clip = overflow_y == Overflow::Visible || overflow_y == Overflow::Clip;
|
||||
if (!overflow_x_is_visible_or_clip || !overflow_y_is_visible_or_clip) {
|
||||
|
@ -2838,12 +2838,12 @@ void StyleComputer::compute_math_depth(StyleProperties& style, DOM::Element cons
|
|||
return element->parent_element()->computed_css_values()->math_depth();
|
||||
};
|
||||
|
||||
auto value = style.property(CSS::PropertyID::MathDepth);
|
||||
if (!value->is_math_depth()) {
|
||||
auto const& value = style.property(CSS::PropertyID::MathDepth);
|
||||
if (!value.is_math_depth()) {
|
||||
style.set_math_depth(inherited_math_depth());
|
||||
return;
|
||||
}
|
||||
auto& math_depth = value->as_math_depth();
|
||||
auto const& math_depth = value.as_math_depth();
|
||||
|
||||
auto resolve_integer = [&](CSSStyleValue const& integer_value) {
|
||||
if (integer_value.is_integer())
|
||||
|
@ -2856,7 +2856,7 @@ void StyleComputer::compute_math_depth(StyleProperties& style, DOM::Element cons
|
|||
// The computed value of the math-depth value is determined as follows:
|
||||
// - If the specified value of math-depth is auto-add and the inherited value of math-style is compact
|
||||
// then the computed value of math-depth of the element is its inherited value plus one.
|
||||
if (math_depth.is_auto_add() && style.property(CSS::PropertyID::MathStyle)->to_keyword() == Keyword::Compact) {
|
||||
if (math_depth.is_auto_add() && style.property(CSS::PropertyID::MathStyle).to_keyword() == Keyword::Compact) {
|
||||
style.set_math_depth(inherited_math_depth() + 1);
|
||||
return;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -76,8 +76,8 @@ public:
|
|||
No,
|
||||
Yes,
|
||||
};
|
||||
NonnullRefPtr<CSSStyleValue const> property(CSS::PropertyID, WithAnimationsApplied = WithAnimationsApplied::Yes) const;
|
||||
RefPtr<CSSStyleValue const> maybe_null_property(CSS::PropertyID) const;
|
||||
CSSStyleValue const& property(CSS::PropertyID, WithAnimationsApplied = WithAnimationsApplied::Yes) const;
|
||||
CSSStyleValue const* maybe_null_property(CSS::PropertyID) const;
|
||||
void revert_property(CSS::PropertyID, StyleProperties const& style_for_revert);
|
||||
|
||||
JS::GCPtr<CSS::CSSStyleDeclaration const> animation_name_source() const { return m_data->m_animation_name_source; }
|
||||
|
|
|
@ -140,7 +140,7 @@ void HTMLInputElement::adjust_computed_style(CSS::StyleProperties& style)
|
|||
style.set_property(CSS::PropertyID::Display, CSS::DisplayStyleValue::create(CSS::Display::from_short(CSS::Display::Short::InlineBlock)));
|
||||
|
||||
if (type_state() != TypeAttributeState::FileUpload) {
|
||||
if (style.property(CSS::PropertyID::Width)->has_auto())
|
||||
if (style.property(CSS::PropertyID::Width).has_auto())
|
||||
style.set_property(CSS::PropertyID::Width, CSS::LengthStyleValue::create(CSS::Length(size(), CSS::Length::Type::Ch)));
|
||||
}
|
||||
|
||||
|
@ -1131,9 +1131,9 @@ void HTMLInputElement::computed_css_values_changed()
|
|||
auto palette = document().page().palette();
|
||||
auto accent_color = palette.color(ColorRole::Accent).to_string();
|
||||
|
||||
auto accent_color_property = computed_css_values()->property(CSS::PropertyID::AccentColor);
|
||||
if (accent_color_property->has_color())
|
||||
accent_color = accent_color_property->to_string();
|
||||
auto const& accent_color_property = computed_css_values()->property(CSS::PropertyID::AccentColor);
|
||||
if (accent_color_property.has_color())
|
||||
accent_color = accent_color_property.to_string();
|
||||
|
||||
if (m_slider_progress_element)
|
||||
MUST(m_slider_progress_element->style_for_bindings()->set_property(CSS::PropertyID::BackgroundColor, accent_color));
|
||||
|
|
|
@ -127,9 +127,9 @@ void HTMLProgressElement::computed_css_values_changed()
|
|||
auto palette = document().page().palette();
|
||||
auto accent_color = palette.color(ColorRole::Accent).to_string();
|
||||
|
||||
auto accent_color_property = computed_css_values()->property(CSS::PropertyID::AccentColor);
|
||||
if (accent_color_property->has_color())
|
||||
accent_color = accent_color_property->to_string();
|
||||
auto const& accent_color_property = computed_css_values()->property(CSS::PropertyID::AccentColor);
|
||||
if (accent_color_property.has_color())
|
||||
accent_color = accent_color_property.to_string();
|
||||
|
||||
if (m_progress_value_element)
|
||||
MUST(m_progress_value_element->style_for_bindings()->set_property(CSS::PropertyID::BackgroundColor, accent_color));
|
||||
|
|
|
@ -48,9 +48,9 @@ void HTMLTextAreaElement::adjust_computed_style(CSS::StyleProperties& style)
|
|||
if (style.display().is_inline_outside() && style.display().is_flow_inside())
|
||||
style.set_property(CSS::PropertyID::Display, CSS::DisplayStyleValue::create(CSS::Display::from_short(CSS::Display::Short::InlineBlock)));
|
||||
|
||||
if (style.property(CSS::PropertyID::Width)->has_auto())
|
||||
if (style.property(CSS::PropertyID::Width).has_auto())
|
||||
style.set_property(CSS::PropertyID::Width, CSS::LengthStyleValue::create(CSS::Length(cols(), CSS::Length::Type::Ch)));
|
||||
if (style.property(CSS::PropertyID::Height)->has_auto())
|
||||
if (style.property(CSS::PropertyID::Height).has_auto())
|
||||
style.set_property(CSS::PropertyID::Height, CSS::LengthStyleValue::create(CSS::Length(rows(), CSS::Length::Type::Lh)));
|
||||
}
|
||||
|
||||
|
|
|
@ -320,32 +320,32 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
// m_font is used by Length::to_px() when resolving sizes against this layout node.
|
||||
// That's why it has to be set before everything else.
|
||||
computed_values.set_font_list(computed_style.computed_font_list());
|
||||
computed_values.set_font_size(computed_style.property(CSS::PropertyID::FontSize)->as_length().length().to_px(*this));
|
||||
computed_values.set_font_weight(round_to<int>(computed_style.property(CSS::PropertyID::FontWeight)->as_number().number()));
|
||||
computed_values.set_font_size(computed_style.property(CSS::PropertyID::FontSize).as_length().length().to_px(*this));
|
||||
computed_values.set_font_weight(round_to<int>(computed_style.property(CSS::PropertyID::FontWeight).as_number().number()));
|
||||
computed_values.set_line_height(computed_style.line_height());
|
||||
|
||||
computed_values.set_vertical_align(computed_style.vertical_align());
|
||||
|
||||
{
|
||||
auto attachments = computed_style.property(CSS::PropertyID::BackgroundAttachment);
|
||||
auto clips = computed_style.property(CSS::PropertyID::BackgroundClip);
|
||||
auto images = computed_style.property(CSS::PropertyID::BackgroundImage);
|
||||
auto origins = computed_style.property(CSS::PropertyID::BackgroundOrigin);
|
||||
auto x_positions = computed_style.property(CSS::PropertyID::BackgroundPositionX);
|
||||
auto y_positions = computed_style.property(CSS::PropertyID::BackgroundPositionY);
|
||||
auto repeats = computed_style.property(CSS::PropertyID::BackgroundRepeat);
|
||||
auto sizes = computed_style.property(CSS::PropertyID::BackgroundSize);
|
||||
auto const& attachments = computed_style.property(CSS::PropertyID::BackgroundAttachment);
|
||||
auto const& clips = computed_style.property(CSS::PropertyID::BackgroundClip);
|
||||
auto const& images = computed_style.property(CSS::PropertyID::BackgroundImage);
|
||||
auto const& origins = computed_style.property(CSS::PropertyID::BackgroundOrigin);
|
||||
auto const& x_positions = computed_style.property(CSS::PropertyID::BackgroundPositionX);
|
||||
auto const& y_positions = computed_style.property(CSS::PropertyID::BackgroundPositionY);
|
||||
auto const& repeats = computed_style.property(CSS::PropertyID::BackgroundRepeat);
|
||||
auto const& sizes = computed_style.property(CSS::PropertyID::BackgroundSize);
|
||||
|
||||
auto count_layers = [](auto maybe_style_value) -> size_t {
|
||||
if (maybe_style_value->is_value_list())
|
||||
return maybe_style_value->as_value_list().size();
|
||||
auto count_layers = [](auto const& maybe_style_value) -> size_t {
|
||||
if (maybe_style_value.is_value_list())
|
||||
return maybe_style_value.as_value_list().size();
|
||||
else
|
||||
return 1;
|
||||
};
|
||||
|
||||
auto value_for_layer = [](auto& style_value, size_t layer_index) -> RefPtr<CSS::CSSStyleValue const> {
|
||||
if (style_value->is_value_list())
|
||||
return style_value->as_value_list().value_at(layer_index, true);
|
||||
auto value_for_layer = [](auto const& style_value, size_t layer_index) -> RefPtr<CSS::CSSStyleValue const> {
|
||||
if (style_value.is_value_list())
|
||||
return style_value.as_value_list().value_at(layer_index, true);
|
||||
return style_value;
|
||||
};
|
||||
|
||||
|
@ -467,33 +467,33 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
if (auto maybe_font_variation_settings = computed_style.font_variation_settings(); maybe_font_variation_settings.has_value())
|
||||
computed_values.set_font_variation_settings(maybe_font_variation_settings.release_value());
|
||||
|
||||
auto border_bottom_left_radius = computed_style.property(CSS::PropertyID::BorderBottomLeftRadius);
|
||||
if (border_bottom_left_radius->is_border_radius()) {
|
||||
auto const& border_bottom_left_radius = computed_style.property(CSS::PropertyID::BorderBottomLeftRadius);
|
||||
if (border_bottom_left_radius.is_border_radius()) {
|
||||
computed_values.set_border_bottom_left_radius(
|
||||
CSS::BorderRadiusData {
|
||||
border_bottom_left_radius->as_border_radius().horizontal_radius(),
|
||||
border_bottom_left_radius->as_border_radius().vertical_radius() });
|
||||
border_bottom_left_radius.as_border_radius().horizontal_radius(),
|
||||
border_bottom_left_radius.as_border_radius().vertical_radius() });
|
||||
}
|
||||
auto border_bottom_right_radius = computed_style.property(CSS::PropertyID::BorderBottomRightRadius);
|
||||
if (border_bottom_right_radius->is_border_radius()) {
|
||||
auto const& border_bottom_right_radius = computed_style.property(CSS::PropertyID::BorderBottomRightRadius);
|
||||
if (border_bottom_right_radius.is_border_radius()) {
|
||||
computed_values.set_border_bottom_right_radius(
|
||||
CSS::BorderRadiusData {
|
||||
border_bottom_right_radius->as_border_radius().horizontal_radius(),
|
||||
border_bottom_right_radius->as_border_radius().vertical_radius() });
|
||||
border_bottom_right_radius.as_border_radius().horizontal_radius(),
|
||||
border_bottom_right_radius.as_border_radius().vertical_radius() });
|
||||
}
|
||||
auto border_top_left_radius = computed_style.property(CSS::PropertyID::BorderTopLeftRadius);
|
||||
if (border_top_left_radius->is_border_radius()) {
|
||||
auto const& border_top_left_radius = computed_style.property(CSS::PropertyID::BorderTopLeftRadius);
|
||||
if (border_top_left_radius.is_border_radius()) {
|
||||
computed_values.set_border_top_left_radius(
|
||||
CSS::BorderRadiusData {
|
||||
border_top_left_radius->as_border_radius().horizontal_radius(),
|
||||
border_top_left_radius->as_border_radius().vertical_radius() });
|
||||
border_top_left_radius.as_border_radius().horizontal_radius(),
|
||||
border_top_left_radius.as_border_radius().vertical_radius() });
|
||||
}
|
||||
auto border_top_right_radius = computed_style.property(CSS::PropertyID::BorderTopRightRadius);
|
||||
if (border_top_right_radius->is_border_radius()) {
|
||||
auto const& border_top_right_radius = computed_style.property(CSS::PropertyID::BorderTopRightRadius);
|
||||
if (border_top_right_radius.is_border_radius()) {
|
||||
computed_values.set_border_top_right_radius(
|
||||
CSS::BorderRadiusData {
|
||||
border_top_right_radius->as_border_radius().horizontal_radius(),
|
||||
border_top_right_radius->as_border_radius().vertical_radius() });
|
||||
border_top_right_radius.as_border_radius().horizontal_radius(),
|
||||
border_top_right_radius.as_border_radius().vertical_radius() });
|
||||
}
|
||||
computed_values.set_display(computed_style.display());
|
||||
|
||||
|
@ -669,9 +669,9 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
if (auto list_style_type = computed_style.list_style_type(); list_style_type.has_value())
|
||||
computed_values.set_list_style_type(list_style_type.value());
|
||||
|
||||
auto list_style_image = computed_style.property(CSS::PropertyID::ListStyleImage);
|
||||
if (list_style_image->is_abstract_image()) {
|
||||
m_list_style_image = list_style_image->as_abstract_image();
|
||||
auto const& list_style_image = computed_style.property(CSS::PropertyID::ListStyleImage);
|
||||
if (list_style_image.is_abstract_image()) {
|
||||
m_list_style_image = list_style_image.as_abstract_image();
|
||||
const_cast<CSS::AbstractImageStyleValue&>(*m_list_style_image).load_any_resources(document());
|
||||
}
|
||||
|
||||
|
@ -717,12 +717,12 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
computed_values.set_transform_box(transform_box.value());
|
||||
computed_values.set_transform_origin(computed_style.transform_origin());
|
||||
|
||||
auto transition_delay_property = computed_style.property(CSS::PropertyID::TransitionDelay);
|
||||
if (transition_delay_property->is_time()) {
|
||||
auto& transition_delay = transition_delay_property->as_time();
|
||||
auto const& transition_delay_property = computed_style.property(CSS::PropertyID::TransitionDelay);
|
||||
if (transition_delay_property.is_time()) {
|
||||
auto const& transition_delay = transition_delay_property.as_time();
|
||||
computed_values.set_transition_delay(transition_delay.time());
|
||||
} else if (transition_delay_property->is_math()) {
|
||||
auto& transition_delay = transition_delay_property->as_math();
|
||||
} else if (transition_delay_property.is_math()) {
|
||||
auto const& transition_delay = transition_delay_property.as_math();
|
||||
computed_values.set_transition_delay(transition_delay.resolve_time().value());
|
||||
}
|
||||
|
||||
|
@ -742,14 +742,14 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
border.width = 0;
|
||||
} else {
|
||||
auto resolve_border_width = [&]() -> CSSPixels {
|
||||
auto value = computed_style.property(width_property);
|
||||
if (value->is_math())
|
||||
return max(CSSPixels { 0 }, value->as_math().resolve_length(*this)->to_px(*this));
|
||||
if (value->is_length())
|
||||
return value->as_length().length().to_px(*this);
|
||||
if (value->is_keyword()) {
|
||||
auto const& value = computed_style.property(width_property);
|
||||
if (value.is_math())
|
||||
return max(CSSPixels { 0 }, value.as_math().resolve_length(*this)->to_px(*this));
|
||||
if (value.is_length())
|
||||
return value.as_length().length().to_px(*this);
|
||||
if (value.is_keyword()) {
|
||||
// https://www.w3.org/TR/css-backgrounds-3/#valdef-line-width-thin
|
||||
switch (value->to_keyword()) {
|
||||
switch (value.to_keyword()) {
|
||||
case CSS::Keyword::Thin:
|
||||
return 1;
|
||||
case CSS::Keyword::Medium:
|
||||
|
@ -772,14 +772,14 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
do_border_style(computed_values.border_right(), CSS::PropertyID::BorderRightWidth, CSS::PropertyID::BorderRightColor, CSS::PropertyID::BorderRightStyle);
|
||||
do_border_style(computed_values.border_bottom(), CSS::PropertyID::BorderBottomWidth, CSS::PropertyID::BorderBottomColor, CSS::PropertyID::BorderBottomStyle);
|
||||
|
||||
if (auto outline_color = computed_style.property(CSS::PropertyID::OutlineColor); outline_color->has_color())
|
||||
computed_values.set_outline_color(outline_color->to_color(*this));
|
||||
if (auto outline_offset = computed_style.property(CSS::PropertyID::OutlineOffset); outline_offset->is_length())
|
||||
computed_values.set_outline_offset(outline_offset->as_length().length());
|
||||
if (auto outline_style = computed_style.outline_style(); outline_style.has_value())
|
||||
if (auto const& outline_color = computed_style.property(CSS::PropertyID::OutlineColor); outline_color.has_color())
|
||||
computed_values.set_outline_color(outline_color.to_color(*this));
|
||||
if (auto const& outline_offset = computed_style.property(CSS::PropertyID::OutlineOffset); outline_offset.is_length())
|
||||
computed_values.set_outline_offset(outline_offset.as_length().length());
|
||||
if (auto const& outline_style = computed_style.outline_style(); outline_style.has_value())
|
||||
computed_values.set_outline_style(outline_style.value());
|
||||
if (auto outline_width = computed_style.property(CSS::PropertyID::OutlineWidth); outline_width->is_length())
|
||||
computed_values.set_outline_width(outline_width->as_length().length());
|
||||
if (auto const& outline_width = computed_style.property(CSS::PropertyID::OutlineWidth); outline_width.is_length())
|
||||
computed_values.set_outline_width(outline_width.as_length().length());
|
||||
|
||||
computed_values.set_grid_auto_columns(computed_style.grid_auto_columns());
|
||||
computed_values.set_grid_auto_rows(computed_style.grid_auto_rows());
|
||||
|
@ -807,39 +807,39 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
if (auto y_value = computed_style.length_percentage(CSS::PropertyID::Y); y_value.has_value())
|
||||
computed_values.set_y(*y_value);
|
||||
|
||||
auto fill = computed_style.property(CSS::PropertyID::Fill);
|
||||
if (fill->has_color())
|
||||
computed_values.set_fill(fill->to_color(*this));
|
||||
else if (fill->is_url())
|
||||
computed_values.set_fill(fill->as_url().url());
|
||||
auto stroke = computed_style.property(CSS::PropertyID::Stroke);
|
||||
if (stroke->has_color())
|
||||
computed_values.set_stroke(stroke->to_color(*this));
|
||||
else if (stroke->is_url())
|
||||
computed_values.set_stroke(stroke->as_url().url());
|
||||
if (auto stop_color = computed_style.property(CSS::PropertyID::StopColor); stop_color->has_color())
|
||||
computed_values.set_stop_color(stop_color->to_color(*this));
|
||||
auto stroke_width = computed_style.property(CSS::PropertyID::StrokeWidth);
|
||||
auto const& fill = computed_style.property(CSS::PropertyID::Fill);
|
||||
if (fill.has_color())
|
||||
computed_values.set_fill(fill.to_color(*this));
|
||||
else if (fill.is_url())
|
||||
computed_values.set_fill(fill.as_url().url());
|
||||
auto const& stroke = computed_style.property(CSS::PropertyID::Stroke);
|
||||
if (stroke.has_color())
|
||||
computed_values.set_stroke(stroke.to_color(*this));
|
||||
else if (stroke.is_url())
|
||||
computed_values.set_stroke(stroke.as_url().url());
|
||||
if (auto const& stop_color = computed_style.property(CSS::PropertyID::StopColor); stop_color.has_color())
|
||||
computed_values.set_stop_color(stop_color.to_color(*this));
|
||||
auto const& stroke_width = computed_style.property(CSS::PropertyID::StrokeWidth);
|
||||
// FIXME: Converting to pixels isn't really correct - values should be in "user units"
|
||||
// https://svgwg.org/svg2-draft/coords.html#TermUserUnits
|
||||
if (stroke_width->is_number())
|
||||
computed_values.set_stroke_width(CSS::Length::make_px(CSSPixels::nearest_value_for(stroke_width->as_number().number())));
|
||||
else if (stroke_width->is_length())
|
||||
computed_values.set_stroke_width(stroke_width->as_length().length());
|
||||
else if (stroke_width->is_percentage())
|
||||
computed_values.set_stroke_width(CSS::LengthPercentage { stroke_width->as_percentage().percentage() });
|
||||
if (stroke_width.is_number())
|
||||
computed_values.set_stroke_width(CSS::Length::make_px(CSSPixels::nearest_value_for(stroke_width.as_number().number())));
|
||||
else if (stroke_width.is_length())
|
||||
computed_values.set_stroke_width(stroke_width.as_length().length());
|
||||
else if (stroke_width.is_percentage())
|
||||
computed_values.set_stroke_width(CSS::LengthPercentage { stroke_width.as_percentage().percentage() });
|
||||
|
||||
if (auto mask_type = computed_style.mask_type(); mask_type.has_value())
|
||||
computed_values.set_mask_type(*mask_type);
|
||||
|
||||
if (auto mask = computed_style.property(CSS::PropertyID::Mask); mask->is_url())
|
||||
computed_values.set_mask(mask->as_url().url());
|
||||
if (auto const& mask = computed_style.property(CSS::PropertyID::Mask); mask.is_url())
|
||||
computed_values.set_mask(mask.as_url().url());
|
||||
|
||||
auto clip_path = computed_style.property(CSS::PropertyID::ClipPath);
|
||||
if (clip_path->is_url())
|
||||
computed_values.set_clip_path(clip_path->as_url().url());
|
||||
else if (clip_path->is_basic_shape())
|
||||
computed_values.set_clip_path(clip_path->as_basic_shape());
|
||||
auto const& clip_path = computed_style.property(CSS::PropertyID::ClipPath);
|
||||
if (clip_path.is_url())
|
||||
computed_values.set_clip_path(clip_path.as_url().url());
|
||||
else if (clip_path.is_basic_shape())
|
||||
computed_values.set_clip_path(clip_path.as_basic_shape());
|
||||
|
||||
if (auto clip_rule = computed_style.clip_rule(); clip_rule.has_value())
|
||||
computed_values.set_clip_rule(*clip_rule);
|
||||
|
@ -861,8 +861,8 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
if (auto text_anchor = computed_style.text_anchor(); text_anchor.has_value())
|
||||
computed_values.set_text_anchor(*text_anchor);
|
||||
|
||||
if (auto column_count = computed_style.property(CSS::PropertyID::ColumnCount); column_count->is_integer())
|
||||
computed_values.set_column_count(CSS::ColumnCount::make_integer(column_count->as_integer().integer()));
|
||||
if (auto const& column_count = computed_style.property(CSS::PropertyID::ColumnCount); column_count.is_integer())
|
||||
computed_values.set_column_count(CSS::ColumnCount::make_integer(column_count.as_integer().integer()));
|
||||
|
||||
if (auto column_span = computed_style.column_span(); column_span.has_value())
|
||||
computed_values.set_column_span(column_span.value());
|
||||
|
@ -878,31 +878,31 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style)
|
|||
if (auto table_layout = computed_style.table_layout(); table_layout.has_value())
|
||||
computed_values.set_table_layout(table_layout.value());
|
||||
|
||||
auto aspect_ratio = computed_style.property(CSS::PropertyID::AspectRatio);
|
||||
if (aspect_ratio->is_value_list()) {
|
||||
auto& values_list = aspect_ratio->as_value_list().values();
|
||||
auto const& aspect_ratio = computed_style.property(CSS::PropertyID::AspectRatio);
|
||||
if (aspect_ratio.is_value_list()) {
|
||||
auto const& values_list = aspect_ratio.as_value_list().values();
|
||||
if (values_list.size() == 2
|
||||
&& values_list[0]->is_keyword() && values_list[0]->as_keyword().keyword() == CSS::Keyword::Auto
|
||||
&& values_list[1]->is_ratio()) {
|
||||
computed_values.set_aspect_ratio({ true, values_list[1]->as_ratio().ratio() });
|
||||
}
|
||||
} else if (aspect_ratio->is_keyword() && aspect_ratio->as_keyword().keyword() == CSS::Keyword::Auto) {
|
||||
} else if (aspect_ratio.is_keyword() && aspect_ratio.as_keyword().keyword() == CSS::Keyword::Auto) {
|
||||
computed_values.set_aspect_ratio({ true, {} });
|
||||
} else if (aspect_ratio->is_ratio()) {
|
||||
} else if (aspect_ratio.is_ratio()) {
|
||||
// https://drafts.csswg.org/css-sizing-4/#aspect-ratio
|
||||
// If the <ratio> is degenerate, the property instead behaves as auto.
|
||||
if (aspect_ratio->as_ratio().ratio().is_degenerate())
|
||||
if (aspect_ratio.as_ratio().ratio().is_degenerate())
|
||||
computed_values.set_aspect_ratio({ true, {} });
|
||||
else
|
||||
computed_values.set_aspect_ratio({ false, aspect_ratio->as_ratio().ratio() });
|
||||
computed_values.set_aspect_ratio({ false, aspect_ratio.as_ratio().ratio() });
|
||||
}
|
||||
|
||||
auto math_shift_value = computed_style.property(CSS::PropertyID::MathShift);
|
||||
if (auto math_shift = keyword_to_math_shift(math_shift_value->to_keyword()); math_shift.has_value())
|
||||
auto const& math_shift_value = computed_style.property(CSS::PropertyID::MathShift);
|
||||
if (auto math_shift = keyword_to_math_shift(math_shift_value.to_keyword()); math_shift.has_value())
|
||||
computed_values.set_math_shift(math_shift.value());
|
||||
|
||||
auto math_style_value = computed_style.property(CSS::PropertyID::MathStyle);
|
||||
if (auto math_style = keyword_to_math_style(math_style_value->to_keyword()); math_style.has_value())
|
||||
auto const& math_style_value = computed_style.property(CSS::PropertyID::MathStyle);
|
||||
if (auto math_style = keyword_to_math_style(math_style_value.to_keyword()); math_style.has_value())
|
||||
computed_values.set_math_style(math_style.value());
|
||||
|
||||
computed_values.set_math_depth(computed_style.math_depth());
|
||||
|
|
|
@ -1387,7 +1387,7 @@ Messages::WebDriverClient::GetElementCssValueResponse WebDriverConnection::get_e
|
|||
// computed value of parameter URL variables["property name"] from element's style declarations.
|
||||
if (auto property = Web::CSS::property_id_from_string(name); property.has_value()) {
|
||||
if (auto computed_values = element->computed_css_values(); computed_values.has_value())
|
||||
computed_value = computed_values->property(property.value())->to_string();
|
||||
computed_value = computed_values->property(property.value()).to_string();
|
||||
}
|
||||
}
|
||||
// -> Otherwise
|
||||
|
|
Loading…
Reference in a new issue