diff options
-rw-r--r-- | components/layout/table.rs | 22 | ||||
-rw-r--r-- | components/layout/table_cell.rs | 5 | ||||
-rw-r--r-- | components/layout/table_row.rs | 120 | ||||
-rw-r--r-- | components/layout/table_rowgroup.rs | 24 | ||||
-rw-r--r-- | components/layout/table_wrapper.rs | 18 | ||||
-rw-r--r-- | components/script/dom/element.rs | 13 | ||||
-rw-r--r-- | components/script/dom/htmltablecellelement.rs | 17 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLTableCellElement.webidl | 4 | ||||
-rw-r--r-- | components/script/layout_wrapper.rs | 6 | ||||
-rw-r--r-- | components/script_layout_interface/wrapper_traits.rs | 2 | ||||
-rw-r--r-- | components/style/matching.rs | 4 | ||||
-rw-r--r-- | tests/wpt/metadata/html/dom/interfaces.html.ini | 9 | ||||
-rw-r--r-- | tests/wpt/metadata/html/dom/reflection-tabular.html.ini | 750 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 36 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/css/table_rowspan_simple_a.html | 20 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/css/table_rowspan_simple_ref.html | 20 |
16 files changed, 248 insertions, 822 deletions
diff --git a/components/layout/table.rs b/components/layout/table.rs index 6d95ff0b1e0..031cf2ab197 100644 --- a/components/layout/table.rs +++ b/components/layout/table.rs @@ -94,7 +94,16 @@ impl TableFlow { preferred_inline_size: surrounding_size, }; let mut column_index = 0; + let mut incoming_rowspan = vec![]; + for child_cell_inline_size in child_cell_inline_sizes { + // Skip any column occupied by a cell from a previous row. + while column_index < incoming_rowspan.len() && incoming_rowspan[column_index] != 1 { + if incoming_rowspan[column_index] > 1 { + incoming_rowspan[column_index] -= 1; + } + column_index += 1; + } for _ in 0..child_cell_inline_size.column_span { if column_index < parent_inline_sizes.len() { // We already have some intrinsic size information for this column. Merge it in @@ -130,6 +139,14 @@ impl TableFlow { total_inline_sizes.preferred_inline_size += parent_inline_sizes[column_index].preferred; + // If this cell spans later rows, record its rowspan. + if child_cell_inline_size.row_span > 1 { + if incoming_rowspan.len() < column_index + 1 { + incoming_rowspan.resize(column_index + 1, 0); + } + incoming_rowspan[column_index] = child_cell_inline_size.row_span; + } + column_index += 1 } } @@ -418,6 +435,7 @@ impl Flow for TableFlow { &self.collapsed_inline_direction_border_widths_for_table; let mut collapsed_block_direction_border_widths_for_table = self.collapsed_block_direction_border_widths_for_table.iter().peekable(); + let mut incoming_rowspan = vec![]; self.block_flow.propagate_assigned_inline_size_to_children(shared_context, inline_start_content_edge, inline_end_content_edge, @@ -432,7 +450,8 @@ impl Flow for TableFlow { child_flow, writing_mode, column_computed_inline_sizes, - &spacing_per_cell); + &spacing_per_cell, + &mut incoming_rowspan); if child_flow.is_table_row() { let child_table_row = child_flow.as_mut_table_row(); child_table_row.populate_collapsed_border_spacing( @@ -647,6 +666,7 @@ fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow, next_block_borders: NextBlockCollapsedBorders, inline_spacing: &mut Vec<Au>, block_spacing: &mut Vec<Au>) { + // TODO mbrubeck: Take rowspan and colspan into account. let number_of_borders_inline_direction = child_table_row.preliminary_collapsed_borders.inline.len(); // Compute interior inline borders. for (i, this_inline_border) in child_table_row.preliminary_collapsed_borders diff --git a/components/layout/table_cell.rs b/components/layout/table_cell.rs index abdcf03cb2b..5e20f195078 100644 --- a/components/layout/table_cell.rs +++ b/components/layout/table_cell.rs @@ -41,6 +41,9 @@ pub struct TableCellFlow { /// The column span of this cell. pub column_span: u32, + /// The rows spanned by this cell. + pub row_span: u32, + /// Whether this cell is visible. If false, the value of `empty-cells` means that we must not /// display this cell. pub visible: bool, @@ -52,6 +55,7 @@ impl TableCellFlow { block_flow: BlockFlow::from_fragment(fragment), collapsed_borders: CollapsedBordersForCell::new(), column_span: 1, + row_span: 1, visible: true, } } @@ -62,6 +66,7 @@ impl TableCellFlow { block_flow: BlockFlow::from_fragment(fragment), collapsed_borders: CollapsedBordersForCell::new(), column_span: node.get_colspan(), + row_span: node.get_rowspan(), visible: visible, } } diff --git a/components/layout/table_row.rs b/components/layout/table_row.rs index 272bf85337f..45ac5fbdb3f 100644 --- a/components/layout/table_row.rs +++ b/components/layout/table_row.rs @@ -45,6 +45,12 @@ pub struct TableRowFlow { /// Information about the computed inline-sizes of each column. pub column_computed_inline_sizes: Vec<ColumnComputedInlineSize>, + /// The number of remaining rows spanned by cells in previous rows, indexed by column. + /// + /// Columns that are not included in this vector have the default rowspan of "1". If there are + /// no cells with rowspan != 1 in previous rows, this vector may be empty. + pub incoming_rowspan: Vec<u32>, + /// The spacing for this row, propagated down from the table during the inline-size assignment /// phase. pub spacing: border_spacing::T, @@ -78,6 +84,8 @@ pub struct CellIntrinsicInlineSize { pub column_size: ColumnIntrinsicInlineSize, /// The column span of this cell. pub column_span: u32, + /// The row span of this cell. + pub row_span: u32, } @@ -88,6 +96,7 @@ impl TableRowFlow { block_flow: BlockFlow::from_fragment(fragment), cell_intrinsic_inline_sizes: Vec::new(), column_computed_inline_sizes: Vec::new(), + incoming_rowspan: Vec::new(), spacing: border_spacing::T { horizontal: Au(0), vertical: Au(0), @@ -268,6 +277,7 @@ impl Flow for TableRowFlow { // fixed and automatic table layout calculation. let child_specified_inline_size; let child_column_span; + let child_row_span; { let child_table_cell = kid.as_mut_table_cell(); child_specified_inline_size = child_table_cell.block_flow @@ -275,6 +285,7 @@ impl Flow for TableRowFlow { .style .content_inline_size(); child_column_span = child_table_cell.column_span; + child_row_span = child_table_cell.row_span; // Perform border collapse if necessary. if collapsing_borders { @@ -319,6 +330,7 @@ impl Flow for TableRowFlow { self.cell_intrinsic_inline_sizes.push(CellIntrinsicInlineSize { column_size: child_column_inline_size, column_span: child_column_span, + row_span: child_row_span, }); } } @@ -348,12 +360,23 @@ impl Flow for TableRowFlow { containing_block_inline_size); // Spread out the completed inline sizes among columns with spans > 1. - let mut computed_inline_size_for_cells = Vec::new(); - let mut column_computed_inline_size_iterator = self.column_computed_inline_sizes.iter(); + let num_columns = self.column_computed_inline_sizes.len(); + let mut computed_inline_size_for_cells = Vec::with_capacity(num_columns); + let mut col = 0; + for cell_intrinsic_inline_size in &self.cell_intrinsic_inline_sizes { + // Skip any column occupied by a cell from a previous row. + while col < self.incoming_rowspan.len() && self.incoming_rowspan[col] != 1 { + let size = match self.column_computed_inline_sizes.get(col) { + Some(column_computed_inline_size) => *column_computed_inline_size, + None => ColumnComputedInlineSize { size: Au(0) } // See FIXME below. + }; + computed_inline_size_for_cells.push(size); + col += 1; + } // Start with the computed inline size for the first column in the span. let mut column_computed_inline_size = - match column_computed_inline_size_iterator.next() { + match self.column_computed_inline_sizes.get(col) { Some(column_computed_inline_size) => *column_computed_inline_size, None => { // We're in fixed layout mode and there are more cells in this row than @@ -366,16 +389,18 @@ impl Flow for TableRowFlow { } } }; + col += 1; // Add in computed inline sizes for any extra columns in the span. for _ in 1..cell_intrinsic_inline_size.column_span { let extra_column_computed_inline_size = - match column_computed_inline_size_iterator.next() { + match self.column_computed_inline_sizes.get(col) { Some(column_computed_inline_size) => column_computed_inline_size, None => break, }; column_computed_inline_size.size = column_computed_inline_size.size + extra_column_computed_inline_size.size + self.spacing.horizontal; + col += 1; } computed_inline_size_for_cells.push(column_computed_inline_size) @@ -397,6 +422,9 @@ impl Flow for TableRowFlow { let spacing = self.spacing; let row_writing_mode = self.block_flow.base.writing_mode; let table_writing_mode = self.table_writing_mode; + let incoming_rowspan = &self.incoming_rowspan; + let mut column_index = 0; + self.block_flow.propagate_assigned_inline_size_to_children(shared_context, inline_start_content_edge, inline_end_content_edge, @@ -410,6 +438,8 @@ impl Flow for TableRowFlow { set_inline_position_of_child_flow( child_flow, child_index, + &mut column_index, + incoming_rowspan, row_writing_mode, table_writing_mode, &computed_inline_size_for_cells, @@ -709,27 +739,28 @@ impl CollapsedBorder { } } -/// Pushes column inline size and border collapse info down to a child. +/// Pushes column inline size, incoming rowspan, and border collapse info down to a child. pub fn propagate_column_inline_sizes_to_child( child_flow: &mut Flow, table_writing_mode: WritingMode, column_computed_inline_sizes: &[ColumnComputedInlineSize], - border_spacing: &border_spacing::T) { - // If the child is a row group or a row, the column inline-size info should be copied from its + border_spacing: &border_spacing::T, + incoming_rowspan: &mut Vec<u32>) { + // If the child is a row group or a row, the column inline-size and rowspan info should be copied from its // parent. // // FIXME(pcwalton): This seems inefficient. Reference count it instead? match child_flow.class() { - FlowClass::Table => { - let child_table_flow = child_flow.as_mut_table(); - child_table_flow.column_computed_inline_sizes = column_computed_inline_sizes.to_vec(); - } FlowClass::TableRowGroup => { let child_table_rowgroup_flow = child_flow.as_mut_table_rowgroup(); - child_table_rowgroup_flow.column_computed_inline_sizes = - column_computed_inline_sizes.to_vec(); child_table_rowgroup_flow.spacing = *border_spacing; - child_table_rowgroup_flow.table_writing_mode = table_writing_mode; + for kid in child_table_rowgroup_flow.block_flow.base.child_iter_mut() { + propagate_column_inline_sizes_to_child(kid, + table_writing_mode, + column_computed_inline_sizes, + border_spacing, + incoming_rowspan); + } } FlowClass::TableRow => { let child_table_row_flow = child_flow.as_mut_table_row(); @@ -737,6 +768,32 @@ pub fn propagate_column_inline_sizes_to_child( column_computed_inline_sizes.to_vec(); child_table_row_flow.spacing = *border_spacing; child_table_row_flow.table_writing_mode = table_writing_mode; + child_table_row_flow.incoming_rowspan = incoming_rowspan.clone(); + + // Update the incoming rowspan for the next row. + let mut col = 0; + for cell in &child_table_row_flow.cell_intrinsic_inline_sizes { + // Skip any column occupied by a cell from a previous row. + while col < incoming_rowspan.len() && incoming_rowspan[col] != 1 { + if incoming_rowspan[col] > 1 { + incoming_rowspan[col] -= 1; + } + col += 1; + } + for _ in 0..cell.column_span { + if col < incoming_rowspan.len() && incoming_rowspan[col] > 1 { + incoming_rowspan[col] -= 1; + } + // If this cell spans later rows, record its rowspan. + if cell.row_span != 1 { + if incoming_rowspan.len() < col + 1 { + incoming_rowspan.resize(col + 1, 1); + } + incoming_rowspan[col] = max(cell.row_span, incoming_rowspan[col]); + } + col += 1; + } + } } c => warn!("unexpected flow in table {:?}", c) } @@ -746,6 +803,8 @@ pub fn propagate_column_inline_sizes_to_child( fn set_inline_position_of_child_flow( child_flow: &mut Flow, child_index: usize, + column_index: &mut usize, + incoming_rowspan: &[u32], row_writing_mode: WritingMode, table_writing_mode: WritingMode, column_computed_inline_sizes: &[ColumnComputedInlineSize], @@ -760,6 +819,21 @@ fn set_inline_position_of_child_flow( let reverse_column_order = table_writing_mode.is_bidi_ltr() != row_writing_mode.is_bidi_ltr(); + // Advance past any column occupied by a cell from a previous row. + while *column_index < incoming_rowspan.len() && incoming_rowspan[*column_index] != 1 { + let column_inline_size = column_computed_inline_sizes[*column_index].size; + let border_inline_size = match *border_collapse_info { + Some(_) => Au(0), // FIXME: Make collapsed borders account for colspan/rowspan. + None => border_spacing.horizontal, + }; + if reverse_column_order { + *inline_end_margin_edge += column_inline_size + border_inline_size; + } else { + *inline_start_margin_edge += column_inline_size + border_inline_size; + } + *column_index += 1; + } + // Handle border collapsing, if necessary. let child_table_cell = child_flow.as_mut_table_cell(); match *border_collapse_info { @@ -797,24 +871,24 @@ fn set_inline_position_of_child_flow( // Move over past the collapsed border. if reverse_column_order { - *inline_end_margin_edge = *inline_end_margin_edge + - child_table_cell.collapsed_borders.inline_start_width + *inline_end_margin_edge += child_table_cell.collapsed_borders.inline_start_width; } else { - *inline_start_margin_edge = *inline_start_margin_edge + - child_table_cell.collapsed_borders.inline_start_width + *inline_start_margin_edge += child_table_cell.collapsed_borders.inline_start_width; } } None => { // Take spacing into account. if reverse_column_order { - *inline_end_margin_edge = *inline_end_margin_edge + border_spacing.horizontal + *inline_end_margin_edge += border_spacing.horizontal; } else { - *inline_start_margin_edge = *inline_start_margin_edge + border_spacing.horizontal + *inline_start_margin_edge += border_spacing.horizontal; } } } - let column_inline_size = column_computed_inline_sizes[child_index].size; + let column_inline_size = column_computed_inline_sizes[*column_index].size; + *column_index += 1; + let kid_base = &mut child_table_cell.block_flow.base; kid_base.block_container_inline_size = column_inline_size; @@ -822,11 +896,11 @@ fn set_inline_position_of_child_flow( // Columns begin from the inline-end edge. kid_base.position.start.i = parent_content_inline_size - *inline_end_margin_edge - column_inline_size; - *inline_end_margin_edge = *inline_end_margin_edge + column_inline_size; + *inline_end_margin_edge += column_inline_size; } else { // Columns begin from the inline-start edge. kid_base.position.start.i = *inline_start_margin_edge; - *inline_start_margin_edge = *inline_start_margin_edge + column_inline_size; + *inline_start_margin_edge += column_inline_size; } } diff --git a/components/layout/table_rowgroup.rs b/components/layout/table_rowgroup.rs index 9c7ace68260..a76d7a82ccf 100644 --- a/components/layout/table_rowgroup.rs +++ b/components/layout/table_rowgroup.rs @@ -23,10 +23,9 @@ use std::iter::{IntoIterator, Iterator, Peekable}; use std::sync::Arc; use style::computed_values::{border_collapse, border_spacing}; use style::context::SharedStyleContext; -use style::logical_geometry::{LogicalSize, WritingMode}; +use style::logical_geometry::LogicalSize; use style::properties::ServoComputedValues; -use table::{ColumnComputedInlineSize, ColumnIntrinsicInlineSize, InternalTable, TableLikeFlow}; -use table_row; +use table::{ColumnIntrinsicInlineSize, InternalTable, TableLikeFlow}; /// A table formatting context. pub struct TableRowGroupFlow { @@ -36,16 +35,9 @@ pub struct TableRowGroupFlow { /// Information about the intrinsic inline-sizes of each column. pub column_intrinsic_inline_sizes: Vec<ColumnIntrinsicInlineSize>, - /// Information about the actual inline sizes of each column. - pub column_computed_inline_sizes: Vec<ColumnComputedInlineSize>, - /// The spacing for this rowgroup. pub spacing: border_spacing::T, - /// The direction of the columns, propagated down from the table during the inline-size - /// assignment phase. - pub table_writing_mode: WritingMode, - /// The final width of the borders in the inline direction for each cell, computed by the /// entire table and pushed down into each row during inline size computation. pub collapsed_inline_direction_border_widths_for_table: Vec<Au>, @@ -63,16 +55,13 @@ impl Serialize for TableRowGroupFlow { impl TableRowGroupFlow { pub fn from_fragment(fragment: Fragment) -> TableRowGroupFlow { - let writing_mode = fragment.style().writing_mode; TableRowGroupFlow { block_flow: BlockFlow::from_fragment(fragment), column_intrinsic_inline_sizes: Vec::new(), - column_computed_inline_sizes: Vec::new(), spacing: border_spacing::T { horizontal: Au(0), vertical: Au(0), }, - table_writing_mode: writing_mode, collapsed_inline_direction_border_widths_for_table: Vec::new(), collapsed_block_direction_border_widths_for_table: Vec::new(), } @@ -150,9 +139,6 @@ impl Flow for TableRowGroupFlow { shared_context, containing_block_inline_size); - let column_computed_inline_sizes = &self.column_computed_inline_sizes; - let border_spacing = self.spacing; - let table_writing_mode = self.table_writing_mode; let collapsed_inline_direction_border_widths_for_table = &self.collapsed_inline_direction_border_widths_for_table; let mut collapsed_block_direction_border_widths_for_table = @@ -167,12 +153,6 @@ impl Flow for TableRowGroupFlow { _writing_mode, _inline_start_margin_edge, _inline_end_margin_edge| { - table_row::propagate_column_inline_sizes_to_child( - child_flow, - table_writing_mode, - column_computed_inline_sizes, - &border_spacing); - if border_collapse == border_collapse::T::collapse { let child_table_row = child_flow.as_mut_table_row(); child_table_row.populate_collapsed_border_spacing( diff --git a/components/layout/table_wrapper.rs b/components/layout/table_wrapper.rs index 372fdbd086f..7510ae3988a 100644 --- a/components/layout/table_wrapper.rs +++ b/components/layout/table_wrapper.rs @@ -37,7 +37,6 @@ use style::properties::ServoComputedValues; use style::values::CSSFloat; use style::values::computed::LengthOrPercentageOrAuto; use table::{ColumnComputedInlineSize, ColumnIntrinsicInlineSize}; -use table_row; #[derive(Copy, Clone, Serialize, Debug)] pub enum TableLayout { @@ -394,7 +393,6 @@ impl Flow for TableWrapperFlow { } }; - let border_spacing = self.block_flow.fragment.style().get_inheritedtable().border_spacing; match assigned_column_inline_sizes { None => { self.block_flow @@ -410,17 +408,11 @@ impl Flow for TableWrapperFlow { inline_start_content_edge, inline_end_content_edge, content_inline_size, - |child_flow, - _child_index, - _content_inline_size, - writing_mode, - _inline_start_margin_edge, - _inline_end_margin_edge| { - table_row::propagate_column_inline_sizes_to_child( - child_flow, - writing_mode, - assigned_column_inline_sizes, - &border_spacing); + |child_flow, _, _, _, _, _| { + if child_flow.class() == FlowClass::Table { + child_flow.as_mut_table().column_computed_inline_sizes = + assigned_column_inline_sizes.to_vec(); + } }) } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index f01c51513ec..d9c2f6907e7 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -325,6 +325,8 @@ pub trait LayoutElementHelpers { #[allow(unsafe_code)] unsafe fn get_colspan(self) -> u32; #[allow(unsafe_code)] + unsafe fn get_rowspan(self) -> u32; + #[allow(unsafe_code)] unsafe fn html_element_in_html_document_for_layout(&self) -> bool; fn id_attribute(&self) -> *const Option<Atom>; fn style_attribute(&self) -> *const Option<Arc<RwLock<PropertyDeclarationBlock>>>; @@ -628,6 +630,17 @@ impl LayoutElementHelpers for LayoutJS<Element> { } } + #[allow(unsafe_code)] + unsafe fn get_rowspan(self) -> u32 { + if let Some(this) = self.downcast::<HTMLTableCellElement>() { + this.get_rowspan().unwrap_or(1) + } else { + // Don't panic since `display` can cause this to be called on arbitrary + // elements. + 1 + } + } + #[inline] #[allow(unsafe_code)] unsafe fn html_element_in_html_document_for_layout(&self) -> bool { diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 6790c2a4ea0..4a6ca5ca9b1 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -18,6 +18,7 @@ use html5ever_atoms::LocalName; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; const DEFAULT_COLSPAN: u32 = 1; +const DEFAULT_ROWSPAN: u32 = 1; #[dom_struct] pub struct HTMLTableCellElement { @@ -42,6 +43,12 @@ impl HTMLTableCellElementMethods for HTMLTableCellElement { // https://html.spec.whatwg.org/multipage/#dom-tdth-colspan make_uint_setter!(SetColSpan, "colspan", DEFAULT_COLSPAN); + // https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan + make_uint_getter!(RowSpan, "rowspan", DEFAULT_ROWSPAN); + + // https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan + make_uint_setter!(SetRowSpan, "rowspan", DEFAULT_ROWSPAN); + // https://html.spec.whatwg.org/multipage/#dom-tdth-bgcolor make_getter!(BgColor, "bgcolor"); @@ -75,6 +82,7 @@ impl HTMLTableCellElementMethods for HTMLTableCellElement { pub trait HTMLTableCellElementLayoutHelpers { fn get_background_color(&self) -> Option<RGBA>; fn get_colspan(&self) -> Option<u32>; + fn get_rowspan(&self) -> Option<u32>; fn get_width(&self) -> LengthOrPercentageOrAuto; } @@ -97,6 +105,14 @@ impl HTMLTableCellElementLayoutHelpers for LayoutJS<HTMLTableCellElement> { } } + fn get_rowspan(&self) -> Option<u32> { + unsafe { + (&*self.upcast::<Element>().unsafe_get()) + .get_attr_for_layout(&ns!(), &local_name!("rowspan")) + .map(AttrValue::as_uint) + } + } + fn get_width(&self) -> LengthOrPercentageOrAuto { unsafe { (&*self.upcast::<Element>().unsafe_get()) @@ -116,6 +132,7 @@ impl VirtualMethods for HTMLTableCellElement { fn parse_plain_attribute(&self, local_name: &LocalName, value: DOMString) -> AttrValue { match *local_name { local_name!("colspan") => AttrValue::from_u32(value.into(), DEFAULT_COLSPAN), + local_name!("rowspan") => AttrValue::from_u32(value.into(), DEFAULT_ROWSPAN), local_name!("bgcolor") => AttrValue::from_legacy_color(value.into()), local_name!("width") => AttrValue::from_nonzero_dimension(value.into()), _ => self.super_type().unwrap().parse_plain_attribute(local_name, value), diff --git a/components/script/dom/webidls/HTMLTableCellElement.webidl b/components/script/dom/webidls/HTMLTableCellElement.webidl index 33863b3dc20..8ac135170ec 100644 --- a/components/script/dom/webidls/HTMLTableCellElement.webidl +++ b/components/script/dom/webidls/HTMLTableCellElement.webidl @@ -5,8 +5,8 @@ // https://html.spec.whatwg.org/multipage/#htmltablecellelement [Abstract] interface HTMLTableCellElement : HTMLElement { - attribute unsigned long colSpan; - // attribute unsigned long rowSpan; + attribute unsigned long colSpan; + attribute unsigned long rowSpan; // attribute DOMString headers; readonly attribute long cellIndex; diff --git a/components/script/layout_wrapper.rs b/components/script/layout_wrapper.rs index dca0750e0ee..e6c38aa1fb3 100644 --- a/components/script/layout_wrapper.rs +++ b/components/script/layout_wrapper.rs @@ -864,6 +864,12 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { self.get_jsmanaged().downcast::<Element>().unwrap().get_colspan() } } + + fn get_rowspan(&self) -> u32 { + unsafe { + self.get_jsmanaged().downcast::<Element>().unwrap().get_rowspan() + } + } } pub struct ThreadSafeLayoutNodeChildrenIterator<ConcreteNode: ThreadSafeLayoutNode> { diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs index 6887fb4f416..e141cb581c3 100644 --- a/components/script_layout_interface/wrapper_traits.rs +++ b/components/script_layout_interface/wrapper_traits.rs @@ -265,6 +265,8 @@ pub trait ThreadSafeLayoutNode: Clone + Copy + Debug + GetLayoutData + NodeInfo fn get_colspan(&self) -> u32; + fn get_rowspan(&self) -> u32; + fn fragment_type(&self) -> FragmentType { match self.get_pseudo_element_type() { PseudoElementType::Normal => FragmentType::FragmentBody, diff --git a/components/style/matching.rs b/components/style/matching.rs index ff89dd07003..8600d9bdc56 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -263,8 +263,8 @@ pub fn common_style_affecting_attributes() -> [CommonStyleAffectingAttributeInfo /// Attributes that, if present, disable style sharing. All legacy HTML attributes must be in /// either this list or `common_style_affecting_attributes`. See the comment in /// `synthesize_presentational_hints_for_legacy_attributes`. -pub fn rare_style_affecting_attributes() -> [LocalName; 3] { - [ local_name!("bgcolor"), local_name!("border"), local_name!("colspan") ] +pub fn rare_style_affecting_attributes() -> [LocalName; 4] { + [local_name!("bgcolor"), local_name!("border"), local_name!("colspan"), local_name!("rowspan")] } fn have_same_class<E: TElement>(element: &E, diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 4961fca1f35..24f7bf07de4 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -2973,9 +2973,6 @@ [HTMLTableDataCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type (0)] expected: FAIL - [HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type (1)] - expected: FAIL - [HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type (2)] expected: FAIL @@ -3024,9 +3021,6 @@ [HTMLTableHeaderCellElement interface: document.createElement("th") must inherit property "sort" with the proper type (3)] expected: FAIL - [HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type (1)] - expected: FAIL - [HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type (2)] expected: FAIL @@ -3051,9 +3045,6 @@ [HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type (11)] expected: FAIL - [HTMLTableCellElement interface: attribute rowSpan] - expected: FAIL - [HTMLTableCellElement interface: attribute headers] expected: FAIL diff --git a/tests/wpt/metadata/html/dom/reflection-tabular.html.ini b/tests/wpt/metadata/html/dom/reflection-tabular.html.ini index abb903f2da3..44589149715 100644 --- a/tests/wpt/metadata/html/dom/reflection-tabular.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-tabular.html.ini @@ -11127,189 +11127,6 @@ [td.tabIndex: IDL set to -2147483648 followed by getAttribute()] expected: FAIL - [td.rowSpan: typeof IDL attribute] - expected: FAIL - - [td.rowSpan: IDL get with DOM attribute unset] - expected: FAIL - - [td.rowSpan: setAttribute() to -2147483649 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to -2147483648 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to -36 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to -1 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 0 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 1 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 257 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 2147483647 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 2147483648 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 4294967295 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 4294967296 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "-1" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "-0" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "0" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "1" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\t7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\v7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\f7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\n7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\r7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "
7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "
7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to true followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to false followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to object "2" followed by IDL get] - expected: FAIL - - [td.rowSpan: setAttribute() to object "3" followed by IDL get] - expected: FAIL - - [td.rowSpan: IDL set to 0 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to 1 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to 257 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to 2147483647 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to "-0" followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to "-0" followed by IDL get] - expected: FAIL - [td.align: typeof IDL attribute] expected: FAIL @@ -13050,189 +12867,6 @@ [th.tabIndex: IDL set to -2147483648 followed by getAttribute()] expected: FAIL - [th.rowSpan: typeof IDL attribute] - expected: FAIL - - [th.rowSpan: IDL get with DOM attribute unset] - expected: FAIL - - [th.rowSpan: setAttribute() to -2147483649 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to -2147483648 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to -36 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to -1 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 0 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 1 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 257 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 2147483647 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 2147483648 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 4294967295 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 4294967296 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "-1" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "-0" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "0" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "1" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\t7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\v7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\f7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\n7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\r7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "
7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "
7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to true followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to false followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to object "2" followed by IDL get] - expected: FAIL - - [th.rowSpan: setAttribute() to object "3" followed by IDL get] - expected: FAIL - - [th.rowSpan: IDL set to 0 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to 1 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to 257 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to 2147483647 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to "-0" followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to "-0" followed by IDL get] - expected: FAIL - [th.align: typeof IDL attribute] expected: FAIL @@ -17007,30 +16641,6 @@ [col.span: IDL set to 4294967295 followed by IDL get] expected: FAIL - [td.rowSpan: IDL set to 2147483648 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to 2147483648 followed by IDL get] - expected: FAIL - - [td.rowSpan: IDL set to 4294967295 followed by getAttribute()] - expected: FAIL - - [td.rowSpan: IDL set to 4294967295 followed by IDL get] - expected: FAIL - - [th.rowSpan: IDL set to 2147483648 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to 2147483648 followed by IDL get] - expected: FAIL - - [th.rowSpan: IDL set to 4294967295 followed by getAttribute()] - expected: FAIL - - [th.rowSpan: IDL set to 4294967295 followed by IDL get] - expected: FAIL - [td.scope: typeof IDL attribute] expected: FAIL @@ -23796,186 +23406,6 @@ [td.tabIndex: IDL set to -2147483648] expected: FAIL - [td.rowSpan: setAttribute() to -2147483649] - expected: FAIL - - [td.rowSpan: setAttribute() to -2147483648] - expected: FAIL - - [td.rowSpan: setAttribute() to -36] - expected: FAIL - - [td.rowSpan: setAttribute() to -1] - expected: FAIL - - [td.rowSpan: setAttribute() to 0] - expected: FAIL - - [td.rowSpan: setAttribute() to 1] - expected: FAIL - - [td.rowSpan: setAttribute() to 257] - expected: FAIL - - [td.rowSpan: setAttribute() to 2147483647] - expected: FAIL - - [td.rowSpan: setAttribute() to 2147483648] - expected: FAIL - - [td.rowSpan: setAttribute() to 4294967295] - expected: FAIL - - [td.rowSpan: setAttribute() to 4294967296] - expected: FAIL - - [td.rowSpan: setAttribute() to ""] - expected: FAIL - - [td.rowSpan: setAttribute() to "-1"] - expected: FAIL - - [td.rowSpan: setAttribute() to "-0"] - expected: FAIL - - [td.rowSpan: setAttribute() to "0"] - expected: FAIL - - [td.rowSpan: setAttribute() to "1"] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\t7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\v7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\f7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\n7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\r7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "
7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "
7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to "7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [td.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] - expected: FAIL - - [td.rowSpan: setAttribute() to undefined] - expected: FAIL - - [td.rowSpan: setAttribute() to 1.5] - expected: FAIL - - [td.rowSpan: setAttribute() to true] - expected: FAIL - - [td.rowSpan: setAttribute() to false] - expected: FAIL - - [td.rowSpan: setAttribute() to object "[object Object\]"] - expected: FAIL - - [td.rowSpan: setAttribute() to NaN] - expected: FAIL - - [td.rowSpan: setAttribute() to Infinity] - expected: FAIL - - [td.rowSpan: setAttribute() to -Infinity] - expected: FAIL - - [td.rowSpan: setAttribute() to "\\0"] - expected: FAIL - - [td.rowSpan: setAttribute() to object "2"] - expected: FAIL - - [td.rowSpan: setAttribute() to object "3"] - expected: FAIL - - [td.rowSpan: IDL set to 0] - expected: FAIL - - [td.rowSpan: IDL set to 1] - expected: FAIL - - [td.rowSpan: IDL set to 257] - expected: FAIL - - [td.rowSpan: IDL set to 2147483647] - expected: FAIL - - [td.rowSpan: IDL set to "-0"] - expected: FAIL - - [td.rowSpan: IDL set to 2147483648] - expected: FAIL - - [td.rowSpan: IDL set to 4294967295] - expected: FAIL - [td.scope: setAttribute() to ""] expected: FAIL @@ -25245,186 +24675,6 @@ [th.tabIndex: IDL set to -2147483648] expected: FAIL - [th.rowSpan: setAttribute() to -2147483649] - expected: FAIL - - [th.rowSpan: setAttribute() to -2147483648] - expected: FAIL - - [th.rowSpan: setAttribute() to -36] - expected: FAIL - - [th.rowSpan: setAttribute() to -1] - expected: FAIL - - [th.rowSpan: setAttribute() to 0] - expected: FAIL - - [th.rowSpan: setAttribute() to 1] - expected: FAIL - - [th.rowSpan: setAttribute() to 257] - expected: FAIL - - [th.rowSpan: setAttribute() to 2147483647] - expected: FAIL - - [th.rowSpan: setAttribute() to 2147483648] - expected: FAIL - - [th.rowSpan: setAttribute() to 4294967295] - expected: FAIL - - [th.rowSpan: setAttribute() to 4294967296] - expected: FAIL - - [th.rowSpan: setAttribute() to ""] - expected: FAIL - - [th.rowSpan: setAttribute() to "-1"] - expected: FAIL - - [th.rowSpan: setAttribute() to "-0"] - expected: FAIL - - [th.rowSpan: setAttribute() to "0"] - expected: FAIL - - [th.rowSpan: setAttribute() to "1"] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\t7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\v7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\f7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\n7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\r7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "
7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "
7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to "7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " 7"] - expected: FAIL - - [th.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] - expected: FAIL - - [th.rowSpan: setAttribute() to undefined] - expected: FAIL - - [th.rowSpan: setAttribute() to 1.5] - expected: FAIL - - [th.rowSpan: setAttribute() to true] - expected: FAIL - - [th.rowSpan: setAttribute() to false] - expected: FAIL - - [th.rowSpan: setAttribute() to object "[object Object\]"] - expected: FAIL - - [th.rowSpan: setAttribute() to NaN] - expected: FAIL - - [th.rowSpan: setAttribute() to Infinity] - expected: FAIL - - [th.rowSpan: setAttribute() to -Infinity] - expected: FAIL - - [th.rowSpan: setAttribute() to "\\0"] - expected: FAIL - - [th.rowSpan: setAttribute() to object "2"] - expected: FAIL - - [th.rowSpan: setAttribute() to object "3"] - expected: FAIL - - [th.rowSpan: IDL set to 0] - expected: FAIL - - [th.rowSpan: IDL set to 1] - expected: FAIL - - [th.rowSpan: IDL set to 257] - expected: FAIL - - [th.rowSpan: IDL set to 2147483647] - expected: FAIL - - [th.rowSpan: IDL set to "-0"] - expected: FAIL - - [th.rowSpan: IDL set to 2147483648] - expected: FAIL - - [th.rowSpan: IDL set to 4294967295] - expected: FAIL - [th.scope: setAttribute() to ""] expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 89acd2726dc..e5f7738ba93 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -5292,6 +5292,18 @@ "url": "/_mozilla/css/table_row_direction_a.html" } ], + "css/table_rowspan_simple_a.html": [ + { + "path": "css/table_rowspan_simple_a.html", + "references": [ + [ + "/_mozilla/css/table_rowspan_simple_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/table_rowspan_simple_a.html" + } + ], "css/table_specified_width_a.html": [ { "path": "css/table_specified_width_a.html", @@ -20538,6 +20550,30 @@ "url": "/_mozilla/css/table_row_direction_a.html" } ], + "css/table_rowspan_simple_a.html": [ + { + "path": "css/table_rowspan_simple_a.html", + "references": [ + [ + "/_mozilla/css/table_rowspan_simple_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/table_rowspan_simple_a.html" + } + ], + "css/table_rowspan_simple_ref.html": [ + { + "path": "css/table_rowspan_simple_ref.html", + "references": [ + [ + "/_mozilla/css/table_rowspan_simple_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/table_rowspan_simple_ref.html" + } + ], "css/table_specified_width_a.html": [ { "path": "css/table_specified_width_a.html", diff --git a/tests/wpt/mozilla/tests/css/table_rowspan_simple_a.html b/tests/wpt/mozilla/tests/css/table_rowspan_simple_a.html new file mode 100644 index 00000000000..8a0df11a942 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/table_rowspan_simple_a.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <meta charset="UTF-8"> + <link rel="match" href="table_rowspan_simple_ref.html"> + <style> + td { + width: 100px; + } + #test { + background-color: green; + } + </style> + <body> + <table border="0" cellspacing="0" cellpadding="0"> + <tr><td rowspan="2"> </td><td> </td></tr> + <tr><td id="test"> </td></tr> + </table> + </body> +</html> + diff --git a/tests/wpt/mozilla/tests/css/table_rowspan_simple_ref.html b/tests/wpt/mozilla/tests/css/table_rowspan_simple_ref.html new file mode 100644 index 00000000000..83580dd1d39 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/table_rowspan_simple_ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <meta charset="UTF-8"> + <link rel="match" href="table_rowspan_simple_ref.html"> + <style> + td { + width: 100px; + } + #test { + background-color: green; + } + </style> + <body> + <table border="0" cellspacing="0" cellpadding="0"> + <tr><td> </td><td> </td></tr> + <tr><td> </td><td id="test"> </td></tr> + </table> + </body> +</html> + |