Index: chrome/test/data/extensions/api_test/webrequest/framework.js |
diff --git a/chrome/test/data/extensions/api_test/webrequest/framework.js b/chrome/test/data/extensions/api_test/webrequest/framework.js |
deleted file mode 100644 |
index 7f84d0039afa19feafd7d31d213d0a6663897f2a..0000000000000000000000000000000000000000 |
--- a/chrome/test/data/extensions/api_test/webrequest/framework.js |
+++ /dev/null |
@@ -1,237 +0,0 @@ |
-var getURL = chrome.extension.getURL; |
-var deepEq = chrome.test.checkDeepEq; |
-var expectedEventData; |
-var capturedEventData; |
-var expectedEventOrder; |
-var tabId; |
-var testServerPort; |
-var eventsCaptured; |
- |
-function runTests(tests) { |
- chrome.tabs.create({url: "about:blank"}, function(tab) { |
- tabId = tab.id; |
- chrome.test.getConfig(function(config) { |
- testServerPort = config.testServer.port; |
- chrome.test.runTests(tests); |
- }); |
- }); |
-} |
- |
-// Returns an URL from the test server, fixing up the port. Must be called |
-// from within a test case passed to runTests. |
-function getServerURL(path) { |
- if (!testServerPort) |
- throw new Error("Called getServerURL outside of runTests."); |
- return "http://www.a.com:" + testServerPort + "/" + path; |
-} |
- |
-// Helper to advance to the next test only when the tab has finished loading. |
-// This is because tabs.update can sometimes fail if the tab is in the middle |
-// of a navigation (from the previous test), resulting in flakiness. |
-function navigateAndWait(url, callback) { |
- var done = chrome.test.listenForever(chrome.tabs.onUpdated, |
- function (_, info, tab) { |
- if (tab.id == tabId && info.status == "complete") { |
- if (callback) callback(); |
- done(); |
- } |
- }); |
- chrome.tabs.update(tabId, {url: url}); |
-} |
- |
-// data: array of extected events, each one is a dictionary: |
-// { label: "<unique identifier>", |
-// event: "<webrequest event type>", |
-// details: { <expected details of the webrequest event> }, |
-// retval: { <dictionary that the event handler shall return> } (optional) |
-// } |
-// order: an array of sequences, e.g. [ ["a", "b", "c"], ["d", "e"] ] means that |
-// event with label "a" needs to occur before event with label "b". The |
-// relative order of "a" and "d" does not matter. |
-// filter: filter dictionary passed on to the event subscription of the |
-// webRequest API. |
-// extraInfoSpec: the union of all desired extraInfoSpecs for the events. |
-function expect(data, order, filter, extraInfoSpec) { |
- expectedEventData = data; |
- capturedEventData = []; |
- expectedEventOrder = order; |
- eventsCaptured = chrome.test.callbackAdded(); |
- tabAndFrameUrls = {}; // Maps "{tabId}-{frameId}" to the URL of the frame. |
- removeListeners(); |
- initListeners(filter || {}, extraInfoSpec || []); |
-} |
- |
-function checkExpectations() { |
- if (capturedEventData.length < expectedEventData.length) { |
- return; |
- } |
- if (capturedEventData.length > expectedEventData.length) { |
- chrome.test.fail("Recorded too many events. " + |
- JSON.stringify(capturedEventData)); |
- return; |
- } |
- // We have ensured that capturedEventData contains exactly the same elements |
- // as expectedEventData. Now we need to verify the ordering. |
- // Step 1: build positions such that |
- // positions[<event-label>]=<position of this event in capturedEventData> |
- var curPos = 0; |
- var positions = {} |
- capturedEventData.forEach(function (event) { |
- chrome.test.assertTrue(event.hasOwnProperty("label")); |
- positions[event.label] = curPos; |
- curPos++; |
- }); |
- // Step 2: check that elements arrived in correct order |
- expectedEventOrder.forEach(function (order) { |
- var previousLabel = undefined; |
- order.forEach(function(label) { |
- if (previousLabel === undefined) { |
- previousLabel = label; |
- return; |
- } |
- chrome.test.assertTrue(positions[previousLabel] < positions[label], |
- "Event " + previousLabel + " is supposed to arrive before " + |
- label + "."); |
- previousLabel = label; |
- }); |
- }); |
- |
- eventsCaptured(); |
-} |
- |
-// Simple check to see that we have a User-Agent header, and that it contains |
-// an expected value. This is a basic check that the request headers are valid. |
-function checkUserAgent(headers) { |
- for (var i in headers) { |
- if (headers[i].name.toLowerCase() == "user-agent") |
- return headers[i].value.toLowerCase().indexOf("chrome") != -1; |
- } |
- return false; |
-} |
- |
-function captureEvent(name, details) { |
- // Ignore system-level requests like safebrowsing updates and favicon fetches |
- // since they are unpredictable. |
- if (details.tabId == -1 || details.type == "other" || |
- details.url.match(/\/favicon.ico$/) || |
- details.url.match(/https:\/\/dl.google.com/)) |
- return; |
- |
- // Pull the extra per-event options out of the expected data. These let |
- // us specify special return values per event. |
- var currentIndex = capturedEventData.length; |
- var extraOptions; |
- if (expectedEventData.length > currentIndex) { |
- retval = expectedEventData[currentIndex].retval; |
- } |
- |
- // Check that the frameId can be used to reliably determine the URL of the |
- // frame that caused requests. |
- if (name == "onBeforeRequest") { |
- chrome.test.assertTrue('frameId' in details && |
- typeof details.frameId === 'number'); |
- chrome.test.assertTrue('tabId' in details && |
- typeof details.tabId === 'number'); |
- var key = details.tabId + "-" + details.frameId; |
- if (details.type == "main_frame" || details.type == "sub_frame") { |
- tabAndFrameUrls[key] = details.url; |
- } |
- details.frameUrl = tabAndFrameUrls[key] || "unknown frame URL"; |
- } |
- delete details.frameId; |
- |
- delete details.requestId; |
- delete details.timeStamp; |
- if (details.requestHeaders) { |
- details.requestHeadersValid = checkUserAgent(details.requestHeaders); |
- delete details.requestHeaders; |
- } |
- if (details.responseHeaders) { |
- details.responseHeadersExist = true; |
- delete details.responseHeaders; |
- } |
- |
- // find |details| in expectedEventData |
- var found = false; |
- var label = undefined; |
- expectedEventData.forEach(function (exp) { |
- if (deepEq(exp.event, name) && deepEq(exp.details, details)) { |
- if (found) { |
- chrome.test.fail("Received event twice '" + name + "':" + |
- JSON.stringify(details)); |
- } else { |
- found = true; |
- label = exp.label; |
- } |
- } |
- }); |
- if (!found) { |
- chrome.test.fail("Received unexpected event '" + name + "':" + |
- JSON.stringify(details)); |
- } |
- |
- capturedEventData.push({label: label, event: name, details: details}); |
- checkExpectations(); |
- return retval; |
-} |
- |
-// Simple array intersection. We use this to filter extraInfoSpec so |
-// that only the allowed specs are sent to each listener. |
-function intersect(array1, array2) { |
- return array1.filter(function(x) { return array2.indexOf(x) != -1; }); |
-} |
- |
-function initListeners(filter, extraInfoSpec) { |
- chrome.experimental.webRequest.onBeforeRequest.addListener( |
- function(details) { |
- return captureEvent("onBeforeRequest", details); |
- }, filter, intersect(extraInfoSpec, ["blocking"])); |
- chrome.experimental.webRequest.onBeforeSendHeaders.addListener( |
- function(details) { |
- return captureEvent("onBeforeSendHeaders", details); |
- }, filter, intersect(extraInfoSpec, ["blocking", "requestHeaders"])); |
- chrome.experimental.webRequest.onSendHeaders.addListener( |
- function(details) { |
- return captureEvent("onSendHeaders", details); |
- }, filter, intersect(extraInfoSpec, ["requestHeaders"])); |
- chrome.experimental.webRequest.onAuthRequired.addListener( |
- function(details) { |
- return captureEvent("onAuthRequired", details); |
- }, filter, intersect(extraInfoSpec, ["responseHeaders", "statusLine"])); |
- chrome.experimental.webRequest.onResponseStarted.addListener( |
- function(details) { |
- return captureEvent("onResponseStarted", details); |
- }, filter, intersect(extraInfoSpec, ["responseHeaders", "statusLine"])); |
- chrome.experimental.webRequest.onBeforeRedirect.addListener( |
- function(details) { |
- return captureEvent("onBeforeRedirect", details); |
- }, filter, intersect(extraInfoSpec, ["responseHeaders", "statusLine"])); |
- chrome.experimental.webRequest.onCompleted.addListener( |
- function(details) { |
- return captureEvent("onCompleted", details); |
- }, filter, intersect(extraInfoSpec, ["responseHeaders", "statusLine"])); |
- chrome.experimental.webRequest.onErrorOccurred.addListener( |
- function(details) { |
- return captureEvent("onErrorOccurred", details); |
- }, filter); |
-} |
- |
-function removeListeners() { |
- function helper(event) { |
- // Note: We're poking at the internal event data, but it's easier than |
- // the alternative. If this starts failing, we just need to update this |
- // helper. |
- for (var cb in event.callbackMap_) { |
- event.removeListener(cb); |
- } |
- chrome.test.assertFalse(event.hasListeners()); |
- } |
- helper(chrome.experimental.webRequest.onBeforeRequest); |
- helper(chrome.experimental.webRequest.onBeforeSendHeaders); |
- helper(chrome.experimental.webRequest.onAuthRequired); |
- helper(chrome.experimental.webRequest.onSendHeaders); |
- helper(chrome.experimental.webRequest.onResponseStarted); |
- helper(chrome.experimental.webRequest.onBeforeRedirect); |
- helper(chrome.experimental.webRequest.onCompleted); |
- helper(chrome.experimental.webRequest.onErrorOccurred); |
-} |