<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>311048</bug_id>
          
          <creation_ts>2026-03-29 18:23:07 -0700</creation_ts>
          <short_desc>Collapsed border color mismatch when table cell has different writing-mode</short_desc>
          <delta_ts>2026-03-31 06:27:14 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tables</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://github.com/web-platform-tests/wpt/pull/58874</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Karl Dubost">karlcow</reporter>
          <assigned_to name="Karl Dubost">karlcow</assigned_to>
          <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2194940</commentid>
    <comment_count>0</comment_count>
      <attachid>478835</attachid>
    <who name="Karl Dubost">karlcow</who>
    <bug_when>2026-03-29 18:23:07 -0700</bug_when>
    <thetext>Created attachment 478835
testcase

In computeCollapsedBeforeBorder and computeCollapsedAfterBorder, four calls to borderAfter() omit the tableWritingMode() parameter, causing the border value (width/style) to be read using the element&apos;s own writing mode while the border color is resolved using the table&apos;s writing mode. When a cell has a different writing mode from the table, these disagree about which physical edge is &quot;after&quot;, producing a CollapsedBorderValue with width/style from one physical edge and color from another.

The affected lines in RenderTableCell.cpp:

  - computeCollapsedBeforeBorder:
    - previousCell-&gt;style().borderAfter()
    - previousRow-&gt;style().borderAfter()
    - currSection-&gt;style().borderAfter()
  - computeCollapsedAfterBorder:
    - lastRowInSpan-&gt;style().borderAfter()

All four should pass tableWritingMode() as the argument, matching the pattern already used by neighboring lookups in the same functions.

The root cause is where afterColorProperty is resolved using tableWritingMode(): CSSPropertyID afterColorProperty = ... CSSProperty::resolveDirectionAwareProperty(CSSPropertyBorderBlockEndColor, tableWritingMode()) ...;

This correctly maps to border-bottom-color for a horizontal-tb table. But previousCell-&gt;style().borderAfter() uses the cell&apos;s own writing mode, so for a vertical-rl cell it reads border-left properties. The resulting CollapsedBorderValue gets its width/style from border-left but its color from border-bottom-color.

Steps to Reproduce:

1. With Safari Technology Preview 239 on macOS
2. Open testcase

Expected Results:

The border between rows should be 3px blue in both tables (cell-below&apos;s 3px blue top border wins over cell-above&apos;s 1px gray bottom border per the &quot;wider border wins&quot; rule).

Actual Results:

In the test table, the border between rows renders with the wrong color (gray instead of blue). The gray comes from border-bottom-color of the cell above, which leaks into the collapsed border value due to the writing-mode mismatch. The reference table correctly shows 3px blue.

Firefox and Chrome both render 3px blue for both tables.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2194959</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2026-03-29 19:10:32 -0700</bug_when>
    <thetext>&lt;rdar://problem/173655092&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2194960</commentid>
    <comment_count>2</comment_count>
    <who name="Karl Dubost">karlcow</who>
    <bug_when>2026-03-29 19:16:26 -0700</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/61647</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2195513</commentid>
    <comment_count>3</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2026-03-31 06:23:08 -0700</bug_when>
    <thetext>Committed 310303@main (81700e22624d): &lt;https://commits.webkit.org/310303@main&gt;

Reviewed commits have been landed. Closing PR #61647 and removing active labels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2195514</commentid>
    <comment_count>4</comment_count>
    <who name="Karl Dubost">karlcow</who>
    <bug_when>2026-03-31 06:27:14 -0700</bug_when>
    <thetext>Submitted web-platform-tests pull request: https://github.com/web-platform-tests/wpt/pull/58874</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>478835</attachid>
            <date>2026-03-29 18:23:07 -0700</date>
            <delta_ts>2026-03-29 18:23:07 -0700</delta_ts>
            <desc>testcase</desc>
            <filename>bug01-collapsed-border-writing-mode.html</filename>
            <type>text/html</type>
            <size>3501</size>
            <attacher name="Karl Dubost">karlcow</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjwhLS0KQnVnIDE6IE1pc3NpbmcgdGFibGVXcml0aW5nTW9kZSgpIGlu
