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

Side by Side Diff: chrome/test/data/extensions/api_test/activity_log_private/friend/reply.js

Issue 19014003: Modifications to activity logging end to end tests. Reduces the number of window.open calls to make… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix things mentioned in review comments Created 7 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 defaultUrl = 'http://www.google.com'; 5 var defaultUrl = 'http://www.google.com';
6 6
7
8 // Utility function to open a URL in a new tab. If the useIncognito global is 7 // Utility function to open a URL in a new tab. If the useIncognito global is
9 // true, the URL is opened in a new incognito window, otherwise it is opened in 8 // true, the URL is opened in a new incognito window, otherwise it is opened in
10 // a new tab in the current window. Alternatively, whether to use incognito 9 // a new tab in the current window. Alternatively, whether to use incognito
11 // can be specified as a second argument which overrides the global setting. 10 // can be specified as a second argument which overrides the global setting.
12 var useIncognito = false; 11 var useIncognito = false;
13 function openTab(url, incognito) { 12 function openTab(url, incognito) {
14 if (incognito == undefined ? useIncognito : incognito) { 13 if (incognito == undefined ? useIncognito : incognito) {
15 chrome.windows.create({'url': url, 'incognito': true}); 14 chrome.windows.create({'url': url, 'incognito': true});
16 } else { 15 } else {
17 window.open(url); 16 window.open(url);
18 } 17 }
19 } 18 }
20 19
21 // CHROME API TEST METHODS -- PUT YOUR TESTS BELOW HERE 20 // CHROME API TEST METHODS -- PUT YOUR TESTS BELOW HERE
22 //////////////////////////////////////////////////////////////////////////////// 21 ////////////////////////////////////////////////////////////////////////////////
23 22
24 // Makes an API call. 23 // Makes an API call.
25 function makeApiCall() { 24 function makeApiCall() {
25 resetStatus();
26 chrome.cookies.set({ 26 chrome.cookies.set({
27 'url': 'https://www.cnn.com', 27 'url': 'https://www.cnn.com',
28 'name': 'activity_log_test_cookie', 28 'name': 'activity_log_test_cookie',
29 'value': 'abcdefg' 29 'value': 'abcdefg'
30 }); 30 });
31 setCompleted('makeApiCall'); 31 appendCompleted('makeApiCall');
32
32 } 33 }
33 34
34 // Makes an API call that has a custom binding. 35 // Makes an API call that has a custom binding.
35 function makeSpecialApiCalls() { 36 function makeSpecialApiCalls() {
37 resetStatus();
36 var url = chrome.extension.getURL('image/cat.jpg'); 38 var url = chrome.extension.getURL('image/cat.jpg');
37 var noparam = chrome.extension.getViews(); 39 var noparam = chrome.extension.getViews();
38 setCompleted('makeSpecialApiCalls'); 40 appendCompleted('makeSpecialApiCalls');
39 } 41 }
40 42
41 // Checks that we don't double-log calls that go through setHandleRequest 43 // Checks that we don't double-log calls that go through setHandleRequest
42 // *and* the ExtensionFunction machinery. 44 // *and* the ExtensionFunction machinery.
43 function checkNoDoubleLogging() { 45 function checkNoDoubleLogging() {
46 resetStatus();
44 chrome.omnibox.setDefaultSuggestion({description: 'hello world'}); 47 chrome.omnibox.setDefaultSuggestion({description: 'hello world'});
45 setCompleted('checkNoDoubleLogging'); 48 appendCompleted('checkNoDoubleLogging');
46 } 49 }
47 50
48 // Check whether we log calls to chrome.app.*; 51 // Check whether we log calls to chrome.app.*;
49 function checkAppCalls() { 52 function checkAppCalls() {
53 resetStatus();
50 var callback = function() {}; 54 var callback = function() {};
51 chrome.app.getDetails(); 55 chrome.app.getDetails();
52 var b = chrome.app.isInstalled; 56 var b = chrome.app.isInstalled;
53 var c = chrome.app.installState(callback); 57 var c = chrome.app.installState(callback);
54 setCompleted('checkAppCalls'); 58 appendCompleted('checkAppCalls');
55 } 59 }
56 60
57 // Makes an API call that the extension doesn't have permission for. 61 // Makes an API call that the extension doesn't have permission for.
58 // Don't add the management permission or this test won't test the code path. 62 // Don't add the management permission or this test won't test the code path.
59 function makeBlockedApiCall() { 63 function makeBlockedApiCall() {
64 resetStatus();
60 try { 65 try {
61 var allExtensions = chrome.management.getAll(); 66 var allExtensions = chrome.management.getAll();
62 } catch (err) { } 67 } catch (err) { }
63 setCompleted('makeBlockedApiCall'); 68 appendCompleted('makeBlockedApiCall');
64 } 69 }
65 70
66 // Injects a content script. 71 function callObjectMethod() {
67 function injectContentScript() { 72 resetStatus();
68 chrome.tabs.onUpdated.addListener( 73 var storageArea = chrome.storage.sync;
69 function callback(tabId, changeInfo, tab) { 74 storageArea.clear();
70 if (changeInfo['status'] === 'complete' && 75 appendCompleted('callObjectMethod');
71 tab.url.match(/google\.com/g)) {
72 chrome.tabs.onUpdated.removeListener(callback);
73 chrome.tabs.executeScript(
74 tab.id,
75 {'file': 'google_cs.js'},
76 function() {
77 chrome.tabs.remove(tabId);
78 setCompleted('injectContentScript');
79 });
80 }
81 }
82 );
83 openTab(defaultUrl);
84 }
85
86 // Injects a blob of script into a page.
87 function injectScriptBlob() {
88 chrome.tabs.onUpdated.addListener(
89 function callback(tabId, changeInfo, tab) {
90 if (changeInfo['status'] === 'complete' &&
91 tab.url.match(/google\.com/g)) {
92 chrome.tabs.onUpdated.removeListener(callback);
93 chrome.tabs.executeScript(
94 tab.id,
95 {'code': 'document.write("g o o g l e");'},
96 function() {
97 chrome.tabs.remove(tabId);
98 setCompleted('injectScriptBlob');
99 });
100 }
101 }
102 );
103 openTab(defaultUrl);
104 } 76 }
105 77
106 // Modifies the headers sent and received in an HTTP request using the 78 // Modifies the headers sent and received in an HTTP request using the
107 // webRequest API. 79 // webRequest API.
108 function doWebRequestModifications() { 80 function doWebRequestModifications() {
81 resetStatus();
109 // Install a webRequest handler that will add an HTTP header to the outgoing 82 // Install a webRequest handler that will add an HTTP header to the outgoing
110 // request for the main page. 83 // request for the main page.
111 function doModifyHeaders(details) { 84 function doModifyHeaders(details) {
112 var response = {}; 85 var response = {};
113 86
114 var headers = details.requestHeaders; 87 var headers = details.requestHeaders;
115 if (headers === undefined) { 88 if (headers === undefined) {
116 headers = []; 89 headers = [];
117 } 90 }
118 headers.push({'name': 'X-Test-Activity-Log-Send', 91 headers.push({'name': 'X-Test-Activity-Log-Send',
(...skipping 23 matching lines...) Expand all
142 {'urls': ['http://*/*'], 'types': ['main_frame']}, 115 {'urls': ['http://*/*'], 'types': ['main_frame']},
143 ['blocking', 'responseHeaders']); 116 ['blocking', 'responseHeaders']);
144 117
145 // Open a tab, then close it when it has finished loading--this should give 118 // Open a tab, then close it when it has finished loading--this should give
146 // the webRequest handler a chance to run. 119 // the webRequest handler a chance to run.
147 chrome.tabs.onUpdated.addListener( 120 chrome.tabs.onUpdated.addListener(
148 function closeTab(tabId, changeInfo, tab) { 121 function closeTab(tabId, changeInfo, tab) {
149 if (changeInfo['status'] === 'complete' && 122 if (changeInfo['status'] === 'complete' &&
150 tab.url.match(/google\.com/g)) { 123 tab.url.match(/google\.com/g)) {
151 chrome.webRequest.onBeforeSendHeaders.removeListener(doModifyHeaders); 124 chrome.webRequest.onBeforeSendHeaders.removeListener(doModifyHeaders);
152 // TODO(karenlees): you added this line in debugging, make sure it is
153 // really needed.
154 chrome.webRequest.onHeadersReceived.removeListener(doModifyHeaders); 125 chrome.webRequest.onHeadersReceived.removeListener(doModifyHeaders);
155 chrome.tabs.onUpdated.removeListener(closeTab); 126 chrome.tabs.onUpdated.removeListener(closeTab);
156 chrome.tabs.remove(tabId); 127 chrome.tabs.remove(tabId);
157 setCompleted('doWebRequestModifications'); 128 appendCompleted('doWebRequestModifications');
158 } 129 }
159 } 130 }
160 ); 131 );
161 openTab(defaultUrl);
162 }
163
164 function getSetObjectProperties() {
165 chrome.tabs.onUpdated.addListener(
166 function getTabProperties(tabId, changeInfo, tab) {
167 if (changeInfo['status'] === 'complete' &&
168 tab.url.match(/google\.com/g)) {
169 console.log(tab.id + ' ' + tab.index + ' ' + tab.url);
170 tab.index = 3333333333333333333;
171 chrome.tabs.onUpdated.removeListener(getTabProperties);
172 chrome.tabs.remove(tabId);
173 setCompleted('getSetObjectProperties');
174 }
175 }
176 );
177 openTab(defaultUrl);
178 }
179
180 function callObjectMethod() {
181 var storageArea = chrome.storage.sync;
182 storageArea.clear();
183 setCompleted('callObjectMethod()');
184 }
185
186 function sendMessageToCS() {
187 chrome.tabs.onUpdated.addListener(
188 function messageCS(tabId, changeInfo, tab) {
189 if (changeInfo['status'] === 'complete' &&
190 tab.url.match(/google\.com/g)) {
191 chrome.tabs.sendMessage(tabId, 'hellooooo!');
192 chrome.tabs.onUpdated.removeListener(messageCS);
193 chrome.tabs.remove(tabId);
194 setCompleted('sendMessageToCS');
195 }
196 }
197 );
198 openTab(defaultUrl); 132 openTab(defaultUrl);
199 } 133 }
200 134
201 function sendMessageToSelf() { 135 function sendMessageToSelf() {
136 resetStatus();
202 try { 137 try {
203 chrome.runtime.sendMessage('hello hello'); 138 chrome.runtime.sendMessage('hello hello');
204 setCompleted('sendMessageToSelf'); 139 appendCompleted('sendMessageToSelf');
205 } catch (err) { 140 } catch (err) {
206 setError(err + ' in function: sendMessageToSelf'); 141 setError(err + ' in function: sendMessageToSelf');
207 } 142 }
208 } 143 }
209 144
210 function sendMessageToOther() { 145 function sendMessageToOther() {
146 resetStatus();
211 try { 147 try {
212 chrome.runtime.sendMessage('ocacnieaapoflmkebkeaidpgfngocapl', 148 chrome.runtime.sendMessage('ocacnieaapoflmkebkeaidpgfngocapl',
213 'knock knock', 149 'knock knock',
214 function response() { 150 function response() {
215 console.log("who's there?"); 151 console.log("who's there?");
152 appendCompleted('sendMessageToOther');
216 }); 153 });
217 setCompleted('sendMessageToOther');
218 } catch (err) { 154 } catch (err) {
219 setError(err + ' in function: sendMessageToOther'); 155 setError(err + ' in function: sendMessageToOther');
220 } 156 }
221 } 157 }
222 158
223 function connectToOther() { 159 function connectToOther() {
160 resetStatus();
224 try { 161 try {
225 chrome.runtime.connect('ocacnieaapoflmkebkeaidpgfngocapl'); 162 chrome.runtime.connect('ocacnieaapoflmkebkeaidpgfngocapl');
226 setCompleted('connectToOther'); 163 appendCompleted('connectToOther');
227 } catch (err) { 164 } catch (err) {
228 setError(err + ' in function:connectToOther'); 165 setError(err + ' in function:connectToOther');
229 } 166 }
230 } 167 }
231 168
232 function tabIdTranslation() { 169 function tabIdTranslation() {
170 resetStatus();
233 var tabIds = [-1, -1]; 171 var tabIds = [-1, -1];
234 172
235 // Test the case of a single int 173 // Test the case of a single int
236 chrome.tabs.onUpdated.addListener( 174 chrome.tabs.onUpdated.addListener(
237 function testSingleInt(tabId, changeInfo, tab) { 175 function testSingleInt(tabId, changeInfo, tab) {
238 if (changeInfo['status'] === 'complete' && 176 if (changeInfo['status'] === 'complete' &&
239 tab.url.match(/google\.com/g)) { 177 tab.url.match(/google\.com/g)) {
240 chrome.tabs.executeScript( 178 chrome.tabs.executeScript(
241 //tab.id, 179 tabId,
242 {'file': 'google_cs.js'}, 180 {'file': 'google_cs.js'},
243 function() { 181 function() {
244 chrome.tabs.onUpdated.removeListener(testSingleInt); 182 chrome.tabs.onUpdated.removeListener(testSingleInt);
245 tabIds[0] = tabId; 183 tabIds[0] = tabId;
246 openTab('http://www.google.be'); 184 openTab('http://www.google.be');
247 }); 185 });
248 } 186 }
249 } 187 }
250 ); 188 );
251 189
252 // Test the case of arrays 190 // Test the case of arrays
253 chrome.tabs.onUpdated.addListener( 191 chrome.tabs.onUpdated.addListener(
254 function testArray(tabId, changeInfo, tab) { 192 function testArray(tabId, changeInfo, tab) {
255 if (changeInfo['status'] === 'complete' && tab.url.match(/google\.be/g)) { 193 if (changeInfo['status'] === 'complete' && tab.url.match(/google\.be/g)) {
256 //chrome.tabs.move(tabId, {'index': -1}); 194 chrome.tabs.move(tabId, {'index': -1});
257 tabIds[1] = tabId; 195 tabIds[1] = tabId;
258 chrome.tabs.onUpdated.removeListener(testArray); 196 chrome.tabs.onUpdated.removeListener(testArray);
259 chrome.tabs.remove(tabIds); 197 chrome.tabs.remove(tabIds);
260 setCompleted('tabIdTranslation'); 198 appendCompleted('tabIdTranslation');
261 } 199 }
262 } 200 }
263 ); 201 );
264 202
265 openTab(defaultUrl); 203 openTab(defaultUrl);
266 } 204 }
267 205
268 // DOM API TEST METHODS -- PUT YOUR TESTS BELOW HERE 206 function executeApiCallsOnTabUpdated() {
269 //////////////////////////////////////////////////////////////////////////////// 207 resetStatus();
270
271 // Does an XHR from this [privileged] context.
272 function doBackgroundXHR() {
273 var request = new XMLHttpRequest();
274 request.open('POST', defaultUrl, false);
275 request.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');
276 try {
277 request.send();
278 } catch (err) {
279 // doesn't matter if it works or not; should be recorded either way
280 }
281 setCompleted('doBackgroundXHR');
282 }
283
284 // Does an XHR from inside a content script.
285 function doContentScriptXHR() {
286 var code = 'var request = new XMLHttpRequest(); ' +
287 'request.open("POST", "http://www.cnn.com", false); ' +
288 'request.setRequestHeader("Content-type", ' +
289 ' "text/plain;charset=UTF-8"); ' +
290 'request.send(); ' +
291 'document.write("sent an XHR");';
292 chrome.tabs.onUpdated.addListener( 208 chrome.tabs.onUpdated.addListener(
293 function callback(tabId, changeInfo, tab) { 209 function callback(tabId, changeInfo, tab) {
294 if (changeInfo['status'] === 'complete' && 210 if (changeInfo['status'] === 'complete' &&
295 tab.url.match(/google\.com/g)) { 211 tab.url.match(/google\.com/g)) {
296 chrome.tabs.onUpdated.removeListener(callback); 212 chrome.tabs.onUpdated.removeListener(callback);
213
214 // Send a message.
215 chrome.tabs.sendMessage(tabId, 'hellooooo!');
216 appendCompleted('sendMessageToCS');
217
218 // Inject a content script
297 chrome.tabs.executeScript( 219 chrome.tabs.executeScript(
298 tab.id, 220 tab.id,
299 {'code': code}, 221 {'file': 'google_cs.js'},
300 function() { 222 function() {
223 appendCompleted('injectContentScript');
224 });
225
226 // Injects a blob of script into a page and cleans up the tab when
227 // finished.
228 chrome.tabs.executeScript(
229 tab.id,
230 {'code': 'document.write("g o o g l e");'},
231 function() {
232 appendCompleted('injectScriptBlob');
301 chrome.tabs.remove(tabId); 233 chrome.tabs.remove(tabId);
302 setCompleted('doContentScriptXHR');
303 }); 234 });
304 } 235 }
305 } 236 }
306 );
307 openTab(defaultUrl);
308 }
309
310 // Accesses the Location object from inside a content script.
311 function doLocationAccess() {
312 var code = 'window.location = "http://www.google.com/#foo"; ' +
313 'document.location = "http://www.google.com/#bar"; ' +
314 'var loc = window.location; ' +
315 'loc.assign("http://www.google.com/#fo"); ' +
316 'loc.replace("http://www.google.com/#bar");';
317 chrome.tabs.onUpdated.addListener(
318 function callback(tabId, changeInfo, tab) {
319 if (changeInfo['status'] === 'complete' &&
320 tab.url.match(/google\.com/g)) {
321 chrome.tabs.onUpdated.removeListener(callback);
322 chrome.tabs.executeScript(
323 tab.id,
324 {'code': code},
325 function() {
326 chrome.tabs.remove(tabId);
327 setCompleted('doLoctionAccess');
328 });
329 }
330 }
331 );
332 openTab(defaultUrl);
333 }
334
335 // Mutates the DOM tree from inside a content script.
336 function doDOMMutation1() {
337 var code = 'var d1 = document.createElement("div"); ' +
338 'var d2 = document.createElement("div"); ' +
339 'document.body.appendChild(d1); ' +
340 'document.body.insertBefore(d2, d1); ' +
341 'document.body.replaceChild(d1, d2);';
342 chrome.tabs.onUpdated.addListener(
343 function callback(tabId, changeInfo, tab) {
344 if (changeInfo['status'] === 'complete' &&
345 tab.url.match(/google\.com/g)) {
346 chrome.tabs.onUpdated.removeListener(callback);
347 chrome.tabs.executeScript(
348 tab.id,
349 {'code': code},
350 function() {
351 chrome.tabs.remove(tabId);
352 setCompleted('doDOMMutation1');
353 });
354 }
355 }
356 );
357 openTab(defaultUrl);
358 }
359
360 function doDOMMutation2() {
361 var code = 'document.write("Hello using document.write"); ' +
362 'document.writeln("Hello using document.writeln"); ' +
363 'document.body.innerHTML = "Hello using innerHTML";';
364 chrome.tabs.onUpdated.addListener(
365 function callback(tabId, changeInfo, tab) {
366 if (changeInfo['status'] === 'complete' &&
367 tab.url.match(/google\.com/g)) {
368 chrome.tabs.onUpdated.removeListener(callback);
369 chrome.tabs.executeScript(
370 tab.id,
371 {'code': code},
372 function() {
373 chrome.tabs.remove(tabId);
374 setCompleted('doDOMMutation2');
375 });
376 }
377 }
378 );
379 openTab(defaultUrl);
380 }
381
382 // Accesses the HTML5 Navigator API from inside a content script.
383 function doNavigatorAPIAccess() {
384 var code = 'var geo = navigator.geolocation; ' +
385 'var successCallback = function(x) { }; ' +
386 'var errorCallback = function(x) { }; ' +
387 'geo.getCurrentPosition(successCallback, errorCallback); ';
388 'var id = geo.watchPosition(successCallback, errorCallback);';
389 chrome.tabs.onUpdated.addListener(
390 function callback(tabId, changeInfo, tab) {
391 if (changeInfo['status'] === 'complete' &&
392 tab.url.match(/google\.com/g)) {
393 chrome.tabs.onUpdated.removeListener(callback);
394 chrome.tabs.executeScript(
395 tab.id,
396 {'code': code},
397 function() {
398 chrome.tabs.remove(tabId);
399 setCompleted('doNavigatorAPIAccess');
400 });
401 }
402 }
403 );
404 openTab(defaultUrl);
405 }
406
407 // Accesses the HTML5 WebStorage API from inside a content script.
408 function doWebStorageAPIAccess1() {
409 var code = 'var store = window.sessionStorage; ' +
410 'store.setItem("foo", 42); ' +
411 'var val = store.getItem("foo"); ' +
412 'store.removeItem("foo"); ' +
413 'store.clear();';
414 chrome.tabs.onUpdated.addListener(
415 function callback(tabId, changeInfo, tab) {
416 if (changeInfo['status'] === 'complete' &&
417 tab.url.match(/google\.com/g)) {
418 chrome.tabs.onUpdated.removeListener(callback);
419 chrome.tabs.executeScript(
420 tab.id,
421 {'code': code},
422 function() {
423 chrome.tabs.remove(tabId);
424 setCompleted('doWebStorageAPIAccess1');
425 });
426 }
427 }
428 );
429 openTab(defaultUrl);
430 }
431
432 function doWebStorageAPIAccess2() {
433 var code = 'var store = window.sessionStorage; ' +
434 'store.setItem("foo", 42); ' +
435 'var val = store.getItem("foo"); ' +
436 'store.removeItem("foo"); ' +
437 'store.clear();';
438 chrome.tabs.onUpdated.addListener(
439 function callback(tabId, changeInfo, tab) {
440 if (changeInfo['status'] === 'complete' &&
441 tab.url.match(/google\.com/g)) {
442 chrome.tabs.onUpdated.removeListener(callback);
443 chrome.tabs.executeScript(
444 tab.id,
445 {'code': code},
446 function() {
447 chrome.tabs.remove(tabId);
448 setCompleted('doWebStorageAPIAccess2');
449 });
450 }
451 }
452 ); 237 );
453 openTab(defaultUrl); 238 openTab(defaultUrl);
454 } 239 }
455 240
456 // Accesses the HTML5 Notification API from inside a content script. 241
457 function doNotificationAPIAccess() { 242 // DOM API TEST METHODS -- PUT YOUR TESTS BELOW HERE
458 var code = 'try {' + 243 ////////////////////////////////////////////////////////////////////////////////
459 ' webkitNotifications.createNotification("myIcon.png", ' + 244
460 ' "myTitle", ' + 245 // Does an XHR from this [privileged] context.
461 ' "myContent");' + 246 function doBackgroundXHR() {
462 '} catch (e) {}'; 247 resetStatus();
463 chrome.tabs.onUpdated.addListener( 248 var request = new XMLHttpRequest();
464 function callback(tabId, changeInfo, tab) { 249 request.open('POST', defaultUrl, false);
465 if (changeInfo['status'] === 'complete' && 250 request.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');
466 tab.url.match(/google\.com/g)) { 251 try {
467 chrome.tabs.onUpdated.removeListener(callback); 252 request.send();
468 chrome.tabs.executeScript( 253 } catch (err) {
469 tab.id, 254 // doesn't matter if it works or not; should be recorded either way
470 {'code': code}, 255 }
471 function() { 256 appendCompleted('doBackgroundXHR');
472 chrome.tabs.remove(tabId);
473 setCompleted('doNotifcationAPIAccess');
474 });
475 }
476 }
477 );
478 openTab(defaultUrl);
479 } 257 }
480 258
481 // Accesses the HTML5 ApplicationCache API from inside a content script. 259 function executeDOMChangesOnTabUpdated() {
482 function doApplicationCacheAPIAccess() { 260 resetStatus();
483 var code = 'var appCache = window.applicationCache;'; 261 code = '';
262
263 // Accesses the Location object from inside a content script.
264 code += 'window.location = "http://www.google.com/#foo"; ' +
265 'document.location = "http://www.google.com/#bar"; ' +
266 'var loc = window.location; ' +
267 'loc.assign("http://www.google.com/#fo"); ' +
268 'loc.replace("http://www.google.com/#bar");';
269
270 // Mutates the DOM tree from inside a content script.
271 code += 'var d1 = document.createElement("div"); ' +
272 'var d2 = document.createElement("div"); ' +
273 'document.body.appendChild(d1); ' +
274 'document.body.insertBefore(d2, d1); ' +
275 'document.body.replaceChild(d1, d2);';
276
277 code += 'document.write("Hello using document.write"); ' +
278 'document.writeln("Hello using document.writeln"); ' +
279 'document.body.innerHTML = "Hello using innerHTML";';
280
281 // Accesses the HTML5 Navigator API from inside a content script.
282 code += 'var geo = navigator.geolocation; ' +
283 'var successCallback = function(x) { }; ' +
284 'var errorCallback = function(x) { }; ' +
285 'geo.getCurrentPosition(successCallback, errorCallback); ' +
286 'var id = geo.watchPosition(successCallback, errorCallback);';
287
288 // Accesses the HTML5 WebStorage API from inside a content script.
289 code += 'var store = window.sessionStorage; ' +
290 'store.setItem("foo", 42); ' +
291 'var val = store.getItem("foo"); ' +
292 'store.removeItem("foo"); ' +
293 'store.clear();';
294 code += 'var store = window.sessionStorage; ' +
295 'store.setItem("foo", 42); ' +
296 'var val = store.getItem("foo"); ' +
297 'store.removeItem("foo"); ' +
298 'store.clear();';
299
300 // Accesses the HTML5 Notification API from inside a content script.
301 code += 'try {' +
302 ' webkitNotifications.createNotification("myIcon.png", ' +
303 ' "myTitle", ' +
304 ' "myContent");' +
305 '} catch (e) {}';
306
307 // Accesses the HTML5 ApplicationCache API from inside a content script.
308 code += 'var appCache = window.applicationCache;';
309
310 // Accesses the HTML5 WebDatabase API from inside a content script.
311 code += 'var db = openDatabase("testdb", "1.0", "test database", ' +
312 ' 1024 * 1024);';
313
314 // Accesses the HTML5 Canvas API from inside a content script.
315 code += 'var testCanvas = document.createElement("canvas"); ' +
316 'var testContext = testCanvas.getContext("2d");';
317
318 // Does an XHR from inside a content script.
319 code += 'var request = new XMLHttpRequest(); ' +
320 'request.open("POST", "http://www.cnn.com", false); ' +
321 'request.setRequestHeader("Content-type", ' +
322 ' "text/plain;charset=UTF-8"); ' +
323 'request.send(); ' +
324 'document.write("sent an XHR");';
felt 2013/07/11 19:44:20 I don't think the document.write is needed here an
karenlees 2013/07/11 21:25:21 Done.
325
484 chrome.tabs.onUpdated.addListener( 326 chrome.tabs.onUpdated.addListener(
485 function callback(tabId, changeInfo, tab) { 327 function callback(tabId, changeInfo, tab) {
486 if (changeInfo['status'] === 'complete' && 328 if (changeInfo['status'] === 'complete' &&
487 tab.url.match(/google\.com/g)) { 329 tab.url.match(/google\.com/g)) {
488 chrome.tabs.onUpdated.removeListener(callback); 330 chrome.tabs.onUpdated.removeListener(callback);
489 chrome.tabs.executeScript( 331 chrome.tabs.executeScript(
490 tab.id, 332 tabId, {'code': code},
491 {'code': code}, 333 function() {
492 function() { 334 chrome.tabs.remove(tabId);
493 chrome.tabs.remove(tabId); 335 appendCompleted('executeDOMChangesOnTabUpdated');
494 setCompleted('doApplictionCacheAPIAccess'); 336 });
495 });
496 } 337 }
497 } 338 }
498 ); 339 );
499 openTab(defaultUrl);
500 }
501
502 // Accesses the HTML5 WebDatabase API from inside a content script.
503 function doWebDatabaseAPIAccess() {
504 var code = 'var db = openDatabase("testdb", "1.0", "test database", ' +
505 ' 1024 * 1024);';
506 chrome.tabs.onUpdated.addListener(
507 function callback(tabId, changeInfo, tab) {
508 if (changeInfo['status'] === 'complete' &&
509 tab.url.match(/google\.com/g)) {
510 chrome.tabs.onUpdated.removeListener(callback);
511 chrome.tabs.executeScript(
512 tab.id,
513 {'code': code},
514 function() {
515 chrome.tabs.remove(tabId);
516 setCompleted('doWebDatabaseAPIAccess');
517 });
518 }
519 }
520 );
521 openTab(defaultUrl);
522 }
523
524 // Accesses the HTML5 Canvas API from inside a content script.
525 function doCanvasAPIAccess() {
526 var code = 'var testCanvas = document.createElement("canvas"); ' +
527 'var testContext = testCanvas.getContext("2d");';
528 chrome.tabs.onUpdated.addListener(
529 function callback(tabId, changeInfo, tab) {
530 if (changeInfo['status'] === 'complete' &&
531 tab.url.match(/google\.com/g)) {
532 chrome.tabs.onUpdated.removeListener(callback);
533 chrome.tabs.executeScript(
534 tab.id,
535 {'code': code},
536 function() {
537 chrome.tabs.remove(tabId);
538 setCompleted('doCanvasAPIAccess');
539 });
540 }
541 }
542 );
543 openTab(defaultUrl); 340 openTab(defaultUrl);
544 } 341 }
545 342
546 // ADD TESTS CASES TO THE MAP HERE. 343 // ADD TESTS CASES TO THE MAP HERE.
547 var fnMap = {}; 344 var fnMap = {};
548 fnMap['api_call'] = makeApiCall; 345 fnMap['api_call'] = makeApiCall;
549 fnMap['special_call'] = makeSpecialApiCalls; 346 fnMap['special_call'] = makeSpecialApiCalls;
550 fnMap['blocked_call'] = makeBlockedApiCall;
551 fnMap['inject_cs'] = injectContentScript;
552 fnMap['inject_blob'] = injectScriptBlob;
553 fnMap['webrequest'] = doWebRequestModifications;
554 fnMap['double'] = checkNoDoubleLogging; 347 fnMap['double'] = checkNoDoubleLogging;
555 fnMap['app_bindings'] = checkAppCalls; 348 fnMap['app_bindings'] = checkAppCalls;
556 fnMap['object_properties'] = getSetObjectProperties; 349 fnMap['blocked_call'] = makeBlockedApiCall;
557 fnMap['object_methods'] = callObjectMethod; 350 fnMap['object_methods'] = callObjectMethod;
558 fnMap['message_cs'] = sendMessageToCS;
559 fnMap['message_self'] = sendMessageToSelf; 351 fnMap['message_self'] = sendMessageToSelf;
560 fnMap['message_other'] = sendMessageToOther; 352 fnMap['message_other'] = sendMessageToOther;
561 fnMap['connect_other'] = connectToOther; 353 fnMap['connect_other'] = connectToOther;
354 fnMap['background_xhr'] = doBackgroundXHR;
355 fnMap['webrequest'] = doWebRequestModifications;
562 fnMap['tab_ids'] = tabIdTranslation; 356 fnMap['tab_ids'] = tabIdTranslation;
563 fnMap['background_xhr'] = doBackgroundXHR; 357 fnMap['dom_tab_updated'] = executeDOMChangesOnTabUpdated;
564 fnMap['cs_xhr'] = doContentScriptXHR; 358 fnMap['api_tab_updated'] = executeApiCallsOnTabUpdated;
565 fnMap['location_access'] = doLocationAccess;
566 fnMap['dom_mutation1'] = doDOMMutation1;
567 fnMap['dom_mutation2'] = doDOMMutation2;
568 fnMap['navigator_access'] = doNavigatorAPIAccess;
569 fnMap['web_storage_access1'] = doWebStorageAPIAccess1;
570 fnMap['web_storage_access2'] = doWebStorageAPIAccess2;
571 fnMap['notification_access'] = doNotificationAPIAccess;
572 fnMap['application_cache_access'] = doApplicationCacheAPIAccess;
573 fnMap['web_database_access'] = doWebDatabaseAPIAccess;
574 fnMap['canvas_access'] = doCanvasAPIAccess;
575 359
576 // Setup function mapping for the automated tests. 360 // Setup function mapping for the automated tests.
577 try { 361 try {
578 chrome.runtime.onMessageExternal.addListener( 362 chrome.runtime.onMessageExternal.addListener(
579 function(message, sender, response) { 363 function(message, sender, response) {
580 useIncognito = false; 364 useIncognito = false;
581 if (message.match(/_incognito$/)) { 365 if (message.match(/_incognito$/)) {
582 // Enable incognito windows for this test, then strip the _incognito 366 // Enable incognito windows for this test, then strip the _incognito
583 // suffix for the lookup below. 367 // suffix for the lookup below.
584 useIncognito = true; 368 useIncognito = true;
585 message = message.slice(0, -10); 369 message = message.slice(0, -10);
586 } 370 }
587 if (fnMap.hasOwnProperty(message)) { 371 if (fnMap.hasOwnProperty(message)) {
588 fnMap[message](); 372 fnMap[message]();
589 } else { 373 } else {
590 console.log('UNKNOWN METHOD: ' + message); 374 console.log('UNKNOWN METHOD: ' + message);
591 } 375 }
592 } 376 }
593 ); 377 );
594 } catch (err) { 378 } catch (err) {
595 console.log('Error while adding listeners: ' + err); 379 console.log('Error while adding listeners: ' + err);
596 } 380 }
597 381
598 // Convenience functions for the manual run mode. 382 // Convenience functions for the manual run mode.
599 function $(o) { 383 function $(o) {
600 return document.getElementById(o); 384 return document.getElementById(o);
601 } 385 }
602 386
603 var completed = 0; 387 var completed = 0;
604 function setCompleted(str) { 388 function resetStatus(str) {
605 completed++; 389 completed = 0;
606 if ($('status') != null) { 390 if ($('status') != null) {
607 $('status').innerText = 'Completed ' + str; 391 $('status').innerText = '';
608 } 392 }
609 console.log('[SUCCESS] ' + str);
610 } 393 }
611 394
612 function setError(str) { 395 function appendCompleted(str) {
613 $('status').innerText = 'Error: ' + str; 396 if ($('status') != null) {
397 if (completed > 0) {
398 $('status').innerText += ', ' + str;
399 } else {
400 $('status').innerText = 'Completed: ' + str;
401 }
402 }
403 completed += 1;
404 console.log('Completed ' + str);
405 }
406
407 function appendError(str) {
408 if ($('status') != null) {
409 $('status').innerText += 'Error: ' + str;
410 }
614 } 411 }
615 412
616 // Set up the event listeners for use in manual run mode. 413 // Set up the event listeners for use in manual run mode.
617 function setupEvents() { 414 function setupEvents() {
618 for (var key in fnMap) { 415 for (var key in fnMap) {
619 if (fnMap.hasOwnProperty(key) && key != '' && $(key) != null) { 416 if (fnMap.hasOwnProperty(key) && key != '' && $(key) != null) {
620 $(key).addEventListener('click', fnMap[key]); 417 $(key).addEventListener('click', fnMap[key]);
621 } 418 }
622 } 419 }
623 $('incognito_checkbox').addEventListener( 420 if ($('incognito_checkbox' != null)) {
624 'click', 421 $('incognito_checkbox').addEventListener(
625 function() { useIncognito = $('incognito_checkbox').checked; }); 422 'click',
626 setCompleted('setup events'); 423 function() { useIncognito = $('incognito_checkbox').checked; });
424 }
627 completed = 0; 425 completed = 0;
426 appendCompleted('setup events');
628 } 427 }
629 document.addEventListener('DOMContentLoaded', setupEvents); 428 document.addEventListener('DOMContentLoaded', setupEvents);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698