| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> | |
| 2 <html> | |
| 3 <head> | |
| 4 <script src="../../resources/js-test.js"></script> | |
| 5 </head> | |
| 6 <body> | |
| 7 <p id="description"></p> | |
| 8 <div id="console"></div> | |
| 9 <script> | |
| 10 description("This test checks that textareas have the right metrics. These numbe
rs match IE7 except for scrollHeight. For two reasons:<br>" + | |
| 11 "1. scrollHeight is different for elements without enough content to cause scrol
l because IE7 then reports the height of the text inside the " + | |
| 12 "element as the scrollHeight. IE8 reports has scrollHeight == offsetHeight. Geck
o/WebKit have scrollHeight == clientHeight.<br>" + | |
| 13 "2. For the elements with scroll in standards-mode, IE wraps the text differentl
y. It seems to leave 2px less space for the text. We don't " + | |
| 14 "currently mimic this quirk. It's not clear whether we should given that we agre
e with IE7's clientWidth numbers in all these cases."); | |
| 15 | |
| 16 function assertTextareaMetrics(doc, properties, expectedMetrics) { | |
| 17 var textarea = doc.createElement('textarea'); | |
| 18 // Give some consistent CSS for consistent rendering across platforms | |
| 19 // and to help in reasoning when trying to match IE metrics. | |
| 20 var style = 'overflow-y:auto; font-family:Ahem; line-height:20px; height:50p
x; width:50px;'; | |
| 21 var title = ''; | |
| 22 for (property in properties) { | |
| 23 var value = properties[property]; | |
| 24 title += ' ' + property + ': "' + value + '",'; | |
| 25 if (property == 'style') | |
| 26 style += value; | |
| 27 else | |
| 28 textarea[property] = value; | |
| 29 } | |
| 30 textarea.style.cssText = style; | |
| 31 doc.body.appendChild(textarea); | |
| 32 | |
| 33 // Create a more human-readable ID. | |
| 34 var id = title.replace(/[\'\",;\:]/g, ' ').replace(/ +/g, '-'); | |
| 35 id = id == '' ? 'no-styles' : id; | |
| 36 textarea.id = id; | |
| 37 | |
| 38 window[doc.compatMode + 'doc'] = doc; | |
| 39 | |
| 40 function assertMetricsForTextarea() { | |
| 41 if (!title) | |
| 42 title = ' none'; | |
| 43 | |
| 44 debug('Properties =' + title); | |
| 45 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').clientWidth"
, String(expectedMetrics.clientWidth)); | |
| 46 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').clientHeight
", String(expectedMetrics.clientHeight)); | |
| 47 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').offsetWidth"
, String(expectedMetrics.offsetWidth)); | |
| 48 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').offsetHeight
", String(expectedMetrics.offsetHeight)); | |
| 49 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').scrollWidth"
, String(expectedMetrics.scrollWidth)); | |
| 50 shouldBe(doc.compatMode + "doc.getElementById('" + id + "').scrollHeight
", String(expectedMetrics.scrollHeight)); | |
| 51 debug(''); | |
| 52 } | |
| 53 if (document.all) | |
| 54 // Give a timeout so IE has time to figure out it's metrics. | |
| 55 setTimeout(assertMetricsForTextarea, 100); | |
| 56 else | |
| 57 assertMetricsForTextarea(); | |
| 58 } | |
| 59 | |
| 60 var smallHTML = 'A'; | |
| 61 var htmlThatCausesScroll = 'AAAAAAAAA'; | |
| 62 | |
| 63 function testTextareasForDocument(doc, compatMode, | |
| 64 textareaSizes, textareaWithScrollSizes, | |
| 65 textareaWith8pxPaddingSizes, textareaWith8pxPaddingAndScrollbarSizes) { | |
| 66 if (doc.compatMode != compatMode) | |
| 67 testFailed('This doc should be in ' + compatMode + ' mode.'); | |
| 68 | |
| 69 try { | |
| 70 var scrollbarStyle = doc.createElement('style'); | |
| 71 scrollbarStyle.innerText = 'textarea::-webkit-scrollbar{ width:17px }'; | |
| 72 doc.getElementsByTagName('head')[0].appendChild(scrollbarStyle); | |
| 73 } catch (e) { | |
| 74 // IE throws an exception here, but doesn't need the above clause anyway
s. | |
| 75 } | |
| 76 | |
| 77 debug('Testing ' + compatMode + ' document.') | |
| 78 assertTextareaMetrics(doc, {}, textareaSizes); | |
| 79 assertTextareaMetrics(doc, {disabled: true}, textareaSizes); | |
| 80 assertTextareaMetrics(doc, {innerHTML: smallHTML}, textareaSizes); | |
| 81 assertTextareaMetrics(doc, {innerHTML: htmlThatCausesScroll}, textareaWithSc
rollSizes); | |
| 82 assertTextareaMetrics(doc, {innerHTML: smallHTML, disabled: true}, textareaS
izes); | |
| 83 assertTextareaMetrics(doc, {innerHTML: htmlThatCausesScroll, disabled: true}
, textareaWithScrollSizes); | |
| 84 assertTextareaMetrics(doc, {innerHTML: smallHTML, style: 'padding:8px'}, tex
tareaWith8pxPaddingSizes); | |
| 85 assertTextareaMetrics(doc, {innerHTML: htmlThatCausesScroll, style: 'padding
:8px'}, textareaWith8pxPaddingAndScrollbarSizes); | |
| 86 assertTextareaMetrics(doc, {innerHTML: smallHTML, rows: 10}, textareaSizes); | |
| 87 assertTextareaMetrics(doc, {innerHTML: htmlThatCausesScroll, rows: 10}, text
areaWithScrollSizes); | |
| 88 } | |
| 89 | |
| 90 // For textareas with scrollbars have the expected clientWidth be the | |
| 91 // expected offsetWidth - scrollbarPlusBorderWidth. | |
| 92 // default border on textareas is 1px solid. So, the border width is 2. | |
| 93 // And the scrollbarWidth we set to be 17 to match windows so that | |
| 94 // these numbers will be platform independent and match IE. | |
| 95 var scrollbarPlusBorderWidth = 19; | |
| 96 | |
| 97 var textareaSizesQuirks = {clientWidth: 48, | |
| 98 clientHeight: 48, | |
| 99 offsetWidth: 50, | |
| 100 offsetHeight: 50, | |
| 101 scrollWidth: 48, | |
| 102 scrollHeight: 48}; | |
| 103 | |
| 104 var textareaWithScrollSizesQuirks = {clientWidth: 50 - scrollbarPlusBorderWidth, | |
| 105 clientHeight: 48, | |
| 106 offsetWidth: 50, | |
| 107 offsetHeight: 50, | |
| 108 scrollWidth: 50 - scrollbarPlusBorderWidth, | |
| 109 scrollHeight: 104}; | |
| 110 | |
| 111 var textareaWith8pxPaddingSizesQuirks = {clientWidth: 48, | |
| 112 clientHeight: 48, | |
| 113 offsetWidth: 50, | |
| 114 offsetHeight: 50, | |
| 115 scrollWidth: 48, | |
| 116 scrollHeight: 48}; | |
| 117 | |
| 118 var textareaWith8pxPaddingAndScrollbarSizesQuirks = {clientWidth: 50 - scrollbar
PlusBorderWidth, | |
| 119 clientHeight: 48, | |
| 120 offsetWidth: 50, | |
| 121 offsetHeight: 50, | |
| 122 scrollWidth: 50 - scrollbar
PlusBorderWidth, | |
| 123 scrollHeight: 196}; | |
| 124 | |
| 125 testTextareasForDocument(document, 'BackCompat', | |
| 126 textareaSizesQuirks, textareaWithScrollSizesQuirks, | |
| 127 textareaWith8pxPaddingSizesQuirks, textareaWith8pxPaddi
ngAndScrollbarSizesQuirks); | |
| 128 | |
| 129 var standardsIframe = document.createElement('iframe'); | |
| 130 standardsIframe.style.width = '100%'; | |
| 131 document.body.appendChild(standardsIframe); | |
| 132 standardsIframe.contentWindow.document.write('<!DocType html><html><head></head>
<body></body></html>'); | |
| 133 standardsIframe.contentWindow.document.close(); | |
| 134 | |
| 135 var textareaSizesStandards = {clientWidth: 54, | |
| 136 clientHeight: 54, | |
| 137 offsetWidth: 56, | |
| 138 offsetHeight: 56, | |
| 139 scrollWidth: 54, | |
| 140 scrollHeight: 54}; | |
| 141 | |
| 142 var textareaWithScrollSizesStandards = {clientWidth: 56 - scrollbarPlusBorderWid
th, | |
| 143 clientHeight: 54, | |
| 144 offsetWidth: 56, | |
| 145 offsetHeight: 56, | |
| 146 scrollWidth: 56 - scrollbarPlusBorderWid
th, | |
| 147 scrollHeight: 64}; | |
| 148 | |
| 149 var textareaWith8pxPaddingSizesStandards = {clientWidth: 66, | |
| 150 clientHeight: 66, | |
| 151 offsetWidth: 68, | |
| 152 offsetHeight: 68, | |
| 153 scrollWidth: 66, | |
| 154 scrollHeight: 66}; | |
| 155 | |
| 156 var textareaWith8pxPaddingAndScrollbarSizesStandards = {clientWidth: 68 - scroll
barPlusBorderWidth, | |
| 157 clientHeight: 66, | |
| 158 offsetWidth: 68, | |
| 159 offsetHeight: 68, | |
| 160 scrollWidth: 68 - scroll
barPlusBorderWidth, | |
| 161 scrollHeight: 76}; | |
| 162 | |
| 163 testTextareasForDocument(standardsIframe.contentWindow.document, 'CSS1Compat', | |
| 164 textareaSizesStandards, textareaWithScrollSizesStandard
s, | |
| 165 textareaWith8pxPaddingSizesStandards, textareaWith8pxPa
ddingAndScrollbarSizesStandards); | |
| 166 </script> | |
| 167 </body> | |
| 168 </html> | |
| OLD | NEW |