diff --git a/content/html/content/src/nsHTMLTableElement.cpp b/content/html/content/src/nsHTMLTableElement.cpp
--- a/content/html/content/src/nsHTMLTableElement.cpp
+++ b/content/html/content/src/nsHTMLTableElement.cpp
@@ -1196,48 +1196,17 @@ MapAttributesIntoRule(const nsMappedAttr
const nsStyleDisplay* readDisplay = aData->mStyleContext->GetStyleDisplay();
if (readDisplay->mDisplay != NS_STYLE_DISPLAY_TABLE_CELL)
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
}
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) {
const nsStyleTableBorder* tableStyle = aData->mStyleContext->GetStyleTableBorder();
const nsStyleDisplay* readDisplay = aData->mStyleContext->GetStyleDisplay();
- if (readDisplay->mDisplay == NS_STYLE_DISPLAY_TABLE_CELL) {
- if (NS_STYLE_BORDER_SEPARATE == tableStyle->mBorderCollapse) {
- // Set the cell's border from the table in the separate border
- // model.
- const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::border);
- if (value &&
- ((value->Type() == nsAttrValue::eInteger &&
- value->GetIntegerValue() > 0) ||
- value->IsEmptyString())) {
- if (aData->mMarginData->mBorderWidth.mLeft.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderWidth.mLeft.SetFloatValue(1.0f, eCSSUnit_Pixel);
- if (aData->mMarginData->mBorderWidth.mRight.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderWidth.mRight.SetFloatValue(1.0f, eCSSUnit_Pixel);
- if (aData->mMarginData->mBorderWidth.mTop.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderWidth.mTop.SetFloatValue(1.0f, eCSSUnit_Pixel);
- if (aData->mMarginData->mBorderWidth.mBottom.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderWidth.mBottom.SetFloatValue(1.0f, eCSSUnit_Pixel);
-
- PRUint8 borderStyle = NS_STYLE_BORDER_STYLE_INSET;
-
- if (aData->mMarginData->mBorderStyle.mLeft.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderStyle.mLeft.SetIntValue(borderStyle, eCSSUnit_Enumerated);
- if (aData->mMarginData->mBorderStyle.mRight.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderStyle.mRight.SetIntValue(borderStyle, eCSSUnit_Enumerated);
- if (aData->mMarginData->mBorderStyle.mTop.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderStyle.mTop.SetIntValue(borderStyle, eCSSUnit_Enumerated);
- if (aData->mMarginData->mBorderStyle.mBottom.GetUnit() == eCSSUnit_Null)
- aData->mMarginData->mBorderStyle.mBottom.SetIntValue(borderStyle, eCSSUnit_Enumerated);
- }
- }
- }
- else { // table
+ if (readDisplay->mDisplay != NS_STYLE_DISPLAY_TABLE_CELL) {
// bordercolor
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::bordercolor);
nscolor color;
if (value && presContext->UseDocumentColors() &&
value->GetColorValue(color)) {
if (aData->mMarginData->mBorderColor.mLeft.GetUnit() == eCSSUnit_Null)
aData->mMarginData->mBorderColor.mLeft.SetColorValue(color);
if (aData->mMarginData->mBorderColor.mRight.GetUnit() == eCSSUnit_Null)
diff --git a/layout/reftests/table-bordercollapse/bordercol.css b/layout/reftests/table-bordercollapse/bordercol.css
--- a/layout/reftests/table-bordercollapse/bordercol.css
+++ b/layout/reftests/table-bordercollapse/bordercol.css
@@ -3,21 +3,21 @@ table {
margin-bottom: 0.5in;
}
caption {
font-weight: bold;
font-style: italic;
}
td {background-color:LightCyan }
-table.topLight {border-top: 1px solid black}
+table.topLight {border-top: 1px solid #AFAFAF}
table.bottom {border-bottom: 1px solid black}
-table.bottomDark {border-bottom: 1px solid black}
-table.leftLight {border-left: 1px solid black}
+table.bottomDark {border-bottom: 1px solid #444444}
+table.leftLight {border-left: 1px solid #AFAFAF}
table.right {border-right: 1px solid black}
-table.rightDark {border-right: 1px solid black}
+table.rightDark {border-right: 1px solid #444444}
table.top {border-top: 1px solid black}
table.left {border-left: 1px solid black}
table.bc {border-collapse:collapse}
tbody.border{border-top: 1px solid black; border-bottom: 1px solid black; }
tr.border{border-top: 1px solid black; border-bottom: 1px solid black; }
td.border{border-left:1px solid black;}
diff --git a/layout/reftests/table-bordercollapse/borderhandling-1.html b/layout/reftests/table-bordercollapse/borderhandling-1.html
--- a/layout/reftests/table-bordercollapse/borderhandling-1.html
+++ b/layout/reftests/table-bordercollapse/borderhandling-1.html
@@ -1,8 +1,11 @@
+
-
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-2.html b/layout/reftests/table-bordercollapse/borderhandling-2.html
--- a/layout/reftests/table-bordercollapse/borderhandling-2.html
+++ b/layout/reftests/table-bordercollapse/borderhandling-2.html
@@ -1,8 +1,11 @@
+
-
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-3.html b/layout/reftests/table-bordercollapse/borderhandling-3.html
--- a/layout/reftests/table-bordercollapse/borderhandling-3.html
+++ b/layout/reftests/table-bordercollapse/borderhandling-3.html
@@ -1,8 +1,11 @@
+
-
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-4.html b/layout/reftests/table-bordercollapse/borderhandling-4.html
--- a/layout/reftests/table-bordercollapse/borderhandling-4.html
+++ b/layout/reftests/table-bordercollapse/borderhandling-4.html
@@ -1,8 +1,11 @@
+
-
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-5.xhtml b/layout/reftests/table-bordercollapse/borderhandling-5.xhtml
--- a/layout/reftests/table-bordercollapse/borderhandling-5.xhtml
+++ b/layout/reftests/table-bordercollapse/borderhandling-5.xhtml
@@ -1,9 +1,11 @@
-
+
-
+
diff --git a/layout/reftests/table-bordercollapse/borderhandling-6.xhtml b/layout/reftests/table-bordercollapse/borderhandling-6.xhtml
--- a/layout/reftests/table-bordercollapse/borderhandling-6.xhtml
+++ b/layout/reftests/table-bordercollapse/borderhandling-6.xhtml
@@ -1,9 +1,11 @@
-
+
-
+
diff --git a/layout/reftests/table-bordercollapse/borderhandling-7.xhtml b/layout/reftests/table-bordercollapse/borderhandling-7.xhtml
--- a/layout/reftests/table-bordercollapse/borderhandling-7.xhtml
+++ b/layout/reftests/table-bordercollapse/borderhandling-7.xhtml
@@ -1,9 +1,11 @@
-
+
-
+
diff --git a/layout/reftests/table-bordercollapse/borderhandling-8.html b/layout/reftests/table-bordercollapse/borderhandling-8.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/borderhandling-8.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-frame-border-ref.html b/layout/reftests/table-bordercollapse/borderhandling-frame-border-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/borderhandling-frame-border-ref.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+frame/border | empty | border | border="0" | border="1" | border="3" |
+empty |
+ |
+ |
+ |
+ |
+ |
+
+frame |
+ |
+ |
+ |
+ |
+ |
+
+frame="void" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="above" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="below" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="hsides" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="lhs" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="rhs" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="vsides" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="box" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="border" |
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-frame-border.html b/layout/reftests/table-bordercollapse/borderhandling-frame-border.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/borderhandling-frame-border.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+frame/border | empty | border | border="0" | border="1" | border="3" |
+empty |
+ |
+ |
+ |
+ |
+ |
+
+frame |
+ |
+ |
+ |
+ |
+ |
+
+frame="void" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="above" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+frame="below" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="hsides" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="lhs" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="rhs" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="vsides" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="box" |
+ |
+ |
+ |
+ |
+ |
+
+
+frame="border" |
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-ref.html b/layout/reftests/table-bordercollapse/borderhandling-ref.html
--- a/layout/reftests/table-bordercollapse/borderhandling-ref.html
+++ b/layout/reftests/table-bordercollapse/borderhandling-ref.html
@@ -1,8 +1,11 @@
+
-
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-rules-border-ref.html b/layout/reftests/table-bordercollapse/borderhandling-rules-border-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/borderhandling-rules-border-ref.html
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+rules/border | empty | border | border="0" | border="1" | border="3" |
+empty |
+ |
+ |
+ |
+ |
+ |
+
+rules |
+ |
+ |
+ |
+ |
+ |
+
+
+rules="none" |
+
+ |
+ |
+ |
+ |
+ |
+
+rules="groups" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
+
+rules="rows" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+rules="cols" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+rules="all" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/borderhandling-rules-border.html b/layout/reftests/table-bordercollapse/borderhandling-rules-border.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/borderhandling-rules-border.html
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+rules/border | empty | border | border="0" | border="1" | border="3" |
+empty |
+ |
+ |
+ |
+ |
+ |
+
+rules |
+ |
+ |
+ |
+ |
+ |
+
+
+rules="none" |
+
+ |
+ |
+ |
+ |
+ |
+
+rules="groups" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
+
+rules="rows" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+rules="cols" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+rules="all" |
+
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/reftest.list b/layout/reftests/table-bordercollapse/reftest.list
--- a/layout/reftests/table-bordercollapse/reftest.list
+++ b/layout/reftests/table-bordercollapse/reftest.list
@@ -67,9 +67,11 @@ fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") ==
== frame_vsides_rules_rows.html frame_vsides_rules_rows_ref.html
== borderhandling-1.html borderhandling-ref.html
== borderhandling-2.html borderhandling-ref.html
== borderhandling-3.html borderhandling-ref.html
== borderhandling-4.html borderhandling-ref.html
== borderhandling-5.xhtml borderhandling-ref.html
== borderhandling-6.xhtml borderhandling-ref.html
== borderhandling-7.xhtml borderhandling-ref.html
-
+== borderhandling-8.html borderhandling-ref.html
+== borderhandling-frame-border.html borderhandling-frame-border-ref.html
+== borderhandling-rules-border.html borderhandling-rules-border-ref.html
diff --git a/layout/style/html.css b/layout/style/html.css
--- a/layout/style/html.css
+++ b/layout/style/html.css
@@ -202,105 +202,106 @@ table[align="right"] {
/* border collapse rules */
/* Set hidden if we have 'frame' or 'rules' attribute.
Set it on all sides when we do so there's more consistency
in what authors should expect */
/* Put this first so 'border' and 'frame' rules can override it. */
-table[rules] {
- border: thin hidden;
-}
+table[rules] {border: thin hidden;}
/* 'border' before 'frame' so 'frame' overrides
A border with a given value should, of course, pass that value
as the border-width in pixels -> attr mapping */
/* 'border="0"' suppresses the border */
-table[border]:not([border="0"]) { border: thin outset; }
+table[border]:not([border="0"]) {border: thin outset; }
- /* XXX Current code uses the 'outset' style instead;
- Opera uses 'outset' only if 'border' was set */
-table[frame] {
- border: thin hidden;
-}
+
+table[frame] {border: thin hidden;}
-table[frame="above"] { border-style: solid hidden hidden hidden;}
-table[frame="below"] { border-style: hidden hidden solid hidden;}
-table[frame="lhs"] { border-style: hidden hidden hidden solid;}
-table[frame="rhs"] { border-style: hidden solid hidden hidden;}
-table[frame="hsides"] { border-style: solid hidden;}
-table[frame="vsides"] { border-style: hidden solid;}
-table[frame="box"],
-table[frame="border"] { border-style: solid;}
+/*increased specifity to compete with [border]:not([border="0"]) rule above*/
+table[frame][frame="void"] { border-style: hidden;}
+table[frame][frame="above"] { border-style: outset hidden hidden hidden;}
+table[frame][frame="below"] { border-style: hidden hidden outset hidden;}
+table[frame][frame="lhs"] { border-style: hidden hidden hidden outset;}
+table[frame][frame="rhs"] { border-style: hidden outset hidden hidden;}
+table[frame][frame="hsides"] { border-style: outset hidden;}
+table[frame][frame="vsides"] { border-style: hidden outset;}
+table[frame][frame="box"],
+table[frame][frame="border"] { border-style: outset;}
- /* Don't set hidden if there's no frame, no border, and rules=none */
-table[rules="none"]:not([frame]):not([border]),
-table[rules="none"]:not([frame])[border="0"] {
- border: none;
-}
-
+
/* Internal Table Borders */
/* 'border' cell borders first */
-table[border]:not([border="0"])> tr > td,
+
table[border]:not([border="0"])> * > tr > td,
-table[border]:not([border="0"])> tr > th,
table[border]:not([border="0"])> * > tr > th,
-table[border]:not([border="0"]) > td,
-table[border]:not([border="0"])> th,
table[border]:not([border="0"])> * > td,
-table[border]:not([border="0"]) > * > th {
+table[border]:not([border="0"])> * > th,
+table[border]:not([border="0"])> td,
+table[border]:not([border="0"])> th
+{
border: thin inset;
}
table[rules]:not([rules="none"]):not([rules=""]) {
- /* XXX current code collapses for rules="", do we want to preserve that here?
- Or maybe copy Opera, which collapses for rules="none" but not for rules="" */
+/*collapse only if rules are really specified*/
border-collapse: collapse;
}
- /*'rules' overrides 'border' settings */
-
-table[rules] > tr > td,
-table[rules] > * > tr > td,
-table[rules] > tr > th,
-table[rules] > * > tr > th {
- border-style: none;
- border-width: thin;
+/*'rules' overrides 'border' settings (increased specifity to achieve this)*/
+table[rules]:not([rules=""]) > tr > td,
+table[rules]:not([rules=""]) > * > tr > td,
+table[rules]:not([rules=""]) > tr > th,
+table[rules]:not([rules=""]) > * > tr > th
+{
+ border: thin none;
}
-table[rules="all"] > tr > td,
-table[rules="all"] > * > tr > td,
-table[rules="all"] > tr > th,
-table[rules="all"] > * > tr > th {
- border-style: solid;
+
+table[rules][rules="none"] > tr > td,
+table[rules][rules="none"] > * > tr > td,
+table[rules][rules="none"] > tr > th,
+table[rules][rules="none"] > * > tr > th
+{
+ border: thin hidden;
}
-table[rules="rows"] > tr,
-table[rules="rows"] > * > tr {
+table[rules][rules="all"] > tr > td,
+table[rules][rules="all"] > * > tr > td,
+table[rules][rules="all"] > tr > th,
+table[rules][rules="all"] > * > tr > th {
+ border: thin solid ;
+}
+
+table[rules][rules="rows"] > tr,
+table[rules][rules="rows"] > * > tr {
border-top: thin solid;
border-bottom: thin solid;
}
-table[rules="cols"] > tr > td,
-table[rules="cols"] > * > tr > td,
-table[rules="cols"] > tr > th,
-table[rules="cols"] > * > tr > th {
- border-style: none solid;
-}
-table[rules="groups"] > colgroup {
+table[rules][rules="cols"] > tr > td,
+table[rules][rules="cols"] > * > tr > td,
+table[rules][rules="cols"] > tr > th,
+table[rules][rules="cols"] > * > tr > th {
border-left: thin solid;
border-right: thin solid;
}
-table[rules="groups"] > tfoot,
-table[rules="groups"] > thead,
-table[rules="groups"] > tbody {
+
+table[rules][rules="groups"] > colgroup {
+ border-left: thin solid;
+ border-right: thin solid;
+}
+table[rules][rules="groups"] > tfoot,
+table[rules][rules="groups"] > thead,
+table[rules][rules="groups"] > tbody {
border-top: thin solid;
border-bottom: thin solid;
}
/* caption inherits from table not table-outer */
caption {
display: table-caption;