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..7626d5189a8f9549574ef03e9d470dfc14f680d8 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,333 @@ function testPartitionRemovalAfterNavigationFails() { |
webview.setAttribute('src', 'data:text/html,<html><body>guest</body></html>'); |
} |
+function testAddContentScript() { |
+ 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') { |
+ console.log( |
+ 'Step 3: Another communication channel has been established ' + |
+ 'with webview.'); |
+ setTimeout(function() { |
+ embedder.test.succeed(); |
+ }, 1000); |
+ 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++; |
+ } 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 testExecuteScriptFail() { |
var webview = document.createElement('webview'); |
document.body.appendChild(webview); |
@@ -2222,6 +2551,17 @@ embedder.test.testList = { |
'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation, |
'testPartitionRemovalAfterNavigationFails': |
testPartitionRemovalAfterNavigationFails, |
+ 'testAddContentScript': testAddContentScript, |
+ 'testAddMultipleContentScripts': testAddMultipleContentScripts, |
+ 'testAddContentScriptWithSameNameShouldOverwriteTheExistingOne': |
+ testAddContentScriptWithSameNameShouldOverwriteTheExistingOne, |
+ 'testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView': |
+ testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView, |
+ 'testAddAndRemoveContentScripts': testAddAndRemoveContentScripts, |
+ 'testAddContentScriptsWithNewWindowAPI': |
+ testAddContentScriptsWithNewWindowAPI, |
+ 'testContentScriptIsInjectedAfterTerminateAndReloadWebView': |
+ testContentScriptIsInjectedAfterTerminateAndReloadWebView, |
'testExecuteScriptFail': testExecuteScriptFail, |
'testExecuteScript': testExecuteScript, |
'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged': |