mirror of
https://github.com/servo/servo.git
synced 2025-07-13 10:23:40 +01:00
Add the HTMLTableCellElement::rowspan property
This commit is contained in:
parent
b77a0a89cf
commit
e982d6003f
10 changed files with 52 additions and 763 deletions
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,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,
|
||||
}
|
||||
|
||||
|
||||
|
@ -268,6 +270,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 +278,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 +323,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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -324,6 +324,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>>>;
|
||||
|
@ -627,6 +629,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 {
|
||||
|
|
|
@ -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 {
|
||||
|
@ -47,6 +48,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");
|
||||
|
||||
|
@ -80,6 +87,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;
|
||||
}
|
||||
|
||||
|
@ -102,6 +110,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())
|
||||
|
@ -121,6 +137,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),
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -913,6 +913,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> {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -266,8 +266,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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue