瀏覽代碼

LibWeb: Support display inline-table

Add support for inline-table display type with corrresponding changes in
tree builder to generate inline anonymous wrapper around inline table
boxes.
Aliaksandr Kalenik 2 年之前
父節點
當前提交
276a77f02d

+ 2 - 0
Userland/Libraries/LibWeb/CSS/StyleProperties.cpp

@@ -555,6 +555,8 @@ CSS::Display StyleProperties::display() const
         return CSS::Display::from_short(CSS::Display::Short::ListItem);
     case CSS::ValueID::Table:
         return CSS::Display::from_short(CSS::Display::Short::Table);
+    case CSS::ValueID::InlineTable:
+        return CSS::Display::from_short(CSS::Display::Short::InlineTable);
     case CSS::ValueID::TableRow:
         return CSS::Display { CSS::Display::Internal::TableRow };
     case CSS::ValueID::TableCell:

+ 6 - 1
Userland/Libraries/LibWeb/Layout/TableBox.h

@@ -18,7 +18,12 @@ public:
     TableBox(DOM::Document&, DOM::Element*, CSS::ComputedValues);
     virtual ~TableBox() override;
 
-    static CSS::Display static_display() { return CSS::Display::from_short(CSS::Display::Short::Table); }
+    static CSS::Display static_display(bool inline_outside)
+    {
+        if (inline_outside)
+            return CSS::Display::from_short(CSS::Display::Short::InlineTable);
+        return CSS::Display::from_short(CSS::Display::Short::Table);
+    }
 };
 
 }

+ 1 - 1
Userland/Libraries/LibWeb/Layout/TableCellBox.h

@@ -21,7 +21,7 @@ public:
     size_t colspan() const;
     size_t rowspan() const;
 
-    static CSS::Display static_display() { return CSS::Display { CSS::Display::Internal::TableCell }; }
+    static CSS::Display static_display(bool) { return CSS::Display { CSS::Display::Internal::TableCell }; }
 };
 
 }

+ 1 - 1
Userland/Libraries/LibWeb/Layout/TableRowBox.h

@@ -18,7 +18,7 @@ public:
     TableRowBox(DOM::Document&, DOM::Element*, CSS::ComputedValues);
     virtual ~TableRowBox() override;
 
-    static CSS::Display static_display() { return CSS::Display { CSS::Display::Internal::TableRow }; }
+    static CSS::Display static_display(bool) { return CSS::Display { CSS::Display::Internal::TableRow }; }
 };
 
 }

+ 5 - 2
Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp

@@ -501,7 +501,7 @@ static void wrap_in_anonymous(Vector<JS::Handle<Node>>& sequence, Node* nearest_
     VERIFY(!sequence.is_empty());
     auto& parent = *sequence.first()->parent();
     auto computed_values = parent.computed_values().clone_inherited_values();
-    static_cast<CSS::MutableComputedValues&>(computed_values).set_display(WrapperBoxType::static_display());
+    static_cast<CSS::MutableComputedValues&>(computed_values).set_display(WrapperBoxType::static_display(parent.display().is_inline_outside()));
     auto wrapper = parent.heap().template allocate_without_realm<WrapperBoxType>(parent.document(), nullptr, move(computed_values));
     for (auto& child : sequence) {
         parent.remove_child(*child);
@@ -591,7 +591,10 @@ void TreeBuilder::generate_missing_parents(NodeWithStyle& root)
         // all other values of non-inheritable properties are used on the table box and not the table wrapper box.
         // (Where the table element's values are not used on the table and table wrapper boxes, the initial values are used instead.)
         auto& mutable_wrapper_computed_values = static_cast<CSS::MutableComputedValues&>(wrapper_computed_values);
-        mutable_wrapper_computed_values.set_display(CSS::Display(CSS::Display::Outside::Block, CSS::Display::Inside::FlowRoot));
+        if (table_box->display().is_inline_outside())
+            mutable_wrapper_computed_values.set_display(CSS::Display::from_short(CSS::Display::Short::InlineBlock));
+        else
+            mutable_wrapper_computed_values.set_display(CSS::Display::from_short(CSS::Display::Short::FlowRoot));
         mutable_wrapper_computed_values.set_position(table_box->computed_values().position());
         mutable_wrapper_computed_values.set_inset(table_box->computed_values().inset());
         mutable_wrapper_computed_values.set_float(table_box->computed_values().float_());