<rdar://problem/10262205> Allow column progression to be independent of writing mode
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Oct 2011 17:59:32 +0000 (17:59 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Oct 2011 17:59:32 +0000 (17:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=71028

Reviewed by Darin Adler.

Source/WebCore:

Tests: fast/multicol/block-axis-horizontal-bt.html
       fast/multicol/block-axis-horizontal-tb.html
       fast/multicol/block-axis-vertical-lr.html
       fast/multicol/block-axis-vertical-rl.html
       fast/multicol/flipped-blocks-hit-test.html

Allow “columns” to be stacked along the block axis rather than the inline axis. This can facilitate
paginated interfaces. A column-axis property is added in order to enable this mode.

* css/CSSComputedStyleDeclaration.cpp:
(WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue): Handle the column-axis property.
* css/CSSParser.cpp:
(WebCore::CSSParser::parseValue): Ditto.
* css/CSSPrimitiveValueMappings.h:
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Map ColumnAxis values to identifiers.
(WebCore::CSSPrimitiveValue::operator ColumnAxis): Map identifiers to ColumnAxis values.
* css/CSSProperty.cpp:
(WebCore::CSSProperty::isInheritedProperty): Updated to return false for the column-axis property.
* css/CSSPropertyNames.in: Added -webkit-column-axis.
* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::applyProperty): Handle column-axis.
* rendering/ColumnInfo.h:
(WebCore::ColumnInfo::ColumnInfo): Added m_progressionAxis to the initialization list.
(WebCore::ColumnInfo::progressionAxis): Added this getter.
(WebCore::ColumnInfo::setProgressionAxis): Added this setter.
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::addOverflowFromChildren): Simplified, and thus also made this function work
with block-axis column progression.
(WebCore::RenderBlock::paintColumnRules): Added code to paint rules between columns with block-axis
progression.
(WebCore::RenderBlock::paintColumnContents): Adjusted the painting offset for the block-axis
column progression case.
(WebCore::RenderBlock::nodeAtPoint): Fixed hit-testing in flipped-blocks writing modes. This is
covered by flipped-blocks-hit-test.html.
(WebCore::RenderBlock::hitTestColumns): Adjusted the offset for the block-axis column progression
case.
(WebCore::RenderBlock::calcColumnWidth): Set the column width to the content logical width in
the block-axis column progression case. The column-width and column-count properties are ignored.
(WebCore::RenderBlock::setDesiredColumnCountAndWidth): Set the column progression axis based on
the style.
(WebCore::RenderBlock::columnCount): Broke up an assertion into two.
(WebCore::RenderBlock::columnRectAt): Updated for block-axis column progression.
(WebCore::RenderBlock::adjustPointToColumnContents): Ditto.
(WebCore::RenderBlock::adjustRectForColumns): Ditto.
(WebCore::RenderBlock::adjustForColumns): Ditto.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintChildLayerIntoColumns): Adjusted the offser for the block-axis column
progression case.
(WebCore::RenderLayer::hitTestChildLayerColumns): Ditto.
* rendering/style/RenderStyle.h:
(WebCore::InheritedFlags::columnAxis): Added this getter.
(WebCore::InheritedFlags::hasInlineColumnAxis): Added. Checks the column axis against the writing
mode.
(WebCore::InheritedFlags::specifiesColumns): Changed to return true if the specified column axis
is the block axis.
(WebCore::InheritedFlags::setColumnAxis): Added this setter.
(WebCore::InheritedFlags::initialColumnAxis): Added. Returns AutoColumnAxis.
* rendering/style/RenderStyleConstants.h: Added a ColumnAxis enum.
* rendering/style/StyleMultiColData.cpp:
(WebCore::StyleMultiColData::StyleMultiColData): Added m_axis to the initialization list.
(WebCore::StyleMultiColData::operator==): Compare m_axis.
* rendering/style/StyleMultiColData.h: Added m_axis member variable.

LayoutTests:

* fast/multicol/block-axis-horizontal-bt.html: Added.
* fast/multicol/block-axis-horizontal-tb.html: Added.
* fast/multicol/block-axis-vertical-lr.html: Added.
* fast/multicol/block-axis-vertical-rl.html: Added.
* fast/multicol/flipped-blocks-hit-test-expected.txt: Added.
* fast/multicol/flipped-blocks-hit-test.html: Added.
* fast/multicol/resources/block-axis.css: Added.
* platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png: Added.
* platform/mac/fast/multicol/block-axis-horizontal-bt-expected.txt: Added.
* platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png: Added.
* platform/mac/fast/multicol/block-axis-horizontal-tb-expected.txt: Added.
* platform/mac/fast/multicol/block-axis-vertical-lr-expected.png: Added.
* platform/mac/fast/multicol/block-axis-vertical-lr-expected.txt: Added.
* platform/mac/fast/multicol/block-axis-vertical-rl-expected.png: Added.
* platform/mac/fast/multicol/block-axis-vertical-rl-expected.txt: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@98608 268f45cc-cd09-0410-ab3c-d52691b4dbfc

