LayoutTests:
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Feb 2007 23:25:44 +0000 (23:25 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Feb 2007 23:25:44 +0000 (23:25 +0000)
        Reviewed by Mitz and Anders.

        Tests for http://bugs.webkit.org/show_bug.cgi?id=11811
        <rdar://problem/4947184> REGRESSION (r11783): Hebrew text in list boxes is reversed

        * fast/text/international/bidi-listbox-expected.checksum: Added.
        * fast/text/international/bidi-listbox-expected.png: Added.
        * fast/text/international/bidi-listbox-expected.txt: Added.
        * fast/text/international/bidi-listbox.html: Added.

        * fast/text/international/bidi-listbox-atsui-expected.checksum: Added.
        * fast/text/international/bidi-listbox-atsui-expected.png: Added.
        * fast/text/international/bidi-listbox-atsui-expected.txt: Added.
        * fast/text/international/bidi-listbox-atsui.html: Added.

WebCore:

        Reviewed by Mitz and Anders.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=11811
        <rdar://problem/4947184> REGRESSION (r11783): Hebrew text in list boxes is reversed

        http://bugs.webkit.org/show_bug.cgi?id=11812
        <rdar://problem/4960269> REGRESSION (Native file upload): Hebrew filenames are reversed

        Tests:
        fast/text/international/bidi-listbox.html
        fast/text/international/bidi-listbox-atsui.html

        * rendering/RenderBlock.h: Added static bidiReorderCharacters that will run the bidi algorithm on a character buffer.
        * rendering/bidi.cpp:
        (WebCore::RenderBlock::bidiReorderCharacters): Added. Creates an anonymous RenderBlock and RenderText to feed into bidiReorderLines.
        (WebCore::RenderBlock::constructLine): Uses the new convenience methods on BidiRun.
        * rendering/bidi.h:
        (WebCore::BidiRun::reversed): Added convenience method.
        (WebCore::BidiRun::dirOverride): ditto.

        * rendering/RenderFileUploadControl.cpp: (WebCore::RenderFileUploadControl::paintObject): Creates a buffer and calls bidiReorderCharacters
          to get a correctly ordered character buffer for drawText.
        * rendering/RenderListBox.cpp: (WebCore::RenderListBox::paintItemForeground): ditto.

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

15 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/text/international/bidi-listbox-atsui-expected.checksum [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-atsui-expected.png [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-atsui-expected.txt [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-atsui.html [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-expected.checksum [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-expected.png [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox-expected.txt [new file with mode: 0644]
LayoutTests/fast/text/international/bidi-listbox.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderBlock.h
WebCore/rendering/RenderFileUploadControl.cpp
WebCore/rendering/RenderListBox.cpp
WebCore/rendering/bidi.cpp
WebCore/rendering/bidi.h

index 32a6960..8c512e9 100644 (file)
@@ -1,3 +1,20 @@
+2007-02-05  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Mitz and Anders.
+
+        Tests for http://bugs.webkit.org/show_bug.cgi?id=11811
+        <rdar://problem/4947184> REGRESSION (r11783): Hebrew text in list boxes is reversed
+
+        * fast/text/international/bidi-listbox-expected.checksum: Added.
+        * fast/text/international/bidi-listbox-expected.png: Added.
+        * fast/text/international/bidi-listbox-expected.txt: Added.
+        * fast/text/international/bidi-listbox.html: Added.
+
+        * fast/text/international/bidi-listbox-atsui-expected.checksum: Added.
+        * fast/text/international/bidi-listbox-atsui-expected.png: Added.
+        * fast/text/international/bidi-listbox-atsui-expected.txt: Added.
+        * fast/text/international/bidi-listbox-atsui.html: Added.
+
 2007-02-05  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Darin.
diff --git a/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.checksum b/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.checksum
new file mode 100644 (file)
index 0000000..397882c
--- /dev/null
@@ -0,0 +1 @@
+9d0c98dc78689c102f86a3ef5a40c5a3
\ No newline at end of file
diff --git a/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.png b/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.png
new file mode 100644 (file)
index 0000000..3deec0c
Binary files /dev/null and b/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.png differ
diff --git a/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.txt b/LayoutTests/fast/text/international/bidi-listbox-atsui-expected.txt
new file mode 100644 (file)
index 0000000..af50ee5
--- /dev/null
@@ -0,0 +1,67 @@
+layer at (0,0) size 785x643
+  RenderView at (0,0) size 785x600
+layer at (0,0) size 785x643
+  RenderBlock {HTML} at (0,0) size 785x643
+    RenderBody {BODY} at (8,8) size 769x627
+      RenderBlock {P} at (0,0) size 769x36
+        RenderText {#text} at (0,0) size 580x18
+          text run at (0,0) width 580: "This tests that bidirectional text is correctly rendered when using ATSUI in list box controls."
+        RenderBR {BR} at (580,14) size 0x0
+        RenderText {#text} at (0,18) size 566x18
+          text run at (0,18) width 566: "The order of the text below each list box should match the order of the select's option text."
+      RenderBlock (anonymous) at (0,52) size 769x79
+        RenderText {#text} at (0,0) size 270x18
+          text run at (0,0) width 270: "1) direction: rtl; -webkit-rtl-ordering: visual"
+        RenderBR {BR} at (270,14) size 0x0
+        RenderListBox {SELECT} at (2,20) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,72) size 0x0
+      RenderBlock {DIV} at (0,131) size 100x18
+        RenderText {#text} at (18,0) size 82x18
+          text run at (18,0) width 22 LTR override: "a\x{300}bc"
+          text run at (40,0) width 60 LTR override: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,149) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 275x18
+          text run at (0,18) width 275: "2) direction: rtl; -webkit-rtl-ordering: logical"
+        RenderBR {BR} at (275,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,246) size 100x18
+        RenderText {#text} at (18,0) size 82x18
+          text run at (18,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+          text run at (78,0) width 22: "a\x{300}bc"
+      RenderBlock (anonymous) at (0,264) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 270x18
+          text run at (0,18) width 270: "3) direction: ltr; -webkit-rtl-ordering: visual"
+        RenderBR {BR} at (270,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,361) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22 LTR override: "a\x{300}bc"
+          text run at (22,0) width 60 LTR override: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,379) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 275x18
+          text run at (0,18) width 275: "4) direction: ltr; -webkit-rtl-ordering: logical"
+        RenderBR {BR} at (275,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,476) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22: "a\x{300}bc"
+          text run at (22,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,494) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 70x18
+          text run at (0,18) width 70: "5) No style"
+        RenderBR {BR} at (70,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,591) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22: "a\x{300}bc"
+          text run at (22,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,609) size 769x18
+        RenderBR {BR} at (0,0) size 0x18
diff --git a/LayoutTests/fast/text/international/bidi-listbox-atsui.html b/LayoutTests/fast/text/international/bidi-listbox-atsui.html
new file mode 100644 (file)
index 0000000..6da161f
--- /dev/null
@@ -0,0 +1,45 @@
+<style>
+.bidi1 {
+    direction: rtl; 
+    -webkit-rtl-ordering: visual;
+    max-width: 100px;
+}
+.bidi2 {
+    direction: rtl; 
+    -webkit-rtl-ordering: logical;
+    max-width: 100px;
+}
+.bidi3 {
+    direction: ltr; 
+    -webkit-rtl-ordering: visual;
+    max-width: 100px;
+}
+.bidi4 {
+    direction: ltr; 
+    -webkit-rtl-ordering: logical;
+    max-width: 100px;
+}
+
+.bidi5 {
+    max-width: 100px;
+}
+</style>
+<p>
+This tests that bidirectional text is correctly rendered when using ATSUI in list box controls.<br>
+The order of the text below each list box should match the order of the select's option text.
+</p>
+    1) direction: rtl; -webkit-rtl-ordering: visual<br>
+<select size="2" class="bidi1"><option>a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi1">a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    2) direction: rtl; -webkit-rtl-ordering: logical<br>
+<select size="2" class="bidi2"><option>a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi2">a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    3) direction: ltr; -webkit-rtl-ordering: visual<br>
+<select size="2" class="bidi3"><option>a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi3">a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    4) direction: ltr; -webkit-rtl-ordering: logical<br>
+<select size="2" class="bidi4"><option>a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi4">a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    5) No style<br>
+<select size="2" class="bidi5"><option>a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi5">a&#x0300;bc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
diff --git a/LayoutTests/fast/text/international/bidi-listbox-expected.checksum b/LayoutTests/fast/text/international/bidi-listbox-expected.checksum
new file mode 100644 (file)
index 0000000..b4cc0fe
--- /dev/null
@@ -0,0 +1 @@
+730279a3f2d7c4636181ceb9e56c4c9b
\ No newline at end of file
diff --git a/LayoutTests/fast/text/international/bidi-listbox-expected.png b/LayoutTests/fast/text/international/bidi-listbox-expected.png
new file mode 100644 (file)
index 0000000..a39a28a
Binary files /dev/null and b/LayoutTests/fast/text/international/bidi-listbox-expected.png differ
diff --git a/LayoutTests/fast/text/international/bidi-listbox-expected.txt b/LayoutTests/fast/text/international/bidi-listbox-expected.txt
new file mode 100644 (file)
index 0000000..713a319
--- /dev/null
@@ -0,0 +1,67 @@
+layer at (0,0) size 785x643
+  RenderView at (0,0) size 785x600
+layer at (0,0) size 785x643
+  RenderBlock {HTML} at (0,0) size 785x643
+    RenderBody {BODY} at (8,8) size 769x627
+      RenderBlock {P} at (0,0) size 769x36
+        RenderText {#text} at (0,0) size 451x18
+          text run at (0,0) width 451: "This tests that bidirectional text is correctly rendered in list box controls."
+        RenderBR {BR} at (451,14) size 0x0
+        RenderText {#text} at (0,18) size 566x18
+          text run at (0,18) width 566: "The order of the text below each list box should match the order of the select's option text."
+      RenderBlock (anonymous) at (0,52) size 769x79
+        RenderText {#text} at (0,0) size 270x18
+          text run at (0,0) width 270: "1) direction: rtl; -webkit-rtl-ordering: visual"
+        RenderBR {BR} at (270,14) size 0x0
+        RenderListBox {SELECT} at (2,20) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,72) size 0x0
+      RenderBlock {DIV} at (0,131) size 100x18
+        RenderText {#text} at (18,0) size 82x18
+          text run at (18,0) width 22 LTR override: "abc"
+          text run at (40,0) width 60 LTR override: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,149) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 275x18
+          text run at (0,18) width 275: "2) direction: rtl; -webkit-rtl-ordering: logical"
+        RenderBR {BR} at (275,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,246) size 100x18
+        RenderText {#text} at (18,0) size 82x18
+          text run at (18,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+          text run at (78,0) width 22: "abc"
+      RenderBlock (anonymous) at (0,264) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 270x18
+          text run at (0,18) width 270: "3) direction: ltr; -webkit-rtl-ordering: visual"
+        RenderBR {BR} at (270,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,361) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22 LTR override: "abc"
+          text run at (22,0) width 60 LTR override: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,379) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 275x18
+          text run at (0,18) width 275: "4) direction: ltr; -webkit-rtl-ordering: logical"
+        RenderBR {BR} at (275,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,476) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22: "abc"
+          text run at (22,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,494) size 769x97
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {#text} at (0,18) size 70x18
+          text run at (0,18) width 70: "5) No style"
+        RenderBR {BR} at (70,32) size 0x0
+        RenderListBox {SELECT} at (2,38) size 77x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)]
+        RenderBR {BR} at (81,90) size 0x0
+      RenderBlock {DIV} at (0,591) size 100x18
+        RenderText {#text} at (0,0) size 82x18
+          text run at (0,0) width 22: "abc"
+          text run at (22,0) width 60 RTL: "\x{5D0}\x{5E4}\x{5E8}\x{5E1}\x{5DE}\x{5D5}\x{5DF}"
+      RenderBlock (anonymous) at (0,609) size 769x18
+        RenderBR {BR} at (0,0) size 0x18
diff --git a/LayoutTests/fast/text/international/bidi-listbox.html b/LayoutTests/fast/text/international/bidi-listbox.html
new file mode 100644 (file)
index 0000000..1b7ab7a
--- /dev/null
@@ -0,0 +1,45 @@
+<style>
+.bidi1 {
+    direction: rtl; 
+    -webkit-rtl-ordering: visual;
+    max-width: 100px;
+}
+.bidi2 {
+    direction: rtl; 
+    -webkit-rtl-ordering: logical;
+    max-width: 100px;
+}
+.bidi3 {
+    direction: ltr; 
+    -webkit-rtl-ordering: visual;
+    max-width: 100px;
+}
+.bidi4 {
+    direction: ltr; 
+    -webkit-rtl-ordering: logical;
+    max-width: 100px;
+}
+
+.bidi5 {
+    max-width: 100px;
+}
+</style>
+<p>
+This tests that bidirectional text is correctly rendered in list box controls.<br>
+The order of the text below each list box should match the order of the select's option text.
+</p>
+    1) direction: rtl; -webkit-rtl-ordering: visual<br>
+<select size="2" class="bidi1"><option>abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi1">abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    2) direction: rtl; -webkit-rtl-ordering: logical<br>
+<select size="2" class="bidi2"><option>abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi2">abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    3) direction: ltr; -webkit-rtl-ordering: visual<br>
+<select size="2" class="bidi3"><option>abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi3">abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    4) direction: ltr; -webkit-rtl-ordering: logical<br>
+<select size="2" class="bidi4"><option>abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi4">abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
+    5) No style<br>
+<select size="2" class="bidi5"><option>abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</option></select><br>
+<div class="bidi5">abc&#x05d0;&#x05e4;&#x05e8;&#x05e1;&#x05de;&#x05d5;&#x05df;</div><br>
index 5d312be..ad55f0e 100644 (file)
@@ -1,3 +1,29 @@
+2007-02-05  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Mitz and Anders.
+
+        Fix for http://bugs.webkit.org/show_bug.cgi?id=11811
+        <rdar://problem/4947184> REGRESSION (r11783): Hebrew text in list boxes is reversed
+
+        http://bugs.webkit.org/show_bug.cgi?id=11812
+        <rdar://problem/4960269> REGRESSION (Native file upload): Hebrew filenames are reversed
+
+        Tests: 
+        fast/text/international/bidi-listbox.html
+        fast/text/international/bidi-listbox-atsui.html
+
+        * rendering/RenderBlock.h: Added static bidiReorderCharacters that will run the bidi algorithm on a character buffer.
+        * rendering/bidi.cpp:
+        (WebCore::RenderBlock::bidiReorderCharacters): Added. Creates an anonymous RenderBlock and RenderText to feed into bidiReorderLines.
+        (WebCore::RenderBlock::constructLine): Uses the new convenience methods on BidiRun.
+        * rendering/bidi.h:
+        (WebCore::BidiRun::reversed): Added convenience method.
+        (WebCore::BidiRun::dirOverride): ditto.
+
+        * rendering/RenderFileUploadControl.cpp: (WebCore::RenderFileUploadControl::paintObject): Creates a buffer and calls bidiReorderCharacters
+          to get a correctly ordered character buffer for drawText.
+        * rendering/RenderListBox.cpp: (WebCore::RenderListBox::paintItemForeground): ditto.
+
 2007-02-05  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Darin.
index 4dea33a..5ee0d5c 100644 (file)
@@ -37,6 +37,9 @@ enum CaretType { CursorCaret, DragCaret };
 
 class RenderBlock : public RenderFlow {
 public:
+    typedef Vector<UChar, 1024> CharacterBuffer;
+    static void bidiReorderCharacters(Document*, RenderStyle*, CharacterBuffer&);
+
     RenderBlock(Node*);
     virtual ~RenderBlock();
 
index 7be9f78..b7df53c 100644 (file)
@@ -159,9 +159,22 @@ void RenderFileUploadControl::paintObject(PaintInfo& paintInfo, int tx, int ty)
     }
 
     if (paintInfo.phase == PaintPhaseForeground) {
-        const String& displayedFilename = m_fileChooser->basenameForWidth(style()->font(), maxFilenameWidth());
-        TextRun textRun(displayedFilename.characters(), displayedFilename.length());
-
+        const String& displayedFilename = m_fileChooser->basenameForWidth(style()->font(), maxFilenameWidth());        
+        unsigned length = displayedFilename.length();
+        const UChar* string = displayedFilename.characters();
+        TextStyle textStyle(0, 0, 0, false, true);
+
+        if (style()->direction() == RTL && style()->unicodeBidi() == Override)
+            textStyle.setRTL(true);
+        else if ((style()->direction() == RTL || style()->unicodeBidi() != Override) && !style()->visuallyOrdered()) {
+            // If necessary, reorder characters by running the string through the bidi algorithm
+            RenderBlock::CharacterBuffer characterBuffer;
+            characterBuffer.append(string, length);
+            RenderBlock::bidiReorderCharacters(document(), style(), characterBuffer);
+            string = characterBuffer.data();
+        }
+        TextRun textRun(string, length);
+        
         // Determine where the filename should be placed
         int contentLeft = tx + borderLeft() + paddingLeft();
         int buttonAndIconWidth = m_button->renderer()->width() + afterButtonSpacing
@@ -179,10 +192,10 @@ void RenderFileUploadControl::paintObject(PaintInfo& paintInfo, int tx, int ty)
 
         paintInfo.context->setFont(style()->font());
         paintInfo.context->setFillColor(style()->color());
-
+        
         // Draw the filename
-        paintInfo.context->drawText(textRun, IntPoint(textX, textY));
-
+        paintInfo.context->drawText(textRun, IntPoint(textX, textY), textStyle);
+        
         if (m_fileChooser->icon()) {
             // Determine where the icon should be placed
             int iconY = ty + borderTop() + paddingTop() + (contentHeight() - iconHeight) / 2;
index f327672..d5b74d7 100644 (file)
@@ -295,9 +295,7 @@ void RenderListBox::paintItemForeground(PaintInfo& paintInfo, int tx, int ty, in
         itemText = static_cast<HTMLOptionElement*>(element)->optionText();
     else if (element->hasTagName(optgroupTag))
         itemText = static_cast<HTMLOptGroupElement*>(element)->groupLabelText();
-   
-    TextRun textRun(itemText.characters(), itemText.length());
-    
+       
     // Determine where the item text should be placed
     IntRect r = itemBoundingBoxRect(tx, ty, listIndex);
     r.move(optionsSpacingHorizontal, style()->font().ascent());
@@ -326,9 +324,24 @@ void RenderListBox::paintItemForeground(PaintInfo& paintInfo, int tx, int ty, in
     }
     paintInfo.context->setFont(itemFont);
     
+    unsigned length = itemText.length();
+    const UChar* string = itemText.characters();
+    TextStyle textStyle(0, 0, 0, false, true);
+
+    if (itemStyle->direction() == RTL && itemStyle->unicodeBidi() == Override)
+        textStyle.setRTL(true);
+    else if ((itemStyle->direction() == RTL || itemStyle->unicodeBidi() != Override) && !itemStyle->visuallyOrdered()) {
+        // If necessary, reorder characters by running the string through the bidi algorithm
+        RenderBlock::CharacterBuffer characterBuffer;
+        characterBuffer.append(string, length);
+        RenderBlock::bidiReorderCharacters(document(), itemStyle, characterBuffer);
+        string = characterBuffer.data();
+    }
+    TextRun textRun(string, length);
+
     // Draw the item text
     if (itemStyle->visibility() != HIDDEN)
-        paintInfo.context->drawText(textRun, r.location());
+        paintInfo.context->drawText(textRun, r.location(), textStyle);
 }
 
 void RenderListBox::paintItemBackground(PaintInfo& paintInfo, int tx, int ty, int listIndex)
index 2052b66..11f9da7 100644 (file)
@@ -111,6 +111,68 @@ static int numSpaces;
 static void embed(Direction, BidiState&);
 static void appendRun(BidiState&);
 
+void RenderBlock::bidiReorderCharacters(Document* document, RenderStyle* style, CharacterBuffer& characterBuffer)
+{
+    unsigned bufferLength = characterBuffer.size();
+    // Create a local copy of the buffer.
+    String string(characterBuffer.data(), bufferLength);
+
+    // Create anonymous RenderBlock    
+    RenderStyle* blockStyle = new (document->renderArena()) RenderStyle();
+    blockStyle->inheritFrom(style);
+    blockStyle->setDisplay(BLOCK);
+    blockStyle->setWhiteSpace(PRE);
+    RenderBlock* block = new (document->renderArena()) RenderBlock(document);
+    block->setStyle(blockStyle);
+    
+    // Create RenderText
+    RenderText* text = new (document->renderArena()) RenderText(document, string.impl());
+    text->setStyle(blockStyle);
+    block->addChild(text);
+    
+    // Call bidiReorderLine
+    BidiState bidi;
+    BidiContext* startEmbed;
+    if (style->direction() == LTR) {
+        startEmbed = new BidiContext(0, LeftToRight, NULL, style->unicodeBidi() == Override);
+        bidi.status.eor = LeftToRight;
+    } else {
+        startEmbed = new BidiContext(1, RightToLeft, NULL, style->unicodeBidi() == Override);
+        bidi.status.eor = RightToLeft;
+    }
+    bidi.status.lastStrong = startEmbed->dir();
+    bidi.status.last = startEmbed->dir();
+    bidi.status.eor = startEmbed->dir();
+    bidi.context = startEmbed;
+    bidi.dir = OtherNeutral;
+    betweenMidpoints = false;
+    
+    block->bidiReorderLine(BidiIterator(block, text, 0), BidiIterator(block, text, bufferLength), bidi);
+    
+    // Fill the characterBuffer.
+    int index = 0;
+    BidiRun* r = sFirstBidiRun; 
+    while (r) {
+        bool reversed = r->reversed(style->visuallyOrdered());
+        // If there's only one run, and it doesn't need to be reversed, return early
+        if (sBidiRunCount == 1 && !reversed)
+            break;
+        for (int i = r->start; i < r->stop; ++i) {
+            if (reversed)
+                characterBuffer[index] = string[r->stop + r->start - i - 1];
+            else
+                characterBuffer[index] = string[i];
+            ++index;
+        }
+        r = r->nextRun;
+    }
+
+    // Tear down temporary RenderBlock and RenderText
+    block->removeChild(text);
+    text->destroy();
+    block->destroy();
+}
+
 static int getBPMWidth(int childValue, Length cssUnit)
 {
     if (!cssUnit.isIntrinsicOrAuto())
@@ -816,8 +878,8 @@ RootInlineBox* RenderBlock::constructLine(const BidiIterator& start, const BidiI
                 text->setStart(r->start);
                 text->setLen(r->stop - r->start);
                 bool visuallyOrdered = r->obj->style()->visuallyOrdered();
-                text->m_reversed = r->level % 2 && !visuallyOrdered;
-                text->m_dirOverride = r->override || visuallyOrdered;
+                text->m_reversed = r->reversed(visuallyOrdered);
+                text->m_dirOverride = r->dirOverride(visuallyOrdered);
             }
         }
     }
index 1e91a27..7b6e831 100644 (file)
@@ -117,6 +117,9 @@ namespace WebCore {
         bool compact : 1;
 
         BidiRun* nextRun;
+        
+        bool reversed(bool visuallyOrdered) { return level % 2 && !visuallyOrdered; }
+        bool dirOverride(bool visuallyOrdered) { return override || visuallyOrdered; }
     };
 
     struct BidiIterator;