Index: extensions/test/data/web_view/apitest/main.js |
diff --git a/extensions/test/data/web_view/apitest/main.js b/extensions/test/data/web_view/apitest/main.js |
index 377cd666b8b880d01b87dc41b2b6af2b2a870b4e..16c713998d598a177b89fe220979f74c72e41e18 100644 |
--- a/extensions/test/data/web_view/apitest/main.js |
+++ b/extensions/test/data/web_view/apitest/main.js |
@@ -111,6 +111,28 @@ function testAPIMethodExistence() { |
document.body.appendChild(webview); |
} |
+// This test verifies that assigning the src attribute the same value it had |
+// prior to a crash spawns off a new guest process. |
+function testAssignSrcAfterCrash() { |
+ var webview = document.createElement('webview'); |
+ webview.setAttribute('partition', arguments.callee.name); |
+ var terminated = false; |
+ webview.addEventListener('loadstop', function(evt) { |
+ if (!terminated) { |
+ webview.terminate(); |
+ return; |
+ } |
+ // The guest has recovered after being terminated. |
+ embedder.test.succeed(); |
+ }); |
+ webview.addEventListener('exit', function(evt) { |
+ terminated = true; |
+ webview.setAttribute('src', 'data:text/html,test page'); |
+ }); |
+ webview.setAttribute('src', 'data:text/html,test page'); |
+ document.body.appendChild(webview); |
+} |
+ |
// Makes sure 'sizechanged' event is fired only if autosize attribute is |
// specified. |
// After loading <webview> without autosize attribute and a size, say size1, |
@@ -336,17 +358,205 @@ function testAutosizeWithPartialAttributes() { |
document.body.appendChild(webview); |
} |
+// This test registers two event listeners on a same event (loadcommit). |
+// Each of the listener tries to change some properties on the event param, |
+// which should not be possible. |
+function testCannotMutateEventName() { |
+ var webview = document.createElement('webview'); |
+ var url = 'data:text/html,<body>Two</body>'; |
+ var loadCommitACalled = false; |
+ var loadCommitBCalled = false; |
+ |
+ var maybeFinishTest = function(e) { |
+ if (loadCommitACalled && loadCommitBCalled) { |
+ embedder.test.assertEq('loadcommit', e.type); |
+ embedder.test.succeed(); |
+ } |
+ }; |
+ |
+ var onLoadCommitA = function(e) { |
+ if (e.url == url) { |
+ embedder.test.assertEq('loadcommit', e.type); |
+ embedder.test.assertTrue(e.isTopLevel); |
+ embedder.test.assertFalse(loadCommitACalled); |
+ loadCommitACalled = true; |
+ // Try mucking with properities inside |e|. |
+ e.type = 'modified'; |
+ maybeFinishTest(e); |
+ } |
+ }; |
+ var onLoadCommitB = function(e) { |
+ if (e.url == url) { |
+ embedder.test.assertEq('loadcommit', e.type); |
+ embedder.test.assertTrue(e.isTopLevel); |
+ embedder.test.assertFalse(loadCommitBCalled); |
+ loadCommitBCalled = true; |
+ // Try mucking with properities inside |e|. |
+ e.type = 'modified'; |
+ maybeFinishTest(e); |
+ } |
+ }; |
+ |
+ // The test starts from here, by setting the src to |url|. Event |
+ // listener registration works because we already have a (dummy) src set |
+ // on the <webview> tag. |
+ webview.addEventListener('loadcommit', onLoadCommitA); |
+ webview.addEventListener('loadcommit', onLoadCommitB); |
+ webview.setAttribute('src', url); |
+ document.body.appendChild(webview); |
+} |
+ |
+// This test verifies that the load event fires when the a new page is |
+// loaded. |
+// TODO(fsamuel): Add a test to verify that subframe loads within a guest |
+// do not fire the 'contentload' event. |
+function testContentLoadEvent() { |
+ var webview = document.createElement('webview'); |
+ webview.addEventListener('contentload', function(e) { |
+ embedder.test.succeed(); |
+ }); |
+ webview.setAttribute('src', 'data:text/html,trigger navigation'); |
+ document.body.appendChild(webview); |
+} |
+ |
+// This test registers two listeners on an event (loadcommit) and removes |
+// the <webview> tag when the first listener fires. |
+// Current expected behavior is that the second event listener will still |
+// fire without crashing. |
+function testDestroyOnEventListener() { |
+ var webview = document.createElement('webview'); |
+ var url = 'data:text/html,<body>Destroy test</body>'; |
+ |
+ var loadCommitCount = 0; |
+ function loadCommitCommon(e) { |
+ embedder.test.assertEq('loadcommit', e.type); |
+ if (url != e.url) |
+ return; |
+ ++loadCommitCount; |
+ if (loadCommitCount == 2) { |
+ // Pass in a timeout so that we can catch if any additional loadcommit |
+ // occurs. |
+ setTimeout(function() { |
+ embedder.test.succeed(); |
+ }, 0); |
+ } else if (loadCommitCount > 2) { |
+ embedder.test.fail(); |
+ } |
+ }; |
+ |
+ // The test starts from here, by setting the src to |url|. |
+ webview.addEventListener('loadcommit', function(e) { |
+ window.console.log('loadcommit1'); |
+ webview.parentNode.removeChild(webview); |
+ loadCommitCommon(e); |
+ }); |
+ webview.addEventListener('loadcommit', function(e) { |
+ window.console.log('loadcommit2'); |
+ loadCommitCommon(e); |
+ }); |
+ webview.setAttribute('src', url); |
+ document.body.appendChild(webview); |
+} |
+ |
+// Tests that a <webview> that starts with "display: none" style loads |
+// properly. |
+function testDisplayNoneWebviewLoad() { |
+ var webview = document.createElement('webview'); |
+ var visible = false; |
+ webview.style.display = 'none'; |
+ // foobar is a privileged partition according to the manifest file. |
+ webview.partition = 'foobar'; |
+ webview.addEventListener('loadabort', function(e) { |
+ embedder.test.fail(); |
+ }); |
+ webview.addEventListener('loadstop', function(e) { |
+ embedder.test.assertTrue(visible); |
+ embedder.test.succeed(); |
+ }); |
+ // Set the .src while we are "display: none". |
+ webview.setAttribute('src', 'about:blank'); |
+ document.body.appendChild(webview); |
+ |
+ setTimeout(function() { |
+ visible = true; |
+ // This should trigger loadstop. |
+ webview.style.display = ''; |
+ }, 0); |
+} |
+ |
+function testDisplayNoneWebviewRemoveChild() { |
+ var webview = document.createElement('webview'); |
+ var visibleAndInDOM = false; |
+ webview.style.display = 'none'; |
+ // foobar is a privileged partition according to the manifest file. |
+ webview.partition = 'foobar'; |
+ webview.addEventListener('loadabort', function(e) { |
+ embedder.test.fail(); |
+ }); |
+ webview.addEventListener('loadstop', function(e) { |
+ embedder.test.assertTrue(visibleAndInDOM); |
+ embedder.test.succeed(); |
+ }); |
+ // Set the .src while we are "display: none". |
+ webview.setAttribute('src', 'about:blank'); |
+ document.body.appendChild(webview); |
+ |
+ setTimeout(function() { |
+ webview.parentNode.removeChild(webview); |
+ webview.style.display = ''; |
+ visibleAndInDOM = true; |
+ // This should trigger loadstop. |
+ document.body.appendChild(webview); |
+ }, 0); |
+} |
+ |
+function testExecuteScript() { |
+ var webview = document.createElement('webview'); |
+ webview.addEventListener('loadstop', function() { |
+ webview.executeScript( |
+ {code:'document.body.style.backgroundColor = "red";'}, |
+ function(results) { |
+ embedder.test.assertEq(1, results.length); |
+ embedder.test.assertEq('red', results[0]); |
+ embedder.test.succeed(); |
+ }); |
+ }); |
+ webview.setAttribute('src', 'data:text/html,trigger navigation'); |
+ document.body.appendChild(webview); |
+} |
+ |
+function testExecuteScriptFail() { |
+ var webview = document.createElement('webview'); |
+ try { |
+ webview.executeScript( |
+ {code: 'document.body.style.backgroundColor = "red";'}, |
+ function(results) { embedder.test.fail(); }); |
+ } |
+ catch (e) { |
+ embedder.test.succeed(); |
+ } |
+} |
+ |
+ |
// Tests end. |
embedder.test.testList = { |
'testAllowTransparencyAttribute': testAllowTransparencyAttribute, |
'testAPIMethodExistence': testAPIMethodExistence, |
+ 'testAssignSrcAfterCrash': testAssignSrcAfterCrash, |
'testAutosizeAfterNavigation': testAutosizeAfterNavigation, |
'testAutosizeBeforeNavigation': testAutosizeBeforeNavigation, |
'testAutosizeHeight': testAutosizeHeight, |
'testAutosizeRemoveAttributes': testAutosizeRemoveAttributes, |
- 'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes |
+ 'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes, |
+ 'testCannotMutateEventName': testCannotMutateEventName, |
+ 'testContentLoadEvent': testContentLoadEvent, |
+ 'testDestroyOnEventListener': testDestroyOnEventListener, |
+ 'testDisplayNoneWebviewLoad': testDisplayNoneWebviewLoad, |
+ 'testDisplayNoneWebviewRemoveChild': testDisplayNoneWebviewRemoveChild, |
+ 'testExecuteScript': testExecuteScript, |
+ 'testExecuteScriptFail': testExecuteScriptFail |
}; |
onload = function() { |