IGNvbGxhcHNlZCBib3JkZXIgcmVzb2x1dGlvbiAoUmVuZGVyVGFibGVDZWxsLmNwcDoxMDMzKQoK
SW4gY29tcHV0ZUNvbGxhcHNlZEJlZm9yZUJvcmRlciwgbGluZSAxMDMzIGNhbGxzOgogICAgcHJl
dmlvdXNDZWxsLT5zdHlsZSgpLmJvcmRlckFmdGVyKCkgICAgICAgICAgIOKGkCB1c2VzIGNlbGwn
cyBPV04gd3JpdGluZyBtb2RlCkJ1dCB0aGUgY29sb3IgYXQgbGluZSAxMDI0IGlzIHJlc29sdmVk
IHZpYToKICAgIENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUJvcmRlckJsb2NrRW5kQ29sb3IsIHRhYmxlV3JpdGluZ01vZGUoKSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaQIHVzZXMgVEFCTEUn
cyB3cml0aW5nIG1vZGUKCkZvciBhIGNlbGwgd2l0aCB3cml0aW5nLW1vZGU6dmVydGljYWwtcmwg
aW4gYSBob3Jpem9udGFsLXRiIHRhYmxlOgogIC0gYm9yZGVyQWZ0ZXIoKSBbY2VsbCdzIHZlcnRp
Y2FsLXJsXSDihpIgcmVhZHMgYm9yZGVyLUxFRlQgKHZhbHVlOiB3aWR0aCArIHN0eWxlKQogIC0g
YWZ0ZXJDb2xvclByb3BlcnR5IFt0YWJsZSdzIGhvcml6b250YWwtdGJdIOKGkiByZXNvbHZlcyB0
byBib3JkZXItQk9UVE9NLWNvbG9yCgpUaGlzIGNyZWF0ZXMgYSBGcmFua2Vuc3RlaW4gQ29sbGFw
c2VkQm9yZGVyVmFsdWU6IHdpZHRoL3N0eWxlIGZyb20gYm9yZGVyLWxlZnQsCmNvbG9yIGZyb20g
Ym9yZGVyLWJvdHRvbS4gVGhlIG1pc21hdGNoZWQgY29sb3IgY2FuIGNvbnRhbWluYXRlIHRoZSBi
b3JkZXIKcmVzb2x1dGlvbiBhbmQgcHJvcGFnYXRlIHRoZSB3cm9uZyBjb2xvciB0byB0aGUgZmlu
YWwgcGFpbnRlZCBib3JkZXIuCgpWRVJJRklFRDoKICAtIFNhZmFyaTogIGJvcmRlciBiZXR3ZWVu
IHJvd3MgaXMgZ3JheSAoV1JPTkcgLSBjb2xvciBmcm9tIGJvcmRlci1ib3R0b20gbGVha2VkKQog
IC0gRmlyZWZveDogYm9yZGVyIGJldHdlZW4gcm93cyBpcyBibHVlIChDT1JSRUNUKQogIC0gQ2hy
b21lOiAgYm9yZGVyIGJldHdlZW4gcm93cyBpcyBibHVlIChDT1JSRUNUKQoKQm90aCB0YWJsZXMg
dXNlIGlkZW50aWNhbCBDU1MgYm9yZGVycy4gVGhlIE9OTFkgZGlmZmVyZW5jZSBpcyB3cml0aW5n
LW1vZGU6dmVydGljYWwtcmwKb24gdGhlIHRvcCBjZWxsLiBUaGUgcmVmZXJlbmNlIHRhYmxlIChu
byB3cml0aW5nLW1vZGUgY2hhbmdlKSBzaG93cyBibHVlIGluIGFsbCBicm93c2Vycy4KLS0+Cjxo
dG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+QnVnIDE6IENvbGxhcHNl
ZCBib3JkZXIgY29sb3IgbWlzbWF0Y2ggd2l0aCBtaXhlZCB3cml0aW5nLW1vZGU8L3RpdGxlPgo8
c3R5bGU+CiAgdGFibGUgewogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIHdyaXRp
bmctbW9kZTogaG9yaXpvbnRhbC10YjsKICAgIHdpZHRoOiAzMDBweDsKICB9CiAgdGQgeyBwYWRk
aW5nOiAxMHB4OyB9CiAgI2NlbGwtYWJvdmUgewogICAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1y
bDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBncmF5OyAgIC8qIHRhYmxlJ3MgImFmdGVy
IiBlZGdlIC0gY29sb3IgbGVha3MgaW50byByZXN1bHQgKi8KICAgIGJvcmRlci1sZWZ0OiA1cHgg
c29saWQgZ3JlZW47ICAgIC8qIGNlbGwncyBvd24gImFmdGVyIiBlZGdlIGluIHZlcnRpY2FsLXJs
ICovCiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTsKICAgIGJvcmRlci1yaWdodDogMXB4
IHNvbGlkIGdyYXk7CiAgICBoZWlnaHQ6IDYwcHg7CiAgfQogICNjZWxsLWJlbG93IHsKICAgIGJv
cmRlci10b3A6IDNweCBzb2xpZCBibHVlOyAgICAgIC8qIHNob3VsZCB3aW46IDNweCA+IDFweCAq
LwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGdyYXk7CiAgICBib3JkZXItbGVmdDogMXB4
IHNvbGlkIGdyYXk7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBncmF5OwogICAgaGVpZ2h0
OiA2MHB4OwogIH0KCiAgLyogUmVmZXJlbmNlOiBpZGVudGljYWwgYm9yZGVycywgbm8gd3JpdGlu
Zy1tb2RlIG92ZXJyaWRlICovCiAgI3JlZi1hYm92ZSB7CiAgICBib3JkZXItYm90dG9tOiAxcHgg
c29saWQgZ3JheTsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgZ3JlZW47CiAgICBib3JkZXIt
dG9wOiAxcHggc29saWQgZ3JheTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGdyYXk7CiAg
ICBoZWlnaHQ6IDYwcHg7CiAgICBwYWRkaW5nOiAxMHB4OwogIH0KICAjcmVmLWJlbG93IHsKICAg
IGJvcmRlci10b3A6IDNweCBzb2xpZCBibHVlOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlk
IGdyYXk7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGdyYXk7CiAgICBib3JkZXItcmlnaHQ6
IDFweCBzb2xpZCBncmF5OwogICAgaGVpZ2h0OiA2MHB4OwogICAgcGFkZGluZzogMTBweDsKICB9
Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CjxoMz5CdWcgMTogQ29sbGFwc2VkIGJvcmRlciBjb2xv
ciBtaXNtYXRjaCB3aXRoIG1peGVkIHdyaXRpbmctbW9kZTwvaDM+Cgo8cD48Yj5UZXN0IHRhYmxl
PC9iPiAodG9wIGNlbGwgaGFzIHdyaXRpbmctbW9kZTogdmVydGljYWwtcmwpOjwvcD4KPHRhYmxl
PgogIDx0cj48dGQgaWQ9ImNlbGwtYWJvdmUiPlRvcCBjZWxsICh3cml0aW5nLW1vZGU6IHZlcnRp
Y2FsLXJsKTwvdGQ+PC90cj4KICA8dHI+PHRkIGlkPSJjZWxsLWJlbG93Ij5Cb3R0b20gY2VsbCAo
bm9ybWFsKTwvdGQ+PC90cj4KPC90YWJsZT4KCjxwPjxiPlJlZmVyZW5jZSB0YWJsZTwvYj4gKHNh
bWUgYm9yZGVycywgbm8gd3JpdGluZy1tb2RlIGNoYW5nZSk6PC9wPgo8dGFibGU+CiAgPHRyPjx0
ZCBpZD0icmVmLWFib3ZlIj5Ub3AgY2VsbCAobm8gd3JpdGluZy1tb2RlIGNoYW5nZSk8L3RkPjwv
dHI+CiAgPHRyPjx0ZCBpZD0icmVmLWJlbG93Ij5Cb3R0b20gY2VsbCAobm9ybWFsKTwvdGQ+PC90
cj4KPC90YWJsZT4KCjxwPjxiPkV4cGVjdGVkOjwvYj4gQm90aCB0YWJsZXMgc2hvdyBhIDxzcGFu
IHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtd2VpZ2h0OmJvbGQiPjNweCBibHVlPC9zcGFuPgpib3Jk
ZXIgYmV0d2VlbiByb3dzIChjZWxsLWJlbG93J3MgM3B4IGJsdWUgdG9wIHdpbnMgb3ZlciBjZWxs
LWFib3ZlJ3MgMXB4IGdyYXkgYm90dG9tKS48L3A+CjxwPjxiPlNhZmFyaSBidWc6PC9iPiBUaGUg
dGVzdCB0YWJsZSBzaG93cyBhIDxzcGFuIHN0eWxlPSJjb2xvcjpncmF5O2ZvbnQtd2VpZ2h0OmJv
bGQiPmdyYXk8L3NwYW4+CmJvcmRlciBiZXR3ZWVuIHJvd3MuIFRoZSBncmF5IGNvbG9yIGxlYWtz
IGZyb20gY2VsbC1hYm92ZSdzIGJvcmRlci1ib3R0b20tY29sb3IKYmVjYXVzZSB0aGUgYm9yZGVy
IHZhbHVlIGFuZCBjb2xvciBhcmUgcmVzb2x2ZWQgdXNpbmcgZGlmZmVyZW50IHdyaXRpbmcgbW9k
ZXMuPC9wPgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>