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
3 // found in the LICENSE file.
5 // The extension ID for the .../activity_log_private/friend extension, which
6 // this extension communicates with. This should correspond to the public key
7 // defined in .../activity_log_private/friend/manifest.json.
8 var FRIEND_EXTENSION_ID = 'pknkgggnfecklokoggaggchhaebkajji';
10 // Setup the test cases.
13 func: function triggerApiCall() {
14 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
15 'api_call', function response() { });
17 expected_activity: ['cookies.set']
20 func: function triggerSpecialCall() {
21 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
22 'special_call', function response() { });
30 func: function triggerDouble() {
31 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
32 'double', function response() {});
34 expected_activity: ['omnibox.setDefaultSuggestion']
37 func: function triggerAppBindings() {
38 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
39 'app_bindings', function response() { });
48 func: function triggerObjectMethods() {
49 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
50 'object_methods', function response() { });
52 expected_activity: ['storage.clear']
55 func: function triggerMessageSelf() {
56 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
57 'message_self', function response() { });
65 func: function triggerMessageOther() {
66 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
67 'message_other', function response() { });
75 func: function triggerConnectOther() {
76 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
77 'connect_other', function response() { });
79 expected_activity: ['runtime.connect']
82 func: function triggerBackgroundXHR() {
83 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
84 'background_xhr', function response() { });
87 'XMLHttpRequest.open',
88 'XMLHttpRequest.setRequestHeader'
92 func: function triggerTabIds() {
93 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
94 'tab_ids', function response() { });
107 func: function triggerTabIdsIncognito() {
108 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
109 'tab_ids_incognito', function response() { });
116 'tabs.executeScript',
126 func: function triggerWebRequest() {
127 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
128 'webrequest', function response() { });
131 'webRequestInternal.addEventListener',
132 'webRequestInternal.addEventListener',
133 'webRequest.onBeforeSendHeaders/1',
134 'webRequestInternal.eventHandled',
135 'webRequest.onBeforeSendHeaders',
136 'webRequest.onHeadersReceived/2',
137 'webRequestInternal.eventHandled',
138 'webRequest.onHeadersReceived',
146 func: function triggerWebRequestIncognito() {
147 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
148 'webrequest_incognito', function response() { });
152 'webRequestInternal.addEventListener',
153 'webRequestInternal.addEventListener',
155 'webRequest.onBeforeSendHeaders/3',
156 'webRequestInternal.eventHandled',
157 'webRequest.onBeforeSendHeaders',
158 'webRequest.onHeadersReceived/4',
159 'webRequestInternal.eventHandled',
160 'webRequest.onHeadersReceived',
168 func: function triggerApiCallsOnTabsUpdated() {
169 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
170 'api_tab_updated', function response() { });
177 'tabs.executeScript',
178 'tabs.executeScript',
179 'HTMLDocument.write',
184 func: function triggerApiCallsOnTabsUpdatedIncognito() {
185 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
186 'api_tab_updated_incognito',
187 function response() { });
196 'tabs.executeScript',
197 'tabs.executeScript',
198 'HTMLDocument.write',
203 func: function triggerFullscreen() {
204 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
205 'launch_dom_fullscreen',
206 function response() { });
211 'Element.webkitRequestFullscreen'
215 var domExpectedActivity = [
218 'tabs.executeScript',
226 'Document.createElement',
227 'Document.createElement',
231 //'Document.location',
232 'HTMLDocument.write',
233 'HTMLDocument.writeln',
237 'Geolocation.getCurrentPosition',
238 'Geolocation.watchPosition',
239 // Web store access - session storage
240 'Window.sessionStorage',
243 'Storage.removeItem',
245 // Web store access - local storage
246 'Window.localStorage',
249 'Storage.removeItem',
251 // Notification access
252 'Window.webkitNotifications',
253 'NotificationCenter.createNotification',
255 'Window.applicationCache',
256 // Web database access
257 'Window.openDatabase',
259 'Document.createElement',
260 'HTMLCanvasElement.getContext',
261 // XHR from content script.
262 'XMLHttpRequest.open',
263 'XMLHttpRequest.setRequestHeader',
267 // add the hook activity
268 hookNames = ['onclick', 'ondblclick', 'ondrag', 'ondragend', 'ondragenter',
269 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'oninput',
270 'onkeydown', 'onkeypress', 'onkeyup', 'onmousedown',
271 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout',
272 'onmouseover', 'onmouseup', 'onmousewheel'];
274 for (var i = 0; i < hookNames.length; i++) {
275 domExpectedActivity.push('HTMLElement.' + hookNames[i]);
276 domExpectedActivity.push('Document.' + hookNames[i]);
277 domExpectedActivity.push('Window.' + hookNames[i]);
281 domExpectedActivity.push('tabs.remove');
284 func: function triggerDOMChangesOnTabsUpdated() {
285 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
286 'dom_tab_updated', function response() { });
288 expected_activity: domExpectedActivity
292 func: function triggerDOMChangesOnTabsUpdatedIncognito() {
293 chrome.runtime.sendMessage(FRIEND_EXTENSION_ID,
294 'dom_tab_updated_incognito',
295 function response() { });
298 expected_activity: ['windows.create'].concat(domExpectedActivity)
302 func: function checkSavedHistory() {
303 var filter = new Object();
304 filter.extensionId = FRIEND_EXTENSION_ID;
305 filter.activityType = 'any';
306 filter.apiCall = 'tabs.onUpdated';
307 chrome.activityLogPrivate.getExtensionActivities(
310 chrome.test.assertEq(FRIEND_EXTENSION_ID,
311 result['activities'][0]['extensionId']);
312 chrome.test.assertEq('tabs.onUpdated',
313 result['activities'][0]['apiCall']);
314 chrome.test.succeed();
320 func: function checkHistoryForURL() {
321 var filter = new Object();
322 filter.extensionId = FRIEND_EXTENSION_ID;
323 filter.activityType = 'any';
324 filter.pageUrl = 'http://www.google.com';
325 chrome.activityLogPrivate.getExtensionActivities(
328 chrome.test.assertEq(FRIEND_EXTENSION_ID,
329 result['activities'][0]['extensionId']);
330 chrome.test.succeed();
336 func: function checkOtherObject() {
337 var filter = new Object();
338 filter.extensionId = FRIEND_EXTENSION_ID;
339 filter.activityType = 'dom_access';
340 filter.apiCall = 'Document.location';
341 chrome.activityLogPrivate.getExtensionActivities(
344 chrome.test.assertEq(FRIEND_EXTENSION_ID,
345 result['activities'][0]['extensionId']);
346 chrome.test.assertEq('Document.location',
347 result['activities'][0]['apiCall']);
348 chrome.test.assertEq('setter',
349 result['activities'][0]['other']['domVerb']);
350 chrome.test.succeed();
352 var filter = new Object();
353 filter.extensionId = FRIEND_EXTENSION_ID;
354 filter.activityType = 'any';
355 filter.apiCall = 'webRequest.onHeadersReceived';
356 chrome.activityLogPrivate.getExtensionActivities(
359 chrome.test.assertEq(FRIEND_EXTENSION_ID,
360 result['activities'][0]['extensionId']);
361 chrome.test.assertEq('webRequest.onHeadersReceived',
362 result['activities'][0]['apiCall']);
363 chrome.test.assertEq('{"added_request_headers":true}',
364 result['activities'][0]['other']['webRequest']);
365 chrome.test.succeed();
371 func: function deleteActivities() {
372 var activityIds = [];
373 var filter = new Object();
374 filter.extensionId = FRIEND_EXTENSION_ID;
375 filter.activityType = 'any';
376 filter.apiCall = 'tabs.executeScript';
377 chrome.activityLogPrivate.getExtensionActivities(filter, function(result) {
378 chrome.test.assertEq(6, result['activities'].length);
379 for (var i = 0; i < result['activities'].length; i++)
380 activityIds.push(result['activities'][i]['activityId']);
381 chrome.test.assertEq(6, activityIds.length);
382 chrome.activityLogPrivate.deleteActivities(['-1', '-2', '-3']);
383 chrome.activityLogPrivate.getExtensionActivities(filter,
385 chrome.test.assertEq(6, result['activities'].length);
386 chrome.activityLogPrivate.deleteActivities([activityIds[0]]);
387 chrome.activityLogPrivate.getExtensionActivities(filter,
389 chrome.test.assertEq(5, result['activities'].length);
390 for (var i = 0; i < result['activities'].length; i++)
391 chrome.test.assertFalse(activityIds[0] ==
392 result['activities'][i]['activityId']);
393 chrome.activityLogPrivate.deleteActivities(activityIds);
394 chrome.activityLogPrivate.getExtensionActivities(filter,
396 chrome.test.assertEq(0, result['activities'].length);
397 chrome.test.succeed();
406 func: function deleteGoogleUrls() {
407 chrome.test.getConfig(function(config) {
408 chrome.activityLogPrivate.deleteUrls(
409 ['http://www.google.com:' + config.testServer.port]);
411 var filter = new Object();
412 filter.extensionId = FRIEND_EXTENSION_ID;
413 filter.activityType = 'any';
414 filter.pageUrl = 'http://www.google.com';
415 chrome.activityLogPrivate.getExtensionActivities(
418 chrome.test.assertEq(0, result['activities'].length);
419 chrome.test.succeed();
426 func: function deleteAllUrls() {
427 chrome.activityLogPrivate.deleteUrls([]);
428 var filter = new Object();
429 filter.extensionId = FRIEND_EXTENSION_ID;
430 filter.activityType = 'any';
431 filter.pageUrl = 'http://';
432 chrome.activityLogPrivate.getExtensionActivities(
435 chrome.test.assertEq(0, result['activities'].length);
436 chrome.test.succeed();
442 func: function deleteAllHistory() {
443 chrome.activityLogPrivate.deleteDatabase();
444 var filter = new Object();
445 filter.extensionId = FRIEND_EXTENSION_ID;
446 filter.activityType = 'any';
448 chrome.activityLogPrivate.getExtensionActivities(
451 chrome.test.assertEq(0, result['activities'].length);
452 chrome.test.succeed();
457 function checkIncognito(url, incognitoExpected) {
459 incognitoExpected = Boolean(incognitoExpected);
460 var kIncognitoMarker = '<incognito>';
462 (url.substr(0, kIncognitoMarker.length) == kIncognitoMarker);
463 chrome.test.assertEq(incognitoExpected, isIncognito,
464 'Bad incognito state for URL ' + url);
468 // Listener to check the expected logging is done in the test cases.
469 var testCaseIndx = 0;
471 var enabledTestCases = [];
473 chrome.activityLogPrivate.onExtensionActivity.addListener(
475 var activityId = activity['extensionId'];
476 chrome.test.assertEq(FRIEND_EXTENSION_ID, activityId);
478 // Check the api call is the one we expected next.
479 var apiCall = activity['apiCall'];
480 expectedCall = 'runtime.onMessageExternal';
481 var testCase = enabledTestCases[testCaseIndx];
483 expectedCall = testCase.expected_activity[callIndx];
485 console.log('Logged:' + apiCall + ' Expected:' + expectedCall);
486 chrome.test.assertEq(expectedCall, apiCall);
488 // Check that no real URLs are logged in incognito-mode tests. Ignore
489 // the initial call to windows.create opening the tab.
490 if (apiCall != 'windows.create') {
491 checkIncognito(activity['pageUrl'], testCase.is_incognito);
492 checkIncognito(activity['argUrl'], testCase.is_incognito);
495 // If all the expected calls have been logged for this test case then
496 // mark as suceeded and move to the next. Otherwise look for the next
497 // expected api call.
498 if (callIndx == testCase.expected_activity.length - 1) {
499 chrome.test.succeed();
508 function setupTestCasesAndRun() {
509 chrome.runtime.getPlatformInfo(function(info) {
511 for (var i = 0; i < testCases.length; i++) {
512 // Ignore test case if disabled for this OS.
513 if (testCases[i].disabled != undefined &&
514 info.os in testCases[i].disabled &&
515 testCases[i].disabled[info.os]) {
516 console.log('Test case disabled for this OS: ' + info.os);
520 // Add the test case to the enabled list and set the expected activity
521 // appriorate for this OS.
522 if (testCases[i].func != undefined) {
523 tests.push(testCases[i].func);
524 var enabledTestCase = testCases[i];
525 var activityListForOS = 'expected_activity_' + info.os;
526 if (activityListForOS in enabledTestCase) {
527 console.log('Expecting OS specific activity for: ' + info.os);
528 enabledTestCase.expected_activity =
529 enabledTestCase[activityListForOS];
531 enabledTestCases.push(enabledTestCase);
534 chrome.test.runTests(tests);
538 setupTestCasesAndRun();