| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 var util = {}; | 5 var util = {}; |
| 6 | 6 |
| 7 // Creates a <webview> tag in document.body and returns the reference to it. | 7 // Creates a <webview> tag in document.body and returns the reference to it. |
| 8 // It also sets a dummy src. The dummy src is significant because this makes | 8 // It also sets a dummy src. The dummy src is significant because this makes |
| 9 // sure that the <object> shim is created (asynchronously at this point) for the | 9 // sure that the <object> shim is created (asynchronously at this point) for the |
| 10 // <webview> tag. This makes the <webview> tag ready for add/removeEventListener | 10 // <webview> tag. This makes the <webview> tag ready for add/removeEventListener |
| 11 // calls. | 11 // calls. |
| 12 util.createWebViewTagInDOM = function() { | 12 util.createWebViewTagInDOM = function(partitionName) { |
| 13 var webview = document.createElement('webview'); | 13 var webview = document.createElement('webview'); |
| 14 webview.style.width = '300px'; | 14 webview.style.width = '300px'; |
| 15 webview.style.height = '200px'; | 15 webview.style.height = '200px'; |
| 16 document.body.appendChild(webview); | |
| 17 var urlDummy = 'data:text/html,<body>Initial dummy guest</body>'; | 16 var urlDummy = 'data:text/html,<body>Initial dummy guest</body>'; |
| 18 webview.setAttribute('src', urlDummy); | 17 webview.setAttribute('src', urlDummy); |
| 18 webview.setAttribute('partition', partitionName); |
| 19 document.body.appendChild(webview); |
| 19 return webview; | 20 return webview; |
| 20 }; | 21 }; |
| 21 | 22 |
| 22 onload = function() { | 23 onload = function() { |
| 23 chrome.test.runTests([ | 24 chrome.test.runTests([ |
| 24 function webView() { | 25 function webView() { |
| 25 var webview = document.querySelector('webview'); | 26 var webview = document.querySelector('webview'); |
| 26 // Since we can't currently inspect the page loaded inside the <webview>, | 27 // Since we can't currently inspect the page loaded inside the <webview>, |
| 27 // the only way we can check that the shim is working is by changing the | 28 // the only way we can check that the shim is working is by changing the |
| 28 // size and seeing if the shim updates the size of the DOM. | 29 // size and seeing if the shim updates the size of the DOM. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 'canGoBack', | 63 'canGoBack', |
| 63 'canGoForward', | 64 'canGoForward', |
| 64 'forward', | 65 'forward', |
| 65 'getProcessId', | 66 'getProcessId', |
| 66 'go', | 67 'go', |
| 67 'reload', | 68 'reload', |
| 68 'stop', | 69 'stop', |
| 69 'terminate' | 70 'terminate' |
| 70 ]; | 71 ]; |
| 71 var webview = document.createElement('webview'); | 72 var webview = document.createElement('webview'); |
| 73 webview.setAttribute('partition', arguments.callee.name); |
| 72 webview.addEventListener('loadstop', function(e) { | 74 webview.addEventListener('loadstop', function(e) { |
| 73 for (var i = 0; i < apiMethodsToCheck.length; ++i) { | 75 for (var i = 0; i < apiMethodsToCheck.length; ++i) { |
| 74 chrome.test.assertEq('function', | 76 chrome.test.assertEq('function', |
| 75 typeof webview[apiMethodsToCheck[i]]); | 77 typeof webview[apiMethodsToCheck[i]]); |
| 76 } | 78 } |
| 77 | 79 |
| 78 // Check contentWindow. | 80 // Check contentWindow. |
| 79 chrome.test.assertEq('object', typeof webview.contentWindow); | 81 chrome.test.assertEq('object', typeof webview.contentWindow); |
| 80 chrome.test.assertEq('function', | 82 chrome.test.assertEq('function', |
| 81 typeof webview.contentWindow.postMessage); | 83 typeof webview.contentWindow.postMessage); |
| 82 | |
| 83 chrome.test.succeed(); | 84 chrome.test.succeed(); |
| 84 }); | 85 }); |
| 85 webview.setAttribute('src', 'data:text/html,webview check api'); | 86 webview.setAttribute('src', 'data:text/html,webview check api'); |
| 86 document.body.appendChild(webview); | 87 document.body.appendChild(webview); |
| 87 }, | 88 }, |
| 88 | 89 |
| 89 function webViewEventName() { | 90 function webViewEventName() { |
| 90 var webview = document.createElement('webview'); | 91 var webview = document.createElement('webview'); |
| 91 webview.setAttribute('src', 'data:text/html,webview check api'); | 92 webview.setAttribute('partition', arguments.callee.name); |
| 92 document.body.appendChild(webview); | |
| 93 | 93 |
| 94 webview.addEventListener('loadstart', function(evt) { | 94 webview.addEventListener('loadstart', function(evt) { |
| 95 chrome.test.assertEq('loadstart', evt.type); | 95 chrome.test.assertEq('loadstart', evt.type); |
| 96 }); | 96 }); |
| 97 | 97 |
| 98 webview.addEventListener('loadstop', function(evt) { | 98 webview.addEventListener('loadstop', function(evt) { |
| 99 chrome.test.assertEq('loadstop', evt.type); | 99 chrome.test.assertEq('loadstop', evt.type); |
| 100 webview.terminate(); | 100 webview.terminate(); |
| 101 }); | 101 }); |
| 102 | 102 |
| 103 webview.addEventListener('exit', function(evt) { | 103 webview.addEventListener('exit', function(evt) { |
| 104 chrome.test.assertEq('exit', evt.type); | 104 chrome.test.assertEq('exit', evt.type); |
| 105 chrome.test.succeed(); | 105 chrome.test.succeed(); |
| 106 }); | 106 }); |
| 107 | 107 |
| 108 webview.setAttribute('src', 'data:text/html,trigger navigation'); | 108 webview.setAttribute('src', 'data:text/html,trigger navigation'); |
| 109 document.body.appendChild(webview); |
| 109 }, | 110 }, |
| 110 | 111 |
| 111 // This test registers two listeners on an event (loadcommit) and removes | 112 // This test registers two listeners on an event (loadcommit) and removes |
| 112 // the <webview> tag when the first listener fires. | 113 // the <webview> tag when the first listener fires. |
| 113 // Current expected behavior is that the second event listener will still | 114 // Current expected behavior is that the second event listener will still |
| 114 // fire without crashing. | 115 // fire without crashing. |
| 115 function webviewDestroyOnEventListener() { | 116 function webviewDestroyOnEventListener() { |
| 116 var webview = util.createWebViewTagInDOM(); | 117 var webview = util.createWebViewTagInDOM(arguments.callee.name); |
| 117 var url = 'data:text/html,<body>Destroy test</body>'; | 118 var url = 'data:text/html,<body>Destroy test</body>'; |
| 118 | 119 |
| 119 var loadCommitCount = 0; | 120 var loadCommitCount = 0; |
| 120 function loadCommitCommon(e) { | 121 function loadCommitCommon(e) { |
| 121 chrome.test.assertEq('loadcommit', e.type); | 122 chrome.test.assertEq('loadcommit', e.type); |
| 122 if (url != e.url) | 123 if (url != e.url) |
| 123 return; | 124 return; |
| 124 ++loadCommitCount; | 125 ++loadCommitCount; |
| 125 if (loadCommitCount == 1) { | 126 if (loadCommitCount == 1) { |
| 126 webview.parentNode.removeChild(webview); | |
| 127 webview = null; | |
| 128 setTimeout(function() { | 127 setTimeout(function() { |
| 129 chrome.test.succeed(); | 128 chrome.test.succeed(); |
| 130 }, 0); | 129 }, 0); |
| 131 } else if (loadCommitCount > 2) { | 130 } else if (loadCommitCount > 2) { |
| 132 chrome.test.fail(); | 131 chrome.test.fail(); |
| 133 } | 132 } |
| 134 }; | 133 }; |
| 135 | 134 |
| 136 // The test starts from here, by setting the src to |url|. | 135 // The test starts from here, by setting the src to |url|. |
| 137 webview.addEventListener('loadcommit', function(e) { | 136 webview.addEventListener('loadcommit', function(e) { |
| 137 webview.parentNode.removeChild(webview); |
| 138 loadCommitCommon(e); | 138 loadCommitCommon(e); |
| 139 }); | 139 }); |
| 140 webview.addEventListener('loadcommit', function(e) { | 140 webview.addEventListener('loadcommit', function(e) { |
| 141 loadCommitCommon(e); | 141 loadCommitCommon(e); |
| 142 }); | 142 }); |
| 143 webview.setAttribute('src', url); | 143 webview.setAttribute('src', url); |
| 144 }, | 144 }, |
| 145 | 145 |
| 146 // This test registers two event listeners on a same event (loadcommit). | 146 // This test registers two event listeners on a same event (loadcommit). |
| 147 // Each of the listener tries to change some properties on the event param, | 147 // Each of the listener tries to change some properties on the event param, |
| 148 // which should not be possible. | 148 // which should not be possible. |
| 149 function cannotMutateEventName() { | 149 function cannotMutateEventName() { |
| 150 var webview = util.createWebViewTagInDOM(); | 150 var webview = util.createWebViewTagInDOM(arguments.callee.name); |
| 151 var url = 'data:text/html,<body>Two</body>'; | 151 var url = 'data:text/html,<body>Two</body>'; |
| 152 | 152 |
| 153 var loadCommitACalled = false; | 153 var loadCommitACalled = false; |
| 154 var loadCommitBCalled = false; | 154 var loadCommitBCalled = false; |
| 155 | 155 |
| 156 var maybeFinishTest = function(e) { | 156 var maybeFinishTest = function(e) { |
| 157 if (loadCommitACalled && loadCommitBCalled) { | 157 if (loadCommitACalled && loadCommitBCalled) { |
| 158 chrome.test.assertEq('loadcommit', e.type); | 158 chrome.test.assertEq('loadcommit', e.type); |
| 159 chrome.test.succeed(); | 159 chrome.test.succeed(); |
| 160 } | 160 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 188 // on the <webview> tag. | 188 // on the <webview> tag. |
| 189 webview.addEventListener('loadcommit', onLoadCommitA); | 189 webview.addEventListener('loadcommit', onLoadCommitA); |
| 190 webview.addEventListener('loadcommit', onLoadCommitB); | 190 webview.addEventListener('loadcommit', onLoadCommitB); |
| 191 webview.setAttribute('src', url); | 191 webview.setAttribute('src', url); |
| 192 }, | 192 }, |
| 193 | 193 |
| 194 // This test verifies that setting the partition attribute after the src has | 194 // This test verifies that setting the partition attribute after the src has |
| 195 // been set raises an exception. | 195 // been set raises an exception. |
| 196 function partitionRaisesException() { | 196 function partitionRaisesException() { |
| 197 var webview = document.createElement('webview'); | 197 var webview = document.createElement('webview'); |
| 198 webview.setAttribute('partition', arguments.callee.name); |
| 198 webview.setAttribute('src', 'data:text/html,trigger navigation'); | 199 webview.setAttribute('src', 'data:text/html,trigger navigation'); |
| 199 document.body.appendChild(webview); | 200 document.body.appendChild(webview); |
| 200 setTimeout(function() { | 201 setTimeout(function() { |
| 201 try { | 202 try { |
| 202 webview.partition = 'illegal'; | 203 webview.partition = 'illegal'; |
| 203 chrome.test.fail(); | 204 chrome.test.fail(); |
| 204 } catch (e) { | 205 } catch (e) { |
| 205 chrome.test.succeed(); | 206 chrome.test.succeed(); |
| 206 } | 207 } |
| 207 }, 0); | 208 }, 0); |
| 208 }, | 209 }, |
| 209 | 210 |
| 210 function webViewExecuteScript() { | 211 function webViewExecuteScript() { |
| 211 var webview = document.createElement('webview'); | 212 var webview = document.createElement('webview'); |
| 213 webview.setAttribute('partition', arguments.callee.name); |
| 212 webview.addEventListener('loadstop', function() { | 214 webview.addEventListener('loadstop', function() { |
| 213 webview.executeScript( | 215 webview.executeScript( |
| 214 {code:'document.body.style.backgroundColor = "red";'}, | 216 {code:'document.body.style.backgroundColor = "red";'}, |
| 215 function(results) { | 217 function(results) { |
| 216 chrome.test.assertEq(1, results.length); | 218 chrome.test.assertEq(1, results.length); |
| 217 chrome.test.assertEq('red', results[0]); | 219 chrome.test.assertEq('red', results[0]); |
| 218 chrome.test.succeed(); | 220 chrome.test.succeed(); |
| 219 }); | 221 }); |
| 220 }); | 222 }); |
| 221 webview.setAttribute('src', 'data:text/html,trigger navigation'); | 223 webview.setAttribute('src', 'data:text/html,trigger navigation'); |
| 222 document.body.appendChild(webview); | 224 document.body.appendChild(webview); |
| 223 }, | 225 }, |
| 224 | 226 |
| 225 // This test calls terminate() on guest after it has already been | 227 // This test calls terminate() on guest after it has already been |
| 226 // terminated. This makes sure we ignore the call gracefully. | 228 // terminated. This makes sure we ignore the call gracefully. |
| 227 function webViewTerminateAfterExitDoesntCrash() { | 229 function webViewTerminateAfterExitDoesntCrash() { |
| 228 var webview = document.querySelector('webview'); | 230 var webview = document.createElement('webview'); |
| 229 webview.addEventListener('loadstart', function(evt) { | 231 webview.setAttribute('partition', arguments.callee.name); |
| 230 chrome.test.assertEq('loadstart', evt.type); | |
| 231 }); | |
| 232 | |
| 233 var loadstopSucceedsTest = false; | 232 var loadstopSucceedsTest = false; |
| 234 webview.addEventListener('loadstop', function(evt) { | 233 webview.addEventListener('loadstop', function(evt) { |
| 235 chrome.test.assertEq('loadstop', evt.type); | 234 chrome.test.assertEq('loadstop', evt.type); |
| 236 if (loadstopSucceedsTest) { | 235 if (loadstopSucceedsTest) { |
| 237 chrome.test.succeed(); | 236 chrome.test.succeed(); |
| 238 return; | 237 return; |
| 239 } | 238 } |
| 240 | 239 |
| 241 webview.terminate(); | 240 webview.terminate(); |
| 242 }); | 241 }); |
| 243 | 242 |
| 244 webview.addEventListener('exit', function(evt) { | 243 webview.addEventListener('exit', function(evt) { |
| 245 chrome.test.assertEq('exit', evt.type); | 244 chrome.test.assertEq('exit', evt.type); |
| 246 // Call terminate again. | 245 // Call terminate again. |
| 247 webview.terminate(); | 246 webview.terminate(); |
| 248 // Load another page. The test would pass when loadstop is called on | 247 // Load another page. The test would pass when loadstop is called on |
| 249 // this second page. This would hopefully catch if call to | 248 // this second page. This would hopefully catch if call to |
| 250 // webview.terminate() caused a browser crash. | 249 // webview.terminate() caused a browser crash. |
| 251 setTimeout(function() { | 250 setTimeout(function() { |
| 252 loadstopSucceedsTest = true; | 251 loadstopSucceedsTest = true; |
| 253 webview.setAttribute('src', 'data:text/html,test second page'); | 252 webview.setAttribute('src', 'data:text/html,test second page'); |
| 254 }, 0); | 253 }, 0); |
| 255 }); | 254 }); |
| 256 | 255 |
| 257 webview.setAttribute('src', 'data:text/html,test terminate() crash.'); | 256 webview.setAttribute('src', 'data:text/html,test terminate() crash.'); |
| 257 document.body.appendChild(webview); |
| 258 }, |
| 259 |
| 260 // This test verifies that assigning the src attribute the same value it had |
| 261 // prior to a crash spawns off a new guest process. |
| 262 function webViewAssignSrcAfterCrash() { |
| 263 var webview = document.createElement('webview'); |
| 264 webview.setAttribute('partition', arguments.callee.name); |
| 265 var terminated = false; |
| 266 webview.addEventListener('loadstop', function(evt) { |
| 267 if (!terminated) { |
| 268 webview.terminate(); |
| 269 return; |
| 270 } |
| 271 // The guest has recovered after being terminated. |
| 272 chrome.test.succeed(); |
| 273 }); |
| 274 webview.addEventListener('exit', function(evt) { |
| 275 terminated = true; |
| 276 webview.setAttribute('src', 'data:text/html,test page'); |
| 277 }); |
| 278 webview.setAttribute('src', 'data:text/html,test page'); |
| 279 document.body.appendChild(webview); |
| 280 }, |
| 281 |
| 282 // This test verifies that <webview> restores the src attribute if it is |
| 283 // removed after navigation. |
| 284 function webViewRemoveSrcAttribute() { |
| 285 var dataUrl = 'data:text/html,test page'; |
| 286 var webview = document.createElement('webview'); |
| 287 webview.setAttribute('partition', arguments.callee.name); |
| 288 var terminated = false; |
| 289 webview.addEventListener('loadstop', function(evt) { |
| 290 webview.removeAttribute('src'); |
| 291 setTimeout(function() { |
| 292 chrome.test.assertEq(dataUrl, webview.getAttribute('src')); |
| 293 chrome.test.succeed(); |
| 294 }, 0); |
| 295 }); |
| 296 webview.setAttribute('src', dataUrl); |
| 297 document.body.appendChild(webview); |
| 258 } | 298 } |
| 259 ]); | 299 ]); |
| 260 }; | 300 }; |
| OLD | NEW |