Patch contributed by Niels Leenheer <niels.leenheer@gmail.com>
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Jun 2005 22:27:55 +0000 (22:27 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Jun 2005 22:27:55 +0000 (22:27 +0000)
        - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=3370
        (Safari can't handle strange frame dimensions)

        Reviewed by Darin.

        * khtml/dom/dom_string.cpp:
        (DOM::DOMString::toCoordsArray):
        * khtml/dom/dom_string.h:
        * khtml/html/html_imageimpl.cpp:
        (HTMLAreaElementImpl::parseMappedAttribute):
        * khtml/xml/dom_atomicstring.h:
        (DOM::AtomicString::toCoordsArray):
        * khtml/xml/dom_stringimpl.cpp:
        (DOM::parseLength):
        (DOM::DOMStringImpl::toCoordsArray):
        (DOM::DOMStringImpl::toLengthArray):
        * khtml/xml/dom_stringimpl.h:

        Test cases added:
        * layout-tests/fast/frames/invalid-expected.txt: Added.
        * layout-tests/fast/frames/invalid.html: Added.
        * layout-tests/fast/frames/valid-expected.txt: Added.
        * layout-tests/fast/frames/valid.html: Added.

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

LayoutTests/fast/frames/invalid-expected.txt [new file with mode: 0644]
LayoutTests/fast/frames/invalid.html [new file with mode: 0644]
LayoutTests/fast/frames/valid-expected.txt [new file with mode: 0644]
LayoutTests/fast/frames/valid.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/dom/dom_string.cpp
WebCore/khtml/dom/dom_string.h
WebCore/khtml/html/html_imageimpl.cpp
WebCore/khtml/xml/dom_atomicstring.h
WebCore/khtml/xml/dom_stringimpl.cpp
WebCore/khtml/xml/dom_stringimpl.h

diff --git a/LayoutTests/fast/frames/invalid-expected.txt b/LayoutTests/fast/frames/invalid-expected.txt
new file mode 100644 (file)
index 0000000..3b1987b
--- /dev/null
@@ -0,0 +1,202 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderFrameSet {FRAMESET} at (0,0) size 800x600
+      RenderFrameSet {FRAMESET} at (0,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x298
+          layer at (0,0) size 52x294
+            RenderCanvas at (0,0) size 52x294
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x298
+          layer at (0,0) size 52x294
+            RenderCanvas at (0,0) size 52x294
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (73,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x447
+          layer at (0,0) size 52x443
+            RenderCanvas at (0,0) size 52x443
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,451) size 69x149
+          layer at (0,0) size 52x145
+            RenderCanvas at (0,0) size 52x145
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (146,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x100
+          layer at (0,0) size 52x96
+            RenderCanvas at (0,0) size 52x96
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,104) size 69x300
+          layer at (0,0) size 52x296
+            RenderCanvas at (0,0) size 52x296
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,408) size 69x192
+          layer at (0,0) size 52x188
+            RenderCanvas at (0,0) size 52x188
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (219,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x300
+          layer at (0,0) size 52x296
+            RenderCanvas at (0,0) size 52x296
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,304) size 69x100
+          layer at (0,0) size 52x96
+            RenderCanvas at (0,0) size 52x96
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,408) size 69x192
+          layer at (0,0) size 52x188
+            RenderCanvas at (0,0) size 52x188
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (292,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x5
+          layer at (0,0) size 52x8
+            RenderCanvas at (0,0) size 52x1
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,9) size 69x53
+          layer at (0,0) size 52x49
+            RenderCanvas at (0,0) size 52x49
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,66) size 69x534
+          layer at (0,0) size 52x530
+            RenderCanvas at (0,0) size 52x530
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (365,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x65
+          layer at (0,0) size 52x61
+            RenderCanvas at (0,0) size 52x61
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,69) size 69x531
+          layer at (0,0) size 52x527
+            RenderCanvas at (0,0) size 52x527
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (438,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,201) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,402) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (511,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,201) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,402) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (584,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x396
+          layer at (0,0) size 52x392
+            RenderCanvas at (0,0) size 52x392
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,400) size 69x200
+          layer at (0,0) size 52x196
+            RenderCanvas at (0,0) size 52x196
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (657,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,151) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,453) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (730,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,151) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,453) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
diff --git a/LayoutTests/fast/frames/invalid.html b/LayoutTests/fast/frames/invalid.html
new file mode 100644 (file)
index 0000000..695800d
--- /dev/null
@@ -0,0 +1,71 @@
+<html>
+
+<frameset cols="*,*,*,*,*,*,*,*,*,*,*">
+
+    <frameset rows="50%*,*">
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="3*%,*">
+        <frame>
+        <frame>
+    </frameset>
+    
+    <frameset rows="100 200,300,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="300.300,100,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="1%00,10%0,100%">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="11 %,*">
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="%10,%20,%70">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+    
+    <frameset rows="this,is,nonsense">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows=",200px,">
+        <frame>
+        <frame>
+    </frameset>
+      
+    <frameset rows="*,*,*,*,">
+        <frame>
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+    
+    <frameset rows=",,,,">
+        <frame>
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+    
+</frameset>
+
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/frames/valid-expected.txt b/LayoutTests/fast/frames/valid-expected.txt
new file mode 100644 (file)
index 0000000..3b1987b
--- /dev/null
@@ -0,0 +1,202 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderFrameSet {FRAMESET} at (0,0) size 800x600
+      RenderFrameSet {FRAMESET} at (0,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x298
+          layer at (0,0) size 52x294
+            RenderCanvas at (0,0) size 52x294
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x298
+          layer at (0,0) size 52x294
+            RenderCanvas at (0,0) size 52x294
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (73,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x447
+          layer at (0,0) size 52x443
+            RenderCanvas at (0,0) size 52x443
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,451) size 69x149
+          layer at (0,0) size 52x145
+            RenderCanvas at (0,0) size 52x145
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (146,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x100
+          layer at (0,0) size 52x96
+            RenderCanvas at (0,0) size 52x96
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,104) size 69x300
+          layer at (0,0) size 52x296
+            RenderCanvas at (0,0) size 52x296
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,408) size 69x192
+          layer at (0,0) size 52x188
+            RenderCanvas at (0,0) size 52x188
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (219,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x300
+          layer at (0,0) size 52x296
+            RenderCanvas at (0,0) size 52x296
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,304) size 69x100
+          layer at (0,0) size 52x96
+            RenderCanvas at (0,0) size 52x96
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,408) size 69x192
+          layer at (0,0) size 52x188
+            RenderCanvas at (0,0) size 52x188
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (292,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x5
+          layer at (0,0) size 52x8
+            RenderCanvas at (0,0) size 52x1
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,9) size 69x53
+          layer at (0,0) size 52x49
+            RenderCanvas at (0,0) size 52x49
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,66) size 69x534
+          layer at (0,0) size 52x530
+            RenderCanvas at (0,0) size 52x530
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (365,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x65
+          layer at (0,0) size 52x61
+            RenderCanvas at (0,0) size 52x61
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,69) size 69x531
+          layer at (0,0) size 52x527
+            RenderCanvas at (0,0) size 52x527
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (438,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,201) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,402) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (511,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,201) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,402) size 69x197
+          layer at (0,0) size 52x193
+            RenderCanvas at (0,0) size 52x193
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (584,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x396
+          layer at (0,0) size 52x392
+            RenderCanvas at (0,0) size 52x392
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,400) size 69x200
+          layer at (0,0) size 52x196
+            RenderCanvas at (0,0) size 52x196
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (657,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,151) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,453) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+      RenderFrameSet {FRAMESET} at (730,0) size 69x600
+        RenderFrame {FRAME} at (0,0) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,151) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,302) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
+        RenderFrame {FRAME} at (0,453) size 69x147
+          layer at (0,0) size 52x143
+            RenderCanvas at (0,0) size 52x143
+          layer at (0,0) size 52x8
+            RenderBlock {HTML} at (0,0) size 52x8
+              RenderBody {BODY} at (8,8) size 36x0
diff --git a/LayoutTests/fast/frames/valid.html b/LayoutTests/fast/frames/valid.html
new file mode 100644 (file)
index 0000000..4f84b8b
--- /dev/null
@@ -0,0 +1,71 @@
+<html>
+
+<frameset cols="*,*,*,*,*,*,*,*,*,*,*">
+
+    <frameset rows="50%,*">
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="3*,*">
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="100,300,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+    
+    <frameset rows="300,100,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="1%,10%,100%">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="11%,*">
+        <frame>
+        <frame>
+    </frameset>
+
+    <frameset rows="*,*,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>   
+
+    <frameset rows="*,*,*">
+        <frame>
+        <frame>
+        <frame>
+    </frameset>   
+
+    <frameset rows="*,200">
+        <frame>
+        <frame>
+    </frameset> 
+
+    <frameset rows="*,*,*,*">
+        <frame>
+        <frame>
+        <frame>
+        <frame>
+    </frameset> 
+
+    <frameset rows="*,*,*,*">
+        <frame>
+        <frame>
+        <frame>
+        <frame>
+    </frameset>    
+  
+</frameset>
+
+</html>
\ No newline at end of file
index e0676420d40bf55040bbe48d3edfea592a9c4e2a..0899f9bbe946e6db0d4a964cb1009d1dba5ff1a5 100644 (file)
@@ -1,3 +1,31 @@
+2005-06-21  Geoffrey Garen  <ggaren@apple.com>
+
+        Patch contributed by Niels Leenheer <niels.leenheer@gmail.com>
+
+        - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=3370
+        (Safari can't handle strange frame dimensions)
+
+        Reviewed by Darin.
+
+        * khtml/dom/dom_string.cpp:
+        (DOM::DOMString::toCoordsArray):
+        * khtml/dom/dom_string.h:
+        * khtml/html/html_imageimpl.cpp:
+        (HTMLAreaElementImpl::parseMappedAttribute):
+        * khtml/xml/dom_atomicstring.h:
+        (DOM::AtomicString::toCoordsArray):
+        * khtml/xml/dom_stringimpl.cpp:
+        (DOM::parseLength):
+        (DOM::DOMStringImpl::toCoordsArray):
+        (DOM::DOMStringImpl::toLengthArray):
+        * khtml/xml/dom_stringimpl.h:
+
+        Test cases added: 
+        * layout-tests/fast/frames/invalid-expected.txt: Added.
+        * layout-tests/fast/frames/invalid.html: Added.
+        * layout-tests/fast/frames/valid-expected.txt: Added.
+        * layout-tests/fast/frames/valid.html: Added.
+
 2005-06-21  Geoffrey Garen  <ggaren@apple.com>
 
         - fixed <rdar://problem/4155049> javascript function named as "opener" doesn't get called because of window.opener property
index d4faf92be5d8a40d6d9133b304737a9545f2d0f2..b03c936d6e9d1574de37feac332ee9435196ed52 100644 (file)
@@ -272,6 +272,11 @@ bool DOMString::isEmpty() const
     return (!impl || impl->l == 0);
 }
 
