LibWeb: Move white-space into LayoutStyle

This commit is contained in:
Andreas Kling 2020-06-24 16:37:44 +02:00
parent bc178ee743
commit 6b334e02e6
Notes: sideshowbarker 2024-07-19 05:24:26 +09:00
6 changed files with 45 additions and 5 deletions

View file

@ -244,6 +244,25 @@ CSS::TextAlign StyleProperties::text_align() const
return CSS::TextAlign::Left;
}
Optional<CSS::WhiteSpace> StyleProperties::white_space() const
{
auto value = property(CSS::PropertyID::WhiteSpace);
if (!value.has_value() || !value.value()->is_string())
return {};
auto string = value.value()->to_string();
if (string == "normal")
return CSS::WhiteSpace::Normal;
if (string == "nowrap")
return CSS::WhiteSpace::Nowrap;
if (string == "pre")
return CSS::WhiteSpace::Pre;
if (string == "pre-line")
return CSS::WhiteSpace::PreLine;
if (string == "pre-wrap")
return CSS::WhiteSpace::PreWrap;
return {};
}
CSS::Display StyleProperties::display() const
{
auto display = string_or_fallback(CSS::PropertyID::Display, "inline");

View file

@ -61,6 +61,7 @@ public:
Color color_or_fallback(CSS::PropertyID, const Document&, Color fallback) const;
CSS::TextAlign text_align() const;
CSS::Display display() const;
Optional<CSS::WhiteSpace> white_space() const;
const Gfx::Font& font() const
{

View file

@ -135,6 +135,14 @@ enum class Display {
TableRowGroup,
};
enum class WhiteSpace {
Normal,
Pre,
Nowrap,
PreLine,
PreWrap,
};
}
class StyleValue : public RefCounted<StyleValue> {

View file

@ -225,6 +225,11 @@ void LayoutNodeWithStyle::apply_style(const StyleProperties& specified_style)
style.set_position(specified_style.position());
style.set_text_align(specified_style.text_align());
auto white_space = specified_style.white_space();
if (white_space.has_value())
style.set_white_space(white_space.value());
style.set_z_index(specified_style.z_index());
style.set_width(specified_style.length_or_fallback(CSS::PropertyID::Width, {}));
style.set_min_width(specified_style.length_or_fallback(CSS::PropertyID::MinWidth, {}));

View file

@ -31,11 +31,17 @@
namespace Web {
class InitialValues {
public:
static CSS::WhiteSpace white_space() { return CSS::WhiteSpace::Normal; }
};
class LayoutStyle {
public:
Optional<int> z_index() const { return m_z_index; }
CSS::TextAlign text_align() const { return m_text_align; }
CSS::Position position() const { return m_position; }
CSS::WhiteSpace white_space() const { return m_white_space; }
const Length& width() const { return m_width; }
const Length& min_width() const { return m_min_width; }
const Length& max_width() const { return m_max_width; }
@ -47,6 +53,7 @@ protected:
Optional<int> m_z_index;
CSS::TextAlign m_text_align;
CSS::Position m_position;
CSS::WhiteSpace m_white_space { InitialValues::white_space() };
Length m_width;
Length m_min_width;
Length m_max_width;
@ -63,6 +70,7 @@ public:
void set_z_index(Optional<int> value) { m_z_index = value; }
void set_text_align(CSS::TextAlign text_align) { m_text_align = text_align; }
void set_position(CSS::Position position) { m_position = position; }
void set_white_space(CSS::WhiteSpace value) { m_white_space = value; }
void set_width(const Length& width) { m_width = width; }
void set_min_width(const Length& width) { m_min_width = width; }
void set_max_width(const Length& width) { m_max_width = width; }

View file

@ -253,21 +253,20 @@ void LayoutText::split_into_lines(LayoutBlock& container, LayoutMode layout_mode
bool do_collapse = true;
bool do_wrap_lines = true;
bool do_wrap_breaks = false;
auto white_space_prop = specified_style().string_or_fallback(CSS::PropertyID::WhiteSpace, "normal");
if (white_space_prop == "nowrap") {
if (style().white_space() == CSS::WhiteSpace::Nowrap) {
do_collapse = true;
do_wrap_lines = false;
do_wrap_breaks = false;
} else if (white_space_prop == "pre") {
} else if (style().white_space() == CSS::WhiteSpace::Pre) {
do_collapse = false;
do_wrap_lines = false;
do_wrap_breaks = true;
} else if (white_space_prop == "pre-line") {
} else if (style().white_space() == CSS::WhiteSpace::PreLine) {
do_collapse = true;
do_wrap_lines = true;
do_wrap_breaks = true;
} else if (white_space_prop == "pre-wrap") {
} else if (style().white_space() == CSS::WhiteSpace::PreWrap) {
do_collapse = false;
do_wrap_lines = true;
do_wrap_breaks = true;