blob: 04d1eea217d638cd729487880003a888fe39dd59 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var callbackPass = chrome.test.callbackPass;
function getSetCookieUrl(name, value) {
return getServerURL('set-header?Set-Cookie:%20' + name + '=' + value);
}
function checkHeaders(headers, requiredNames, disallowedNames) {
var headerMap = {};
for (var i = 0; i < headers.length; i++)
headerMap[headers[i].name.toLowerCase()] = headers[i].value;
for (var i = 0; i < requiredNames.length; i++) {
chrome.test.assertTrue(!!headerMap[requiredNames[i]],
'Missing header: ' + requiredNames[i]);
}
for (var i = 0; i < disallowedNames.length; i++) {
chrome.test.assertFalse(!!headerMap[disallowedNames[i]],
'Header should not be present: ' + disallowedNames[i]);
}
}
function removeHeader(headers, name) {
for (var i = 0; i < headers.length; i++) {
if (headers[i].name.toLowerCase() == name) {
headers.splice(i, 1);
break;
}
}
}
runTests([
function testSpecialRequestHeadersVisible() {
// Set a cookie so the cookie request header is set.
navigateAndWait(getSetCookieUrl('foo', 'bar'), function() {
var url = getServerURL('echo');
var extraHeadersListener = callbackPass(function(details) {
checkHeaders(details.requestHeaders, ['user-agent', 'cookie'], []);
});
chrome.webRequest.onBeforeSendHeaders.addListener(extraHeadersListener,
{urls: [url]}, ['requestHeaders', 'extraHeaders']);
var standardListener = callbackPass(function(details) {
checkHeaders(details.requestHeaders, ['user-agent'], ['cookie']);
});
chrome.webRequest.onBeforeSendHeaders.addListener(standardListener,
{urls: [url]}, ['requestHeaders']);
navigateAndWait(url, function() {
chrome.webRequest.onBeforeSendHeaders.removeListener(
extraHeadersListener);
chrome.webRequest.onBeforeSendHeaders.removeListener(standardListener);
});
});
},
function testSpecialResponseHeadersVisible() {
var url = getSetCookieUrl('foo', 'bar');
var extraHeadersListener = callbackPass(function(details) {
checkHeaders(details.responseHeaders, ['set-cookie'], []);
});
chrome.webRequest.onHeadersReceived.addListener(extraHeadersListener,
{urls: [url]}, ['responseHeaders', 'extraHeaders']);
var standardListener = callbackPass(function(details) {
checkHeaders(details.responseHeaders, [], ['set-cookie']);
});
chrome.webRequest.onHeadersReceived.addListener(standardListener,
{urls: [url]}, ['responseHeaders']);
navigateAndWait(url, function() {
chrome.webRequest.onHeadersReceived.removeListener(extraHeadersListener);
chrome.webRequest.onHeadersReceived.removeListener(standardListener);
});
},
function testModifySpecialRequestHeaders() {
// Set a cookie so the cookie request header is set.
navigateAndWait(getSetCookieUrl('foo', 'bar'), function() {
var url = getServerURL('echoheader?Cookie');
var listener = callbackPass(function(details) {
removeHeader(details.requestHeaders, 'cookie');
return {requestHeaders: details.requestHeaders};
});
chrome.webRequest.onBeforeSendHeaders.addListener(listener,
{urls: [url]}, ['requestHeaders', 'blocking', 'extraHeaders']);
navigateAndWait(url, function(tab) {
chrome.webRequest.onBeforeSendHeaders.removeListener(listener);
chrome.tabs.executeScript(tab.id, {
code: 'document.body.innerText'
}, callbackPass(function(results) {
chrome.test.assertTrue(results[0].indexOf('bar') == -1,
'Header not removed.');
}));
});
});
},
function testCannotModifySpecialRequestHeadersWithoutExtraHeaders() {
// Set a cookie so the cookie request header is set.
navigateAndWait(getSetCookieUrl('foo', 'bar'), function() {
var url = getServerURL('echoheader?Cookie');
var listener = callbackPass(function(details) {
removeHeader(details.requestHeaders, 'cookie');
return {requestHeaders: details.requestHeaders};
});
chrome.webRequest.onBeforeSendHeaders.addListener(listener,
{urls: [url]}, ['requestHeaders', 'blocking']);
// Add a no-op listener with extraHeaders to make sure it does not affect
// the other listener.
var noop = function() {};
chrome.webRequest.onBeforeSendHeaders.addListener(noop,
{urls: [url]}, ['requestHeaders', 'blocking', 'extraHeaders']);
navigateAndWait(url, function(tab) {
chrome.webRequest.onBeforeSendHeaders.removeListener(noop);
chrome.webRequest.onBeforeSendHeaders.removeListener(listener);
chrome.tabs.executeScript(tab.id, {
code: 'document.body.innerText'
}, callbackPass(function(results) {
chrome.test.assertTrue(results[0].indexOf('bar') >= 0,
'Header should not be removed.');
}));
});
});
},
function testModifyUserAgentWithoutExtraHeaders() {
var url = getServerURL('echoheader?User-Agent');
var listener = callbackPass(function(details) {
var headers = details.requestHeaders;
for (var i = 0; i < headers.length; i++) {
if (headers[i].name.toLowerCase() === 'user-agent') {
headers[i].value = 'foo';
break;
}
}
return {requestHeaders: headers};
});
chrome.webRequest.onBeforeSendHeaders.addListener(listener,
{urls: [url]}, ['requestHeaders', 'blocking']);
navigateAndWait(url, function(tab) {
chrome.webRequest.onBeforeSendHeaders.removeListener(listener);
chrome.tabs.executeScript(tab.id, {
code: 'document.body.innerText'
}, callbackPass(function(results) {
chrome.test.assertTrue(results[0].indexOf('foo') >= 0,
'User-Agent should be modified.');
}));
});
},
// Successful Set-Cookie modification is tested in test_blocking_cookie.js.
function testCannotModifySpecialResponseHeadersWithoutExtraHeaders() {
// Use unique name and value so other tests don't interfere.
var url = getSetCookieUrl('theName', 'theValue');
var listener = callbackPass(function(details) {
removeHeader(details.responseHeaders, 'set-cookie');
return {responseHeaders: details.responseHeaders};
});
chrome.webRequest.onHeadersReceived.addListener(listener,
{urls: [url]}, ['responseHeaders', 'blocking']);
// Add a no-op listener with extraHeaders to make sure it does not affect
// the other listener.
var noop = function() {};
chrome.webRequest.onHeadersReceived.addListener(noop,
{urls: [url]}, ['responseHeaders', 'blocking', 'extraHeaders']);
navigateAndWait(url, function(tab) {
chrome.webRequest.onHeadersReceived.removeListener(noop);
chrome.webRequest.onHeadersReceived.removeListener(listener);
chrome.tabs.executeScript(tab.id, {
code: 'document.cookie'
}, callbackPass(function(results) {
chrome.test.assertTrue(results[0].indexOf('theValue') >= 0,
'Header should not be removed.');
}));
});
},
]);