+khtml::Length* DOMString::toCoordsArray(int& len) const 
+{ 
+    return impl ? impl->toCoordsArray(len) : 0;
+}
+
 khtml::Length* DOMString::toLengthArray(int& len) const 
 { 
     return impl ? impl->toLengthArray(len) : 0;
index 2631b2cfc9dcab812c92203d699dcbde15a81760..a44830e89e3b4b529efc2828f6eefac59d3c48e3 100644 (file)
@@ -105,6 +105,7 @@ public:
 
     int toInt() const;
     khtml::Length* toLengthArray(int& len) const;
+    khtml::Length* toCoordsArray(int& len) const;
     bool percentage(int &_percentage) const;
 
     DOMString copy() const;
index 636fee4170dfc48b7c72af21c4c567b17dea3483..b27ae94e41d7c3e60fe894dfcc818166fa5ee1a2 100644 (file)
@@ -656,7 +656,7 @@ void HTMLAreaElementImpl::parseMappedAttribute(MappedAttributeImpl *attr)
         break;
     case ATTR_COORDS:
         if (m_coords) delete [] m_coords;
-        m_coords = attr->value().toLengthArray(m_coordsLen);
+        m_coords = attr->value().toCoordsArray(m_coordsLen);
         break;
     case ATTR_TARGET:
         m_hasTarget = !attr->isNull();
index 3bc985d0bacd15053bea3ef9d0377af90e31b22a..fb37e17b4d1b52b3e26adb45f09f858b34b28472 100644 (file)
@@ -54,6 +54,7 @@ public:
     int toInt() const { return m_string.toInt(); }
     bool percentage(int &_percentage) const { return m_string.percentage(_percentage); }
     khtml::Length* toLengthArray(int& len) const { return m_string.toLengthArray(len); }
+    khtml::Length* toCoordsArray(int& len) const { return m_string.toCoordsArray(len); }
     
     bool isNull() const { return m_string.isNull(); }
     bool isEmpty() const { return m_string.isEmpty(); }
index 0f9ea959f2e9a56a9ef7ae07a369bd2a760bd79a..606b2e11d818628ceaa6962088bf90d0897d8d09 100644 (file)
@@ -220,37 +220,56 @@ DOMStringImpl *DOMStringImpl::substring(uint pos, uint len)
     return new DOMStringImpl(s + pos, len);
 }
 
