Chromium Code Reviews| Index: chrome/test/data/extensions/platform_apps/web_view/shim/main.js |
| diff --git a/chrome/test/data/extensions/platform_apps/web_view/shim/main.js b/chrome/test/data/extensions/platform_apps/web_view/shim/main.js |
| index d9bcfc2369794749cf3878265c0f1f5af0518832..838844e9b10371c4c3b705ba739d18225ab30664 100644 |
| --- a/chrome/test/data/extensions/platform_apps/web_view/shim/main.js |
| +++ b/chrome/test/data/extensions/platform_apps/web_view/shim/main.js |
| @@ -22,6 +22,8 @@ embedder.setUp_ = function(config) { |
| '/extensions/platform_apps/web_view/shim/empty_guest.html'; |
| embedder.windowOpenGuestURL = embedder.baseGuestURL + |
| '/extensions/platform_apps/web_view/shim/guest.html'; |
| + embedder.windowOpenGuestFromSameURL = embedder.baseGuestURL + |
| + '/extensions/platform_apps/web_view/shim/guest_from_opener.html'; |
| embedder.noReferrerGuestURL = embedder.baseGuestURL + |
| '/extensions/platform_apps/web_view/shim/guest_noreferrer.html'; |
| embedder.detectUserAgentURL = embedder.baseGuestURL + '/detect-user-agent'; |
| @@ -749,6 +751,379 @@ function testPartitionRemovalAfterNavigationFails() { |
| webview.setAttribute('src', 'data:text/html,<html><body>guest</body></html>'); |
| } |
| +function testAddContentScript() { |
|
Devlin
2015/04/13 19:21:46
Describe what the test does in comments (for all)
Xi Han
2015/04/14 19:05:50
Done.
|
| + var webview = document.createElement('webview'); |
| + |
| + console.log("Step 1: call <webview>.addContentScripts."); |
| + webview.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + |
| + webview.addEventListener('loadstop', function() { |
| + var msg = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + }); |
| + |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected') { |
| + console.log( |
| + 'Step 2: A communication channel has been established with webview.'); |
| + embedder.test.succeed(); |
| + return; |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testAddMultipleContentScripts() { |
| + var webview = document.createElement('webview'); |
| + |
| + console.log("Step 1: call <webview>.addContentScripts(myrule1 & myrule2)"); |
| + webview.addContentScripts( |
| + [{"name": 'myrule1', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}, |
| + {"name": 'myrule2', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel_2.js"], |
| + "run_at": "document_start"}]); |
| + |
| + webview.addEventListener('loadstop', function() { |
| + var msg1 = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg1), '*'); |
| + var msg2 = ['connect_request']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg2), '*'); |
| + }); |
| + |
| + var response_1 = false; |
| + var response_2 = false; |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected') { |
| + console.log( |
| + 'Step 2: A communication channel has been established with webview.'); |
| + response_1 = true; |
| + if (response_1 && response_2) |
| + embedder.test.succeed(); |
| + return; |
| + } else if (data == 'connected_response') { |
| + console.log( |
| + 'Step 3: A communication channel has been established with webview.'); |
| + response_2 = true; |
| + if (response_1 && response_2) |
| + embedder.test.succeed(); |
| + return; |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testAddContentScriptWithSameNameShouldOverwriteTheExistingOne() { |
| + var webview = document.createElement('webview'); |
| + |
| + console.log("Step 1: call <webview>.addContentScripts(myrule1)"); |
| + webview.addContentScripts( |
| + [{"name": 'myrule1', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + var connect_script_1 = true; |
| + var connect_script_2 = false; |
| + |
| + webview.addEventListener('loadstop', function() { |
| + if (connect_script_1) { |
| + var msg1 = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg1), '*'); |
| + connect_script_1 = false; |
| + } |
| + if (connect_script_2) { |
| + var msg2 = ['connect_request']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg2), '*'); |
| + connect_script_2 = false; |
| + } |
| + }); |
| + |
| + var should_get_response_from_script_1 = true; |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected') { |
| + if (should_get_response_from_script_1) { |
| + console.log( |
| + 'Step 2: A communication channel has been established with webview.' |
| + ); |
| + webview.addContentScripts( |
| + [{"name": 'myrule1', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel_2.js"], |
| + "run_at": "document_start"}]); |
| + connect_script_2 = true; |
| + should_get_response_from_script_1 = false; |
| + webview.src = embedder.emptyGuestURL; |
| + } else { |
| + embedder.test.fail(); |
| + } |
| + return; |
| + } else if (data == 'connected_response') { |
|
Devlin
2015/04/13 19:21:46
These messages and responses are used enough that
Xi Han
2015/04/14 19:05:50
Done.
|
| + console.log( |
| + 'Step 3: Another communication channel has been established ' + |
| + 'with webview.'); |
| + setTimeout(function() { |
| + embedder.test.succeed(); |
| + }, 1000); |
|
Devlin
2015/04/13 19:21:46
Why the timeout?
Xi Han
2015/04/14 19:05:50
Here we verify that we won't get any message from
Devlin
2015/04/14 23:04:57
1000ms is a pretty arbitrary limit to put there.
Xi Han
2015/04/15 19:43:55
Sounds good to me, updated:)
|
| + return; |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView() { |
| + var webview1 = document.createElement('webview'); |
| + var webview2 = document.createElement('webview'); |
| + |
| + console.log("Step 1: call <webview1>.addContentScripts."); |
| + webview1.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + |
| + webview2.addEventListener('loadstop', function() { |
| + console.log("Step 2: webview2 requests to build communication channel."); |
| + var msg = ['connect']; |
| + webview2.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + setTimeout(function() { |
| + embedder.test.succeed(); |
| + }, 2000); |
| + }); |
| + |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected') { |
| + embedder.test.fail(); |
| + return; |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview1.src = embedder.emptyGuestURL; |
| + webview2.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview1); |
| + document.body.appendChild(webview2); |
| +} |
| + |
| +function testAddAndRemoveContentScripts() { |
| + var webview = document.createElement('webview'); |
| + |
| + console.log("Step 1: call <webview>.addContentScripts."); |
| + webview.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + |
| + var count = 0; |
| + webview.addEventListener('loadstop', function() { |
| + if (count == 0) { |
| + console.log('Step 2: post message to build connect.'); |
| + var msg = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + count++; |
|
Devlin
2015/04/13 19:21:46
nit: pre-increment
Xi Han
2015/04/14 19:05:50
Done.
|
| + } else if (count == 1) { |
| + console.log( |
| + 'Step 4: call <webview>.removeContentScripts and navigate.'); |
| + webview.removeContentScripts(); |
| + webview.src = embedder.emptyGuestURL; |
| + count++; |
| + } else if (count == 2) { |
| + console.log('Step 5: post message to build connect again.'); |
| + var msg = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + setTimeout(function() { |
| + embedder.test.succeed(); |
| + }, 2000); |
| + } |
| + }); |
| + |
| + var replyCount = 0; |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data[0] == 'connected') { |
| + console.log( |
| + 'Step 3: A communication channel has been established with webview.'); |
| + if (replyCount == 0) { |
| + webview.setAttribute('src', 'about:blank'); |
| + replyCount++; |
| + return; |
| + } else if (replyCount == 1) { |
| + embedder.test.fail(); |
| + return; |
| + } |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testAddContentScriptsWithNewWindowAPI() { |
| + var webview = document.createElement('webview'); |
| + |
| + var newwebview; |
| + webview.addEventListener('newwindow', function(e) { |
| + e.preventDefault(); |
| + newwebview = document.createElement('webview'); |
| + |
| + console.log('Step 2: call newwebview.addContentScripts.'); |
| + newwebview.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + |
| + newwebview.addEventListener('loadstop', function(evt) { |
| + var msg = ['connect']; |
| + console.log('Step 4: new webview postmessage to build communication ' + |
| + 'channel.'); |
| + newwebview.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + }); |
| + |
| + document.body.appendChild(newwebview); |
| + // attach the new window to the new <webview>. |
| + console.log("Step 3: attaches the new webview."); |
| + e.window.attach(newwebview); |
| + }); |
| + |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected' && e.source == newwebview.contentWindow) { |
| + console.log('Step 5: a communication channel has been established ' + |
| + 'with the new webview.'); |
| + embedder.test.succeed(); |
| + return; |
| + } else { |
| + embedder.test.fail(); |
| + return; |
| + } |
| + console.log('unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + console.log('Step 1: navigates the webview to window open guest URL.'); |
| + webview.setAttribute('src', embedder.windowOpenGuestFromSameURL); |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testContentScriptIsInjectedAfterTerminateAndReloadWebView() { |
| + var webview = document.createElement('webview'); |
| + |
| + console.log('Step 1: call <webview>.addContentScripts.'); |
| + webview.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["inject_comm_channel.js"], |
| + "run_at": "document_start"}]); |
| + |
| + var count = 0; |
| + webview.addEventListener('loadstop', function() { |
| + if (count == 0) { |
| + console.log('Step 2: call webview.terminate().'); |
| + webview.terminate(); |
| + ++count; |
| + return; |
| + } else if (count == 1) { |
| + console.log('Step 4: postMessage to build communication.'); |
| + var msg = ['connect']; |
| + webview.contentWindow.postMessage(JSON.stringify(msg), '*'); |
| + ++count; |
| + } |
| + }); |
| + |
| + webview.addEventListener('exit', function() { |
| + console.log('Step 3: call webview.reload().'); |
| + webview.reload(); |
| + }); |
| + |
| + window.addEventListener('message', function(e) { |
| + var data = JSON.parse(e.data); |
| + if (data == 'connected') { |
| + console.log( |
| + 'Step 5: A communication channel has been established with webview.'); |
| + embedder.test.succeed(); |
| + return; |
| + } |
| + console.log('Unexpected message: \'' + data[0] + '\''); |
| + embedder.test.fail(); |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
| +function testContentScriptExistsAsLongAsWebViewTagExists() { |
| + var webview = document.createElement('webview'); |
| + |
| + console.log('Step 1: call <webview>.addContentScripts.'); |
| + webview.addContentScripts( |
| + [{"name": 'myrule', |
| + "matches": ["http://*/extensions/*"], |
| + "js": ["simple_script.js"], |
| + "run_at": "document_end"}]); |
| + |
| + var count = 0; |
| + webview.addEventListener('loadstop', function() { |
| + if (count == 0) { |
| + console.log('Step 2: check the result of content script injected.'); |
| + webview.executeScript({ |
| + code: 'document.body.style.backgroundColor;' |
| + }, function(results) { |
| + embedder.test.assertEq(1, results.length); |
| + embedder.test.assertEq('red', results[0]); |
| + }); |
| + |
| + console.log('Step 3: remove webview from the DOM.'); |
| + document.body.removeChild(webview); |
| + |
| + console.log('Step 4: add webview back to the DOM.'); |
| + document.body.appendChild(webview); |
| + ++count; |
| + return; |
|
Devlin
2015/04/13 19:21:46
these returns are redundant with the if/else.
Xi Han
2015/04/14 19:05:50
removed.
|
| + } else if (count == 1) { |
| + webview.executeScript({ |
| + code: 'document.body.style.backgroundColor;' |
| + }, function(results) { |
| + console.log('Step 5: check the result of content script injected' + |
| + ' again.'); |
| + embedder.test.assertEq(1, results.length); |
| + embedder.test.assertEq('red', results[0]); |
| + embedder.test.succeed(); |
| + }); |
| + return; |
| + } |
| + }); |
| + |
| + webview.src = embedder.emptyGuestURL; |
| + document.body.appendChild(webview); |
| +} |
| + |
|
Devlin
2015/04/13 19:21:46
Can we add a test for navigation?
Xi Han
2015/04/14 19:05:50
Everytime when we set the src of <webview>, it tri
|
| function testExecuteScriptFail() { |
| var webview = document.createElement('webview'); |
| document.body.appendChild(webview); |
| @@ -2222,6 +2597,19 @@ embedder.test.testList = { |
| 'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation, |
| 'testPartitionRemovalAfterNavigationFails': |
| testPartitionRemovalAfterNavigationFails, |
| + 'testAddContentScript': testAddContentScript, |
| + 'testAddMultipleContentScripts': testAddMultipleContentScripts, |
| + 'testAddContentScriptWithSameNameShouldOverwriteTheExistingOne': |
| + testAddContentScriptWithSameNameShouldOverwriteTheExistingOne, |
| + 'testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView': |
| + testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView, |
| + 'testAddAndRemoveContentScripts': testAddAndRemoveContentScripts, |
| + 'testAddContentScriptsWithNewWindowAPI': |
| + testAddContentScriptsWithNewWindowAPI, |
| + 'testContentScriptIsInjectedAfterTerminateAndReloadWebView': |
| + testContentScriptIsInjectedAfterTerminateAndReloadWebView, |
| + 'testContentScriptExistsAsLongAsWebViewTagExists': |
| + testContentScriptExistsAsLongAsWebViewTagExists, |
| 'testExecuteScriptFail': testExecuteScriptFail, |
| 'testExecuteScript': testExecuteScript, |
| 'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged': |