2010-09-09 Dirk Pranke <dpranke@chromium.org>
[WebKit.git] / LayoutTests / editing / execCommand / query-font-size.html
1 <body>
2 <script>
3
4 function addRow(table)
5 {
6     var tableRow = document.createElement("tr");
7     table.appendChild(tableRow);
8     return tableRow;
9 }
10
11 function addCellWithNodeContents(tableRow, contents)
12 {
13     var tableCell = document.createElement("td");
14     tableCell.appendChild(contents);
15     tableRow.appendChild(tableCell);
16     return tableCell;
17 }
18
19 function addCellWithTextContents(tableRow, contents)
20 {
21     return addCellWithNodeContents(tableRow, document.createTextNode(contents));
22 }
23
24 function addHeaderWithTextContents(tableRow, contents)
25 {
26     var tableCell = document.createElement("th");   
27     tableCell.appendChild(document.createTextNode(contents));
28     tableRow.appendChild(tableCell);
29     return tableCell;
30 }
31
32 function setFontSizeOnContent(size)
33 {
34     window.getSelection().selectAllChildren(editableDiv);
35     document.execCommand("FontSize", false, size);
36     return editableDiv.firstChild;
37 }
38
39 function setFontFamilyOnContent(fontFamily)
40 {
41     window.getSelection().selectAllChildren(editableDiv);
42     document.execCommand("FontName", false, fontFamily);
43     return editableDiv.firstChild;
44 }
45
46 function wrapInSpanIfNeeded(shouldBeSpan)
47 {
48     // Sometimes the result of the ExecCommand will not have a wrapping <span>
49     if (!shouldBeSpan.localName || shouldBeSpan.localName.toLowerCase() != "span") {
50         shouldBeSpan = document.createElement("span");
51         shouldBeSpan.appendChild(editableDiv.firstChild);
52         editableDiv.appendChild(shouldBeSpan);
53     }
54     return shouldBeSpan;
55 }
56
57 function reportSizeForSpan(span, comment)
58 {
59     var tableRow = addRow(table);
60     addCellWithTextContents(tableRow, comment);
61     addCellWithTextContents(tableRow, span.parentNode.innerHTML); // sill FF has no outerHTML
62     window.getSelection().selectAllChildren(span.parentNode);
63     addCellWithTextContents(tableRow, "" + document.queryCommandValue("FontSize"));
64 }
65
66 function testExecCommandFontSize(size, fontFamily)
67 {
68     editableDiv.innerHTML = "test";
69     var sizedContent = setFontSizeOnContent(size);
70     sizedContent = wrapInSpanIfNeeded(sizedContent);
71     if (fontFamily)
72         sizedContent = setFontFamilyOnContent(fontFamily);
73     var sizeString = (typeof(size) == "string") ? ("'" + size + "'") : size;
74     reportSizeForSpan(sizedContent, "execCommand('FontSize', " + sizeString + ")");
75 }
76
77 function testManualFontSize(size)
78 {
79     editableDiv.innerHTML = "<span style='font-size: " + size + "'>test</span>";
80     reportSizeForSpan(editableDiv.firstChild, "manual CSS font-size: " + size);
81 }
82
83 if (window.layoutTestController)
84     window.layoutTestController.dumpAsText();
85
86 var editableDiv = document.createElement("div");
87 editableDiv.contentEditable = true;
88 document.body.appendChild(editableDiv);
89
90 var table = document.createElement("table");
91 table.border = "1px";
92 table.width = "100%";
93 document.body.appendChild(table);
94
95 var tableRow = addRow(table);
96 addHeaderWithTextContents(tableRow, "test");
97 addHeaderWithTextContents(tableRow, "html");
98 addHeaderWithTextContents(tableRow, "queryCommandValue result");
99
100 for (var size = -2; size < 8; size++) {
101     testExecCommandFontSize(size);
102 }
103 testExecCommandFontSize("8px");
104 testExecCommandFontSize("2px");
105
106 testManualFontSize("3px");
107 testManualFontSize("0.2em");
108 testManualFontSize("17px");
109 testManualFontSize("31px");
110 testManualFontSize("50px");
111 testManualFontSize("5em");
112 testManualFontSize("10px");
113
114 tableRow = addRow(table);
115 addHeaderWithTextContents(tableRow, "monospace tests to ensure the bug 19161 does not affect queryCommandValue's values");
116
117 for (var size = -2; size < 8; size++) {
118     testExecCommandFontSize(size, 'monospace');
119 }
120
121 document.body.removeChild(editableDiv);
122
123 </script>