30 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/multicol/block-axis-horizontal-bt.html [new file with mode: 0644]
LayoutTests/fast/multicol/block-axis-horizontal-tb.html [new file with mode: 0644]
LayoutTests/fast/multicol/block-axis-vertical-lr.html [new file with mode: 0644]
LayoutTests/fast/multicol/block-axis-vertical-rl.html [new file with mode: 0644]
LayoutTests/fast/multicol/flipped-blocks-hit-test-expected.txt [new file with mode: 0644]
LayoutTests/fast/multicol/flipped-blocks-hit-test.html [new file with mode: 0644]
LayoutTests/fast/multicol/resources/block-axis.css [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSPrimitiveValueMappings.h
Source/WebCore/css/CSSProperty.cpp
Source/WebCore/css/CSSPropertyNames.in
Source/WebCore/css/CSSStyleSelector.cpp
Source/WebCore/rendering/ColumnInfo.h
Source/WebCore/rendering/RenderBlock.cpp
Source/WebCore/rendering/RenderLayer.cpp
Source/WebCore/rendering/style/RenderStyle.h
Source/WebCore/rendering/style/RenderStyleConstants.h
Source/WebCore/rendering/style/StyleMultiColData.cpp
Source/WebCore/rendering/style/StyleMultiColData.h

index 376c359438ac9f1c8ed03d3be4e07612722611b7..c05f64070cab005d542f1862bcc0655fc0c122dd 100755 (executable)
@@ -1,3 +1,26 @@
+2011-10-27  Dan Bernstein  <mitz@apple.com>
+
+        <rdar://problem/10262205> Allow column progression to be independent of writing mode
+        https://bugs.webkit.org/show_bug.cgi?id=71028
+
+        Reviewed by Darin Adler.
+
+        * fast/multicol/block-axis-horizontal-bt.html: Added.
+        * fast/multicol/block-axis-horizontal-tb.html: Added.
+        * fast/multicol/block-axis-vertical-lr.html: Added.
+        * fast/multicol/block-axis-vertical-rl.html: Added.
+        * fast/multicol/flipped-blocks-hit-test-expected.txt: Added.
+        * fast/multicol/flipped-blocks-hit-test.html: Added.
+        * fast/multicol/resources/block-axis.css: Added.
+        * platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png: Added.
+        * platform/mac/fast/multicol/block-axis-horizontal-bt-expected.txt: Added.
+        * platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png: Added.
+        * platform/mac/fast/multicol/block-axis-horizontal-tb-expected.txt: Added.
+        * platform/mac/fast/multicol/block-axis-vertical-lr-expected.png: Added.
+        * platform/mac/fast/multicol/block-axis-vertical-lr-expected.txt: Added.
+        * platform/mac/fast/multicol/block-axis-vertical-rl-expected.png: Added.
+        * platform/mac/fast/multicol/block-axis-vertical-rl-expected.txt: Added.
+
 2011-10-27  John Gregg  <johnnyg@google.com>
 
         Unreviewed, adding additional expected failures.
diff --git a/LayoutTests/fast/multicol/block-axis-horizontal-bt.html b/LayoutTests/fast/multicol/block-axis-horizontal-bt.html
new file mode 100644 (file)
index 0000000..29319e3
--- /dev/null
@@ -0,0 +1,14 @@
+<link rel="stylesheet" href="resources/block-axis.css">
+<div class="horizontal flipped">
+    Lorem ipsum dolor sit amet, consectetur
+    adipiscing elit. Curabitur neque elit, pulvinar eget lobortis at,
+    convallis ut lectus. <span>Vivamus</span> vulputate tincidunt leo, eu varius
+    nunc ullamcorper vel. Integer nec dolor sed ante pharetra lacinia.
+    Integer dignissim iaculis nulla et rutrum. Praesent pretium euismod
+    est eget laoreet. <span>Integer</span> suscipit suscipit elementum. Duis consectetur
+    pulvinar tempor. In mi sapien, malesuada vitae posuere ut, adipiscing
+    id odio. Integer est mi, luctus sed cursus in, cursus vitae urna. Nam
+    consectetur orci tempor nibh iaculis eu dignissim odio laoreet. Aenean
+    congue fermentum nibh sed malesuada. Curabitur enim leo, porttitor ut
+    interdum et, <span>pulvinar</span> ut lorem.
+</div>
diff --git a/LayoutTests/fast/multicol/block-axis-horizontal-tb.html b/LayoutTests/fast/multicol/block-axis-horizontal-tb.html
new file mode 100644 (file)
index 0000000..ffebd3f
--- /dev/null
@@ -0,0 +1,14 @@
+<link rel="stylesheet" href="resources/block-axis.css">
+<div class="horizontal">
+    Lorem ipsum dolor sit amet, consectetur
+    adipiscing elit. Curabitur neque elit, pulvinar eget lobortis at,
+    convallis ut lectus. <span>Vivamus</span> vulputate tincidunt leo, eu varius
+    nunc ullamcorper vel. Integer nec dolor sed ante pharetra lacinia.
+    Integer dignissim iaculis nulla et rutrum. Praesent pretium euismod
+    est eget laoreet. <span>Integer</span> suscipit suscipit elementum. Duis consectetur
+    pulvinar tempor. In mi sapien, malesuada vitae posuere ut, adipiscing
+    id odio. Integer est mi, luctus sed cursus in, cursus vitae urna. Nam
+    consectetur orci tempor nibh iaculis eu dignissim odio laoreet. Aenean
+    congue fermentum nibh sed malesuada. Curabitur enim leo, porttitor ut
+    interdum et, <span>pulvinar</span> ut lorem.
+</div>
diff --git a/LayoutTests/fast/multicol/block-axis-vertical-lr.html b/LayoutTests/fast/multicol/block-axis-vertical-lr.html
new file mode 100644 (file)
index 0000000..efbcbe4
--- /dev/null
@@ -0,0 +1,14 @@
+<link rel="stylesheet" href="resources/block-axis.css">
+<div class="vertical">
+    Lorem ipsum dolor sit amet, consectetur
+    adipiscing elit. Curabitur neque elit, pulvinar eget lobortis at,
+    convallis ut lectus. <span>Vivamus</span> vulputate tincidunt leo, eu varius
+    nunc ullamcorper vel. Integer nec dolor sed ante pharetra lacinia.
+    Integer dignissim iaculis nulla et rutrum. Praesent pretium euismod
+    est eget laoreet. <span>Integer</span> suscipit suscipit elementum. Duis consectetur
+    pulvinar tempor. In mi sapien, malesuada vitae posuere ut, adipiscing
+    id odio. Integer est mi, luctus sed cursus in, cursus vitae urna. Nam
+    consectetur orci tempor nibh iaculis eu dignissim odio laoreet. Aenean
+    congue fermentum nibh sed malesuada. Curabitur enim leo, porttitor ut
+    interdum et, <span>pulvinar</span> ut lorem.
+</div>
diff --git a/LayoutTests/fast/multicol/block-axis-vertical-rl.html b/LayoutTests/fast/multicol/block-axis-vertical-rl.html
new file mode 100644 (file)
index 0000000..de5eef5
--- /dev/null
@@ -0,0 +1,14 @@
+<link rel="stylesheet" href="resources/block-axis.css">
+<div class="vertical flipped">
+    Lorem ipsum dolor sit amet, consectetur
+    adipiscing elit. Curabitur neque elit, pulvinar eget lobortis at,
+    convallis ut lectus. <span>Vivamus</span> vulputate tincidunt leo, eu varius
+    nunc ullamcorper vel. Integer nec dolor sed ante pharetra lacinia.
+    Integer dignissim iaculis nulla et rutrum. Praesent pretium euismod
+    est eget laoreet. <span>Integer</span> suscipit suscipit elementum. Duis consectetur
+    pulvinar tempor. In mi sapien, malesuada vitae posuere ut, adipiscing
+    id odio. Integer est mi, luctus sed cursus in, cursus vitae urna. Nam
+    consectetur orci tempor nibh iaculis eu dignissim odio laoreet. Aenean
+    congue fermentum nibh sed malesuada. Curabitur enim leo, porttitor ut
+    interdum et, <span>pulvinar</span> ut lorem.
+</div>
diff --git a/LayoutTests/fast/multicol/flipped-blocks-hit-test-expected.txt b/LayoutTests/fast/multicol/flipped-blocks-hit-test-expected.txt
new file mode 100644 (file)
index 0000000..3a21466
--- /dev/null
@@ -0,0 +1,2 @@
+1111 2222 3333 4444 5
+PASS
diff --git a/LayoutTests/fast/multicol/flipped-blocks-hit-test.html b/LayoutTests/fast/multicol/flipped-blocks-hit-test.html
new file mode 100644 (file)
index 0000000..bcf373d
--- /dev/null
@@ -0,0 +1,19 @@
+<div style="
+    width: 200px;
+    height: 100px;
+    -webkit-columns: 2;
+    -webkit-column-gap: 0;
+    -webkit-writing-mode: horizontal-bt;
+    font: 20px ahem;
+">
+    1111 2222 3333 4444 5
+    <div></div>
+</div>
+<p id="result">The test did not run.</p>
+<script>
+    if (window.layoutTestController)
+        layoutTestController.dumpAsText();
+
+    var offset = document.caretRangeFromPoint(38, 18).startOffset;
+    document.getElementById("result").innerText = offset === 26 ? "PASS" : "FAIL";
+</script>
diff --git a/LayoutTests/fast/multicol/resources/block-axis.css b/LayoutTests/fast/multicol/resources/block-axis.css
new file mode 100644 (file)
index 0000000..630b0d1
--- /dev/null
@@ -0,0 +1,41 @@
+body {
+    margin: 0;
+}
+
+div {
+    -webkit-logical-width: 200px;
+    -webkit-logical-height: 150px;
+    -webkit-column-gap: 30px;
+    -webkit-column-rule-width: 10px;
+    -webkit-column-rule-style: solid;
+    outline: 1px dashed lightblue;
+    -webkit-margin-after: 360px;
+    -webkit-border-before: 20px solid silver;
+    -webkit-margin-start: 20px;
+}
+
+div.horizontal
+{
+    -webkit-column-axis: vertical;
+}
+
+div.horizontal.flipped
+{
+    -webkit-writing-mode: horizontal-bt;
+}
+
+div.vertical
+{
+    -webkit-writing-mode: vertical-lr;
+    -webkit-column-axis: horizontal;
+}
+
+div.vertical.flipped
+{
+    -webkit-writing-mode: vertical-rl;
+}
+
+span {
+    background-color: yellow;
+    position: relative;
+}
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png
new file mode 100644 (file)
index 0000000..11ed219
Binary files /dev/null and b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.txt b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-bt-expected.txt
new file mode 100644 (file)
index 0000000..5c4d87e
--- /dev/null
@@ -0,0 +1,55 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (0,360) size 800x240
+layer at (20,360) size 200x170
+  RenderBlock {DIV} at (20,0) size 200x170 [border: (20px solid #C0C0C0) none]
+    RenderText {#text} at (0,20) size 185x90
+      text run at (0,20) width 177: "Lorem ipsum dolor sit amet,"
+      text run at (0,38) width 75: "consectetur "
+      text run at (75,38) width 91: "adipiscing elit."
+      text run at (0,56) width 185: "Curabitur neque elit, pulvinar"
+      text run at (0,74) width 100: "eget lobortis at, "
+      text run at (100,74) width 72: "convallis ut"
+      text run at (0,92) width 44: "lectus. "
+    RenderText {#text} at (101,92) size 192x132
+      text run at (101,92) width 62: " vulputate"
+      text run at (0,110) width 147: "tincidunt leo, eu varius "
+      text run at (147,110) width 31: "nunc"
+      text run at (0,128) width 176: "ullamcorper vel. Integer nec"
+      text run at (0,146) width 192: "dolor sed ante pharetra lacinia."
+      text run at (0,170) width 187: "Integer dignissim iaculis nulla"
+      text run at (0,188) width 170: "et rutrum. Praesent pretium"
+      text run at (0,206) width 57: "euismod "
+      text run at (57,206) width 97: "est eget laoreet."
+    RenderText {#text} at (44,224) size 196x222
+      text run at (44,224) width 102: " suscipit suscipit"
+      text run at (0,242) width 182: "elementum. Duis consectetur"
+      text run at (0,260) width 189: "pulvinar tempor. In mi sapien,"
+      text run at (0,278) width 173: "malesuada vitae posuere ut,"
+      text run at (0,296) width 68: "adipiscing "
+      text run at (68,296) width 117: "id odio. Integer est"
+      text run at (0,320) width 194: "mi, luctus sed cursus in, cursus"
+      text run at (0,338) width 105: "vitae urna. Nam "
+      text run at (105,338) width 71: "consectetur"
+      text run at (0,356) width 167: "orci tempor nibh iaculis eu"
+      text run at (0,374) width 195: "dignissim odio laoreet. Aenean"
+      text run at (0,392) width 175: "congue fermentum nibh sed"
+      text run at (0,410) width 196: "malesuada. Curabitur enim leo,"
+      text run at (0,428) width 70: "porttitor ut "
+      text run at (70,428) width 75: "interdum et,"
+    RenderText {#text} at (52,446) size 60x18
+      text run at (52,446) width 60: " ut lorem."
+layer at (20,360) size 57x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 57x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (44,92) size 57x18
+      text run at (44,92) width 57: "Vivamus"
+layer at (20,360) size 44x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 44x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (0,224) size 44x18
+      text run at (0,224) width 44: "Integer"
+layer at (20,360) size 52x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 52x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (0,446) size 52x18
+      text run at (0,446) width 52: "pulvinar"
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png
new file mode 100644 (file)
index 0000000..40cf8b0
Binary files /dev/null and b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.txt b/LayoutTests/platform/mac/fast/multicol/block-axis-horizontal-tb-expected.txt
new file mode 100644 (file)
index 0000000..4511e1d
--- /dev/null
@@ -0,0 +1,55 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (0,0) size 800x240
+layer at (20,0) size 200x170
+  RenderBlock {DIV} at (20,0) size 200x170 [border: (20px solid #C0C0C0) none]
+    RenderText {#text} at (0,20) size 185x90
+      text run at (0,20) width 177: "Lorem ipsum dolor sit amet,"
+      text run at (0,38) width 75: "consectetur "
+      text run at (75,38) width 91: "adipiscing elit."
+      text run at (0,56) width 185: "Curabitur neque elit, pulvinar"
+      text run at (0,74) width 100: "eget lobortis at, "
+      text run at (100,74) width 72: "convallis ut"
+      text run at (0,92) width 44: "lectus. "
+    RenderText {#text} at (101,92) size 192x132
+      text run at (101,92) width 62: " vulputate"
+      text run at (0,110) width 147: "tincidunt leo, eu varius "
+      text run at (147,110) width 31: "nunc"
+      text run at (0,128) width 176: "ullamcorper vel. Integer nec"
+      text run at (0,146) width 192: "dolor sed ante pharetra lacinia."
+      text run at (0,170) width 187: "Integer dignissim iaculis nulla"
+      text run at (0,188) width 170: "et rutrum. Praesent pretium"
+      text run at (0,206) width 57: "euismod "
+      text run at (57,206) width 97: "est eget laoreet."
+    RenderText {#text} at (44,224) size 196x222
+      text run at (44,224) width 102: " suscipit suscipit"
+      text run at (0,242) width 182: "elementum. Duis consectetur"
+      text run at (0,260) width 189: "pulvinar tempor. In mi sapien,"
+      text run at (0,278) width 173: "malesuada vitae posuere ut,"
+      text run at (0,296) width 68: "adipiscing "
+      text run at (68,296) width 117: "id odio. Integer est"
+      text run at (0,320) width 194: "mi, luctus sed cursus in, cursus"
+      text run at (0,338) width 105: "vitae urna. Nam "
+      text run at (105,338) width 71: "consectetur"
+      text run at (0,356) width 167: "orci tempor nibh iaculis eu"
+      text run at (0,374) width 195: "dignissim odio laoreet. Aenean"
+      text run at (0,392) width 175: "congue fermentum nibh sed"
+      text run at (0,410) width 196: "malesuada. Curabitur enim leo,"
+      text run at (0,428) width 70: "porttitor ut "
+      text run at (70,428) width 75: "interdum et,"
+    RenderText {#text} at (52,446) size 60x18
+      text run at (52,446) width 60: " ut lorem."
+layer at (20,0) size 57x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 57x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (44,92) size 57x18
+      text run at (44,92) width 57: "Vivamus"
+layer at (20,0) size 44x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 44x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (0,224) size 44x18
+      text run at (0,224) width 44: "Integer"
+layer at (20,0) size 52x18
+  RenderInline (relative positioned) {SPAN} at (0,0) size 52x18 [bgcolor=#FFFF00]
+    RenderText {#text} at (0,446) size 52x18
+      text run at (0,446) width 52: "pulvinar"
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.png b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.png
new file mode 100644 (file)
index 0000000..e331b0e
Binary files /dev/null and b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.txt b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-lr-expected.txt
new file mode 100644 (file)
index 0000000..1524d89
--- /dev/null
@@ -0,0 +1,55 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (0,20) size 800x580
+layer at (0,20) size 170x200
+  RenderBlock {DIV} at (0,0) size 170x200 [border: (20px solid #C0C0C0)]
+    RenderText {#text} at (20,0) size 90x185
+      text run at (20,0) width 177: "Lorem ipsum dolor sit amet,"
+      text run at (38,0) width 75: "consectetur "
+      text run at (38,75) width 91: "adipiscing elit."
+      text run at (56,0) width 185: "Curabitur neque elit, pulvinar"
+      text run at (74,0) width 100: "eget lobortis at, "
+      text run at (74,100) width 72: "convallis ut"
+      text run at (92,0) width 44: "lectus. "
+    RenderText {#text} at (92,101) size 132x192
+      text run at (92,101) width 62: " vulputate"
+      text run at (110,0) width 147: "tincidunt leo, eu varius "
+      text run at (110,147) width 31: "nunc"
+      text run at (128,0) width 176: "ullamcorper vel. Integer nec"
+      text run at (146,0) width 192: "dolor sed ante pharetra lacinia."
+      text run at (170,0) width 187: "Integer dignissim iaculis nulla"
+      text run at (188,0) width 170: "et rutrum. Praesent pretium"
+      text run at (206,0) width 57: "euismod "
+      text run at (206,57) width 97: "est eget laoreet."
+    RenderText {#text} at (224,44) size 222x196
+      text run at (224,44) width 102: " suscipit suscipit"
+      text run at (242,0) width 182: "elementum. Duis consectetur"
+      text run at (260,0) width 189: "pulvinar tempor. In mi sapien,"
+      text run at (278,0) width 173: "malesuada vitae posuere ut,"
+      text run at (296,0) width 68: "adipiscing "
+      text run at (296,68) width 117: "id odio. Integer est"
+      text run at (320,0) width 194: "mi, luctus sed cursus in, cursus"
+      text run at (338,0) width 105: "vitae urna. Nam "
+      text run at (338,105) width 71: "consectetur"
+      text run at (356,0) width 167: "orci tempor nibh iaculis eu"
+      text run at (374,0) width 195: "dignissim odio laoreet. Aenean"
+      text run at (392,0) width 175: "congue fermentum nibh sed"
+      text run at (410,0) width 196: "malesuada. Curabitur enim leo,"
+      text run at (428,0) width 70: "porttitor ut "
+      text run at (428,70) width 75: "interdum et,"
+    RenderText {#text} at (446,52) size 18x60
+      text run at (446,52) width 60: " ut lorem."
+layer at (0,20) size 18x57
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x57 [bgcolor=#FFFF00]
+    RenderText {#text} at (92,44) size 18x57
+      text run at (92,44) width 57: "Vivamus"
+layer at (0,20) size 18x44
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x44 [bgcolor=#FFFF00]
+    RenderText {#text} at (224,0) size 18x44
+      text run at (224,0) width 44: "Integer"
+layer at (0,20) size 18x52
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x52 [bgcolor=#FFFF00]
+    RenderText {#text} at (446,0) size 18x52
+      text run at (446,0) width 52: "pulvinar"
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.png b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.png
new file mode 100644 (file)
index 0000000..4dde54c
Binary files /dev/null and b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.txt b/LayoutTests/platform/mac/fast/multicol/block-axis-vertical-rl-expected.txt
new file mode 100644 (file)
index 0000000..29e1dc3
--- /dev/null
@@ -0,0 +1,55 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (0,20) size 800x580
+layer at (360,20) size 170x200
+  RenderBlock {DIV} at (360,0) size 170x200 [border: (20px solid #C0C0C0) none]
+    RenderText {#text} at (20,0) size 90x185
+      text run at (20,0) width 177: "Lorem ipsum dolor sit amet,"
+      text run at (38,0) width 75: "consectetur "
+      text run at (38,75) width 91: "adipiscing elit."
+      text run at (56,0) width 185: "Curabitur neque elit, pulvinar"
+      text run at (74,0) width 100: "eget lobortis at, "
+      text run at (74,100) width 72: "convallis ut"
+      text run at (92,0) width 44: "lectus. "
+    RenderText {#text} at (92,101) size 132x192
+      text run at (92,101) width 62: " vulputate"
+      text run at (110,0) width 147: "tincidunt leo, eu varius "
+      text run at (110,147) width 31: "nunc"
+      text run at (128,0) width 176: "ullamcorper vel. Integer nec"
+      text run at (146,0) width 192: "dolor sed ante pharetra lacinia."
+      text run at (170,0) width 187: "Integer dignissim iaculis nulla"
+      text run at (188,0) width 170: "et rutrum. Praesent pretium"
+      text run at (206,0) width 57: "euismod "
+      text run at (206,57) width 97: "est eget laoreet."
+    RenderText {#text} at (224,44) size 222x196
+      text run at (224,44) width 102: " suscipit suscipit"
+      text run at (242,0) width 182: "elementum. Duis consectetur"
+      text run at (260,0) width 189: "pulvinar tempor. In mi sapien,"
+      text run at (278,0) width 173: "malesuada vitae posuere ut,"
+      text run at (296,0) width 68: "adipiscing "
+      text run at (296,68) width 117: "id odio. Integer est"
+      text run at (320,0) width 194: "mi, luctus sed cursus in, cursus"
+      text run at (338,0) width 105: "vitae urna. Nam "
+      text run at (338,105) width 71: "consectetur"
+      text run at (356,0) width 167: "orci tempor nibh iaculis eu"
+      text run at (374,0) width 195: "dignissim odio laoreet. Aenean"
+      text run at (392,0) width 175: "congue fermentum nibh sed"
+      text run at (410,0) width 196: "malesuada. Curabitur enim leo,"
+      text run at (428,0) width 70: "porttitor ut "
+      text run at (428,70) width 75: "interdum et,"
+    RenderText {#text} at (446,52) size 18x60
+      text run at (446,52) width 60: " ut lorem."
+layer at (360,20) size 18x57
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x57 [bgcolor=#FFFF00]
+    RenderText {#text} at (92,44) size 18x57
+      text run at (92,44) width 57: "Vivamus"
+layer at (360,20) size 18x44
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x44 [bgcolor=#FFFF00]
+    RenderText {#text} at (224,0) size 18x44
+      text run at (224,0) width 44: "Integer"
+layer at (360,20) size 18x52
+  RenderInline (relative positioned) {SPAN} at (0,0) size 18x52 [bgcolor=#FFFF00]
+    RenderText {#text} at (446,0) size 18x52
+      text run at (446,0) width 52: "pulvinar"
index 2c00f98eb53aebe229d81c7107f0a59dda801ed9..60f5408f4ba1a1771d6f1e8a7c5c25b0d6fb0521 100755 (executable)
@@ -1,3 +1,73 @@
+2011-10-27  Dan Bernstein  <mitz@apple.com>
+
+        <rdar://problem/10262205> Allow column progression to be independent of writing mode
+        https://bugs.webkit.org/show_bug.cgi?id=71028
+
+        Reviewed by Darin Adler.
+
+        Tests: fast/multicol/block-axis-horizontal-bt.html
+               fast/multicol/block-axis-horizontal-tb.html
+               fast/multicol/block-axis-vertical-lr.html
+               fast/multicol/block-axis-vertical-rl.html
+               fast/multicol/flipped-blocks-hit-test.html
+
+        Allow “columns” to be stacked along the block axis rather than the inline axis. This can facilitate
+        paginated interfaces. A column-axis property is added in order to enable this mode.
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue): Handle the column-axis property.
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseValue): Ditto.
+        * css/CSSPrimitiveValueMappings.h:
+        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Map ColumnAxis values to identifiers.
+        (WebCore::CSSPrimitiveValue::operator ColumnAxis): Map identifiers to ColumnAxis values.
+        * css/CSSProperty.cpp:
+        (WebCore::CSSProperty::isInheritedProperty): Updated to return false for the column-axis property.
+        * css/CSSPropertyNames.in: Added -webkit-column-axis.
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::applyProperty): Handle column-axis.
+        * rendering/ColumnInfo.h:
+        (WebCore::ColumnInfo::ColumnInfo): Added m_progressionAxis to the initialization list.
+        (WebCore::ColumnInfo::progressionAxis): Added this getter.
+        (WebCore::ColumnInfo::setProgressionAxis): Added this setter.
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::addOverflowFromChildren): Simplified, and thus also made this function work
+        with block-axis column progression.
+        (WebCore::RenderBlock::paintColumnRules): Added code to paint rules between columns with block-axis
+        progression.
+        (WebCore::RenderBlock::paintColumnContents): Adjusted the painting offset for the block-axis
+        column progression case.
+        (WebCore::RenderBlock::nodeAtPoint): Fixed hit-testing in flipped-blocks writing modes. This is
+        covered by flipped-blocks-hit-test.html.
+        (WebCore::RenderBlock::hitTestColumns): Adjusted the offset for the block-axis column progression
+        case.
+        (WebCore::RenderBlock::calcColumnWidth): Set the column width to the content logical width in
+        the block-axis column progression case. The column-width and column-count properties are ignored.
+        (WebCore::RenderBlock::setDesiredColumnCountAndWidth): Set the column progression axis based on
+        the style.
+        (WebCore::RenderBlock::columnCount): Broke up an assertion into two.
+        (WebCore::RenderBlock::columnRectAt): Updated for block-axis column progression.
+        (WebCore::RenderBlock::adjustPointToColumnContents): Ditto.
+        (WebCore::RenderBlock::adjustRectForColumns): Ditto.
+        (WebCore::RenderBlock::adjustForColumns): Ditto.
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::paintChildLayerIntoColumns): Adjusted the offser for the block-axis column
+        progression case.
+        (WebCore::RenderLayer::hitTestChildLayerColumns): Ditto.
+        * rendering/style/RenderStyle.h:
+        (WebCore::InheritedFlags::columnAxis): Added this getter.
+        (WebCore::InheritedFlags::hasInlineColumnAxis): Added. Checks the column axis against the writing
+        mode.
+        (WebCore::InheritedFlags::specifiesColumns): Changed to return true if the specified column axis
+        is the block axis.
+        (WebCore::InheritedFlags::setColumnAxis): Added this setter.
+        (WebCore::InheritedFlags::initialColumnAxis): Added. Returns AutoColumnAxis.
+        * rendering/style/RenderStyleConstants.h: Added a ColumnAxis enum.
+        * rendering/style/StyleMultiColData.cpp:
+        (WebCore::StyleMultiColData::StyleMultiColData): Added m_axis to the initialization list.
+        (WebCore::StyleMultiColData::operator==): Compare m_axis.
+        * rendering/style/StyleMultiColData.h: Added m_axis member variable.
+
 2011-10-27  Mihnea Ovidenie  <mihnea@adobe.com>
 
         [CSSRegions]Flag regions with custom styling
index d085aeae2bc9092f8ce96a7b6e659845b03f13a5..731e43087aca98a69c3a813b4588bc437ef8c137 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2004 Zack Rusin <zack@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
  * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
  * Copyright (C) 2011 Sencha, Inc. All rights reserved.
@@ -199,6 +199,7 @@ static const int computedProperties[] = {
     CSSPropertyWebkitColumnBreakAfter,
     CSSPropertyWebkitColumnBreakBefore,
     CSSPropertyWebkitColumnBreakInside,
+    CSSPropertyWebkitColumnAxis,
     CSSPropertyWebkitColumnCount,
     CSSPropertyWebkitColumnGap,
     CSSPropertyWebkitColumnRuleColor,
@@ -1334,6 +1335,8 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
             return primitiveValueCache->createValue(style->clear());
         case CSSPropertyColor:
             return primitiveValueCache->createColorValue(m_allowVisitedStyle ? style->visitedDependentColor(CSSPropertyColor).rgb() : style->color().rgb());
+        case CSSPropertyWebkitColumnAxis:
+            return primitiveValueCache->createValue(style->columnAxis());
         case CSSPropertyWebkitColumnCount:
             if (style->hasAutoColumnCount())
                 return primitiveValueCache->createIdentifierValue(CSSValueAuto);
index b1550964aa0439670d84ddc443f3da62d84c9f10..69f72cecc3d8abfe0649cff4db134d0467f3afa7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
  * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
@@ -1813,6 +1813,10 @@ bool CSSParser::parseValue(int propId, bool important)
         else
             validPrimitive = validUnit(value, FLength | FNonNeg, m_strict);
         break;
+    case CSSPropertyWebkitColumnAxis:
+        if (id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValueAuto)
+            validPrimitive = true;
+        break;
     case CSSPropertyWebkitColumnSpan:        // all | 1
         if (id == CSSValueAll)
             validPrimitive = true;
index 14f8353a311ac154e31db1a501e8beb5799fceee..b19ccde90d5c6fcf17e20a66b43fabae1d4eb4ed 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2007 Alexey Proskuryakov <ap@nypop.com>.
- * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  * Copyright (C) 2009 Jeff Schiller <codedread@gmail.com>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
@@ -3325,6 +3325,38 @@ template<> inline CSSPrimitiveValue::operator ETransformStyle3D() const
     }
 }
 
+template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColumnAxis e)
+    : m_type(CSS_IDENT)
+    , m_hasCachedCSSText(false)
+{
+    switch (e) {
+    case HorizontalColumnAxis:
+        m_value.ident = CSSValueHorizontal;
+        break;
+    case VerticalColumnAxis:
+        m_value.ident = CSSValueVertical;
+        break;
+    case AutoColumnAxis:
+        m_value.ident = CSSValueAuto;
+        break;
+    }
+}
+
+template<> inline CSSPrimitiveValue::operator ColumnAxis() const
+{
+    switch (m_value.ident) {
+    case CSSValueHorizontal:
+        return HorizontalColumnAxis;
+    case CSSValueVertical:
+        return VerticalColumnAxis;
+    case CSSValueAuto:
+        return AutoColumnAxis;
+    default:
+        ASSERT_NOT_REACHED();
+        return AutoColumnAxis;
+    }
+}
+
 #if ENABLE(SVG)
 
 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorInterpolation e)
@@ -3611,7 +3643,7 @@ template<> inline CSSPrimitiveValue::operator EVectorEffect() const
     }
 }
 
-#endif
+#endif // ENABLE(SVG)
 
 }
 
index acc96a54ee819ec2c9becd35d9e6306ab2835264..eb8b2f932f99c1cf88daa63446ed330bbffc1b8a 100644 (file)
@@ -541,6 +541,7 @@ bool CSSProperty::isInheritedProperty(unsigned propertyID)
     case CSSPropertyWebkitBoxPack:
     case CSSPropertyWebkitBoxReflect:
     case CSSPropertyWebkitBoxShadow:
+    case CSSPropertyWebkitColumnAxis:
     case CSSPropertyWebkitColumnBreakAfter:
     case CSSPropertyWebkitColumnBreakBefore:
     case CSSPropertyWebkitColumnBreakInside:
index f7fbe42598509600173d00a21bd0ba0be25a193b..df31bec47b1eaee919453708dfab79a9f92b999d 100644 (file)
@@ -236,6 +236,7 @@ z-index
 -webkit-box-reflect
 -webkit-box-shadow
 -webkit-color-correction
+-webkit-column-axis
 -webkit-column-break-after
 -webkit-column-break-before
 -webkit-column-break-inside
index 63784a28214f1d19c92360d3450391f652f76204..41b08cd060f4e4c556ad01392a45d1825aa97865 100644 (file)
@@ -3777,6 +3777,10 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
         return;
     }
 
+    case CSSPropertyWebkitColumnAxis:
+        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(columnAxis, ColumnAxis);
+        return;
+
     case CSSPropertyWebkitWrapShape:
         HANDLE_INHERIT_AND_INITIAL(wrapShape, WrapShape);
         if (!primitiveValue)
index 4f43fc08fe041bbb049163fb39a81d157ea6b183..fd2e9bf72e3751e6ffc23399f357f695f51dc4b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc.  All rights reserved.
+ * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -37,20 +37,27 @@ public:
     ColumnInfo()
         : m_desiredColumnWidth(0)
         , m_desiredColumnCount(1)
+        , m_progressionAxis(InlineAxis)
         , m_columnCount(1)
         , m_columnHeight(0)
         , m_minimumColumnHeight(0)
         , m_forcedBreaks(0)
         , m_maximumDistanceBetweenForcedBreaks(0)
         , m_forcedBreakOffset(0)
-        { }
-    
+    {
+    }
+
     LayoutUnit desiredColumnWidth() const { return m_desiredColumnWidth; }
     void setDesiredColumnWidth(LayoutUnit width) { m_desiredColumnWidth = width; }
     
     unsigned desiredColumnCount() const { return m_desiredColumnCount; }
     void setDesiredColumnCount(unsigned count) { m_desiredColumnCount = count; }
 
+    enum Axis { InlineAxis, BlockAxis };
+
+    Axis progressionAxis() const { return m_progressionAxis; }
+    void setProgressionAxis(Axis progressionAxis) { m_progressionAxis = progressionAxis; }
+
     unsigned columnCount() const { return m_columnCount; }
     LayoutUnit columnHeight() const { return m_columnHeight; }
 
@@ -89,7 +96,8 @@ public:
 private:
     LayoutUnit m_desiredColumnWidth;
     unsigned m_desiredColumnCount;
-    
+    Axis m_progressionAxis;
+
     unsigned m_columnCount;
     LayoutUnit m_columnHeight;
     LayoutUnit m_minimumColumnHeight;
index 22b7e4dfd4efd2099486ee9aa2ccdfac0b1bb786..8c3e6ec9675a77d60c27da3241559a6305babfe3 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2007 David Smith (catfish.man@gmail.com)
- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
@@ -1394,22 +1394,9 @@ void RenderBlock::addOverflowFromChildren()
         ColumnInfo* colInfo = columnInfo();
         if (columnCount(colInfo)) {
             LayoutRect lastRect = columnRectAt(colInfo, columnCount(colInfo) - 1);
-            if (isHorizontalWritingMode()) {
-                LayoutUnit overflowLeft = !style()->isLeftToRightDirection() ? min<LayoutUnit>(0, lastRect.x()) : 0;
-                LayoutUnit overflowRight = style()->isLeftToRightDirection() ? max(width(), lastRect.maxX()) : 0;
-                LayoutUnit overflowHeight = borderBefore() + paddingBefore() + colInfo->columnHeight();
-                addLayoutOverflow(LayoutRect(overflowLeft, 0, overflowRight - overflowLeft, overflowHeight));
-                if (!hasOverflowClip())
-                    addVisualOverflow(LayoutRect(overflowLeft, 0, overflowRight - overflowLeft, overflowHeight));
-            } else {
-                LayoutRect lastRect = columnRectAt(colInfo, columnCount(colInfo) - 1);
-                LayoutUnit overflowTop = !style()->isLeftToRightDirection() ? min<LayoutUnit>(0, lastRect.y()) : 0;
-                LayoutUnit overflowBottom = style()->isLeftToRightDirection() ? max(height(), lastRect.maxY()) : 0;
-                LayoutUnit overflowWidth = borderBefore() + paddingBefore() + colInfo->columnHeight();
-                addLayoutOverflow(LayoutRect(0, overflowTop, overflowWidth, overflowBottom - overflowTop));
-                if (!hasOverflowClip())
-                    addVisualOverflow(LayoutRect(0, overflowTop, overflowWidth, overflowBottom - overflowTop));
-            }
+            addLayoutOverflow(lastRect);
+            if (!hasOverflowClip())
+                addVisualOverflow(lastRect);
         }
     }
 }
@@ -2384,45 +2371,68 @@ void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& pain
     const Color& ruleColor = style()->visitedDependentColor(CSSPropertyWebkitColumnRuleColor);
     bool ruleTransparent = style()->columnRuleIsTransparent();
     EBorderStyle ruleStyle = style()->columnRuleStyle();
-    LayoutUnit ruleWidth = style()->columnRuleWidth();
+    LayoutUnit ruleThickness = style()->columnRuleWidth();
     LayoutUnit colGap = columnGap();
-    bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent && ruleWidth <= colGap;
+    bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent && ruleThickness <= colGap;
     if (!renderRule)
         return;
 
-    // We need to do multiple passes, breaking up our child painting into strips.
     ColumnInfo* colInfo = columnInfo();
     unsigned colCount = columnCount(colInfo);
-    LayoutUnit currLogicalLeftOffset = style()->isLeftToRightDirection() ? 0 : contentLogicalWidth();
-    LayoutUnit ruleAdd = logicalLeftOffsetForContent();
-    LayoutUnit ruleLogicalLeft = style()->isLeftToRightDirection() ? 0 : contentLogicalWidth();
-
     bool antialias = shouldAntialiasLines(paintInfo.context);
-    LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth();
 
-    for (unsigned i = 0; i < colCount; i++) {
-        // Move to the next position.
-        if (style()->isLeftToRightDirection()) {
-            ruleLogicalLeft += inlineDirectionSize + colGap / 2;
-            currLogicalLeftOffset += inlineDirectionSize + colGap;
-        } else {
-            ruleLogicalLeft -= (inlineDirectionSize + colGap / 2);
-            currLogicalLeftOffset -= (inlineDirectionSize + colGap);
+    if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) {
+        LayoutUnit currLogicalLeftOffset = style()->isLeftToRightDirection() ? 0 : contentLogicalWidth();
+        LayoutUnit ruleAdd = logicalLeftOffsetForContent();
+        LayoutUnit ruleLogicalLeft = style()->isLeftToRightDirection() ? 0 : contentLogicalWidth();
+        LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth();
+        BoxSide boxSide = isHorizontalWritingMode()
+            ? style()->isLeftToRightDirection() ? BSLeft : BSRight
+            : style()->isLeftToRightDirection() ? BSTop : BSBottom;
+
+        for (unsigned i = 0; i < colCount; i++) {
+            // Move to the next position.
+            if (style()->isLeftToRightDirection()) {
+                ruleLogicalLeft += inlineDirectionSize + colGap / 2;
+                currLogicalLeftOffset += inlineDirectionSize + colGap;
+            } else {
+                ruleLogicalLeft -= (inlineDirectionSize + colGap / 2);
+                currLogicalLeftOffset -= (inlineDirectionSize + colGap);
+            }
+           
+            // Now paint the column rule.
+            if (i < colCount - 1) {
+                LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft() + paddingLeft();
+                LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ruleThickness : ruleLeft + contentWidth();
+                LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd;
+                LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + contentHeight() : ruleTop + ruleThickness;
+                drawLineForBoxSide(paintInfo.context, ruleLeft, ruleTop, ruleRight, ruleBottom, boxSide, ruleColor, ruleStyle, 0, 0, antialias);
+            }
+            
+            ruleLogicalLeft = currLogicalLeftOffset;
         }
-       
-        // Now paint the column rule.
-        if (i < colCount - 1) {
-            LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x() + ruleLogicalLeft - ruleWidth / 2 + ruleAdd : paintOffset.x() + borderLeft() + paddingLeft();
-            LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ruleWidth : ruleLeft + contentWidth();
-            LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleWidth / 2 + ruleAdd;
-            LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + contentHeight() : ruleTop + ruleWidth;
-            BoxSide side = isHorizontalWritingMode()
-                ? style()->isLeftToRightDirection() ? BSLeft : BSRight
-                : style()->isLeftToRightDirection() ? BSTop : BSBottom;
-            drawLineForBoxSide(paintInfo.context, ruleLeft, ruleTop, ruleRight, ruleBottom, side, ruleColor, ruleStyle, 0, 0, antialias);
+    } else {
+        LayoutUnit ruleLeft = isHorizontalWritingMode() ? borderLeft() + paddingLeft() : colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + paddingBefore();
+        LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : ruleThickness;
+        LayoutUnit ruleTop = isHorizontalWritingMode() ? colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + paddingBefore() : borderStart() + paddingStart();
+        LayoutUnit ruleHeight = isHorizontalWritingMode() ? ruleThickness : contentHeight();
+        LayoutRect ruleRect(ruleLeft, ruleTop, ruleWidth, ruleHeight);
+
+        flipForWritingMode(ruleRect);
+        ruleRect.moveBy(paintOffset);
+
+        BoxSide boxSide = isHorizontalWritingMode()
+            ? !style()->isFlippedBlocksWritingMode() ? BSTop : BSBottom
+            : !style()->isFlippedBlocksWritingMode() ? BSLeft : BSRight;
+
+        LayoutSize step(0, !style()->isFlippedBlocksWritingMode() ? colInfo->columnHeight() + colGap : -(colInfo->columnHeight() + colGap));
+        if (!isHorizontalWritingMode())
+            step = step.transposedSize();
+
+        for (unsigned i = 1; i < colCount; i++) {
+            ruleRect.move(step);
+            drawLineForBoxSide(paintInfo.context, ruleRect.x(), ruleRect.y(), ruleRect.maxX(), ruleRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias);
         }
-        
-        ruleLogicalLeft = currLogicalLeftOffset;
     }
 }
 
@@ -2441,6 +2451,12 @@ void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& p
         flipForWritingMode(colRect);
         LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x() : colRect.y()) - logicalLeftOffsetForContent();
         LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOffset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset);
+        if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) {
+            if (isHorizontalWritingMode())
+                offset.expand(0, colRect.y() - borderTop() - paddingTop());
+            else
+                offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0);
+        }
         colRect.moveBy(paintOffset);
         PaintInfo info(paintInfo);
         info.rect.intersect(colRect);
@@ -4142,7 +4158,7 @@ bool RenderBlock::nodeAtPoint(const HitTestRequest& request, HitTestResult& resu
             if (hitTestAction == HitTestFloat && hitTestFloats(request, result, pointInContainer, toLayoutPoint(scrolledOffset)))
                 return true;
         } else if (hitTestColumns(request, result, pointInContainer, toLayoutPoint(scrolledOffset), hitTestAction)) {
-            updateHitTestResult(result, pointInContainer - localOffset);
+            updateHitTestResult(result, flipForWritingMode(pointInContainer - localOffset));
             return true;
         }
     }
@@ -4197,17 +4213,10 @@ bool RenderBlock::hitTestColumns(const HitTestRequest& request, HitTestResult& r
     if (!colCount)
         return false;
     LayoutUnit logicalLeft = logicalLeftOffsetForContent();
-    LayoutUnit currLogicalTopOffset = 0;
-    int i;
+    LayoutUnit currLogicalTopOffset = !style()->isFlippedBlocksWritingMode() ? -colCount * colInfo->columnHeight() : colCount * colInfo->columnHeight();
     bool isHorizontal = isHorizontalWritingMode();
-    LayoutUnit blockDelta =  colInfo->columnHeight();
-    for (i = 0; i < colCount; i++) {
-        if (style()->isFlippedBlocksWritingMode())
-            currLogicalTopOffset += blockDelta;
-        else
-            currLogicalTopOffset -= blockDelta;
-    }
-    for (i = colCount - 1; i >= 0; i--) {
+
+    for (int i = colCount - 1; i >= 0; i--) {
         LayoutRect colRect = columnRectAt(colInfo, i);
         flipForWritingMode(colRect);
         LayoutUnit currLogicalLeftOffset = (isHorizontal ? colRect.x() : colRect.y()) - logicalLeft;
@@ -4223,6 +4232,13 @@ bool RenderBlock::hitTestColumns(const HitTestRequest& request, HitTestResult& r
             // Adjust accumulatedOffset to change where we hit test.
         
             LayoutSize offset = isHorizontal ? IntSize(currLogicalLeftOffset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, currLogicalLeftOffset);
+            if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) {
+                if (isHorizontal)
+                    offset.expand(0, colRect.y() - accumulatedOffset.y() - borderTop() - paddingTop());
+                else
+                    offset.expand(colRect.x() - accumulatedOffset.x() - borderLeft() - paddingLeft(), 0);
+            }
+
             LayoutPoint finalLocation = accumulatedOffset + offset;
             if (result.isRectBasedTest() && !colRect.contains(result.rectForPoint(pointInContainer)))
                 hitTestContents(request, result, pointInContainer, finalLocation, hitTestAction);
@@ -4455,7 +4471,7 @@ void RenderBlock::calcColumnWidth()
     int desiredColumnWidth = contentLogicalWidth();
     
     // For now, we don't support multi-column layouts when printing, since we have to do a lot of work for proper pagination.
-    if (document()->paginated() || (style()->hasAutoColumnCount() && style()->hasAutoColumnWidth())) {
+    if (document()->paginated() || (style()->hasAutoColumnCount() && style()->hasAutoColumnWidth()) || !style()->hasInlineColumnAxis()) {
         setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth);
         return;
     }
@@ -4481,7 +4497,7 @@ void RenderBlock::calcColumnWidth()
 void RenderBlock::setDesiredColumnCountAndWidth(int count, LayoutUnit width)
 {
     bool destroyColumns = !firstChild()
-                          || (count == 1 && style()->hasAutoColumnWidth())
+                          || (count == 1 && style()->hasAutoColumnWidth() && style()->hasInlineColumnAxis())
                           || firstChild()->isAnonymousColumnsBlock()
                           || firstChild()->isAnonymousColumnSpanBlock();
     if (destroyColumns) {
@@ -4501,7 +4517,8 @@ void RenderBlock::setDesiredColumnCountAndWidth(int count, LayoutUnit width)
             setHasColumns(true);
         }
         info->setDesiredColumnCount(count);
-        info->setDesiredColumnWidth(width);   
+        info->setDesiredColumnWidth(width);
+        info->setProgressionAxis(style()->hasInlineColumnAxis() ? ColumnInfo::InlineAxis : ColumnInfo::BlockAxis);
     }
 }
 
@@ -4528,7 +4545,8 @@ ColumnInfo* RenderBlock::columnInfo() const
 
 unsigned RenderBlock::columnCount(ColumnInfo* colInfo) const
 {
-    ASSERT(hasColumns() && gColumnInfoMap->get(this) == colInfo);
+    ASSERT(hasColumns());
+    ASSERT(gColumnInfoMap->get(this) == colInfo);
     return colInfo->columnCount();
 }
 
@@ -4540,10 +4558,15 @@ LayoutRect RenderBlock::columnRectAt(ColumnInfo* colInfo, unsigned index) const
     LayoutUnit colLogicalWidth = colInfo->desiredColumnWidth();
     LayoutUnit colLogicalHeight = colInfo->columnHeight();
     LayoutUnit colLogicalTop = borderBefore() + paddingBefore();
+    LayoutUnit colLogicalLeft = logicalLeftOffsetForContent();
     int colGap = columnGap();
-    LayoutUnit colLogicalLeft = style()->isLeftToRightDirection() ? 
-                                 logicalLeftOffsetForContent() + (index * (colLogicalWidth + colGap))
-                               : logicalLeftOffsetForContent() + contentLogicalWidth() - colLogicalWidth - (index * (colLogicalWidth + colGap));
+    if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) {
+        if (style()->isLeftToRightDirection())
+            colLogicalLeft += index * (colLogicalWidth + colGap);
+        else
+            colLogicalLeft += contentLogicalWidth() - colLogicalWidth - index * (colLogicalWidth + colGap);
+    } else
+        colLogicalTop += index * (colLogicalHeight + colGap);
 
     if (isHorizontalWritingMode())
         return LayoutRect(colLogicalLeft, colLogicalTop, colLogicalWidth, colLogicalHeight);
@@ -4612,7 +4635,8 @@ void RenderBlock::adjustPointToColumnContents(LayoutPoint& point) const
     for (unsigned i = 0; i < colInfo->columnCount(); i++) {
         // Add in half the column gap to the left and right of the rect.
         LayoutRect colRect = columnRectAt(colInfo, i);
-        if (isHorizontalWritingMode()) {
+        flipForWritingMode(colRect);
+        if (isHorizontalWritingMode() == (colInfo->progressionAxis() == ColumnInfo::InlineAxis)) {
             LayoutRect gapAndColumnRect(colRect.x() - halfColGap, colRect.y(), colRect.width() + colGap, colRect.height());
             if (point.x() >= gapAndColumnRect.x() && point.x() < gapAndColumnRect.maxX()) {
                 // FIXME: The clamping that follows is not completely right for right-to-left
@@ -4628,12 +4652,15 @@ void RenderBlock::adjustPointToColumnContents(LayoutPoint& point) const
                 }
 
                 // We're inside the column.  Translate the x and y into our column coordinate space.
-                point.move(columnPoint.x() - colRect.x(), logicalOffset);
+                if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                    point.move(columnPoint.x() - colRect.x(), logicalOffset);
+                else
+                    point.move((!style()->isFlippedBlocksWritingMode() ? logicalOffset : -logicalOffset) - colRect.x() + borderLeft() + paddingLeft(), 0);
                 return;
             }
             
             // Move to the next position.
-            logicalOffset += colRect.height();
+            logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxis ? colRect.height() : colRect.width();
         } else {
             LayoutRect gapAndColumnRect(colRect.x(), colRect.y() - halfColGap, colRect.width(), colRect.height() + colGap);
             if (point.y() >= gapAndColumnRect.y() && point.y() < gapAndColumnRect.maxY()) {
@@ -4650,12 +4677,15 @@ void RenderBlock::adjustPointToColumnContents(LayoutPoint& point) const
                 }
 
                 // We're inside the column.  Translate the x and y into our column coordinate space.
-                point.move(logicalOffset, columnPoint.y() - colRect.y());
+                if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                    point.move(logicalOffset, columnPoint.y() - colRect.y());
+                else
+                    point.move(0, (!style()->isFlippedBlocksWritingMode() ? logicalOffset : -logicalOffset) - colRect.y() + borderTop() + paddingTop());
                 return;
             }
             
             // Move to the next position.
-            logicalOffset += colRect.width();
+            logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxis ? colRect.width() : colRect.height();
         }
     }
 }
@@ -4694,10 +4724,17 @@ void RenderBlock::adjustRectForColumns(LayoutRect& r) const
         LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent();
         LayoutRect colRect = columnRectAt(colInfo, startColumn);
         LayoutRect repaintRect = r;
-        if (isHorizontal)
-            repaintRect.move(colRect.x() - logicalLeftOffset, - static_cast<int>(startColumn) * colHeight);
-        else
-            repaintRect.move(- static_cast<int>(startColumn) * colHeight, colRect.y() - logicalLeftOffset);
+        if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) {
+            if (isHorizontal)
+                repaintRect.move(colRect.x() - logicalLeftOffset, - static_cast<int>(startColumn) * colHeight);
+            else
+                repaintRect.move(- static_cast<int>(startColumn) * colHeight, colRect.y() - logicalLeftOffset);
+        } else {
+            if (isHorizontal)
+                repaintRect.move(0, colRect.y() - startColumn * colHeight - beforeBorderPadding);
+            else
+                repaintRect.move(colRect.x() - startColumn * colHeight - beforeBorderPadding, 0);
+        }
         repaintRect.intersect(colRect);
         result.unite(repaintRect);
     } else {
@@ -4762,12 +4799,18 @@ void RenderBlock::adjustForColumns(LayoutSize& offset, const LayoutPoint& point)
         // Now we're in the same coordinate space as the point.  See if it is inside the rectangle.
         if (isHorizontalWritingMode()) {
             if (point.y() >= sliceRect.y() && point.y() < sliceRect.maxY()) {
-                offset.expand(columnRectAt(colInfo, i).x() - logicalLeft, -logicalOffset);
+                if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                    offset.expand(columnRectAt(colInfo, i).x() - logicalLeft, -logicalOffset);
+                else
+                    offset.expand(0, columnRectAt(colInfo, i).y() - logicalOffset - borderBefore() - paddingBefore());
                 return;
             }
         } else {
             if (point.x() >= sliceRect.x() && point.x() < sliceRect.maxX()) {
-                offset.expand(-logicalOffset, columnRectAt(colInfo, i).y() - logicalLeft);
+                if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                    offset.expand(-logicalOffset, columnRectAt(colInfo, i).y() - logicalLeft);
+                else
+                    offset.expand(columnRectAt(colInfo, i).x() - logicalOffset - borderBefore() - paddingBefore(), 0);
                 return;
             }
         }
index 51568e5f8a1a4032329e3e2241cb68b1dba3e743..8723652fa4d5f83a5a087517277ed69866da5731 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  *
  * Portions are Copyright (C) 1998 Netscape Communications Corporation.
  *
@@ -2918,7 +2918,18 @@ void RenderLayer::paintChildLayerIntoColumns(RenderLayer* childLayer, RenderLaye
         LayoutRect colRect = columnBlock->columnRectAt(colInfo, i);
         columnBlock->flipForWritingMode(colRect);
         int logicalLeftOffset = (isHorizontal ? colRect.x() : colRect.y()) - columnBlock->logicalLeftOffsetForContent();
-        LayoutSize offset = isHorizontal ? LayoutSize(logicalLeftOffset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset);
+        LayoutSize offset;
+        if (isHorizontal) {
+            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                offset = LayoutSize(logicalLeftOffset, currLogicalTopOffset);
+            else
+                offset = LayoutSize(0, colRect.y() + currLogicalTopOffset - columnBlock->borderTop() - columnBlock->paddingTop());
+        } else {
+            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                offset = LayoutSize(currLogicalTopOffset, logicalLeftOffset);
+            else
+                offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnBlock->borderLeft() - columnBlock->paddingLeft(), 0);
+        }
 
         colRect.moveBy(layerOffset);
 
@@ -3396,12 +3407,24 @@ RenderLayer* RenderLayer::hitTestChildLayerColumns(RenderLayer* childLayer, Rend
             currLogicalTopOffset -= blockDelta;
         else
             currLogicalTopOffset += blockDelta;
+
+        LayoutSize offset;
+        if (isHorizontal) {
+            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                offset = LayoutSize(currLogicalLeftOffset, currLogicalTopOffset);
+            else
+                offset = LayoutSize(0, colRect.y() + currLogicalTopOffset - columnBlock->borderTop() - columnBlock->paddingTop());
+        } else {
+            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
+                offset = LayoutSize(currLogicalTopOffset, currLogicalLeftOffset);
+            else
+                offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnBlock->borderLeft() - columnBlock->paddingLeft(), 0);
+        }
+
         colRect.moveBy(layerOffset);
 
         LayoutRect localClipRect(hitTestRect);
         localClipRect.intersect(colRect);
-        
-        LayoutSize offset = isHorizontal ? LayoutSize(currLogicalLeftOffset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, currLogicalLeftOffset);
 
         if (!localClipRect.isEmpty() && localClipRect.intersects(result.rectForPoint(hitTestPoint))) {
             RenderLayer* hitLayer = 0;
index d7f559cf498d660cd50f3b76c9af6efb84395d52..002230cc65e6cae2772e3a63554eef5437613eb1 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
  *           (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
  * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
  *
  * This library is free software; you can redistribute it and/or
@@ -758,11 +758,16 @@ public:
     const AtomicString& locale() const { return rareInheritedData->locale; }
     EBorderFit borderFit() const { return static_cast<EBorderFit>(rareNonInheritedData->m_borderFit); }
     EResize resize() const { return static_cast<EResize>(rareInheritedData->resize); }
+    ColumnAxis columnAxis() const { return static_cast<ColumnAxis>(rareNonInheritedData->m_multiCol->m_axis); }
+    bool hasInlineColumnAxis() const {
+        ColumnAxis axis = columnAxis();
+        return axis == AutoColumnAxis || isHorizontalWritingMode() == (axis == HorizontalColumnAxis);
+    }
     float columnWidth() const { return rareNonInheritedData->m_multiCol->m_width; }
     bool hasAutoColumnWidth() const { return rareNonInheritedData->m_multiCol->m_autoWidth; }
     unsigned short columnCount() const { return rareNonInheritedData->m_multiCol->m_count; }
     bool hasAutoColumnCount() const { return rareNonInheritedData->m_multiCol->m_autoCount; }
-    bool specifiesColumns() const { return !hasAutoColumnCount() || !hasAutoColumnWidth(); }
+    bool specifiesColumns() const { return !hasAutoColumnCount() || !hasAutoColumnWidth() || !hasInlineColumnAxis(); }
     float columnGap() const { return rareNonInheritedData->m_multiCol->m_gap; }
     bool hasNormalColumnGap() const { return rareNonInheritedData->m_multiCol->m_normalGap; }
     EBorderStyle columnRuleStyle() const { return rareNonInheritedData->m_multiCol->m_rule.style(); }
@@ -1146,6 +1151,7 @@ public:
     void setLocale(const AtomicString& locale) { SET_VAR(rareInheritedData, locale, locale); }
     void setBorderFit(EBorderFit b) { SET_VAR(rareNonInheritedData, m_borderFit, b); }
     void setResize(EResize r) { SET_VAR(rareInheritedData, resize, r); }
+    void setColumnAxis(ColumnAxis axis) { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_axis, axis); }
     void setColumnWidth(float f) { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_autoWidth, false); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_width, f); }
     void setHasAutoColumnWidth() { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_autoWidth, true); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_width, 0); }
     void setColumnCount(unsigned short c) { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_autoCount, false); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_count, c); }
@@ -1351,6 +1357,7 @@ public:
     static ECaptionSide initialCaptionSide() { return CAPTOP; }
     static EClear initialClear() { return CNONE; }
     static ColorSpace initialColorSpace() { return ColorSpaceDeviceRGB; }
+    static ColumnAxis initialColumnAxis() { return AutoColumnAxis; }
     static TextDirection initialDirection() { return LTR; }
     static WritingMode initialWritingMode() { return TopToBottomWritingMode; }
     static TextCombine initialTextCombine() { return TextCombineNone; }
index dd9a1db56a0e3149f4c4fd032b0ae45263119cd8..76244f19204df39a2f8e518c106ea8da9320b5ea 100644 (file)
@@ -448,6 +448,8 @@ enum Order { LogicalOrder = 0, VisualOrder };
 
 enum RegionOverflow { AutoRegionOverflow, BreakRegionOverflow };
 
+enum ColumnAxis { HorizontalColumnAxis, VerticalColumnAxis, AutoColumnAxis };
+
 } // namespace WebCore
 
 #endif // RenderStyleConstants_h
index 66e584c42d8f0c6ba5c57b66d5f3f35f40846133..96327ff8c0142305f4a85c9716918f5cf2573148 100644 (file)
@@ -37,6 +37,7 @@ StyleMultiColData::StyleMultiColData()
     , m_breakBefore(RenderStyle::initialPageBreak())
     , m_breakAfter(RenderStyle::initialPageBreak())
     , m_breakInside(RenderStyle::initialPageBreak())
+    , m_axis(RenderStyle::initialColumnAxis())
 {
 }
 
@@ -54,6 +55,7 @@ StyleMultiColData::StyleMultiColData(const StyleMultiColData& o)
     , m_breakBefore(o.m_breakBefore)
     , m_breakAfter(o.m_breakAfter)
     , m_breakInside(o.m_breakInside)
+    , m_axis(o.m_axis)
 {
 }
 
@@ -62,7 +64,7 @@ bool StyleMultiColData::operator==(const StyleMultiColData& o) const
     return m_width == o.m_width && m_count == o.m_count && m_gap == o.m_gap
            && m_rule == o.m_rule && m_visitedLinkColumnRuleColor == o.m_visitedLinkColumnRuleColor && m_breakBefore == o.m_breakBefore
            && m_autoWidth == o.m_autoWidth && m_autoCount == o.m_autoCount && m_normalGap == o.m_normalGap
-           && m_columnSpan == o.m_columnSpan && m_breakAfter == o.m_breakAfter && m_breakInside == o.m_breakInside;
+           && m_columnSpan == o.m_columnSpan && m_breakAfter == o.m_breakAfter && m_breakInside == o.m_breakInside && m_axis == o.m_axis;
 }
 
 } // namespace WebCore
index 854e0f9109fecdcf65e25e84a33a0ee9a1ebf5af..f2174dc9cf3bb8226532258e8a7fe715e47a2dd5 100644 (file)
@@ -66,7 +66,8 @@ public:
     unsigned m_breakBefore : 2; // EPageBreak
     unsigned m_breakAfter : 2; // EPageBreak
     unsigned m_breakInside : 2; // EPageBreak
-    
+    unsigned m_axis : 2; // ColumnAxis
+
 private:
     StyleMultiColData();
     StyleMultiColData(const StyleMultiColData&);