Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jan 2005 22:18:47 +0000 (22:18 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jan 2005 22:18:47 +0000 (22:18 +0000)
        Fix for this bug:

        <rdar://problem/3786659> REGRESSION (Mail): editable WebViews don't work with
        "size up" and "size down" NSFontManager changes

        * khtml/css/cssparser.cpp:
        (CSSParser::parseValue): Add support for parsing new font size delta property.
        * khtml/css/cssproperties.c: Generated file.
        * khtml/css/cssproperties.h: Ditto.
        * khtml/css/cssproperties.in: Add support for parsing new font size delta property.
        * khtml/editing/htmlediting.cpp:
        (khtml::isEmptyStyleSpan): New helper function. Code existed before, but now factored out for convenient use.
        (khtml::CompositeEditCommand::removeNodeAttribute): Does check on value to see it exists before creating
        and running command to do the removal.
        (khtml::ApplyStyleCommand::doApply): Now calls new applyRelativeFontStyleChange() function as part of its work.
        (khtml::ApplyStyleCommand::applyRelativeFontStyleChange): New function that does the "heavy lifting" to handle
        relative font size changes.
        (khtml::ApplyStyleCommand::applyInlineStyle): Range check the start and end positions to make sure the start is
        before or equal to the end. Swap them if not true. I ran into this problem in some similar code in
        applyRelativeFontStyleChange(). Moving that goodness here too.
        (khtml::ApplyStyleCommand::splitTextAtEndIfNeeded): Uses a local variable to save a value used often.
        Code is the same, but reads better now. Function now returns bool as well, just like splitTextAtStartIfNeeded.
        I use the bool return value now (I obviously did not need it before).
        (khtml::ApplyStyleCommand::computedFontSize): New helper function.
        (khtml::ApplyStyleCommand::joinChildTextNodes): Ditto.
        (khtml::createStyleSpanElement): Ditto.
        * khtml/editing/htmlediting.h: Update header accordingly.
        * khtml/editing/jsediting.cpp: Add new command string to enable relative font size changes.
        * kwq/DOM-CSS.mm:
        (-[DOMCSSStyleDeclaration _fontSizeDelta]): New convenience.
        (-[DOMCSSStyleDeclaration _setFontSizeDelta:]): Ditto.
        * kwq/DOMPrivate.h: Declare new conveniences.
        * layout-tests/editing/editing.js: Add new JS to enable relative font size changes, as well as explicit font size setting.
        * layout-tests/editing/style/relative-font-size-change-001-expected.txt: Added.
        * layout-tests/editing/style/relative-font-size-change-001.html: Added.
        * layout-tests/editing/style/relative-font-size-change-002-expected.txt: Added.
        * layout-tests/editing/style/relative-font-size-change-002.html: Added.
        * layout-tests/editing/style/relative-font-size-change-003-expected.txt: Added.
        * layout-tests/editing/style/relative-font-size-change-003.html: Added.
        * layout-tests/editing/style/relative-font-size-change-004-expected.txt: Added.
        * layout-tests/editing/style/relative-font-size-change-004.html: Added.

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

19 files changed:
LayoutTests/editing/editing.js
LayoutTests/editing/style/relative-font-size-change-001-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-001.html [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-002-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-002.html [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-003-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-003.html [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-004-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/relative-font-size-change-004.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/cssparser.cpp
WebCore/khtml/css/cssproperties.c
WebCore/khtml/css/cssproperties.h
WebCore/khtml/css/cssproperties.in
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h
WebCore/khtml/editing/jsediting.cpp
WebCore/kwq/DOM-CSS.mm
WebCore/kwq/DOMPrivate.h

index ff3da95faf0fbd04ed473c9f84d239e55d978ad1..5d334e5efd8c0a5e14bfba8c93d7ea9c745df90e 100644 (file)
@@ -202,6 +202,54 @@ function boldCommand() {
     }
 }
 
+//-------------------------------------------------------------------------------------------------------
+
+function execFontNameCommand() {
+    document.execCommand("FontName", false, "Courier");
+}
+function fontNameCommand() {
+    if (commandDelay > 0) {
+        window.setTimeout(execFontNameCommand, commandCount * commandDelay);
+        commandCount++;
+    }
+    else {
+        execFontNameCommand();
+    }
+}
+
+//-------------------------------------------------------------------------------------------------------
+
+function execFontSizeCommand(s) {
+    if (arguments.length == 0 || s == undefined || s.length == 0)
+        s = '12px';
+    document.execCommand("FontSize", false, s);
+}
+function fontSizeCommand(s) {
+    if (commandDelay > 0) {
+        window.setTimeout(execFontSizeCommand, commandCount * commandDelay, s);
+        commandCount++;
+    }
+    else {
+        execFontSizeCommand(s);
+    }
+}
+
+//-------------------------------------------------------------------------------------------------------
+
+function execFontSizeDeltaCommand(s) {
+    if (arguments.length == 0 || s == undefined || s.length == 0)
+        s = '1px';
+    document.execCommand("FontSizeDelta", false, s);
+}
+function fontSizeDeltaCommand(s) {
+    if (commandDelay > 0) {
+        window.setTimeout(execFontSizeDeltaCommand, commandCount * commandDelay, s);
+        commandCount++;
+    }
+    else {
+        execFontSizeDeltaCommand(s);
+    }
+}
 
 //-------------------------------------------------------------------------------------------------------
 
@@ -459,23 +507,6 @@ function backColorCommand() {
     }
 }
 
-
-//-------------------------------------------------------------------------------------------------------
-
-
-function execFontNameCommand() {
-    document.execCommand("FontName", false, "Courier");
-}
-function fontNameCommand() {
-    if (commandDelay > 0) {
-        window.setTimeout(execFontNameCommand, commandCount * commandDelay);
-        commandCount++;
-    }
-    else {
-        execFontNameCommand();
-    }
-}
-
 //-------------------------------------------------------------------------------------------------------
 
 
diff --git a/LayoutTests/editing/style/relative-font-size-change-001-expected.txt b/LayoutTests/editing/style/relative-font-size-change-001-expected.txt
new file mode 100644 (file)
index 0000000..d579a4f
--- /dev/null
@@ -0,0 +1,35 @@
+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
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #0000FF)]
+        RenderText {TEXT} at (14,14) size 715x56
+          text run at (14,14) width 250: "Size check should say: 30"
+          text run at (264,14) width 465: "px. All text in the red boxes should appear to be"
+          text run at (14,42) width 54: "30px."
+      RenderBlock {DIV} at (0,108) size 784x28
+        RenderText {TEXT} at (0,0) size 118x28
+          text run at (0,0) width 118: "Size check: "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {TEXT} at (118,0) size 48x28
+            text run at (118,0) width 24: "30"
+            text run at (142,0) width 24: "px"
+      RenderBlock {DIV} at (0,152) size 784x164
+        RenderBlock {DIV} at (0,0) size 784x164 [border: (2px solid #FF0000)]
+          RenderBlock (anonymous) at (14,14) size 756x36
+            RenderText {TEXT} at (0,0) size 170x36
+              text run at (0,0) width 170: "There is a tide"
+          RenderBlock {DIV} at (14,50) size 756x64 [border: (2px solid #FF0000)]
+            RenderText {TEXT} at (14,14) size 245x36
+              text run at (14,14) width 245: "In the affairs of men"
+          RenderBlock (anonymous) at (14,114) size 756x36
+            RenderText {TEXT} at (0,0) size 295x36
+              text run at (0,0) width 295: "Which taken at the flood"
+selection is RANGE:
+start:      position 1 of child 1 {TEXT} of child 1 {DIV} of root {DIV}
+upstream:   position 0 of child 1 {DIV} of root {DIV}
+downstream: position 1 of child 1 {TEXT} of child 1 {DIV} of root {DIV}
+end:        position 25 of child 3 {TEXT} of child 1 {DIV} of root {DIV}
+upstream:   position 25 of child 3 {TEXT} of child 1 {DIV} of root {DIV}
+downstream: position 26 of child 3 {TEXT} of child 1 {DIV} of root {DIV}
diff --git a/LayoutTests/editing/style/relative-font-size-change-001.html b/LayoutTests/editing/style/relative-font-size-change-001.html
new file mode 100644 (file)
index 0000000..3852232
--- /dev/null
@@ -0,0 +1,60 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+.explanation { 
+    border: 2px solid blue; 
+    padding: 12px; 
+    font-size: 24px; 
+    margin-bottom: 24px;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    for (i = 0; i < 2; i++)
+        extendSelectionForwardByLineCommand();
+    for (i = 0; i < 5; i++)
+        extendSelectionForwardByWordCommand();
+    for (i = 0; i < 6; i++)
+        fontSizeDeltaCommand("+1px");
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable="true">
+<div class="explanation">
+Size check should say: 30px. All text in the red boxes should appear to be 30px.
+</div>
+
+<div style="font-size: 24px; margin-bottom: 16px;">Size check: <span id="check"></span></div>
+
+<div id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+<div id="test" class="editing">
+There is a tide
+<div class="editing">
+In the affairs of men
+</div>
+Which taken at the flood
+</div>
+</div>
+
+<script>
+runEditingTest();
+test = document.getElementById("test");
+check = document.getElementById("check");
+size = document.defaultView.getComputedStyle(test, "").getPropertyValue("font-size");
+check.innerHTML = size;
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/relative-font-size-change-002-expected.txt b/LayoutTests/editing/style/relative-font-size-change-002-expected.txt
new file mode 100644 (file)
index 0000000..4b79d0f
--- /dev/null
@@ -0,0 +1,40 @@
+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
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #0000FF)]
+        RenderText {TEXT} at (14,14) size 748x56
+          text run at (14,14) width 250: "Size check should say: 30"
+          text run at (264,14) width 498: "px. All text on the first line, and the first two words"
+          text run at (14,42) width 403: "of the second line, should appear to be 30"
+          text run at (417,42) width 30: "px."
+      RenderBlock {DIV} at (0,108) size 784x28
+        RenderText {TEXT} at (0,0) size 118x28
+          text run at (0,0) width 118: "Size check: "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {TEXT} at (118,0) size 48x28
+            text run at (118,0) width 24: "30"
+            text run at (142,0) width 24: "px"
+      RenderBlock {DIV} at (0,152) size 784x156
+        RenderBlock {DIV} at (0,0) size 784x156 [border: (2px solid #FF0000)]
+          RenderBlock (anonymous) at (14,14) size 756x36
+            RenderInline {SPAN} at (0,0) size 170x36
+              RenderText {TEXT} at (0,0) size 170x36
+                text run at (0,0) width 170: "There is a tide"
+          RenderBlock {DIV} at (14,50) size 756x64 [border: (2px solid #FF0000)]
+            RenderInline {SPAN} at (0,0) size 69x36
+              RenderText {TEXT} at (14,14) size 69x36
+                text run at (14,14) width 69: "In the"
+            RenderText {TEXT} at (83,20) size 142x28
+              text run at (83,20) width 142: " affairs of men"
+          RenderBlock (anonymous) at (14,114) size 756x28
+            RenderText {TEXT} at (0,0) size 241x28
+              text run at (0,0) width 241: "Which taken at the flood"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 1 {SPAN} of child 1 {DIV} of root {DIV}
+upstream:   position 0 of child 1 {DIV} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 1 {SPAN} of child 1 {DIV} of root {DIV}
+end:        position 6 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+upstream:   position 6 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+downstream: position 0 of child 2 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
diff --git a/LayoutTests/editing/style/relative-font-size-change-002.html b/LayoutTests/editing/style/relative-font-size-change-002.html
new file mode 100644 (file)
index 0000000..dcd8dd4
--- /dev/null
@@ -0,0 +1,58 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+.explanation { 
+    border: 2px solid blue; 
+    padding: 12px; 
+    font-size: 24px; 
+    margin-bottom: 24px;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    extendSelectionForwardByWordCommand();
+    extendSelectionForwardByLineCommand();
+    extendSelectionForwardByWordCommand();
+    for (i = 0; i < 6; i++)
+        fontSizeDeltaCommand("+1px");
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable="true">
+<div class="explanation">
+Size check should say: 30px. All text on the first line, and the first two words of the second line, should appear to be 30px.
+</div>
+
+<div style="font-size: 24px; margin-bottom: 16px;">Size check: <span id="check"></span></div>
+
+<div id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+<div id="test" class="editing">There is a tide
+<div id="foo" class="editing">
+In the affairs of men
+</div>
+Which taken at the flood
+</div>
+</div>
+
+<script>
+runEditingTest();
+test = document.getElementById("test").firstChild;
+check = document.getElementById("check");
+size = document.defaultView.getComputedStyle(test, "").getPropertyValue("font-size");
+check.innerHTML = size;
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/relative-font-size-change-003-expected.txt b/LayoutTests/editing/style/relative-font-size-change-003-expected.txt
new file mode 100644 (file)
index 0000000..bd60afe
--- /dev/null
@@ -0,0 +1,42 @@
+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
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x112 [border: (2px solid #0000FF)]
+        RenderText {TEXT} at (14,14) size 738x84
+          text run at (14,14) width 250: "Size check should say: 24"
+          text run at (264,14) width 473: "px. The first two words of the second line should"
+          text run at (14,42) width 149: "appear to be 24"
+          text run at (163,42) width 183: "px. The rest of the "
+          text run at (346,42) width 406: "words on the second line should appear to"
+          text run at (14,70) width 53: "be 30"
+          text run at (67,70) width 30: "px."
+      RenderBlock {DIV} at (0,136) size 784x28
+        RenderText {TEXT} at (0,0) size 118x28
+          text run at (0,0) width 118: "Size check: "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {TEXT} at (118,0) size 48x28
+            text run at (118,0) width 24: "24"
+            text run at (142,0) width 24: "px"
+      RenderBlock {DIV} at (0,180) size 784x148
+        RenderBlock {DIV} at (0,0) size 784x148 [border: (2px solid #FF0000)]
+          RenderBlock (anonymous) at (14,14) size 756x28
+            RenderText {TEXT} at (0,0) size 139x28
+              text run at (0,0) width 139: "There is a tide"
+          RenderBlock {DIV} at (14,42) size 756x64 [border: (2px solid #FF0000)]
+            RenderInline {SPAN} at (0,0) size 56x28
+              RenderText {TEXT} at (14,20) size 56x28
+                text run at (14,20) width 56: "In the"
+            RenderText {TEXT} at (70,14) size 176x36
+              text run at (70,14) width 176: " affairs of men"
+          RenderBlock (anonymous) at (14,106) size 756x28
+            RenderText {TEXT} at (0,0) size 241x28
+              text run at (0,0) width 241: "Which taken at the flood"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+upstream:   position 0 of child 2 {DIV} of child 1 {DIV} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+end:        position 6 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+upstream:   position 6 of child 1 {TEXT} of child 1 {SPAN} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+downstream: position 0 of child 2 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
diff --git a/LayoutTests/editing/style/relative-font-size-change-003.html b/LayoutTests/editing/style/relative-font-size-change-003.html
new file mode 100644 (file)
index 0000000..a58da61
--- /dev/null
@@ -0,0 +1,63 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+.explanation { 
+    border: 2px solid blue; 
+    padding: 12px; 
+    font-size: 24px; 
+    margin-bottom: 24px;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    moveSelectionForwardByLineCommand();
+    for (i = 0; i < 5; i++)
+        extendSelectionForwardByWordCommand();
+    for (i = 0; i < 6; i++)
+        fontSizeDeltaCommand("+1px");
+    moveSelectionBackwardByCharacterCommand();
+    for (i = 0; i < 2; i++)
+        extendSelectionForwardByWordCommand();
+    for (i = 0; i < 6; i++)
+        fontSizeDeltaCommand("-1px");
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable="true">
+<div class="explanation">
+Size check should say: 24px. The first two words of the second line should appear to be 24px. The rest of the 
+words on the second line should appear to be 30px.
+</div>
+
+<div style="font-size: 24px; margin-bottom: 16px;">Size check: <span id="check"></span></div>
+
+<div id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+<div id="test" class="editing">There is a tide
+<div id="sizeTest" class="editing">In the affairs of men
+</div>
+Which taken at the flood
+</div>
+</div>
+
+<script>
+runEditingTest();
+test = document.getElementById("sizeTest").firstChild;
+check = document.getElementById("check");
+size = document.defaultView.getComputedStyle(test, "").getPropertyValue("font-size");
+check.innerHTML = size;
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/relative-font-size-change-004-expected.txt b/LayoutTests/editing/style/relative-font-size-change-004-expected.txt
new file mode 100644 (file)
index 0000000..956186e
--- /dev/null
@@ -0,0 +1,36 @@
+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
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x112 [border: (2px solid #0000FF)]
+        RenderText {TEXT} at (14,14) size 715x84
+          text run at (14,14) width 250: "Size check should say: 30"
+          text run at (264,14) width 465: "px. All text in the red boxes should appear to be"
+          text run at (14,42) width 688: "24px. This test checks removing font size tags when they are no longer"
+          text run at (14,70) width 100: "necessary."
+      RenderBlock {DIV} at (0,136) size 784x28
+        RenderText {TEXT} at (0,0) size 118x28
+          text run at (0,0) width 118: "Size check: "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {TEXT} at (118,0) size 48x28
+            text run at (118,0) width 24: "30"
+            text run at (142,0) width 24: "px"
+      RenderBlock {DIV} at (0,180) size 784x140
+        RenderBlock {DIV} at (0,0) size 784x140 [border: (2px solid #FF0000)]
+          RenderBlock (anonymous) at (14,14) size 756x28
+            RenderText {TEXT} at (0,0) size 139x28
+              text run at (0,0) width 139: "There is a tide"
+          RenderBlock {DIV} at (14,42) size 756x56 [border: (2px solid #FF0000)]
+            RenderText {TEXT} at (14,14) size 198x28
+              text run at (14,14) width 198: "In the affairs of men"
+          RenderBlock (anonymous) at (14,98) size 756x28
+            RenderText {TEXT} at (0,0) size 241x28
+              text run at (0,0) width 241: "Which taken at the flood"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+upstream:   position 0 of child 2 {DIV} of child 1 {DIV} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+end:        position 21 of child 1 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+upstream:   position 21 of child 1 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
+downstream: position 22 of child 1 {TEXT} of child 2 {DIV} of child 1 {DIV} of root {DIV}
diff --git a/LayoutTests/editing/style/relative-font-size-change-004.html b/LayoutTests/editing/style/relative-font-size-change-004.html
new file mode 100644 (file)
index 0000000..a4ba9b5
--- /dev/null
@@ -0,0 +1,62 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+.explanation { 
+    border: 2px solid blue; 
+    padding: 12px; 
+    font-size: 24px; 
+    margin-bottom: 24px;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    moveSelectionForwardByLineCommand();
+    for (i = 0; i < 5; i++)
+        extendSelectionForwardByWordCommand();
+    for (i = 0; i < 6; i++)
+        fontSizeDeltaCommand("+1px");
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable="true">
+<div class="explanation">
+Size check should say: 30px. All text in the red boxes should appear to be 24px. This test checks removing
+font size tags when they are no longer necessary.
+</div>
+
+<div style="font-size: 24px; margin-bottom: 16px;">Size check: <span id="check"></span></div>
+
+<div id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+<div id="test" class="editing">There is a tide
+<div id="sizeTest" class="editing">In the affairs of men
+</div>
+Which taken at the flood
+</div>
+</div>
+
+<script>
+runEditingTest();
+
+test = document.getElementById("sizeTest");
+check = document.getElementById("check");
+size = document.defaultView.getComputedStyle(test, "").getPropertyValue("font-size");
+check.innerHTML = size;
+for (i = 0; i < 6; i++)
+    fontSizeDeltaCommand("-1px");
+
+</script>
+
+</body>
+</html>
index eeb69d132dbf362514c9579cd6b90e6f785d1499..7264b6967011110f81c82d13884fed5d03a3afba 100644 (file)
@@ -1,3 +1,49 @@
+2005-01-17  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3786659> REGRESSION (Mail): editable WebViews don't work with 
+        "size up" and "size down" NSFontManager changes
+
+        * khtml/css/cssparser.cpp:
+        (CSSParser::parseValue): Add support for parsing new font size delta property.
+        * khtml/css/cssproperties.c: Generated file.
+        * khtml/css/cssproperties.h: Ditto.
+        * khtml/css/cssproperties.in: Add support for parsing new font size delta property.
+        * khtml/editing/htmlediting.cpp:
+        (khtml::isEmptyStyleSpan): New helper function. Code existed before, but now factored out for convenient use.
+        (khtml::CompositeEditCommand::removeNodeAttribute): Does check on value to see it exists before creating
+        and running command to do the removal.
+        (khtml::ApplyStyleCommand::doApply): Now calls new applyRelativeFontStyleChange() function as part of its work.
+        (khtml::ApplyStyleCommand::applyRelativeFontStyleChange): New function that does the "heavy lifting" to handle 
+        relative font size changes.
+        (khtml::ApplyStyleCommand::applyInlineStyle): Range check the start and end positions to make sure the start is
+        before or equal to the end. Swap them if not true. I ran into this problem in some similar code in 
+        applyRelativeFontStyleChange(). Moving that goodness here too.
+        (khtml::ApplyStyleCommand::splitTextAtEndIfNeeded): Uses a local variable to save a value used often.
+        Code is the same, but reads better now. Function now returns bool as well, just like splitTextAtStartIfNeeded.
+        I use the bool return value now (I obviously did not need it before).
+        (khtml::ApplyStyleCommand::computedFontSize): New helper function.
+        (khtml::ApplyStyleCommand::joinChildTextNodes): Ditto.
+        (khtml::createStyleSpanElement): Ditto.
+        * khtml/editing/htmlediting.h: Update header accordingly.
+        * khtml/editing/jsediting.cpp: Add new command string to enable relative font size changes.
+        * kwq/DOM-CSS.mm:
+        (-[DOMCSSStyleDeclaration _fontSizeDelta]): New convenience.
+        (-[DOMCSSStyleDeclaration _setFontSizeDelta:]): Ditto.
+        * kwq/DOMPrivate.h: Declare new conveniences.
+        * layout-tests/editing/editing.js: Add new JS to enable relative font size changes, as well as explicit font size setting.
+        * layout-tests/editing/style/relative-font-size-change-001-expected.txt: Added.
+        * layout-tests/editing/style/relative-font-size-change-001.html: Added.
+        * layout-tests/editing/style/relative-font-size-change-002-expected.txt: Added.
+        * layout-tests/editing/style/relative-font-size-change-002.html: Added.
+        * layout-tests/editing/style/relative-font-size-change-003-expected.txt: Added.
+        * layout-tests/editing/style/relative-font-size-change-003.html: Added.
+        * layout-tests/editing/style/relative-font-size-change-004-expected.txt: Added.
+        * layout-tests/editing/style/relative-font-size-change-004.html: Added.
+
 2005-01-14  Darin Adler  <darin@apple.com>
 
         * khtml/css/cssproperties.c: Regenerated with gperf 3.0.1.
index 418f763dcb22619b0a993157b54b1d1fe951dad2..3957d4ddb9538ac4cd0959dc5c24f6325e7758e3 100644 (file)
@@ -751,6 +751,10 @@ bool CSSParser::parseValue( int propId, bool important )
            valid_primitive = true;
        break;
 
+    case CSS_PROP__KHTML_FONT_SIZE_DELTA:           // <length>
+          valid_primitive = validUnit( value, FLength, strict );
+       break;
+
     case CSS_PROP__KHTML_NBSP_MODE:     // normal | space
        if (id == CSS_VAL_NORMAL || id == CSS_VAL_SPACE)
            valid_primitive = true;
index a9917d03e30a4c87200f9bcee9d4982d37124570..486d2b22d00a20154ac663c6da1140ad25a15e59 100644 (file)
@@ -191,7 +191,7 @@ findProp (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 157,
+      TOTAL_KEYWORDS = 158,
       MIN_WORD_LENGTH = 3,
       MAX_WORD_LENGTH = 32,
       MIN_HASH_VALUE = 3,
@@ -200,7 +200,7 @@ findProp (register const char *str, register unsigned int len)
 
   static const struct props wordlist_prop[] =
     {
-#line 134 "cssproperties.gperf"
+#line 135 "cssproperties.gperf"
       {"top", CSS_PROP_TOP},
 #line 46 "cssproperties.gperf"
       {"clip", CSS_PROP_CLIP},
@@ -210,131 +210,131 @@ findProp (register const char *str, register unsigned int len)
       {"bottom", CSS_PROP_BOTTOM},
 #line 45 "cssproperties.gperf"
       {"clear", CSS_PROP_CLEAR},
-#line 148 "cssproperties.gperf"
+#line 149 "cssproperties.gperf"
       {"border", CSS_PROP_BORDER},
 #line 48 "cssproperties.gperf"
       {"content", CSS_PROP_CONTENT},
 #line 52 "cssproperties.gperf"
       {"direction", CSS_PROP_DIRECTION},
-#line 151 "cssproperties.gperf"
+#line 152 "cssproperties.gperf"
       {"border-top", CSS_PROP_BORDER_TOP},
-#line 149 "cssproperties.gperf"
+#line 150 "cssproperties.gperf"
       {"border-color", CSS_PROP_BORDER_COLOR},
-#line 153 "cssproperties.gperf"
+#line 154 "cssproperties.gperf"
       {"border-bottom", CSS_PROP_BORDER_BOTTOM},
 #line 23 "cssproperties.gperf"
       {"border-top-color", CSS_PROP_BORDER_TOP_COLOR},
 #line 25 "cssproperties.gperf"
       {"border-bottom-color", CSS_PROP_BORDER_BOTTOM_COLOR},
-#line 65 "cssproperties.gperf"
+#line 66 "cssproperties.gperf"
       {"-apple-line-clamp", CSS_PROP__APPLE_LINE_CLAMP},
-#line 158 "cssproperties.gperf"
+#line 159 "cssproperties.gperf"
       {"margin", CSS_PROP_MARGIN},
-#line 160 "cssproperties.gperf"
+#line 161 "cssproperties.gperf"
       {"padding", CSS_PROP_PADDING},
-#line 106 "cssproperties.gperf"
+#line 107 "cssproperties.gperf"
       {"position", CSS_PROP_POSITION},
-#line 102 "cssproperties.gperf"
+#line 103 "cssproperties.gperf"
       {"page", CSS_PROP_PAGE},
-#line 70 "cssproperties.gperf"
+#line 71 "cssproperties.gperf"
       {"margin-top", CSS_PROP_MARGIN_TOP},
-#line 97 "cssproperties.gperf"
+#line 98 "cssproperties.gperf"
       {"padding-top", CSS_PROP_PADDING_TOP},
-#line 72 "cssproperties.gperf"
+#line 73 "cssproperties.gperf"
       {"margin-bottom", CSS_PROP_MARGIN_BOTTOM},
-#line 99 "cssproperties.gperf"
+#line 100 "cssproperties.gperf"
       {"padding-bottom", CSS_PROP_PADDING_BOTTOM},
 #line 44 "cssproperties.gperf"
       {"caption-side", CSS_PROP_CAPTION_SIDE},
-#line 108 "cssproperties.gperf"
+#line 109 "cssproperties.gperf"
       {"right", CSS_PROP_RIGHT},
-#line 91 "cssproperties.gperf"
+#line 92 "cssproperties.gperf"
       {"orphans", CSS_PROP_ORPHANS},
-#line 109 "cssproperties.gperf"
+#line 110 "cssproperties.gperf"
       {"size", CSS_PROP_SIZE},
 #line 19 "cssproperties.gperf"
       {"border-collapse", CSS_PROP_BORDER_COLLAPSE},
-#line 152 "cssproperties.gperf"
+#line 153 "cssproperties.gperf"
       {"border-right", CSS_PROP_BORDER_RIGHT},
 #line 24 "cssproperties.gperf"
       {"border-right-color", CSS_PROP_BORDER_RIGHT_COLOR},
-#line 62 "cssproperties.gperf"
+#line 63 "cssproperties.gperf"
       {"height", CSS_PROP_HEIGHT},
 #line 20 "cssproperties.gperf"
       {"border-spacing", CSS_PROP_BORDER_SPACING},
-#line 87 "cssproperties.gperf"
+#line 88 "cssproperties.gperf"
       {"min-height", CSS_PROP_MIN_HEIGHT},
-#line 166 "cssproperties.gperf"
+#line 167 "cssproperties.gperf"
       {"scrollbar-track-color", CSS_PROP_SCROLLBAR_TRACK_COLOR},
-#line 64 "cssproperties.gperf"
+#line 65 "cssproperties.gperf"
       {"letter-spacing", CSS_PROP_LETTER_SPACING},
-#line 66 "cssproperties.gperf"
+#line 67 "cssproperties.gperf"
       {"line-height", CSS_PROP_LINE_HEIGHT},
-#line 71 "cssproperties.gperf"
+#line 72 "cssproperties.gperf"
       {"margin-right", CSS_PROP_MARGIN_RIGHT},
-#line 98 "cssproperties.gperf"
+#line 99 "cssproperties.gperf"
       {"padding-right", CSS_PROP_PADDING_RIGHT},
 #line 18 "cssproperties.gperf"
       {"-khtml-binding", CSS_PROP__KHTML_BINDING},
-#line 159 "cssproperties.gperf"
+#line 160 "cssproperties.gperf"
       {"outline", CSS_PROP_OUTLINE},
-#line 139 "cssproperties.gperf"
+#line 140 "cssproperties.gperf"
       {"vertical-align", CSS_PROP_VERTICAL_ALIGN},
-#line 89 "cssproperties.gperf"
+#line 90 "cssproperties.gperf"
       {"-khtml-nbsp-mode", CSS_PROP__KHTML_NBSP_MODE},
-#line 135 "cssproperties.gperf"
+#line 136 "cssproperties.gperf"
       {"unicode-bidi", CSS_PROP_UNICODE_BIDI},
-#line 92 "cssproperties.gperf"
+#line 93 "cssproperties.gperf"
       {"outline-color", CSS_PROP_OUTLINE_COLOR},
-#line 74 "cssproperties.gperf"
+#line 75 "cssproperties.gperf"
       {"-khtml-line-break", CSS_PROP__KHTML_LINE_BREAK},
-#line 164 "cssproperties.gperf"
+#line 165 "cssproperties.gperf"
       {"scrollbar-3dlight-color", CSS_PROP_SCROLLBAR_3DLIGHT_COLOR},
-#line 133 "cssproperties.gperf"
+#line 134 "cssproperties.gperf"
       {"-apple-dashboard-region", CSS_PROP__APPLE_DASHBOARD_REGION},
 #line 51 "cssproperties.gperf"
       {"cursor", CSS_PROP_CURSOR},
 #line 49 "cssproperties.gperf"
       {"counter-increment", CSS_PROP_COUNTER_INCREMENT},
-#line 105 "cssproperties.gperf"
+#line 106 "cssproperties.gperf"
       {"page-break-inside", CSS_PROP_PAGE_BREAK_INSIDE},
-#line 78 "cssproperties.gperf"
+#line 79 "cssproperties.gperf"
       {"-khtml-margin-start", CSS_PROP__KHTML_MARGIN_START},
-#line 101 "cssproperties.gperf"
+#line 102 "cssproperties.gperf"
       {"-khtml-padding-start", CSS_PROP__KHTML_PADDING_START},
-#line 75 "cssproperties.gperf"
-      {"-khtml-margin-collapse", CSS_PROP__KHTML_MARGIN_COLLAPSE},
 #line 76 "cssproperties.gperf"
+      {"-khtml-margin-collapse", CSS_PROP__KHTML_MARGIN_COLLAPSE},
+#line 77 "cssproperties.gperf"
       {"-khtml-margin-top-collapse", CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE},
 #line 50 "cssproperties.gperf"
       {"counter-reset", CSS_PROP_COUNTER_RESET},
-#line 77 "cssproperties.gperf"
+#line 78 "cssproperties.gperf"
       {"-khtml-margin-bottom-collapse", CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE},
-#line 147 "cssproperties.gperf"
+#line 148 "cssproperties.gperf"
       {"background", CSS_PROP_BACKGROUND},
-#line 113 "cssproperties.gperf"
+#line 114 "cssproperties.gperf"
       {"text-indent", CSS_PROP_TEXT_INDENT},
-#line 112 "cssproperties.gperf"
+#line 113 "cssproperties.gperf"
       {"text-decoration", CSS_PROP_TEXT_DECORATION},
 #line 11 "cssproperties.gperf"
       {"background-color", CSS_PROP_BACKGROUND_COLOR},
-#line 146 "cssproperties.gperf"
+#line 147 "cssproperties.gperf"
       {"z-index", CSS_PROP_Z_INDEX},
-#line 156 "cssproperties.gperf"
+#line 157 "cssproperties.gperf"
       {"font", CSS_PROP_FONT},
 #line 55 "cssproperties.gperf"
       {"float", CSS_PROP_FLOAT},
-#line 63 "cssproperties.gperf"
+#line 64 "cssproperties.gperf"
       {"left", CSS_PROP_LEFT},
-#line 163 "cssproperties.gperf"
+#line 164 "cssproperties.gperf"
       {"scrollbar-highlight-color", CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR},
 #line 13 "cssproperties.gperf"
       {"background-repeat", CSS_PROP_BACKGROUND_REPEAT},
-#line 111 "cssproperties.gperf"
+#line 112 "cssproperties.gperf"
       {"text-align", CSS_PROP_TEXT_ALIGN},
-#line 107 "cssproperties.gperf"
+#line 108 "cssproperties.gperf"
       {"quotes", CSS_PROP_QUOTES},
-#line 154 "cssproperties.gperf"
+#line 155 "cssproperties.gperf"
       {"border-left", CSS_PROP_BORDER_LEFT},
 #line 21 "cssproperties.gperf"
       {"-khtml-border-horizontal-spacing", CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING},
@@ -352,25 +352,25 @@ findProp (register const char *str, register unsigned int len)
       {"-khtml-box-orient", CSS_PROP__KHTML_BOX_ORIENT},
 #line 37 "cssproperties.gperf"
       {"-khtml-box-direction", CSS_PROP__KHTML_BOX_DIRECTION},
-#line 73 "cssproperties.gperf"
+#line 74 "cssproperties.gperf"
       {"margin-left", CSS_PROP_MARGIN_LEFT},
-#line 100 "cssproperties.gperf"
+#line 101 "cssproperties.gperf"
       {"padding-left", CSS_PROP_PADDING_LEFT},
-#line 120 "cssproperties.gperf"
+#line 121 "cssproperties.gperf"
       {"text-overline", CSS_PROP_TEXT_OVERLINE},
-#line 79 "cssproperties.gperf"
+#line 80 "cssproperties.gperf"
       {"-khtml-marquee", CSS_PROP__KHTML_MARQUEE},
-#line 85 "cssproperties.gperf"
+#line 86 "cssproperties.gperf"
       {"max-height", CSS_PROP_MAX_HEIGHT},
-#line 136 "cssproperties.gperf"
+#line 137 "cssproperties.gperf"
       {"-khtml-user-drag", CSS_PROP__KHTML_USER_DRAG},
-#line 121 "cssproperties.gperf"
+#line 122 "cssproperties.gperf"
       {"text-overline-color", CSS_PROP_TEXT_OVERLINE_COLOR},
-#line 161 "cssproperties.gperf"
+#line 162 "cssproperties.gperf"
       {"scrollbar-face-color", CSS_PROP_SCROLLBAR_FACE_COLOR},
-#line 60 "cssproperties.gperf"
+#line 61 "cssproperties.gperf"
       {"font-variant", CSS_PROP_FONT_VARIANT},
-#line 122 "cssproperties.gperf"
+#line 123 "cssproperties.gperf"
       {"text-overline-mode", CSS_PROP_TEXT_OVERLINE_MODE},
 #line 57 "cssproperties.gperf"
       {"font-size", CSS_PROP_FONT_SIZE},
@@ -378,37 +378,37 @@ findProp (register const char *str, register unsigned int len)
       {"-khtml-box-pack", CSS_PROP__KHTML_BOX_PACK},
 #line 36 "cssproperties.gperf"
       {"-khtml-box-align", CSS_PROP__KHTML_BOX_ALIGN},
-#line 58 "cssproperties.gperf"
+#line 59 "cssproperties.gperf"
       {"font-stretch", CSS_PROP_FONT_STRETCH},
-#line 138 "cssproperties.gperf"
+#line 139 "cssproperties.gperf"
       {"-khtml-user-select", CSS_PROP__KHTML_USER_SELECT},
-#line 80 "cssproperties.gperf"
+#line 81 "cssproperties.gperf"
       {"-khtml-marquee-direction", CSS_PROP__KHTML_MARQUEE_DIRECTION},
 #line 40 "cssproperties.gperf"
       {"-khtml-box-lines", CSS_PROP__KHTML_BOX_LINES},
-#line 81 "cssproperties.gperf"
-      {"-khtml-marquee-increment", CSS_PROP__KHTML_MARQUEE_INCREMENT},
 #line 82 "cssproperties.gperf"
+      {"-khtml-marquee-increment", CSS_PROP__KHTML_MARQUEE_INCREMENT},
+#line 83 "cssproperties.gperf"
       {"-khtml-marquee-repetition", CSS_PROP__KHTML_MARQUEE_REPETITION},
-#line 127 "cssproperties.gperf"
-      {"text-underline", CSS_PROP_TEXT_UNDERLINE},
 #line 128 "cssproperties.gperf"
+      {"text-underline", CSS_PROP_TEXT_UNDERLINE},
+#line 129 "cssproperties.gperf"
       {"text-underline-color", CSS_PROP_TEXT_UNDERLINE_COLOR},
-#line 103 "cssproperties.gperf"
+#line 104 "cssproperties.gperf"
       {"page-break-after", CSS_PROP_PAGE_BREAK_AFTER},
-#line 90 "cssproperties.gperf"
+#line 91 "cssproperties.gperf"
       {"opacity", CSS_PROP_OPACITY},
-#line 129 "cssproperties.gperf"
+#line 130 "cssproperties.gperf"
       {"text-underline-mode", CSS_PROP_TEXT_UNDERLINE_MODE},
-#line 83 "cssproperties.gperf"
+#line 84 "cssproperties.gperf"
       {"-khtml-marquee-speed", CSS_PROP__KHTML_MARQUEE_SPEED},
-#line 104 "cssproperties.gperf"
+#line 105 "cssproperties.gperf"
       {"page-break-before", CSS_PROP_PAGE_BREAK_BEFORE},
-#line 143 "cssproperties.gperf"
+#line 144 "cssproperties.gperf"
       {"width", CSS_PROP_WIDTH},
-#line 88 "cssproperties.gperf"
+#line 89 "cssproperties.gperf"
       {"min-width", CSS_PROP_MIN_WIDTH},
-#line 155 "cssproperties.gperf"
+#line 156 "cssproperties.gperf"
       {"border-width", CSS_PROP_BORDER_WIDTH},
 #line 31 "cssproperties.gperf"
       {"border-top-width", CSS_PROP_BORDER_TOP_WIDTH},
@@ -416,101 +416,103 @@ findProp (register const char *str, register unsigned int len)
       {"display", CSS_PROP_DISPLAY},
 #line 33 "cssproperties.gperf"
       {"border-bottom-width", CSS_PROP_BORDER_BOTTOM_WIDTH},
-#line 167 "cssproperties.gperf"
+#line 58 "cssproperties.gperf"
+      {"-khtml-font-size-delta", CSS_PROP__KHTML_FONT_SIZE_DELTA},
+#line 168 "cssproperties.gperf"
       {"scrollbar-arrow-color", CSS_PROP_SCROLLBAR_ARROW_COLOR},
 #line 54 "cssproperties.gperf"
       {"empty-cells", CSS_PROP_EMPTY_CELLS},
-#line 150 "cssproperties.gperf"
+#line 151 "cssproperties.gperf"
       {"border-style", CSS_PROP_BORDER_STYLE},
 #line 27 "cssproperties.gperf"
       {"border-top-style", CSS_PROP_BORDER_TOP_STYLE},
-#line 114 "cssproperties.gperf"
+#line 115 "cssproperties.gperf"
       {"text-line-through", CSS_PROP_TEXT_LINE_THROUGH},
 #line 29 "cssproperties.gperf"
       {"border-bottom-style", CSS_PROP_BORDER_BOTTOM_STYLE},
-#line 141 "cssproperties.gperf"
+#line 142 "cssproperties.gperf"
       {"white-space", CSS_PROP_WHITE_SPACE},
-#line 145 "cssproperties.gperf"
+#line 146 "cssproperties.gperf"
       {"word-spacing", CSS_PROP_WORD_SPACING},
-#line 115 "cssproperties.gperf"
+#line 116 "cssproperties.gperf"
       {"text-line-through-color", CSS_PROP_TEXT_LINE_THROUGH_COLOR},
 #line 41 "cssproperties.gperf"
       {"-khtml-box-ordinal-group", CSS_PROP__KHTML_BOX_ORDINAL_GROUP},
-#line 116 "cssproperties.gperf"
+#line 117 "cssproperties.gperf"
       {"text-line-through-mode", CSS_PROP_TEXT_LINE_THROUGH_MODE},
-#line 157 "cssproperties.gperf"
+#line 158 "cssproperties.gperf"
       {"list-style", CSS_PROP_LIST_STYLE},
 #line 16 "cssproperties.gperf"
       {"background-position-x", CSS_PROP_BACKGROUND_POSITION_X},
 #line 32 "cssproperties.gperf"
       {"border-right-width", CSS_PROP_BORDER_RIGHT_WIDTH},
-#line 140 "cssproperties.gperf"
+#line 141 "cssproperties.gperf"
       {"visibility", CSS_PROP_VISIBILITY},
-#line 132 "cssproperties.gperf"
+#line 133 "cssproperties.gperf"
       {"-apple-text-size-adjust", CSS_PROP__APPLE_TEXT_SIZE_ADJUST},
-#line 126 "cssproperties.gperf"
+#line 127 "cssproperties.gperf"
       {"text-transform", CSS_PROP_TEXT_TRANSFORM},
-#line 162 "cssproperties.gperf"
+#line 163 "cssproperties.gperf"
       {"scrollbar-shadow-color", CSS_PROP_SCROLLBAR_SHADOW_COLOR},
-#line 110 "cssproperties.gperf"
+#line 111 "cssproperties.gperf"
       {"table-layout", CSS_PROP_TABLE_LAYOUT},
 #line 28 "cssproperties.gperf"
       {"border-right-style", CSS_PROP_BORDER_RIGHT_STYLE},
-#line 95 "cssproperties.gperf"
+#line 96 "cssproperties.gperf"
       {"outline-width", CSS_PROP_OUTLINE_WIDTH},
-#line 68 "cssproperties.gperf"
+#line 69 "cssproperties.gperf"
       {"list-style-position", CSS_PROP_LIST_STYLE_POSITION},
-#line 67 "cssproperties.gperf"
+#line 68 "cssproperties.gperf"
       {"list-style-image", CSS_PROP_LIST_STYLE_IMAGE},
-#line 165 "cssproperties.gperf"
+#line 166 "cssproperties.gperf"
       {"scrollbar-darkshadow-color", CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR},
-#line 94 "cssproperties.gperf"
+#line 95 "cssproperties.gperf"
       {"outline-style", CSS_PROP_OUTLINE_STYLE},
-#line 86 "cssproperties.gperf"
+#line 87 "cssproperties.gperf"
       {"max-width", CSS_PROP_MAX_WIDTH},
-#line 125 "cssproperties.gperf"
+#line 126 "cssproperties.gperf"
       {"text-shadow", CSS_PROP_TEXT_SHADOW},
 #line 17 "cssproperties.gperf"
       {"background-position-y", CSS_PROP_BACKGROUND_POSITION_Y},
 #line 34 "cssproperties.gperf"
       {"border-left-width", CSS_PROP_BORDER_LEFT_WIDTH},
-#line 59 "cssproperties.gperf"
+#line 60 "cssproperties.gperf"
       {"font-style", CSS_PROP_FONT_STYLE},
-#line 93 "cssproperties.gperf"
+#line 94 "cssproperties.gperf"
       {"outline-offset", CSS_PROP_OUTLINE_OFFSET},
-#line 96 "cssproperties.gperf"
+#line 97 "cssproperties.gperf"
       {"overflow", CSS_PROP_OVERFLOW},
-#line 61 "cssproperties.gperf"
+#line 62 "cssproperties.gperf"
       {"font-weight", CSS_PROP_FONT_WEIGHT},
 #line 30 "cssproperties.gperf"
       {"border-left-style", CSS_PROP_BORDER_LEFT_STYLE},
-#line 124 "cssproperties.gperf"
+#line 125 "cssproperties.gperf"
       {"text-overline-width", CSS_PROP_TEXT_OVERLINE_WIDTH},
 #line 38 "cssproperties.gperf"
       {"-khtml-box-flex", CSS_PROP__KHTML_BOX_FLEX},
-#line 144 "cssproperties.gperf"
+#line 145 "cssproperties.gperf"
       {"word-wrap", CSS_PROP_WORD_WRAP},
-#line 123 "cssproperties.gperf"
+#line 124 "cssproperties.gperf"
       {"text-overline-style", CSS_PROP_TEXT_OVERLINE_STYLE},
-#line 84 "cssproperties.gperf"
+#line 85 "cssproperties.gperf"
       {"-khtml-marquee-style", CSS_PROP__KHTML_MARQUEE_STYLE},
-#line 131 "cssproperties.gperf"
+#line 132 "cssproperties.gperf"
       {"text-underline-width", CSS_PROP_TEXT_UNDERLINE_WIDTH},
-#line 142 "cssproperties.gperf"
+#line 143 "cssproperties.gperf"
       {"widows", CSS_PROP_WIDOWS},
-#line 130 "cssproperties.gperf"
+#line 131 "cssproperties.gperf"
       {"text-underline-style", CSS_PROP_TEXT_UNDERLINE_STYLE},
-#line 118 "cssproperties.gperf"
+#line 119 "cssproperties.gperf"
       {"text-line-through-width", CSS_PROP_TEXT_LINE_THROUGH_WIDTH},
 #line 56 "cssproperties.gperf"
       {"font-family", CSS_PROP_FONT_FAMILY},
-#line 69 "cssproperties.gperf"
+#line 70 "cssproperties.gperf"
       {"list-style-type", CSS_PROP_LIST_STYLE_TYPE},
-#line 137 "cssproperties.gperf"
+#line 138 "cssproperties.gperf"
       {"-khtml-user-modify", CSS_PROP__KHTML_USER_MODIFY},
-#line 117 "cssproperties.gperf"
+#line 118 "cssproperties.gperf"
       {"text-line-through-style", CSS_PROP_TEXT_LINE_THROUGH_STYLE},
-#line 119 "cssproperties.gperf"
+#line 120 "cssproperties.gperf"
       {"text-overflow", CSS_PROP_TEXT_OVERFLOW},
 #line 39 "cssproperties.gperf"
       {"-khtml-box-flex-group", CSS_PROP__KHTML_BOX_FLEX_GROUP}
@@ -542,34 +544,34 @@ findProp (register const char *str, register unsigned int len)
        -1,  -1,  -1,  -1,  -1,  96,  97,  98,  -1,  99,
       100,  -1, 101,  -1,  -1, 102,  -1,  -1,  -1, 103,
        -1,  -1,  -1,  -1,  -1,  -1,  -1, 104,  -1,  -1,
-       -1, 105, 106,  -1, 107,  -1,  -1,  -1,  -1,  -1,
-       -1, 108,  -1,  -1,  -1,  -1, 109, 110,  -1,  -1,
-       -1, 111, 112,  -1, 113,  -1, 114, 115, 116, 117,
-       -1,  -1, 118,  -1,  -1, 119, 120,  -1,  -1,  -1,
-       -1,  -1,  -1, 121,  -1, 122,  -1,  -1, 123, 124,
-       -1,  -1, 125,  -1,  -1,  -1,  -1, 126,  -1,  -1,
-       -1,  -1,  -1, 127,  -1,  -1,  -1,  -1, 128, 129,
-       -1, 130,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1, 131,  -1,  -1,  -1,  -1,  -1,  -1, 132,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 133,
+       -1, 105, 106,  -1, 107,  -1,  -1, 108,  -1,  -1,
+       -1, 109,  -1,  -1,  -1,  -1, 110, 111,  -1,  -1,
+       -1, 112, 113,  -1, 114,  -1, 115, 116, 117, 118,
+       -1,  -1, 119,  -1,  -1, 120, 121,  -1,  -1,  -1,
+       -1,  -1,  -1, 122,  -1, 123,  -1,  -1, 124, 125,
+       -1,  -1, 126,  -1,  -1,  -1,  -1, 127,  -1,  -1,
+       -1,  -1,  -1, 128,  -1,  -1,  -1,  -1, 129, 130,
+       -1, 131,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1, 132,  -1,  -1,  -1,  -1,  -1,  -1, 133,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 134,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1, 134,  -1,  -1,  -1,  -1, 135,  -1,  -1,  -1,
-       -1,  -1, 136,  -1,  -1, 137,  -1,  -1,  -1, 138,
-       -1,  -1,  -1, 139,  -1,  -1, 140,  -1,  -1,  -1,
-       -1,  -1, 141,  -1, 142,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 143,  -1,  -1,  -1, 144,
-       -1,  -1,  -1,  -1, 145, 146,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 147,  -1,  -1,  -1,  -1,
-       -1, 148,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 149,  -1,  -1,  -1,  -1,
+       -1, 135,  -1,  -1,  -1,  -1, 136,  -1,  -1,  -1,
+       -1,  -1, 137,  -1,  -1, 138,  -1,  -1,  -1, 139,
+       -1,  -1,  -1, 140,  -1,  -1, 141,  -1,  -1,  -1,
+       -1,  -1, 142,  -1, 143,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 144,  -1,  -1,  -1, 145,
+       -1,  -1,  -1,  -1, 146, 147,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 148,  -1,  -1,  -1,  -1,
+       -1, 149,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 150,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 150,  -1,
-       -1, 151,  -1,  -1,  -1, 152,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 153,  -1,  -1,  -1,  -1, 154,  -1,
-       -1,  -1,  -1, 155,  -1,  -1, 156
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 151,  -1,
+       -1, 152,  -1,  -1,  -1, 153,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1, 154,  -1,  -1,  -1,  -1, 155,  -1,
+       -1,  -1,  -1, 156,  -1,  -1, 157
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -591,7 +593,7 @@ findProp (register const char *str, register unsigned int len)
     }
   return 0;
 }
-#line 168 "cssproperties.gperf"
+#line 169 "cssproperties.gperf"
 
 static const char * const propertyList[] = {
 "",
@@ -642,6 +644,7 @@ static const char * const propertyList[] = {
 "float", 
 "font-family", 
 "font-size", 
+"-khtml-font-size-delta", 
 "font-stretch", 
 "font-style", 
 "font-variant", 
index ece970030ec443d9506e2e9202fb342ae52da8ac..724f6c1ff3eecd6ccc15dbe3ece7119e1e998558 100644 (file)
 #define CSS_PROP_FLOAT 45
 #define CSS_PROP_FONT_FAMILY 46
 #define CSS_PROP_FONT_SIZE 47
-#define CSS_PROP_FONT_STRETCH 48
-#define CSS_PROP_FONT_STYLE 49
-#define CSS_PROP_FONT_VARIANT 50
-#define CSS_PROP_FONT_WEIGHT 51
-#define CSS_PROP_HEIGHT 52
-#define CSS_PROP_LEFT 53
-#define CSS_PROP_LETTER_SPACING 54
-#define CSS_PROP__APPLE_LINE_CLAMP 55
-#define CSS_PROP_LINE_HEIGHT 56
-#define CSS_PROP_LIST_STYLE_IMAGE 57
-#define CSS_PROP_LIST_STYLE_POSITION 58
-#define CSS_PROP_LIST_STYLE_TYPE 59
-#define CSS_PROP_MARGIN_TOP 60
-#define CSS_PROP_MARGIN_RIGHT 61
-#define CSS_PROP_MARGIN_BOTTOM 62
-#define CSS_PROP_MARGIN_LEFT 63
-#define CSS_PROP__KHTML_LINE_BREAK 64
-#define CSS_PROP__KHTML_MARGIN_COLLAPSE 65
-#define CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE 66
-#define CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE 67
-#define CSS_PROP__KHTML_MARGIN_START 68
-#define CSS_PROP__KHTML_MARQUEE 69
-#define CSS_PROP__KHTML_MARQUEE_DIRECTION 70
-#define CSS_PROP__KHTML_MARQUEE_INCREMENT 71
-#define CSS_PROP__KHTML_MARQUEE_REPETITION 72
-#define CSS_PROP__KHTML_MARQUEE_SPEED 73
-#define CSS_PROP__KHTML_MARQUEE_STYLE 74
-#define CSS_PROP_MAX_HEIGHT 75
-#define CSS_PROP_MAX_WIDTH 76
-#define CSS_PROP_MIN_HEIGHT 77
-#define CSS_PROP_MIN_WIDTH 78
-#define CSS_PROP__KHTML_NBSP_MODE 79
-#define CSS_PROP_OPACITY 80
-#define CSS_PROP_ORPHANS 81
-#define CSS_PROP_OUTLINE_COLOR 82
-#define CSS_PROP_OUTLINE_OFFSET 83
-#define CSS_PROP_OUTLINE_STYLE 84
-#define CSS_PROP_OUTLINE_WIDTH 85
-#define CSS_PROP_OVERFLOW 86
-#define CSS_PROP_PADDING_TOP 87
-#define CSS_PROP_PADDING_RIGHT 88
-#define CSS_PROP_PADDING_BOTTOM 89
-#define CSS_PROP_PADDING_LEFT 90
-#define CSS_PROP__KHTML_PADDING_START 91
-#define CSS_PROP_PAGE 92
-#define CSS_PROP_PAGE_BREAK_AFTER 93
-#define CSS_PROP_PAGE_BREAK_BEFORE 94
-#define CSS_PROP_PAGE_BREAK_INSIDE 95
-#define CSS_PROP_POSITION 96
-#define CSS_PROP_QUOTES 97
-#define CSS_PROP_RIGHT 98
-#define CSS_PROP_SIZE 99
-#define CSS_PROP_TABLE_LAYOUT 100
-#define CSS_PROP_TEXT_ALIGN 101
-#define CSS_PROP_TEXT_DECORATION 102
-#define CSS_PROP_TEXT_INDENT 103
-#define CSS_PROP_TEXT_LINE_THROUGH 104
-#define CSS_PROP_TEXT_LINE_THROUGH_COLOR 105
-#define CSS_PROP_TEXT_LINE_THROUGH_MODE 106
-#define CSS_PROP_TEXT_LINE_THROUGH_STYLE 107
-#define CSS_PROP_TEXT_LINE_THROUGH_WIDTH 108
-#define CSS_PROP_TEXT_OVERFLOW 109
-#define CSS_PROP_TEXT_OVERLINE 110
-#define CSS_PROP_TEXT_OVERLINE_COLOR 111
-#define CSS_PROP_TEXT_OVERLINE_MODE 112
-#define CSS_PROP_TEXT_OVERLINE_STYLE 113
-#define CSS_PROP_TEXT_OVERLINE_WIDTH 114
-#define CSS_PROP_TEXT_SHADOW 115
-#define CSS_PROP_TEXT_TRANSFORM 116
-#define CSS_PROP_TEXT_UNDERLINE 117
-#define CSS_PROP_TEXT_UNDERLINE_COLOR 118
-#define CSS_PROP_TEXT_UNDERLINE_MODE 119
-#define CSS_PROP_TEXT_UNDERLINE_STYLE 120
-#define CSS_PROP_TEXT_UNDERLINE_WIDTH 121
-#define CSS_PROP__APPLE_TEXT_SIZE_ADJUST 122
-#define CSS_PROP__APPLE_DASHBOARD_REGION 123
-#define CSS_PROP_TOP 124
-#define CSS_PROP_UNICODE_BIDI 125
-#define CSS_PROP__KHTML_USER_DRAG 126
-#define CSS_PROP__KHTML_USER_MODIFY 127
-#define CSS_PROP__KHTML_USER_SELECT 128
-#define CSS_PROP_VERTICAL_ALIGN 129
-#define CSS_PROP_VISIBILITY 130
-#define CSS_PROP_WHITE_SPACE 131
-#define CSS_PROP_WIDOWS 132
-#define CSS_PROP_WIDTH 133
-#define CSS_PROP_WORD_WRAP 134
-#define CSS_PROP_WORD_SPACING 135
-#define CSS_PROP_Z_INDEX 136
-#define CSS_PROP_BACKGROUND 137
-#define CSS_PROP_BORDER 138
-#define CSS_PROP_BORDER_COLOR 139
-#define CSS_PROP_BORDER_STYLE 140
-#define CSS_PROP_BORDER_TOP 141
-#define CSS_PROP_BORDER_RIGHT 142
-#define CSS_PROP_BORDER_BOTTOM 143
-#define CSS_PROP_BORDER_LEFT 144
-#define CSS_PROP_BORDER_WIDTH 145
-#define CSS_PROP_FONT 146
-#define CSS_PROP_LIST_STYLE 147
-#define CSS_PROP_MARGIN 148
-#define CSS_PROP_OUTLINE 149
-#define CSS_PROP_PADDING 150
-#define CSS_PROP_SCROLLBAR_FACE_COLOR 151
-#define CSS_PROP_SCROLLBAR_SHADOW_COLOR 152
-#define CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR 153
-#define CSS_PROP_SCROLLBAR_3DLIGHT_COLOR 154
-#define CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR 155
-#define CSS_PROP_SCROLLBAR_TRACK_COLOR 156
-#define CSS_PROP_SCROLLBAR_ARROW_COLOR 157
+#define CSS_PROP__KHTML_FONT_SIZE_DELTA 48
+#define CSS_PROP_FONT_STRETCH 49
+#define CSS_PROP_FONT_STYLE 50
+#define CSS_PROP_FONT_VARIANT 51
+#define CSS_PROP_FONT_WEIGHT 52
+#define CSS_PROP_HEIGHT 53
+#define CSS_PROP_LEFT 54
+#define CSS_PROP_LETTER_SPACING 55
+#define CSS_PROP__APPLE_LINE_CLAMP 56
+#define CSS_PROP_LINE_HEIGHT 57
+#define CSS_PROP_LIST_STYLE_IMAGE 58
+#define CSS_PROP_LIST_STYLE_POSITION 59
+#define CSS_PROP_LIST_STYLE_TYPE 60
+#define CSS_PROP_MARGIN_TOP 61
+#define CSS_PROP_MARGIN_RIGHT 62
+#define CSS_PROP_MARGIN_BOTTOM 63
+#define CSS_PROP_MARGIN_LEFT 64
+#define CSS_PROP__KHTML_LINE_BREAK 65
+#define CSS_PROP__KHTML_MARGIN_COLLAPSE 66
+#define CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE 67
+#define CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE 68
+#define CSS_PROP__KHTML_MARGIN_START 69
+#define CSS_PROP__KHTML_MARQUEE 70
+#define CSS_PROP__KHTML_MARQUEE_DIRECTION 71
+#define CSS_PROP__KHTML_MARQUEE_INCREMENT 72
+#define CSS_PROP__KHTML_MARQUEE_REPETITION 73
+#define CSS_PROP__KHTML_MARQUEE_SPEED 74
+#define CSS_PROP__KHTML_MARQUEE_STYLE 75
+#define CSS_PROP_MAX_HEIGHT 76
+#define CSS_PROP_MAX_WIDTH 77
+#define CSS_PROP_MIN_HEIGHT 78
+#define CSS_PROP_MIN_WIDTH 79
+#define CSS_PROP__KHTML_NBSP_MODE 80
+#define CSS_PROP_OPACITY 81
+#define CSS_PROP_ORPHANS 82
+#define CSS_PROP_OUTLINE_COLOR 83
+#define CSS_PROP_OUTLINE_OFFSET 84
+#define CSS_PROP_OUTLINE_STYLE 85
+#define CSS_PROP_OUTLINE_WIDTH 86
+#define CSS_PROP_OVERFLOW 87
+#define CSS_PROP_PADDING_TOP 88
+#define CSS_PROP_PADDING_RIGHT 89
+#define CSS_PROP_PADDING_BOTTOM 90
+#define CSS_PROP_PADDING_LEFT 91
+#define CSS_PROP__KHTML_PADDING_START 92
+#define CSS_PROP_PAGE 93
+#define CSS_PROP_PAGE_BREAK_AFTER 94
+#define CSS_PROP_PAGE_BREAK_BEFORE 95
+#define CSS_PROP_PAGE_BREAK_INSIDE 96
+#define CSS_PROP_POSITION 97
+#define CSS_PROP_QUOTES 98
+#define CSS_PROP_RIGHT 99
+#define CSS_PROP_SIZE 100
+#define CSS_PROP_TABLE_LAYOUT 101
+#define CSS_PROP_TEXT_ALIGN 102
+#define CSS_PROP_TEXT_DECORATION 103
+#define CSS_PROP_TEXT_INDENT 104
+#define CSS_PROP_TEXT_LINE_THROUGH 105
+#define CSS_PROP_TEXT_LINE_THROUGH_COLOR 106
+#define CSS_PROP_TEXT_LINE_THROUGH_MODE 107
+#define CSS_PROP_TEXT_LINE_THROUGH_STYLE 108
+#define CSS_PROP_TEXT_LINE_THROUGH_WIDTH 109
+#define CSS_PROP_TEXT_OVERFLOW 110
+#define CSS_PROP_TEXT_OVERLINE 111
+#define CSS_PROP_TEXT_OVERLINE_COLOR 112
+#define CSS_PROP_TEXT_OVERLINE_MODE 113
+#define CSS_PROP_TEXT_OVERLINE_STYLE 114
+#define CSS_PROP_TEXT_OVERLINE_WIDTH 115
+#define CSS_PROP_TEXT_SHADOW 116
+#define CSS_PROP_TEXT_TRANSFORM 117
+#define CSS_PROP_TEXT_UNDERLINE 118
+#define CSS_PROP_TEXT_UNDERLINE_COLOR 119
+#define CSS_PROP_TEXT_UNDERLINE_MODE 120
+#define CSS_PROP_TEXT_UNDERLINE_STYLE 121
+#define CSS_PROP_TEXT_UNDERLINE_WIDTH 122
+#define CSS_PROP__APPLE_TEXT_SIZE_ADJUST 123
+#define CSS_PROP__APPLE_DASHBOARD_REGION 124
+#define CSS_PROP_TOP 125
+#define CSS_PROP_UNICODE_BIDI 126
+#define CSS_PROP__KHTML_USER_DRAG 127
+#define CSS_PROP__KHTML_USER_MODIFY 128
+#define CSS_PROP__KHTML_USER_SELECT 129
+#define CSS_PROP_VERTICAL_ALIGN 130
+#define CSS_PROP_VISIBILITY 131
+#define CSS_PROP_WHITE_SPACE 132
+#define CSS_PROP_WIDOWS 133
+#define CSS_PROP_WIDTH 134
+#define CSS_PROP_WORD_WRAP 135
+#define CSS_PROP_WORD_SPACING 136
+#define CSS_PROP_Z_INDEX 137
+#define CSS_PROP_BACKGROUND 138
+#define CSS_PROP_BORDER 139
+#define CSS_PROP_BORDER_COLOR 140
+#define CSS_PROP_BORDER_STYLE 141
+#define CSS_PROP_BORDER_TOP 142
+#define CSS_PROP_BORDER_RIGHT 143
+#define CSS_PROP_BORDER_BOTTOM 144
+#define CSS_PROP_BORDER_LEFT 145
+#define CSS_PROP_BORDER_WIDTH 146
+#define CSS_PROP_FONT 147
+#define CSS_PROP_LIST_STYLE 148
+#define CSS_PROP_MARGIN 149
+#define CSS_PROP_OUTLINE 150
+#define CSS_PROP_PADDING 151
+#define CSS_PROP_SCROLLBAR_FACE_COLOR 152
+#define CSS_PROP_SCROLLBAR_SHADOW_COLOR 153
+#define CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR 154
+#define CSS_PROP_SCROLLBAR_3DLIGHT_COLOR 155
+#define CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR 156
+#define CSS_PROP_SCROLLBAR_TRACK_COLOR 157
+#define CSS_PROP_SCROLLBAR_ARROW_COLOR 158
 
 #define CSS_PROP_MAX CSS_PROP_Z_INDEX
-#define CSS_PROP_TOTAL 158
+#define CSS_PROP_TOTAL 159
 #endif
 
index 9cc154d6b0af76c1e42ab6fe9ee7292d9d0a3b29..8b535a1dde98cf44f58cfacb3665712f52ab2c00 100644 (file)
@@ -59,6 +59,7 @@ empty-cells
 float
 font-family
 font-size
+-khtml-font-size-delta
 font-stretch
 font-style
 font-variant
index 136c9300b6f146f3bf4f3c3270eedbf55e908d4e..6ee4fdbf374d98ef47723fa996a040483fcdde9b 100644 (file)
@@ -61,6 +61,7 @@ using DOM::CSSPrimitiveValue;
 using DOM::CSSPrimitiveValueImpl;
 using DOM::CSSProperty;
 using DOM::CSSStyleDeclarationImpl;
+using DOM::CSSValue;
 using DOM::CSSValueImpl;
 using DOM::DocumentFragmentImpl;
 using DOM::DocumentImpl;
@@ -173,6 +174,22 @@ static DOMString &styleSpanClassString()
     return styleSpanClassString;
 }
 
+static bool isEmptyStyleSpan(const NodeImpl *node)
+{
+    if (!node || !node->isHTMLElement())
+        return false;
+
+    const HTMLElementImpl *elem = static_cast<const HTMLElementImpl *>(node);
+    CSSMutableStyleDeclarationImpl *inlineStyleDecl = elem->inlineStyleDecl();
+    if (!inlineStyleDecl || inlineStyleDecl->length() == 0) {
+        NamedAttrMapImpl *map = elem->attributes();
+        if (map && map->length() == 1 && elem->getAttribute(ATTR_CLASS) == styleSpanClassString())
+            return true;
+    }
+    
+    return false;
+}
+
 static DOMString &blockPlaceholderClassString()
 {
     static DOMString blockPlaceholderClassString = "khtml-block-placeholder";
@@ -763,6 +780,9 @@ void CompositeEditCommand::removeCSSProperty(CSSStyleDeclarationImpl *decl, int
 
 void CompositeEditCommand::removeNodeAttribute(ElementImpl *element, int attribute)
 {
+    DOMString value = element->getAttribute(attribute);
+    if (value.isEmpty())
+        return;
     EditCommandPtr cmd(new RemoveNodeAttributeCommand(document(), element, attribute));
     applyCommandToComposite(cmd);
 }
@@ -1132,6 +1152,7 @@ void ApplyStyleCommand::doApply()
     if (blockStyle->length() < m_style->length()) {
         CSSMutableStyleDeclarationImpl *inlineStyle = m_style->copy();
         inlineStyle->ref();
+        applyRelativeFontStyleChange(inlineStyle);
         blockStyle->diff(inlineStyle);
         applyInlineStyle(inlineStyle);
         inlineStyle->deref();
@@ -1183,11 +1204,144 @@ void ApplyStyleCommand::applyBlockStyle(CSSMutableStyleDeclarationImpl *style)
     }
 }
 
+#define NoFontDelta (0.0f)
+#define MinimumFontSize (0.1f)
+
+void ApplyStyleCommand::applyRelativeFontStyleChange(CSSMutableStyleDeclarationImpl *style)
+{
+    if (style->getPropertyCSSValue(CSS_PROP_FONT_SIZE)) {
+        // Explicit font size overrides any delta.
+        style->removeProperty(CSS_PROP__KHTML_FONT_SIZE_DELTA);
+        return;
+    }
+
+    // Get the adjustment amount out of the style.
+    CSSValueImpl *value = style->getPropertyCSSValue(CSS_PROP__KHTML_FONT_SIZE_DELTA);
+    if (!value)
+        return;
+    value->ref();
+    float adjustment = NoFontDelta;
+    if (value->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE) {
+        CSSPrimitiveValueImpl *primitiveValue = static_cast<CSSPrimitiveValueImpl *>(value);
+        if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_PX) {
+            // Only PX handled now. If we handle more types in the future, perhaps
+            // a switch statement here would be more appropriate.
+            adjustment = primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PX);
+        }
+    }
+    style->removeProperty(CSS_PROP__KHTML_FONT_SIZE_DELTA);
+    value->deref();
+    if (adjustment == NoFontDelta)
+        return;
+    
+    // Adjust to the positions we want to use for applying style.
+    Selection selection = endingSelection();
+    Position start(selection.start().downstream(StayInBlock));
+    Position end(selection.end().upstream(StayInBlock));
+    if (RangeImpl::compareBoundaryPoints(end, start) < 0) {
+        Position swap = start;
+        start = end;
+        end = swap;
+    }
+
+    // Join up any adjacent text nodes.
+    if (start.node()->isTextNode()) {
+        joinChildTextNodes(start.node()->parentNode(), start, end);
+        selection = endingSelection();
+        start = selection.start();
+        end = selection.end();
+    }
+    if (end.node()->isTextNode() && start.node()->parentNode() != end.node()->parentNode()) {
+        joinChildTextNodes(end.node()->parentNode(), start, end);
+        selection = endingSelection();
+        start = selection.start();
+        end = selection.end();
+    }
+
+    // Split the start text nodes if needed to apply style.
+    bool splitStart = splitTextAtStartIfNeeded(start, end); 
+    if (splitStart) {
+        start = endingSelection().start();
+        end = endingSelection().end();
+    }
+    bool splitEnd = splitTextAtEndIfNeeded(start, end);
+    if (splitEnd) {
+        start = endingSelection().start();
+        end = endingSelection().end();
+    }
+
+    NodeImpl *beyondEnd = end.node()->traverseNextNode(); // Calculate loop end point.
+    start = start.upstream(StayInBlock); // Move upstream to ensure we do not add redundant spans.
+
+    // Store away font size before making any changes to the document.
+    // This ensures that changes to one node won't effect another.
+    QMap<const NodeImpl *,float> startingFontSizes;
+    for (const NodeImpl *node = start.node(); node != beyondEnd; node = node->traverseNextNode())
+        startingFontSizes.insert(node, computedFontSize(node));
+
+    // These spans were added by us. If empty after font size changes, they can be removed.
+    QPtrList<NodeImpl> emptySpans;
+    
+    NodeImpl *lastStyledNode = 0;
+    for (NodeImpl *node = start.node(); node != beyondEnd; node = node->traverseNextNode()) {
+        // Only work on fully selected nodes.
+        if (!nodeFullySelected(node, start, end))
+            continue;
+
+        HTMLElementImpl *elem = 0;
+        if (node->isHTMLElement()) {
+            elem = static_cast<HTMLElementImpl *>(node);
+        }
+        else if (node->isTextNode() && node->parentNode() != lastStyledNode) {
+            // Last styled node was not parent node of this text node, but we wish to style this
+            // text node. To make this possible, add a style span to surround this text node.
+            elem = static_cast<HTMLElementImpl *>(createStyleSpanElement(document()));
+            insertNodeBefore(elem, node);
+            surroundNodeRangeWithElement(node, node, elem);
+        }
+        else {
+            // Only handle HTML elements and text nodes.
+            continue;
+        }
+        lastStyledNode = node;
+        
+        CSSMutableStyleDeclarationImpl *inlineStyleDecl = elem->getInlineStyleDecl();
+        float currentFontSize = computedFontSize(node);
+        float desiredFontSize = kMax(MinimumFontSize, startingFontSizes[node] + adjustment);
+        if (inlineStyleDecl->getPropertyCSSValue(CSS_PROP_FONT_SIZE)) {
+            inlineStyleDecl->removeProperty(CSS_PROP_FONT_SIZE, true);
+            currentFontSize = computedFontSize(node);
+        }
+        if (currentFontSize != desiredFontSize) {
+            QString desiredFontSizeString = QString::number(desiredFontSize);
+            desiredFontSizeString += "px";
+            inlineStyleDecl->setProperty(CSS_PROP_FONT_SIZE, desiredFontSizeString, false, false);
+            setNodeAttribute(elem, ATTR_STYLE, inlineStyleDecl->cssText());
+        }
+        if (inlineStyleDecl->length() == 0) {
+            removeNodeAttribute(elem, ATTR_STYLE);
+            if (isEmptyStyleSpan(elem))
+                emptySpans.append(elem);
+        }
+    }
+
+    for (QPtrListIterator<NodeImpl> it(emptySpans); it.current(); ++it)
+        removeNodePreservingChildren(it.current());
+}
+
+#undef NoFontDelta
+#undef MinimumFontSize
+
 void ApplyStyleCommand::applyInlineStyle(CSSMutableStyleDeclarationImpl *style)
 {
     // adjust to the positions we want to use for applying style
     Position start(endingSelection().start().downstream(StayInBlock).equivalentRangeCompliantPosition());
     Position end(endingSelection().end().upstream(StayInBlock));
+    if (RangeImpl::compareBoundaryPoints(end, start) < 0) {
+        Position swap = start;
+        start = end;
+        end = swap;
+    }
 
     // update document layout once before removing styles
     // so that we avoid the expense of updating before each and every call
@@ -1373,19 +1527,21 @@ bool ApplyStyleCommand::splitTextAtStartIfNeeded(const Position &start, const Po
     return false;
 }
 
-NodeImpl *ApplyStyleCommand::splitTextAtEndIfNeeded(const Position &start, const Position &end)
+bool ApplyStyleCommand::splitTextAtEndIfNeeded(const Position &start, const Position &end)
 {
     if (end.node()->isTextNode() && end.offset() > end.node()->caretMinOffset() && end.offset() < end.node()->caretMaxOffset()) {
         TextImpl *text = static_cast<TextImpl *>(end.node());
         SplitTextNodeCommand *impl = new SplitTextNodeCommand(document(), text, end.offset());
         EditCommandPtr cmd(impl);
         applyCommandToComposite(cmd);
-        NodeImpl *startNode = start.node() == end.node() ? impl->node()->previousSibling() : start.node();
+        NodeImpl *prevNode = impl->node()->previousSibling();
+        ASSERT(prevNode);
+        NodeImpl *startNode = start.node() == end.node() ? prevNode : start.node();
         ASSERT(startNode);
-        setEndingSelection(Selection(Position(startNode, start.offset()), Position(impl->node()->previousSibling(), impl->node()->previousSibling()->caretMaxOffset())));
-        return impl->node()->previousSibling();
+        setEndingSelection(Selection(Position(startNode, start.offset()), Position(prevNode, prevNode->caretMaxOffset())));
+        return true;
     }
-    return end.node();
+    return false;
 }
 
 void ApplyStyleCommand::surroundNodeRangeWithElement(NodeImpl *startNode, NodeImpl *endNode, ElementImpl *element)
@@ -1504,6 +1660,61 @@ Position ApplyStyleCommand::positionInsertionPoint(Position pos)
     return pos;
 }
 
+float ApplyStyleCommand::computedFontSize(const NodeImpl *node)
+{
+    float size = 0.0f;
+    
+    if (!node)
+        return size;
+    
+    Position pos(const_cast<NodeImpl *>(node), 0);
+    CSSComputedStyleDeclarationImpl *computedStyle = pos.computedStyle();
+    if (!computedStyle)
+        return size;
+    computedStyle->ref();
+
+    CSSPrimitiveValueImpl *value = static_cast<CSSPrimitiveValueImpl *>(computedStyle->getPropertyCSSValue(CSS_PROP_FONT_SIZE));
+    if (value) {
+        value->ref();
+        size = value->getFloatValue(CSSPrimitiveValue::CSS_PX);
+        value->deref();
+    }
+
+    computedStyle->deref();
+    return size;
+}
+
+void ApplyStyleCommand::joinChildTextNodes(NodeImpl *node, const Position &start, const Position &end)
+{
+    if (!node)
+        return;
+
+    Position newStart = start;
+    Position newEnd = end;
+    
+    NodeImpl *child = node->firstChild();
+    while (child) {
+        NodeImpl *next = child->nextSibling();
+        if (child->isTextNode() && next && next->isTextNode()) {
+            TextImpl *childText = static_cast<TextImpl *>(child);
+            TextImpl *nextText = static_cast<TextImpl *>(next);
+            if (next == start.node())
+                newStart = Position(childText, childText->length() + start.offset());
+            if (next == end.node())
+                newEnd = Position(childText, childText->length() + end.offset());
+            DOMString textToMove = nextText->data();
+            insertTextIntoNode(childText, childText->length(), textToMove);
+            removeNode(next);
+            // don't move child node pointer. it may want to merge with more text nodes.
+        }
+        else {
+            child = child->nextSibling();
+        }
+    }
+
+    setEndingSelection(Selection(newStart, newEnd));
+}
+
 //------------------------------------------------------------------------------------------
 // DeleteFromTextNodeCommand
 
@@ -1990,7 +2201,7 @@ void DeleteSelectionCommand::calculateTypingStyleAfterDelete()
     // has completed.
     // FIXME: Improve typing style.
     // See this bug: <rdar://problem/3769899> Implementation of typing style needs improvement
-    if (m_startNode == m_endingPosition.node())
+    if (m_startNode == m_endingPosition.node() && m_startNode->inDocument() && !m_startNode->isBlockFlow())
         document()->part()->setTypingStyle(0);
     else {
         CSSComputedStyleDeclarationImpl endingStyle(m_endingPosition.node());
@@ -4261,4 +4472,13 @@ ElementImpl *createBreakElement(DocumentImpl *document)
     return breakNode;
 }
 
+ElementImpl *createStyleSpanElement(DocumentImpl *document)
+{
+    int exceptionCode = 0;
+    ElementImpl *styleElement = document->createHTMLElement("SPAN", exceptionCode);
+    ASSERT(exceptionCode == 0);
+    styleElement->setAttribute(ATTR_CLASS, styleSpanClassString());
+    return styleElement;
+}
+
 } // namespace khtml
index f79b42d338aac44e2c147b81f194544aef76dbc5..b1a5575bf3736deec47348cc25ec98f3820928d7 100644 (file)
@@ -274,13 +274,16 @@ private:
 
     // style-application helpers
     void applyBlockStyle(DOM::CSSMutableStyleDeclarationImpl *);
+    void applyRelativeFontStyleChange(DOM::CSSMutableStyleDeclarationImpl *);
     void applyInlineStyle(DOM::CSSMutableStyleDeclarationImpl *);
     void addBlockStyleIfNeeded(DOM::CSSMutableStyleDeclarationImpl *, DOM::NodeImpl *);
     void addInlineStyleIfNeeded(DOM::CSSMutableStyleDeclarationImpl *, DOM::NodeImpl *start, DOM::NodeImpl *end);
     bool splitTextAtStartIfNeeded(const DOM::Position &start, const DOM::Position &end);
-    DOM::NodeImpl *splitTextAtEndIfNeeded(const DOM::Position &start, const DOM::Position &end);
+    bool splitTextAtEndIfNeeded(const DOM::Position &start, const DOM::Position &end);
     void surroundNodeRangeWithElement(DOM::NodeImpl *start, DOM::NodeImpl *end, DOM::ElementImpl *element);
     DOM::Position positionInsertionPoint(DOM::Position);
+    float computedFontSize(const DOM::NodeImpl *);
+    void joinChildTextNodes(DOM::NodeImpl *, const DOM::Position &start, const DOM::Position &end);
     
     DOM::CSSMutableStyleDeclarationImpl *m_style;
     EditAction m_editingAction;
@@ -792,6 +795,7 @@ private:
 DOM::ElementImpl *createDefaultParagraphElement(DOM::DocumentImpl *document);
 DOM::ElementImpl *createBlockPlaceholderElement(DOM::DocumentImpl *document);
 DOM::ElementImpl *createBreakElement(DOM::DocumentImpl *document);
+DOM::ElementImpl *createStyleSpanElement(DOM::DocumentImpl *document);
 
 //------------------------------------------------------------------------------------------
 
index 359cd16272cd5f08aabf9eed47bbf2e1e8d3a14b..a5998ef7fce5ae0dfb9dfa8dce6f09d76f9a9725 100644 (file)
@@ -224,6 +224,11 @@ bool execFontSize(KHTMLPart *part, bool userInterface, const DOMString &value)
     return execStyleChange(part, CSS_PROP_FONT_SIZE, value);
 }
 
+bool execFontSizeDelta(KHTMLPart *part, bool userInterface, const DOMString &value)
+{
+    return execStyleChange(part, CSS_PROP__KHTML_FONT_SIZE_DELTA, value);
+}
+
 bool execForeColor(KHTMLPart *part, bool userInterface, const DOMString &value)
 {
     return execStyleChange(part, CSS_PROP_COLOR, value);
@@ -449,6 +454,11 @@ DOMString valueFontSize(KHTMLPart *part)
     return valueStyle(part, CSS_PROP_FONT_SIZE);
 }
 
+DOMString valueFontSizeDelta(KHTMLPart *part)
+{
+    return valueStyle(part, CSS_PROP__KHTML_FONT_SIZE_DELTA);
+}
+
 DOMString valueForeColor(KHTMLPart *part)
 {
     return valueStyle(part, CSS_PROP_COLOR);
@@ -469,6 +479,7 @@ QDict<CommandImp> createCommandDictionary()
         { "Delete", { execDelete, enabledAnySelection, stateNone, valueNull } },
         { "FontName", { execFontName, enabledAnySelection, stateNone, valueFontName } },
         { "FontSize", { execFontSize, enabledAnySelection, stateNone, valueFontSize } },
+        { "FontSizeDelta", { execFontSizeDelta, enabledAnySelection, stateNone, valueFontSizeDelta } },
         { "ForeColor", { execForeColor, enabledAnySelection, stateNone, valueForeColor } },
         { "Indent", { execIndent, enabledAnySelection, stateNone, valueNull } },
         { "InsertLineBreak", { execInsertLineBreak, enabledAnySelection, stateNone, valueNull } },
index 7325b82ee09e00a9fa19dbccff25a0110aad647b..62b11923d39336f9ca2ec5f4635dfa23df70a930 100644 (file)
@@ -1827,6 +1827,16 @@ void removeWrapperForRGB(QRgb value)
     [self setProperty:@"font-size-adjust" :fontSizeAdjust :@""];
 }
 
+- (NSString *)_fontSizeDelta
+{
+    return [self getPropertyValue:@"-khtml-font-size-delta"];
+}
+
+- (void)_setFontSizeDelta:(NSString *)fontSizeDelta
+{
+    [self setProperty:@"-khtml-font-size-delta" :fontSizeDelta :@""];
+}
+
 - (NSString *)fontStretch
 {
     return [self getPropertyValue:@"font-stretch"];
index 3db2463ac71863ccbd10495a805e5b4024c0e9a7..863653540a8b4528556259b8599c26ac9bd45471 100644 (file)
@@ -38,3 +38,8 @@
 @interface DOMElement (WebPrivate)
 - (NSFont *)_font;
 @end
+
+@interface DOMCSSStyleDeclaration (WebPrivate)
+- (NSString *)_fontSizeDelta;
+- (void)_setFontSizeDelta:(NSString *)fontSizeDelta;
+@end