Bug 1210877 - Make nsBidiPresUtils::RepositionFrame work also for box-decoration-break:clone. r=roc, a=lizzard
authorMats Palmgren <mats@mozilla.com>
Sat, 03 Oct 2015 06:28:00 +0200
changeset 296437 c63b04aa6e9a291581504d8eaa588ad512ad7c9c
parent 296436 d32d0321812f0fc485fbbc7719010b041afc0e12
child 296438 8732331619b21c210a75f59d85397594731025a1
push id5245
push userraliiev@mozilla.com
push dateThu, 29 Oct 2015 11:30:51 +0000
treeherdermozilla-beta@dac831dc1bd0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc, lizzard
bugs1210877
milestone43.0a2
Bug 1210877 - Make nsBidiPresUtils::RepositionFrame work also for box-decoration-break:clone. r=roc, a=lizzard
layout/base/nsBidiPresUtils.cpp
layout/reftests/css-break/box-decoration-break-with-bidi-ref.html
layout/reftests/css-break/box-decoration-break-with-bidi.html
layout/reftests/css-break/reftest.list
--- a/layout/base/nsBidiPresUtils.cpp
+++ b/layout/base/nsBidiPresUtils.cpp
@@ -1573,29 +1573,32 @@ nsBidiPresUtils::RepositionFrame(nsIFram
   // bidiUtils->ReorderFrames, so this is guaranteed to be after the inlines
   // have been reflowed, which is required for GetUsedMargin/Border/Padding
   nscoord frameISize = aFrame->ISize();
   LogicalMargin frameMargin = aFrame->GetLogicalUsedMargin(frameWM);
   LogicalMargin borderPadding = aFrame->GetLogicalUsedBorderAndPadding(frameWM);
   // Since the visual order of frame could be different from the
   // continuation order, we need to remove any border/padding first,
   // so that we can get the correct isize of the current frame.
-  if (!aFrame->GetPrevContinuation()) {
-    frameISize -= borderPadding.IStart(frameWM);
-  }
-  if (!aFrame->GetNextContinuation()) {
-    frameISize -= borderPadding.IEnd(frameWM);
-  }
-  if (!isFirst) {
-    frameMargin.IStart(frameWM) = 0;
-    borderPadding.IStart(frameWM) = 0;
-  }
-  if (!isLast) {
-    frameMargin.IEnd(frameWM) = 0;
-    borderPadding.IEnd(frameWM) = 0;
+  if (aFrame->StyleBorder()->mBoxDecorationBreak ==
+        NS_STYLE_BOX_DECORATION_BREAK_SLICE) {
+    if (!aFrame->GetPrevContinuation()) {
+      frameISize -= borderPadding.IStart(frameWM);
+    }
+    if (!aFrame->GetNextContinuation()) {
+      frameISize -= borderPadding.IEnd(frameWM);
+    }
+    if (!isFirst) {
+      frameMargin.IStart(frameWM) = 0;
+      borderPadding.IStart(frameWM) = 0;
+    }
+    if (!isLast) {
+      frameMargin.IEnd(frameWM) = 0;
+      borderPadding.IEnd(frameWM) = 0;
+    }
   }
   frameISize += borderPadding.IStartEnd(frameWM);
 
   nscoord icoord = 0;
   if (!IsBidiLeaf(aFrame)) {
     bool reverseDir = aIsEvenLevel != frameWM.IsBidiLTR();
     icoord += reverseDir ?
       borderPadding.IEnd(frameWM) : borderPadding.IStart(frameWM);
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-break/box-decoration-break-with-bidi-ref.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+  <meta charset="utf-8">
+  <title>Testing box-decoration-break with bidi resolution</title>
+  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1210877">
+  <style type="text/css">
+
+.test {
+    box-decoration-break: slice;
+    background: black;
+}
+.p {
+    padding:11px 3px 5px 7px;
+}
+.b {
+    border: 1px solid blue;
+    border-width:3px 5px 7px 11px;
+}
+.m {
+    margin:5px 7px 11px 3px;
+}
+.direction {
+    direction: rtl;
+}
+
+x {display:inline-block; width:20px; height:10px; background:lime; }
+y {display:inline-block; width:30px; height:1px; background:lime; }
+d {display:inline-block; border:10px solid red }
+    </style>
+</head>
+<body>
+
+<div style="float:left; width: 100px;">
+<span class="test p"><x></x></span><br>
+<span class="test p"><y></y></span><br><br><br>
+<span class="test b"><x></x></span><br>
+<span class="test b"><y></y></span><br><br><br>
+<span class="test p b"><x></x></span><br>
+<span class="test p b"><y></y></span><br><br><br>
+<span class="test m"><x></x></span><br>
+<span class="test m"><y></y></span><br><br><br>
+<span class="test p m"><x></x></span><br>
+<span class="test p m"><y></y></span><br><br><br>
+<span class="test b m"><x></x></span><br>
+<span class="test b m"><y></y></span><br><br><br>
+<span class="test p b m"><x></x></span><br>
+<span class="test p b m"><y></y></span><br><br><br>
+
+
+</div><div style="float:left; width: 100px; text-align:right">
+
+<span class="test p"><y></y></span><br>
+<span class="test p"><x></x></span><br><br><br>
+<span class="test b"><y></y></span><br>
+<span class="test b"><x></x></span><br><br><br>
+<span class="test p b"><y></y></span><br>
+<span class="test p b"><x></x></span><br><br><br>
+<span class="test m"><y></y></span><br>
+<span class="test m"><x></x></span><br><br><br>
+<span class="test p m"><y></y></span><br>
+<span class="test p m"><x></x></span><br><br><br>
+<span class="test b m"><y></y></span><br>
+<span class="test b m"><x></x></span><br><br><br>
+<span class="test p b m"><y></y></span><br>
+<span class="test p b m"><x></x></span><br><br><br>
+
+</div>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-break/box-decoration-break-with-bidi.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+  <meta charset="utf-8">
+  <title>Testing box-decoration-break with bidi resolution</title>
+  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1210877">
+  <link rel="help" href="http://dev.w3.org/csswg/css-break/#break-decoration">
+  <link rel="match" href="box-decoration-break-with-bidi-ref.html">
+  <style type="text/css">
+
+.test {
+    box-decoration-break: clone;
+    background: black;
+}
+.p {
+    padding:11px 3px 5px 7px;
+}
+.b {
+    border: 1px solid blue;
+    border-width:3px 5px 7px 11px;
+}
+.m {
+    margin:5px 7px 11px 3px;
+}
+.direction {
+    direction: rtl;
+}
+
+x {display:inline-block; width:20px; height:10px; background:lime; }
+y {display:inline-block; width:30px; height:1px; background:lime; }
+d {display:inline-block; border:10px solid red }
+    </style>
+</head>
+<body>
+
+<div style="float:left; width: 100px;">
+<span class="test p"><x></x><br><y></y></span><br><br><br>
+<span class="test b"><x></x><br><y></y></span><br><br><br>
+<span class="test p b"><x></x><br><y></y></span><br><br><br>
+<span class="test m"><x></x><br><y></y></span><br><br><br>
+<span class="test p m"><x></x><br><y></y></span><br><br><br>
+<span class="test b m"><x></x><br><y></y></span><br><br><br>
+<span class="test p b m"><x></x><br><y></y></span><br><br><br>
+
+<div class="direction"></div>  <!-- to trigger bidi resolution -->
+
+</div><div style="float:left; width: 100px; text-align:right">
+
+<span class="test p"><y></y><br><x></x></span><br><br><br>
+<span class="test b"><y></y><br><x></x></span><br><br><br>
+<span class="test p b"><y></y><br><x></x></span><br><br><br>
+<span class="test m"><y></y><br><x></x></span><br><br><br>
+<span class="test p m"><y></y><br><x></x></span><br><br><br>
+<span class="test b m"><y></y><br><x></x></span><br><br><br>
+<span class="test p b m"><y></y><br><x></x></span><br><br><br>
+
+<div class="direction"></div>  <!-- to trigger bidi resolution -->
+</div>
+
+</body>
+</html>
--- a/layout/reftests/css-break/reftest.list
+++ b/layout/reftests/css-break/reftest.list
@@ -2,8 +2,9 @@ default-preferences pref(layout.css.box-
 
 == box-decoration-break-1.html box-decoration-break-1-ref.html
 fuzzy(1,20) == box-decoration-break-with-inset-box-shadow-1.html box-decoration-break-with-inset-box-shadow-1-ref.html
 fuzzy(16,460) fuzzy-if(Android,10,3673) == box-decoration-break-with-outset-box-shadow-1.html box-decoration-break-with-outset-box-shadow-1-ref.html
 random-if(!gtkWidget) HTTP(..) == box-decoration-break-border-image.html box-decoration-break-border-image-ref.html
 == box-decoration-break-block-border-padding.html box-decoration-break-block-border-padding-ref.html
 == box-decoration-break-block-margin.html box-decoration-break-block-margin-ref.html
 fuzzy-if(!Android,1,5) fuzzy-if(Android,8,6627) == box-decoration-break-first-letter.html box-decoration-break-first-letter-ref.html
+== box-decoration-break-with-bidi.html box-decoration-break-with-bidi-ref.html