| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../../resources/js-test.js"></script> |
| </head> |
| <body> |
| <script> |
| jsTestIsAsync = true; |
| |
| function testCompleted() |
| { |
| var scriptElement = document.createElement("script") |
| scriptElement.src = '../../../resources/js-test-post-async.js' |
| document.body.appendChild(scriptElement); |
| } |
| |
| function computeResolution(resolution, imgResolutionDppx) |
| { |
| if (!resolution) |
| return; |
| var fromImage = /from-image/.test(resolution); |
| var snap = /snap/.test(resolution); |
| var explicit = /(-?\d*(\.\d+)?)(dp(px|i|cm))/.exec(resolution); |
| var value = explicit && explicit[1] * 1; |
| var unit = explicit && explicit[3]; |
| var dppx = 1; |
| if (!unit && !fromImage) |
| return; |
| if (unit && value <= 0) |
| return; |
| if (unit && value) { |
| var cssPxPerIn = 96; |
| var cmPerIn = 2.54; |
| if (unit == 'dppx') |
| dppx = value; |
| else if (unit === 'dpi') |
| dppx = value / cssPxPerIn; |
| else if (unit === 'dpcm') |
| dppx = value / (cssPxPerIn / cmPerIn); |
| else |
| return; |
| } |
| if (fromImage && imgResolutionDppx) |
| dppx = imgResolutionDppx; |
| if (snap) |
| dppx = Math.floor(dppx + 0.01); |
| if (dppx <= 0) |
| dppx = 1; |
| return dppx; |
| } |
| |
| function permute3(rule) { |
| var s = rule.trim().split(' '); |
| if (s.length == 1) |
| return s; |
| if (s.length == 2) |
| return [s.join(' '), [s[1], s[0]].join(' ')]; |
| return [[s[0], s[1], s[2]].join(' '), [s[0], s[2], s[1]].join(' '), |
| [s[1], s[0], s[2]].join(' '), [s[1], s[2], s[0]].join(' '), |
| [s[2], s[0], s[1]].join(' '), [s[2], s[1], s[0]].join(' ')]; |
| } |
| |
| function generateTests(resolutions) { |
| var tests = resolutions.slice(); |
| resolutions.forEach(function(resolution) { |
| tests.push.apply(tests, permute3(resolution + ' from-image')); |
| }); |
| resolutions.forEach(function(resolution) { |
| tests.push.apply(tests, permute3(resolution + ' snap')); |
| }); |
| resolutions.forEach(function(resolution) { |
| tests.push.apply(tests, permute3(resolution + ' from-image snap')); |
| }); |
| return tests; |
| } |
| |
| var imgUrl = '../../images/resources/green.jpg'; |
| var imgWidthPx = 16; |
| var imgHeightPx = 16; |
| var imgResolutionDppx = 0; /* Embedded image resolution data not plumbed yet. */ |
| var dimensions = imgWidthPx + 'x' + imgHeightPx; |
| |
| description('Apply image-resolution property to a fixed image (' + dimensions + ').'); |
| |
| var img = document.createElement('img'); |
| img.src = imgUrl; |
| |
| var resolutions = ['0dppx', '1dppx', '2dppx', '3dppx', '4dppx', |
| '0dpi', '96dpi', '192dpi', '288dpi', '384dpi', |
| '150dpi', '300dpi', '450dpi', '600dpi', |
| '0dpcm', '37.7dpcm', '75.5dpcm', '113.3dpcm', '151.1dpcm', '']; |
| |
| img.onload = function() { |
| generateTests(resolutions).forEach(function(test) { |
| var dppx = computeResolution(test, imgResolutionDppx); |
| img.style.imageResolution = ''; |
| img.style.imageResolution = test; |
| debug('<span class="pass">TEST</span> "' + test + '"'); |
| if (!dppx) { |
| shouldBe('img.style.cssText', '""'); |
| return; |
| } |
| shouldBe('img.style.cssText', '"image-resolution: ' + test + ';"'); |
| var expectedWidth = Math.floor(imgWidthPx / dppx); |
| var expectedHeight = Math.floor(imgHeightPx / dppx); |
| shouldBe('img.offsetWidth', stringify(expectedWidth)); |
| shouldBe('img.offsetHeight', stringify(expectedHeight)); |
| }); |
| document.body.removeChild(img); |
| finishJSTest(); |
| }; |
| |
| document.body.appendChild(img); |
| </script> |
| </body> |
| </html> |