// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var assertEq = chrome.test.assertEq;
var assertFalse = chrome.test.assertFalse;
var assertTrue = chrome.test.assertTrue;
var callbackFail = chrome.test.callbackFail;
var callbackPass = chrome.test.callbackPass;
var RoleType = chrome.automation.RoleType;
function canXhr(url) {
assertFalse(url == null);
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
var success = true;
try {
xhr.send();
} catch(e) {
assertEq('NetworkError', e.name);
success = false;
}
return success;
}
var cachedUrl = null;
var iframeDone = null;
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.message == 'xhr') {
sendResponse({url: cachedUrl});
} else {
assertTrue(request.success);
iframeDone();
}
});
var iframeUrl = chrome.runtime.getURL('iframe.html');
var injectIframe =
'var iframe = document.createElement("iframe");\n' +
'iframe.src = "' + iframeUrl + '";\n' +
'document.body.appendChild(iframe);\n';
var runCount = 0;
chrome.browserAction.onClicked.addListener(function(tab) {
runCount++;
if (runCount == 1) {
// First pass is done without granting activeTab permission, the extension
// shouldn't have access to tab.url here.
assertFalse(!!tab.url);
chrome.test.succeed();
return;
} else if (runCount == 3) {
// Third pass is done in a public session, and activeTab permission is
// granted to the extension. URL should be scrubbed down to the origin
// here (tested at the C++ side).
chrome.test.sendMessage(tab.url);
chrome.test.succeed();
return;
}
// Second pass is done with granting activeTab permission, the extension
// should have full access to the page (and also to tab.url).
iframeDone = chrome.test.callbackAdded();
cachedUrl = tab.url;
chrome.tabs.executeScript({code: injectIframe}, callbackPass());
assertTrue(canXhr(tab.url));
});
var navigationCount = 0;
chrome.webNavigation.onCompleted.addListener(function(details) {
if (!details.url.endsWith('page.html'))
return;
navigationCount++;
chrome.test.sendMessage(navigationCount.toString());
// The second navigation remains on the same site, so we should still have
// access.
var expectHasAccess = navigationCount === 2;
if (expectHasAccess) {
chrome.tabs.executeScript({code: 'true'}, callbackPass());
chrome.automation.getDesktop(callbackPass());
assertTrue(canXhr(details.url));
return;
}
chrome.tabs.executeScript(
{code: 'true'},
callbackFail(
'Cannot access contents of the page. ' +
'Extension manifest must request permission to access the ' +
'respective host.'));
chrome.automation.getDesktop(
callbackFail('Failed request of automation on a page'));
assertFalse(canXhr(details.url));
});
chrome.test.sendMessage('ready');