-static Length parseLength(QChar *s, unsigned int l) {
-    const QChar* last = s+l-1;
-    
-    if ( *last == QChar('%')) {
-        // CSS allows one decimal after the point, like
-        //  42.2%, but not 42.22%
-        // we ignore the non-integer part for speed/space reasons
-        int i = QConstString(s, l).string().findRev('.');
-        if ( i >= 0 && i < (int)l-1 )
-            l = i + 1;
-
-        return Length(QConstString(s, l-1).string().toInt(), Percent);
+static Length parseLength(QChar *s, unsigned int l)
+{
+    if (l == 0) {
+        return Length(1, Relative);
     }
 
-    if ( *last == QChar('*'))
-    {
-        if(l == 1)
-            return Length(1, Relative);
-        else
-            return Length(QConstString(s, l-1).string().toInt(), Relative);
-    }
+    unsigned i = 0;
+    while (i < l && s[i].isSpace())
+        ++i;
+    if (i < l && (s[i] == '+' || s[i] == '-'))
+        ++i;
+    while (i < l && s[i].isDigit())
+        ++i;
 
-    // should we strip of the non-integer part here also?
-    // CSS says no, all important browsers do so, including Mozilla. sigh.
     bool ok;
-    // this ugly construct helps in case someone specifies a length as "100."
-    int v = (int) QConstString(s, l).string().toFloat(&ok);
-    if(ok) {
-        return Length(v, Fixed);
+    int r = QConstString(s, i).string().toInt(&ok);
+
+    /* Skip over any remaining digits, we are not that accurate (5.5% => 5%) */
+    while (i < l && (s[i].isDigit() || s[i] == '.'))
+        ++i;
+
+    /* IE Quirk: Skip any whitespace (20 % => 20%) */
+    while (i < l && s[i].isSpace())
+        ++i;
+
+    if (ok) {
+        if (i == l) {
+            return Length(r, Fixed);
+        } else {
+            const QChar* next = s+i;
+
+            if (*next == '%')
+                return Length(r, Percent);
+
+            if (*next == '*')
+                return Length(r, Relative);
+        }
+        return Length(r, Fixed);
+    } else {
+        if (i < l) {
+            const QChar* next = s+i;
+
+            if (*next == '*')
+                return Length(1, Relative);
+
+            if (*next == '%')
+                return Length(1, Relative);
+        }
     }
-    return Length(0, Variable);
+    return Length(0, Relative);
 }
 
 Length DOMStringImpl::toLength() const
@@ -258,47 +277,28 @@ Length DOMStringImpl::toLength() const
     return parseLength(s,l);
 }
 
-khtml::Length* DOMStringImpl::toLengthArray(int& len) const
+khtml::Length* DOMStringImpl::toCoordsArray(int& len) const
 {
-#if !APPLE_CHANGES
-    QString str(s, l);
-#endif /* APPLE_CHANGES not defined */
-    int pos = 0;
-    int pos2;
-
-    // web authors are so stupid. This is a workaround
-    // to fix lists like "1,2px 3 ,4"
-    // make sure not to break percentage or relative widths
-    // ### what about "auto" ?
-#if APPLE_CHANGES
-    // This alternate version works around a limitation in our QString implementation.
     QChar spacified[l];
     QChar space(' ');
     for(unsigned int i=0; i < l; i++) {
         QChar cc = s[i];
-        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') ){
+        if (cc > '9' || (cc < '0' && cc != '-' && cc != '*' && cc != '.'))
             spacified[i] = space;
-        }
-        else {
+        else
             spacified[i] = cc;
-        }
     }
     QString str(spacified, l);
-#else /* APPLE_CHANGES not defined */
-    QChar space(' ');
-    for(unsigned int i=0; i < l; i++) {
-        char cc = str[i].latin1();
-        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') )
-            str[i] = space;
-    }
-#endif /* APPLE_CHANGES not defined */
     str = str.simplifyWhiteSpace();
 
     len = str.contains(' ') + 1;
     khtml::Length* r = new khtml::Length[len];
+
     int i = 0;
-    while((pos2 = str.find(' ', pos)) != -1)
-    {
+    int pos = 0;
+    int pos2;
+
+    while((pos2 = str.find(' ', pos)) != -1) {
         r[i++] = parseLength((QChar *) str.unicode()+pos, pos2-pos);
         pos = pos2+1;
     }
@@ -307,6 +307,32 @@ khtml::Length* DOMStringImpl::toLengthArray(int& len) const
     return r;
 }
 
+khtml::Length* DOMStringImpl::toLengthArray(int& len) const
+{
+    QString str(s, l);
+    str = str.simplifyWhiteSpace();
+
+    len = str.contains(',') + 1;
+    khtml::Length* r = new khtml::Length[len];
+
+    int i = 0;
+    int pos = 0;
+    int pos2;
+
+    while((pos2 = str.find(',', pos)) != -1) {
+        r[i++] = parseLength((QChar *) str.unicode()+pos, pos2-pos);
+        pos = pos2+1;
+    }
+
+    /* IE Quirk: If the last comma is the last char skip it and reduce len by one */
+    if (str.length()-pos > 0)
+        r[i] = parseLength((QChar *) str.unicode()+pos, str.length()-pos);
+    else
+        len--;
+
+    return r;
+}
+
 bool DOMStringImpl::isLower() const
 {
     unsigned int i;
index 0b781dba1e9616c5c6e84cf72148b0af2ed6ac27..8173272b32658127beb0b27cfc0eb5aa04e5049e 100644 (file)
@@ -76,6 +76,7 @@ public:
     // ignores trailing garbage, unlike QString
     int toInt(bool* ok=0) const;
 
+    khtml::Length* toCoordsArray(int& len) const;
     khtml::Length* toLengthArray(int& len) const;
     bool isLower() const;
     DOMStringImpl *lower() const;