1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5var embedder = {}; 6 7// TODO(lfg) Move these functions to a common js. 8window.runTest = function(testName) { 9 if (!embedder.test.testList[testName]) { 10 window.console.warn('Incorrect testName: ' + testName); 11 embedder.test.fail(); 12 return; 13 } 14 15 // Run the test. 16 embedder.test.testList[testName](); 17}; 18 19embedder.test = {}; 20 21embedder.test.assertEq = function(a, b) { 22 if (a != b) { 23 window.console.warn('assertion failed: ' + a + ' != ' + b); 24 embedder.test.fail(); 25 } 26}; 27 28embedder.test.assertFalse = function(condition) { 29 if (condition) { 30 window.console.warn('assertion failed: false != ' + condition); 31 embedder.test.fail(); 32 } 33}; 34 35embedder.test.assertTrue = function(condition) { 36 if (!condition) { 37 window.console.warn('assertion failed: true != ' + condition); 38 embedder.test.fail(); 39 } 40}; 41 42embedder.test.fail = function() { 43 chrome.test.sendMessage('TEST_FAILED'); 44}; 45 46embedder.test.succeed = function() { 47 chrome.test.sendMessage('TEST_PASSED'); 48}; 49 50 51// Tests begin. 52 53// This test verifies that the allowtransparency property cannot be changed 54// once set. The attribute can only be deleted. 55function testAllowTransparencyAttribute() { 56 var webview = document.createElement('webview'); 57 webview.src = 'data:text/html,webview test'; 58 webview.allowtransparency = true; 59 60 webview.addEventListener('loadstop', function(e) { 61 embedder.test.assertTrue(webview.hasAttribute('allowtransparency')); 62 webview.allowtransparency = false; 63 embedder.test.assertTrue(webview.allowtransparency); 64 embedder.test.assertTrue(webview.hasAttribute('allowtransparency')); 65 webview.removeAttribute('allowtransparency'); 66 embedder.test.assertFalse(webview.allowtransparency); 67 embedder.test.succeed(); 68 }); 69 70 document.body.appendChild(webview); 71} 72 73function testAPIMethodExistence() { 74 var apiMethodsToCheck = [ 75 'back', 76 'find', 77 'forward', 78 'canGoBack', 79 'canGoForward', 80 'clearData', 81 'getProcessId', 82 'getZoom', 83 'go', 84 'print', 85 'reload', 86 'setZoom', 87 'stop', 88 'stopFinding', 89 'terminate', 90 'executeScript', 91 'insertCSS', 92 'getUserAgent', 93 'isUserAgentOverridden', 94 'setUserAgentOverride' 95 ]; 96 var webview = document.createElement('webview'); 97 webview.setAttribute('partition', arguments.callee.name); 98 webview.addEventListener('loadstop', function(e) { 99 for (var i = 0; i < apiMethodsToCheck.length; ++i) { 100 embedder.test.assertEq('function', 101 typeof webview[apiMethodsToCheck[i]]); 102 } 103 104 // Check contentWindow. 105 embedder.test.assertEq('object', typeof webview.contentWindow); 106 embedder.test.assertEq('function', 107 typeof webview.contentWindow.postMessage); 108 embedder.test.succeed(); 109 }); 110 webview.setAttribute('src', 'data:text/html,webview check api'); 111 document.body.appendChild(webview); 112} 113 114// Makes sure 'sizechanged' event is fired only if autosize attribute is 115// specified. 116// After loading <webview> without autosize attribute and a size, say size1, 117// we set autosize attribute and new min size with size2. We would get (only 118// one) sizechanged event with size1 as old size and size2 as new size. 119function testAutosizeAfterNavigation() { 120 var webview = document.createElement('webview'); 121 122 var step = 1; 123 var sizeChangeHandler = function(e) { 124 switch (step) { 125 case 1: 126 // This would be triggered after we set autosize attribute. 127 embedder.test.assertEq(50, e.oldWidth); 128 embedder.test.assertEq(100, e.oldHeight); 129 embedder.test.assertTrue(e.newWidth >= 60 && e.newWidth <= 70); 130 embedder.test.assertTrue(e.newHeight >= 110 && e.newHeight <= 120); 131 132 // Remove autosize attribute and expect webview to return to its 133 // original size. 134 webview.removeAttribute('autosize'); 135 break; 136 case 2: 137 // Expect 50x100. 138 embedder.test.assertEq(50, e.newWidth); 139 embedder.test.assertEq(100, e.newHeight); 140 141 embedder.test.succeed(); 142 break; 143 default: 144 window.console.log('Unexpected sizechanged event, step = ' + step); 145 embedder.test.fail(); 146 break; 147 } 148 149 ++step; 150 }; 151 152 webview.addEventListener('sizechanged', sizeChangeHandler); 153 154 webview.addEventListener('loadstop', function(e) { 155 webview.setAttribute('autosize', true); 156 webview.setAttribute('minwidth', 60); 157 webview.setAttribute('maxwidth', 70); 158 webview.setAttribute('minheight', 110); 159 webview.setAttribute('maxheight', 120); 160 }); 161 162 webview.style.width = '50px'; 163 webview.style.height = '100px'; 164 webview.setAttribute('src', 'data:text/html,webview test sizechanged event'); 165 document.body.appendChild(webview); 166} 167 168// This test verifies that if a browser plugin is in autosize mode before 169// navigation then the guest starts auto-sized. 170function testAutosizeBeforeNavigation() { 171 var webview = document.createElement('webview'); 172 173 webview.setAttribute('autosize', 'true'); 174 webview.setAttribute('minwidth', 200); 175 webview.setAttribute('maxwidth', 210); 176 webview.setAttribute('minheight', 100); 177 webview.setAttribute('maxheight', 110); 178 179 webview.addEventListener('sizechanged', function(e) { 180 embedder.test.assertTrue(e.newWidth >= 200 && e.newWidth <= 210); 181 embedder.test.assertTrue(e.newHeight >= 100 && e.newHeight <= 110); 182 embedder.test.succeed(); 183 }); 184 185 webview.setAttribute('src', 'data:text/html,webview test sizechanged event'); 186 document.body.appendChild(webview); 187} 188 189// This test verifies that a lengthy page with autosize enabled will report 190// the correct height in the sizechanged event. 191function testAutosizeHeight() { 192 var webview = document.createElement('webview'); 193 194 webview.autosize = true; 195 webview.minwidth = 200; 196 webview.maxwidth = 210; 197 webview.minheight = 40; 198 webview.maxheight = 200; 199 200 var step = 1; 201 webview.addEventListener('sizechanged', function(e) { 202 switch (step) { 203 case 1: 204 embedder.test.assertEq(200, e.newHeight); 205 // Change the maxheight to verify that we see the change. 206 webview.maxheight = 50; 207 break; 208 case 2: 209 embedder.test.assertEq(200, e.oldHeight); 210 embedder.test.assertEq(50, e.newHeight); 211 embedder.test.succeed(); 212 break; 213 default: 214 window.console.log('Unexpected sizechanged event, step = ' + step); 215 embedder.test.fail(); 216 break; 217 } 218 ++step; 219 }); 220 221 webview.src = 'data:text/html,' + 222 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' + 223 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' + 224 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' + 225 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' + 226 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>'; 227 document.body.appendChild(webview); 228} 229 230// This test verifies that all autosize attributes can be removed 231// without crashing the plugin, or throwing errors. 232function testAutosizeRemoveAttributes() { 233 var webview = document.createElement('webview'); 234 235 var step = 1; 236 var sizeChangeHandler = function(e) { 237 switch (step) { 238 case 1: 239 // This is the sizechanged event for autosize. 240 241 // Remove attributes. 242 webview.removeAttribute('minwidth'); 243 webview.removeAttribute('maxwidth'); 244 webview.removeAttribute('minheight'); 245 webview.removeAttribute('maxheight'); 246 webview.removeAttribute('autosize'); 247 248 // We'd get one more sizechanged event after we turn off 249 // autosize. 250 webview.style.width = '500px'; 251 webview.style.height = '500px'; 252 break; 253 case 2: 254 embedder.test.succeed(); 255 break; 256 } 257 258 ++step; 259 }; 260 261 webview.addEventListener('loadstop', function(e) { 262 webview.minwidth = 300; 263 webview.maxwidth = 700; 264 webview.minheight = 600; 265 webview.maxheight = 400; 266 webview.autosize = true; 267 }); 268 269 webview.addEventListener('sizechanged', sizeChangeHandler); 270 271 webview.style.width = '640px'; 272 webview.style.height = '480px'; 273 webview.setAttribute('src', 'data:text/html,webview check autosize'); 274 document.body.appendChild(webview); 275} 276 277// This test verifies that autosize works when some of the parameters are unset. 278function testAutosizeWithPartialAttributes() { 279 window.console.log('testAutosizeWithPartialAttributes'); 280 var webview = document.createElement('webview'); 281 282 var step = 1; 283 var sizeChangeHandler = function(e) { 284 window.console.log('sizeChangeHandler, new: ' + 285 e.newWidth + ' X ' + e.newHeight); 286 switch (step) { 287 case 1: 288 // Expect 300x200. 289 embedder.test.assertEq(300, e.newWidth); 290 embedder.test.assertEq(200, e.newHeight); 291 292 // Change the min size to cause a relayout. 293 webview.minwidth = 500; 294 break; 295 case 2: 296 embedder.test.assertTrue(e.newWidth >= webview.minwidth); 297 embedder.test.assertTrue(e.newWidth <= webview.maxwidth); 298 299 // Tests when minwidth > maxwidth, minwidth = maxwidth. 300 // i.e. minwidth is essentially 700. 301 webview.minwidth = 800; 302 break; 303 case 3: 304 // Expect 700X? 305 embedder.test.assertEq(700, e.newWidth); 306 embedder.test.assertTrue(e.newHeight >= 200); 307 embedder.test.assertTrue(e.newHeight <= 600); 308 309 embedder.test.succeed(); 310 break; 311 default: 312 window.console.log('Unexpected sizechanged event, step = ' + step); 313 embedder.test.fail(); 314 break; 315 } 316 317 ++step; 318 }; 319 320 webview.addEventListener('sizechanged', sizeChangeHandler); 321 322 webview.addEventListener('loadstop', function(e) { 323 webview.minwidth = 300; 324 webview.maxwidth = 700; 325 webview.minheight = 200; 326 webview.maxheight = 600; 327 webview.autosize = true; 328 }); 329 330 webview.style.width = '640px'; 331 webview.style.height = '480px'; 332 webview.setAttribute('src', 'data:text/html,webview check autosize'); 333 document.body.appendChild(webview); 334} 335 336 337// Tests end. 338 339embedder.test.testList = { 340 'testAllowTransparencyAttribute': testAllowTransparencyAttribute, 341 'testAPIMethodExistence': testAPIMethodExistence, 342 'testAutosizeAfterNavigation': testAutosizeAfterNavigation, 343 'testAutosizeBeforeNavigation': testAutosizeBeforeNavigation, 344 'testAutosizeHeight': testAutosizeHeight, 345 'testAutosizeRemoveAttributes': testAutosizeRemoveAttributes, 346 'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes 347}; 348 349onload = function() { 350 chrome.test.sendMessage('LAUNCHED'); 351}; 352