about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/cascade.nim12
-rw-r--r--test/layout/position-absolute-prevents-blockification.expected3
-rw-r--r--test/layout/position-absolute-prevents-blockification.html35
3 files changed, 46 insertions, 4 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index d98949a1..453b65f8 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -272,11 +272,15 @@ func buildComputedValues(rules: CSSValueEntryMap; parent: CSSValues;
   for t in CSSPropertyType:
     if not inited[t]:
       result.initialOrInheritFrom(parent, t)
-  if result{"float"} != FloatNone:
+  # Quirk: it seems others aren't implementing what the spec says about
+  # blockification.
+  # Well, neither will I, because the spec breaks on actual websites.
+  # Curse CSS.
+  if result{"position"} in {PositionAbsolute, PositionFixed}:
+    if result{"display"} == DisplayInline:
+      result{"display"} = DisplayInlineBlock
+  elif result{"float"} != FloatNone:
     result{"display"} = result{"display"}.blockify()
-  elif result{"position"} in {PositionAbsolute, PositionFixed} and
-      result{"display"} == DisplayInline:
-    result{"display"} = DisplayInlineBlock
   if (result{"overflow-x"} in {OverflowVisible, OverflowClip}) !=
       (result{"overflow-y"} in {OverflowVisible, OverflowClip}):
     result{"overflow-x"} = result{"overflow-x"}.bfcify()
diff --git a/test/layout/position-absolute-prevents-blockification.expected b/test/layout/position-absolute-prevents-blockification.expected
new file mode 100644
index 00000000..e99cc285
--- /dev/null
+++ b/test/layout/position-absolute-prevents-blockification.expected
@@ -0,0 +1,3 @@
+test 1test 2
+test 1test 2
+test 1test 2
diff --git a/test/layout/position-absolute-prevents-blockification.html b/test/layout/position-absolute-prevents-blockification.html
new file mode 100644
index 00000000..1fa49f1d
--- /dev/null
+++ b/test/layout/position-absolute-prevents-blockification.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+Fun fact: Blink and Gecko agree on inline-flex, but disagree on
+inline-table.
+The spec disagrees with both, but that breaks websites.
+LOL
+-->
+<div>
+<span>
+<div style="display: inline-block; float: left">
+test 1
+</div>
+<div style="display: inline-block; float: left; position: absolute">
+test 2
+</div>
+</span>
+</div>
+<br>
+<div>
+<div style="display: inline-block; float: left">
+test 1
+</div>
+<div style="display: inline-table; float: left; position: absolute">
+test 2
+</div>
+</div>
+<br>
+<div>
+<div style="display: inline-block; float: left">
+test 1
+</div>
+<div style="display: inline-flex; float: left; position: absolute">
+test 2
+</div>
+</div>