summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-values/viewport-units-css2-001.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/css/css-values/viewport-units-css2-001.html')
-rw-r--r--testing/web-platform/tests/css/css-values/viewport-units-css2-001.html234
1 files changed, 234 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/css-values/viewport-units-css2-001.html b/testing/web-platform/tests/css/css-values/viewport-units-css2-001.html
new file mode 100644
index 0000000000..c51237dd8a
--- /dev/null
+++ b/testing/web-platform/tests/css/css-values/viewport-units-css2-001.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Values and Units Test: Checks viewport units against CSS 2.1 properties and the CSSOM</title>
+ <meta charset="UTF-8">
+ <meta name="assert" content="Testing what happens when one applies and rereads viewport unit lengths to CSS 2.1 properties that accept length values" />
+ <link rel="author" title="Christian Schaefer" href="mailto:schaepp@gmx.de">
+ <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <style>
+ #div {
+ position: relative;
+ width: 50vw;
+ height: 10vw;
+ background: green;
+ border: 0 green solid;
+ font-size: 4vw;
+ }
+
+ #table td {
+ border: 1px solid green;
+ }
+ </style>
+</head>
+<body>
+ <div id="log"></div>
+
+ <p>
+ Checks viewport units. Also re-check with zoom in/out.
+ </p>
+
+ <div id="div">
+ Test the Web Forward!
+ </div>
+
+ <table id="table">
+ <tbody>
+ <tr>
+ <td id="td">Test</td>
+ <td>T</td>
+ <td>W</td>
+ <td>F</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <script>
+
+ /* Boilerplate code */
+
+ var camelize = function (str) {
+ return str.replace(/\-(\w)/g, function(str, letter){
+ return letter.toUpperCase();
+ });
+ };
+
+ var retrieveComputedStyle = function(element,property){
+ var result =
+ document
+ .defaultView
+ .getComputedStyle(element,null)
+ .getPropertyValue(property);
+
+ // If there are multiple values, cut down to the first
+ result = result.split(' ')[0];
+
+ if(window.console) console.log('Retrieving ' + property + ' property. Result: ' + result);
+
+ return result;
+ }
+
+ var testit = function(element,vunit,property,expectedResult){
+
+ element.style[camelize(property)] = '0px';
+ element.style[camelize(property)] = lengthAmount + vunit;
+
+ if(window.console) console.log(element.nodeName.toLowerCase() + '.style.' + camelize(property) + ' = ' + lengthAmount + vunit);
+
+ var result = retrieveComputedStyle(element,property);
+
+ // Test against WebKit's getComputedStyle bug, where it does not return absolute values
+ // As required here: http://www.w3.org/TR/1998/REC-CSS2-19980512/cascade.html#computed-value
+ // If it returns a pixel value, but this value is 0px then it is considered a fail, too.
+ var px_result = result.search(/^[-\d\.]+px$/) !== -1 && result !== '0px' ? 'non-zero px-based value' : result;
+
+ // If browser returns pixel value, we compare against our expected pixel value
+ if(px_result === 'non-zero px-based value'){
+ test(function(){
+ assert_equals(Math.round(parseFloat(result.replace(/[^-\d\.]+/g,''))),expectedResult);
+ },vunit + ' length applied to ' + property);
+ }
+ // If not, we compare against the value we set initially
+ else {
+ test(function(){
+ assert_equals(result,lengthAmount + vunit);
+ },vunit + ' length applied to ' + property);
+ }
+
+ // Does the browser have a bug in getComputedStyle or not?
+ test(function(){
+ assert_equals(px_result,'non-zero px-based value');
+ },vunit + ' length applied to ' + property + ': getComputedStyle returns a non-zero px-based value');
+
+ element.style[camelize(property)] = '';
+ }
+
+ var lengthAmount = 10;
+ var layoutViewportWidth = document.documentElement.clientWidth;
+ var layoutViewportHeight = document.documentElement.clientHeight;
+
+ var viewportUnits = [
+ {
+ ident: 'vw',
+ expectedResult: Math.round(layoutViewportWidth * (lengthAmount / 100))
+ }
+ ,{
+ ident: 'vh',
+ expectedResult: Math.round(layoutViewportHeight * (lengthAmount / 100))
+ }
+ ,{
+ ident: 'vmin',
+ expectedResult: layoutViewportWidth < layoutViewportHeight ? Math.round(layoutViewportWidth * (lengthAmount / 100)) : Math.round(layoutViewportHeight * (lengthAmount / 100))
+ }
+ ,{
+ ident: 'vmax',
+ expectedResult: layoutViewportWidth > layoutViewportHeight ? Math.round(layoutViewportWidth * (lengthAmount / 100)) : Math.round(layoutViewportHeight * (lengthAmount / 100))
+ }
+ ]
+
+ // List of length accepting properties and which element they map to
+ // http://www.w3.org/TR/CSS21/propidx.html
+ var lengthAcceptingProperties = [
+ {
+ name: 'width',
+ element: 'div'
+ }
+ ,{
+ name: 'height',
+ element: 'div'
+ }
+ ,{
+ name: 'min-width',
+ element: 'div'
+ }
+ ,{
+ name: 'min-height',
+ element: 'div'
+ }
+ ,{
+ name: 'max-width',
+ element: 'div'
+ }
+ ,{
+ name: 'max-height',
+ element: 'div'
+ }
+ ,{
+ name: 'margin-top',
+ element: 'div'
+ }
+ ,{
+ name: 'padding-top',
+ element: 'div'
+ }
+ ,{
+ name: 'border-top-width',
+ element: 'div'
+ }
+ ,{
+ name: 'font-size',
+ element: 'div'
+ }
+ ,{
+ name: 'line-height',
+ element: 'div'
+ }
+ ,{
+ name: 'border-spacing',
+ element: 'table'
+ }
+ ,{
+ name: 'top',
+ element: 'div'
+ }
+ ,{
+ name: 'right',
+ element: 'div'
+ }
+ ,{
+ name: 'bottom',
+ element: 'div'
+ }
+ ,{
+ name: 'left',
+ element: 'div'
+ }
+ ,{
+ name: 'letter-spacing',
+ element: 'div'
+ }
+ ,{
+ name: 'text-indent',
+ element: 'div'
+ }
+ ,{
+ name: 'vertical-align',
+ element: 'td'
+ }
+ ,{
+ name: 'word-spacing',
+ element: 'div'
+ }
+ ];
+
+ var div = document.getElementById('div');
+ var table = document.getElementById('table');
+ var td = document.getElementById('td');
+
+ for(unitEntry in viewportUnits){
+ for(propertyEntry in lengthAcceptingProperties){
+
+ var vunit = viewportUnits[unitEntry].ident;
+ var expectedResult = viewportUnits[unitEntry].expectedResult;
+ var property = lengthAcceptingProperties[propertyEntry].name;
+ var element = window[lengthAcceptingProperties[propertyEntry].element];
+
+ testit(element,vunit,property,expectedResult);
+ }
+ }
+
+ </script>
+</body>
+</html>