Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: chrome/test/data/extensions/platform_apps/web_view/shim/main.js

Issue 959413003: Implement <webview>.addContentScript/removeContentScript API [1] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add a test for the lifetime of content scripts. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 var embedder = {}; 6 var embedder = {};
7 embedder.baseGuestURL = ''; 7 embedder.baseGuestURL = '';
8 embedder.emptyGuestURL = ''; 8 embedder.emptyGuestURL = '';
9 embedder.windowOpenGuestURL = ''; 9 embedder.windowOpenGuestURL = '';
10 embedder.noReferrerGuestURL = ''; 10 embedder.noReferrerGuestURL = '';
11 embedder.redirectGuestURL = ''; 11 embedder.redirectGuestURL = '';
12 embedder.redirectGuestURLDest = ''; 12 embedder.redirectGuestURLDest = '';
13 embedder.closeSocketURL = ''; 13 embedder.closeSocketURL = '';
14 embedder.tests = {}; 14 embedder.tests = {};
15 15
16 embedder.setUp_ = function(config) { 16 embedder.setUp_ = function(config) {
17 if (!config || !config.testServer) { 17 if (!config || !config.testServer) {
18 return; 18 return;
19 } 19 }
20 embedder.baseGuestURL = 'http://localhost:' + config.testServer.port; 20 embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
21 embedder.emptyGuestURL = embedder.baseGuestURL + 21 embedder.emptyGuestURL = embedder.baseGuestURL +
22 '/extensions/platform_apps/web_view/shim/empty_guest.html'; 22 '/extensions/platform_apps/web_view/shim/empty_guest.html';
23 embedder.windowOpenGuestURL = embedder.baseGuestURL + 23 embedder.windowOpenGuestURL = embedder.baseGuestURL +
24 '/extensions/platform_apps/web_view/shim/guest.html'; 24 '/extensions/platform_apps/web_view/shim/guest.html';
25 embedder.windowOpenGuestFromSameURL = embedder.baseGuestURL +
26 '/extensions/platform_apps/web_view/shim/guest_from_opener.html';
25 embedder.noReferrerGuestURL = embedder.baseGuestURL + 27 embedder.noReferrerGuestURL = embedder.baseGuestURL +
26 '/extensions/platform_apps/web_view/shim/guest_noreferrer.html'; 28 '/extensions/platform_apps/web_view/shim/guest_noreferrer.html';
27 embedder.detectUserAgentURL = embedder.baseGuestURL + '/detect-user-agent'; 29 embedder.detectUserAgentURL = embedder.baseGuestURL + '/detect-user-agent';
28 embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect'; 30 embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect';
29 embedder.redirectGuestURLDest = embedder.baseGuestURL + 31 embedder.redirectGuestURLDest = embedder.baseGuestURL +
30 '/extensions/platform_apps/web_view/shim/guest_redirect.html'; 32 '/extensions/platform_apps/web_view/shim/guest_redirect.html';
31 embedder.closeSocketURL = embedder.baseGuestURL + '/close-socket'; 33 embedder.closeSocketURL = embedder.baseGuestURL + '/close-socket';
32 embedder.testImageBaseURL = embedder.baseGuestURL + 34 embedder.testImageBaseURL = embedder.baseGuestURL +
33 '/extensions/platform_apps/web_view/shim/'; 35 '/extensions/platform_apps/web_view/shim/';
34 embedder.virtualURL = 'http://virtualurl/'; 36 embedder.virtualURL = 'http://virtualurl/';
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 // Removing after navigation should not change the partition. 744 // Removing after navigation should not change the partition.
743 webview.removeAttribute('partition'); 745 webview.removeAttribute('partition');
744 embedder.test.assertEq('testme', webview.partition); 746 embedder.test.assertEq('testme', webview.partition);
745 embedder.test.succeed(); 747 embedder.test.succeed();
746 }; 748 };
747 webview.addEventListener('loadstop', loadstopHandler); 749 webview.addEventListener('loadstop', loadstopHandler);
748 750
749 webview.setAttribute('src', 'data:text/html,<html><body>guest</body></html>'); 751 webview.setAttribute('src', 'data:text/html,<html><body>guest</body></html>');
750 } 752 }
751 753
754 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.
755 var webview = document.createElement('webview');
756
757 console.log("Step 1: call <webview>.addContentScripts.");
758 webview.addContentScripts(
759 [{"name": 'myrule',
760 "matches": ["http://*/extensions/*"],
761 "js": ["inject_comm_channel.js"],
762 "run_at": "document_start"}]);
763
764 webview.addEventListener('loadstop', function() {
765 var msg = ['connect'];
766 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
767 });
768
769 window.addEventListener('message', function(e) {
770 var data = JSON.parse(e.data);
771 if (data == 'connected') {
772 console.log(
773 'Step 2: A communication channel has been established with webview.');
774 embedder.test.succeed();
775 return;
776 }
777 console.log('Unexpected message: \'' + data[0] + '\'');
778 embedder.test.fail();
779 });
780
781 webview.src = embedder.emptyGuestURL;
782 document.body.appendChild(webview);
783 }
784
785 function testAddMultipleContentScripts() {
786 var webview = document.createElement('webview');
787
788 console.log("Step 1: call <webview>.addContentScripts(myrule1 & myrule2)");
789 webview.addContentScripts(
790 [{"name": 'myrule1',
791 "matches": ["http://*/extensions/*"],
792 "js": ["inject_comm_channel.js"],
793 "run_at": "document_start"},
794 {"name": 'myrule2',
795 "matches": ["http://*/extensions/*"],
796 "js": ["inject_comm_channel_2.js"],
797 "run_at": "document_start"}]);
798
799 webview.addEventListener('loadstop', function() {
800 var msg1 = ['connect'];
801 webview.contentWindow.postMessage(JSON.stringify(msg1), '*');
802 var msg2 = ['connect_request'];
803 webview.contentWindow.postMessage(JSON.stringify(msg2), '*');
804 });
805
806 var response_1 = false;
807 var response_2 = false;
808 window.addEventListener('message', function(e) {
809 var data = JSON.parse(e.data);
810 if (data == 'connected') {
811 console.log(
812 'Step 2: A communication channel has been established with webview.');
813 response_1 = true;
814 if (response_1 && response_2)
815 embedder.test.succeed();
816 return;
817 } else if (data == 'connected_response') {
818 console.log(
819 'Step 3: A communication channel has been established with webview.');
820 response_2 = true;
821 if (response_1 && response_2)
822 embedder.test.succeed();
823 return;
824 }
825 console.log('Unexpected message: \'' + data[0] + '\'');
826 embedder.test.fail();
827 });
828
829 webview.src = embedder.emptyGuestURL;
830 document.body.appendChild(webview);
831 }
832
833 function testAddContentScriptWithSameNameShouldOverwriteTheExistingOne() {
834 var webview = document.createElement('webview');
835
836 console.log("Step 1: call <webview>.addContentScripts(myrule1)");
837 webview.addContentScripts(
838 [{"name": 'myrule1',
839 "matches": ["http://*/extensions/*"],
840 "js": ["inject_comm_channel.js"],
841 "run_at": "document_start"}]);
842 var connect_script_1 = true;
843 var connect_script_2 = false;
844
845 webview.addEventListener('loadstop', function() {
846 if (connect_script_1) {
847 var msg1 = ['connect'];
848 webview.contentWindow.postMessage(JSON.stringify(msg1), '*');
849 connect_script_1 = false;
850 }
851 if (connect_script_2) {
852 var msg2 = ['connect_request'];
853 webview.contentWindow.postMessage(JSON.stringify(msg2), '*');
854 connect_script_2 = false;
855 }
856 });
857
858 var should_get_response_from_script_1 = true;
859 window.addEventListener('message', function(e) {
860 var data = JSON.parse(e.data);
861 if (data == 'connected') {
862 if (should_get_response_from_script_1) {
863 console.log(
864 'Step 2: A communication channel has been established with webview.'
865 );
866 webview.addContentScripts(
867 [{"name": 'myrule1',
868 "matches": ["http://*/extensions/*"],
869 "js": ["inject_comm_channel_2.js"],
870 "run_at": "document_start"}]);
871 connect_script_2 = true;
872 should_get_response_from_script_1 = false;
873 webview.src = embedder.emptyGuestURL;
874 } else {
875 embedder.test.fail();
876 }
877 return;
878 } 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.
879 console.log(
880 'Step 3: Another communication channel has been established ' +
881 'with webview.');
882 setTimeout(function() {
883 embedder.test.succeed();
884 }, 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:)
885 return;
886 }
887 console.log('Unexpected message: \'' + data[0] + '\'');
888 embedder.test.fail();
889 });
890
891 webview.src = embedder.emptyGuestURL;
892 document.body.appendChild(webview);
893 }
894
895 function testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView() {
896 var webview1 = document.createElement('webview');
897 var webview2 = document.createElement('webview');
898
899 console.log("Step 1: call <webview1>.addContentScripts.");
900 webview1.addContentScripts(
901 [{"name": 'myrule',
902 "matches": ["http://*/extensions/*"],
903 "js": ["inject_comm_channel.js"],
904 "run_at": "document_start"}]);
905
906 webview2.addEventListener('loadstop', function() {
907 console.log("Step 2: webview2 requests to build communication channel.");
908 var msg = ['connect'];
909 webview2.contentWindow.postMessage(JSON.stringify(msg), '*');
910 setTimeout(function() {
911 embedder.test.succeed();
912 }, 2000);
913 });
914
915 window.addEventListener('message', function(e) {
916 var data = JSON.parse(e.data);
917 if (data == 'connected') {
918 embedder.test.fail();
919 return;
920 }
921 console.log('Unexpected message: \'' + data[0] + '\'');
922 embedder.test.fail();
923 });
924
925 webview1.src = embedder.emptyGuestURL;
926 webview2.src = embedder.emptyGuestURL;
927 document.body.appendChild(webview1);
928 document.body.appendChild(webview2);
929 }
930
931 function testAddAndRemoveContentScripts() {
932 var webview = document.createElement('webview');
933
934 console.log("Step 1: call <webview>.addContentScripts.");
935 webview.addContentScripts(
936 [{"name": 'myrule',
937 "matches": ["http://*/extensions/*"],
938 "js": ["inject_comm_channel.js"],
939 "run_at": "document_start"}]);
940
941 var count = 0;
942 webview.addEventListener('loadstop', function() {
943 if (count == 0) {
944 console.log('Step 2: post message to build connect.');
945 var msg = ['connect'];
946 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
947 count++;
Devlin 2015/04/13 19:21:46 nit: pre-increment
Xi Han 2015/04/14 19:05:50 Done.
948 } else if (count == 1) {
949 console.log(
950 'Step 4: call <webview>.removeContentScripts and navigate.');
951 webview.removeContentScripts();
952 webview.src = embedder.emptyGuestURL;
953 count++;
954 } else if (count == 2) {
955 console.log('Step 5: post message to build connect again.');
956 var msg = ['connect'];
957 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
958 setTimeout(function() {
959 embedder.test.succeed();
960 }, 2000);
961 }
962 });
963
964 var replyCount = 0;
965 window.addEventListener('message', function(e) {
966 var data = JSON.parse(e.data);
967 if (data[0] == 'connected') {
968 console.log(
969 'Step 3: A communication channel has been established with webview.');
970 if (replyCount == 0) {
971 webview.setAttribute('src', 'about:blank');
972 replyCount++;
973 return;
974 } else if (replyCount == 1) {
975 embedder.test.fail();
976 return;
977 }
978 }
979 console.log('Unexpected message: \'' + data[0] + '\'');
980 embedder.test.fail();
981 });
982
983 webview.src = embedder.emptyGuestURL;
984 document.body.appendChild(webview);
985 }
986
987 function testAddContentScriptsWithNewWindowAPI() {
988 var webview = document.createElement('webview');
989
990 var newwebview;
991 webview.addEventListener('newwindow', function(e) {
992 e.preventDefault();
993 newwebview = document.createElement('webview');
994
995 console.log('Step 2: call newwebview.addContentScripts.');
996 newwebview.addContentScripts(
997 [{"name": 'myrule',
998 "matches": ["http://*/extensions/*"],
999 "js": ["inject_comm_channel.js"],
1000 "run_at": "document_start"}]);
1001
1002 newwebview.addEventListener('loadstop', function(evt) {
1003 var msg = ['connect'];
1004 console.log('Step 4: new webview postmessage to build communication ' +
1005 'channel.');
1006 newwebview.contentWindow.postMessage(JSON.stringify(msg), '*');
1007 });
1008
1009 document.body.appendChild(newwebview);
1010 // attach the new window to the new <webview>.
1011 console.log("Step 3: attaches the new webview.");
1012 e.window.attach(newwebview);
1013 });
1014
1015 window.addEventListener('message', function(e) {
1016 var data = JSON.parse(e.data);
1017 if (data == 'connected' && e.source == newwebview.contentWindow) {
1018 console.log('Step 5: a communication channel has been established ' +
1019 'with the new webview.');
1020 embedder.test.succeed();
1021 return;
1022 } else {
1023 embedder.test.fail();
1024 return;
1025 }
1026 console.log('unexpected message: \'' + data[0] + '\'');
1027 embedder.test.fail();
1028 });
1029
1030 console.log('Step 1: navigates the webview to window open guest URL.');
1031 webview.setAttribute('src', embedder.windowOpenGuestFromSameURL);
1032 document.body.appendChild(webview);
1033 }
1034
1035 function testContentScriptIsInjectedAfterTerminateAndReloadWebView() {
1036 var webview = document.createElement('webview');
1037
1038 console.log('Step 1: call <webview>.addContentScripts.');
1039 webview.addContentScripts(
1040 [{"name": 'myrule',
1041 "matches": ["http://*/extensions/*"],
1042 "js": ["inject_comm_channel.js"],
1043 "run_at": "document_start"}]);
1044
1045 var count = 0;
1046 webview.addEventListener('loadstop', function() {
1047 if (count == 0) {
1048 console.log('Step 2: call webview.terminate().');
1049 webview.terminate();
1050 ++count;
1051 return;
1052 } else if (count == 1) {
1053 console.log('Step 4: postMessage to build communication.');
1054 var msg = ['connect'];
1055 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
1056 ++count;
1057 }
1058 });
1059
1060 webview.addEventListener('exit', function() {
1061 console.log('Step 3: call webview.reload().');
1062 webview.reload();
1063 });
1064
1065 window.addEventListener('message', function(e) {
1066 var data = JSON.parse(e.data);
1067 if (data == 'connected') {
1068 console.log(
1069 'Step 5: A communication channel has been established with webview.');
1070 embedder.test.succeed();
1071 return;
1072 }
1073 console.log('Unexpected message: \'' + data[0] + '\'');
1074 embedder.test.fail();
1075 });
1076
1077 webview.src = embedder.emptyGuestURL;
1078 document.body.appendChild(webview);
1079 }
1080
1081 function testContentScriptExistsAsLongAsWebViewTagExists() {
1082 var webview = document.createElement('webview');
1083
1084 console.log('Step 1: call <webview>.addContentScripts.');
1085 webview.addContentScripts(
1086 [{"name": 'myrule',
1087 "matches": ["http://*/extensions/*"],
1088 "js": ["simple_script.js"],
1089 "run_at": "document_end"}]);
1090
1091 var count = 0;
1092 webview.addEventListener('loadstop', function() {
1093 if (count == 0) {
1094 console.log('Step 2: check the result of content script injected.');
1095 webview.executeScript({
1096 code: 'document.body.style.backgroundColor;'
1097 }, function(results) {
1098 embedder.test.assertEq(1, results.length);
1099 embedder.test.assertEq('red', results[0]);
1100 });
1101
1102 console.log('Step 3: remove webview from the DOM.');
1103 document.body.removeChild(webview);
1104
1105 console.log('Step 4: add webview back to the DOM.');
1106 document.body.appendChild(webview);
1107 ++count;
1108 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.
1109 } else if (count == 1) {
1110 webview.executeScript({
1111 code: 'document.body.style.backgroundColor;'
1112 }, function(results) {
1113 console.log('Step 5: check the result of content script injected' +
1114 ' again.');
1115 embedder.test.assertEq(1, results.length);
1116 embedder.test.assertEq('red', results[0]);
1117 embedder.test.succeed();
1118 });
1119 return;
1120 }
1121 });
1122
1123 webview.src = embedder.emptyGuestURL;
1124 document.body.appendChild(webview);
1125 }
1126
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
752 function testExecuteScriptFail() { 1127 function testExecuteScriptFail() {
753 var webview = document.createElement('webview'); 1128 var webview = document.createElement('webview');
754 document.body.appendChild(webview); 1129 document.body.appendChild(webview);
755 setTimeout(function() { 1130 setTimeout(function() {
756 webview.executeScript( 1131 webview.executeScript(
757 {code:'document.body.style.backgroundColor = "red";'}, 1132 {code:'document.body.style.backgroundColor = "red";'},
758 function(results) { 1133 function(results) {
759 embedder.test.fail(); 1134 embedder.test.fail();
760 }); 1135 });
761 setTimeout(function() { 1136 setTimeout(function() {
(...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after
2215 'testInvalidChromeExtensionURL': testInvalidChromeExtensionURL, 2590 'testInvalidChromeExtensionURL': testInvalidChromeExtensionURL,
2216 'testWebRequestAPIExistence': testWebRequestAPIExistence, 2591 'testWebRequestAPIExistence': testWebRequestAPIExistence,
2217 'testEventName': testEventName, 2592 'testEventName': testEventName,
2218 'testOnEventProperties': testOnEventProperties, 2593 'testOnEventProperties': testOnEventProperties,
2219 'testLoadProgressEvent': testLoadProgressEvent, 2594 'testLoadProgressEvent': testLoadProgressEvent,
2220 'testDestroyOnEventListener': testDestroyOnEventListener, 2595 'testDestroyOnEventListener': testDestroyOnEventListener,
2221 'testCannotMutateEventName': testCannotMutateEventName, 2596 'testCannotMutateEventName': testCannotMutateEventName,
2222 'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation, 2597 'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation,
2223 'testPartitionRemovalAfterNavigationFails': 2598 'testPartitionRemovalAfterNavigationFails':
2224 testPartitionRemovalAfterNavigationFails, 2599 testPartitionRemovalAfterNavigationFails,
2600 'testAddContentScript': testAddContentScript,
2601 'testAddMultipleContentScripts': testAddMultipleContentScripts,
2602 'testAddContentScriptWithSameNameShouldOverwriteTheExistingOne':
2603 testAddContentScriptWithSameNameShouldOverwriteTheExistingOne,
2604 'testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView':
2605 testAddContentScriptToOneWebViewShouldNotInjectToTheOtherWebView,
2606 'testAddAndRemoveContentScripts': testAddAndRemoveContentScripts,
2607 'testAddContentScriptsWithNewWindowAPI':
2608 testAddContentScriptsWithNewWindowAPI,
2609 'testContentScriptIsInjectedAfterTerminateAndReloadWebView':
2610 testContentScriptIsInjectedAfterTerminateAndReloadWebView,
2611 'testContentScriptExistsAsLongAsWebViewTagExists':
2612 testContentScriptExistsAsLongAsWebViewTagExists,
2225 'testExecuteScriptFail': testExecuteScriptFail, 2613 'testExecuteScriptFail': testExecuteScriptFail,
2226 'testExecuteScript': testExecuteScript, 2614 'testExecuteScript': testExecuteScript,
2227 'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged': 2615 'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged':
2228 testExecuteScriptIsAbortedWhenWebViewSourceIsChanged, 2616 testExecuteScriptIsAbortedWhenWebViewSourceIsChanged,
2229 'testTerminateAfterExit': testTerminateAfterExit, 2617 'testTerminateAfterExit': testTerminateAfterExit,
2230 'testAssignSrcAfterCrash': testAssignSrcAfterCrash, 2618 'testAssignSrcAfterCrash': testAssignSrcAfterCrash,
2231 'testNavOnConsecutiveSrcAttributeChanges': 2619 'testNavOnConsecutiveSrcAttributeChanges':
2232 testNavOnConsecutiveSrcAttributeChanges, 2620 testNavOnConsecutiveSrcAttributeChanges,
2233 'testNavOnSrcAttributeChange': testNavOnSrcAttributeChange, 2621 'testNavOnSrcAttributeChange': testNavOnSrcAttributeChange,
2234 'testReassignSrcAttribute': testReassignSrcAttribute, 2622 'testReassignSrcAttribute': testReassignSrcAttribute,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2281 'testPerViewZoomMode': testPerViewZoomMode, 2669 'testPerViewZoomMode': testPerViewZoomMode,
2282 'testDisabledZoomMode': testDisabledZoomMode, 2670 'testDisabledZoomMode': testDisabledZoomMode,
2283 }; 2671 };
2284 2672
2285 onload = function() { 2673 onload = function() {
2286 chrome.test.getConfig(function(config) { 2674 chrome.test.getConfig(function(config) {
2287 embedder.setUp_(config); 2675 embedder.setUp_(config);
2288 chrome.test.sendMessage("Launched"); 2676 chrome.test.sendMessage("Launched");
2289 }); 2677 });
2290 }; 2678 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698