bug 1293355 - add fromCache to onResponseStarted details, r?kmag
MozReview-Commit-ID: GO0a8s8D2oT
--- a/toolkit/components/extensions/ext-webRequest.js
+++ b/toolkit/components/extensions/ext-webRequest.js
@@ -38,16 +38,21 @@ function WebRequestEventManager(context,
originUrl: data.originUrl,
method: data.method,
type: data.type,
timeStamp: Date.now(),
frameId: ExtensionManagement.getFrameId(data.windowId),
parentFrameId: ExtensionManagement.getParentFrameId(data.parentWindowId, data.windowId),
};
+ const maybeCached = ["onResponseStarted", "onBeforeRedirect", "onCompleted", "onErrorOccurred"];
+ if (maybeCached.includes(eventName)) {
+ data2.fromCache = !!data.fromCache;
+ }
+
if ("ip" in data) {
data2.ip = data.ip;
}
// Fills in tabId typically.
let result = {};
extensions.emit("fill-browser-data", data.browser, data2, result);
if (result.cancel) {
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
@@ -425,48 +425,59 @@ function backgroundScript() {
if (/^https?:/.test(details.url)) {
browser.test.assertEq(details.ip, "127.0.0.1", "correct ip");
}
completedUrls[kind].add(details.url);
}
checkStatus(details);
}
+ function checkFromCache(kind, details) {
+ if (checkCompleted) {
+ // If we have already completed a GET request for this url,
+ // and it was found, we expect for the response to come fromCache.
+ const completed = kind in completedUrls && completedUrls[kind].has(details.url);
+ const expected = completed && details.method === "GET" && details.statusCode != 404;
+ browser.test.assertEq(expected, details.fromCache, "fromCache is correct");
+ }
+ checkIpAndRecord(kind, details);
+ }
+
function onHeadersReceived(details) {
checkIpAndRecord("headersReceived", details);
processHeaders("response", details);
browser.test.log(`After processing response headers: ${details.responseHeaders.toSource()}`);
return {responseHeaders: details.responseHeaders};
}
function onErrorOccurred(details) {
onRecord("error", details);
browser.test.assertTrue(/^NS_ERROR_/.test(details.error), `onErrorOccurred reported for ${details.url} (${details.error})`);
}
function onCompleted(details) {
- checkIpAndRecord("completed", details);
+ checkFromCache("completed", details);
checkHeaders("response", details);
}
browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, {urls: ["<all_urls>"]}, ["blocking"]);
try {
browser.webRequest.onBeforeRequest.addListener(onUpload, {urls: ["http://*/*"]}, ["blocking", "requestBody"]);
} catch (e) {
// requestBody is disabled in release builds
if (!/\brequestBody\b/.test(e.message)) {
throw e;
}
}
browser.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, {urls: ["<all_urls>"]}, ["blocking", "requestHeaders"]);
browser.webRequest.onSendHeaders.addListener(onSendHeaders, {urls: ["<all_urls>"]}, ["requestHeaders"]);
browser.webRequest.onBeforeRedirect.addListener(onBeforeRedirect, {urls: ["<all_urls>"]});
browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
- browser.webRequest.onResponseStarted.addListener(checkIpAndRecord.bind(null, "responseStarted"), {urls: ["<all_urls>"]});
- browser.webRequest.onResponseStarted.addListener(checkIpAndRecord.bind(null, "responseStarted2"), {urls: ["<all_urls>"]});
+ browser.webRequest.onResponseStarted.addListener(checkFromCache.bind(null, "responseStarted"), {urls: ["<all_urls>"]});
+ browser.webRequest.onResponseStarted.addListener(checkFromCache.bind(null, "responseStarted2"), {urls: ["<all_urls>"]});
browser.webRequest.onErrorOccurred.addListener(onErrorOccurred, {urls: ["<all_urls>"]});
browser.webRequest.onCompleted.addListener(onCompleted, {urls: ["<all_urls>"]}, ["responseHeaders"]);
function onTestMessage(msg) {
if (msg == "skipCompleted") {
checkCompleted = false;
browser.test.sendMessage("ackSkipCompleted");
} else {
--- a/toolkit/modules/addons/WebRequest.jsm
+++ b/toolkit/modules/addons/WebRequest.jsm
@@ -423,19 +423,21 @@ HttpObserverManager = {
},
observe(subject, topic, data) {
let channel = subject.QueryInterface(Ci.nsIHttpChannel);
switch (topic) {
case "http-on-modify-request":
this.modify(channel, topic, data);
break;
- case "http-on-examine-response":
case "http-on-examine-cached-response":
case "http-on-examine-merged-response":
+ getData(channel).fromCache = true;
+ // falls through
+ case "http-on-examine-response":
this.examine(channel, topic, data);
break;
}
},
// We map activity values with tentative error names, e.g. "STATUS_RESOLVING" => "NS_ERROR_NET_ON_RESOLVING".
get activityErrorsMap() {
let prefix = /^(?:ACTIVITY_SUBTYPE_|STATUS_)/;
@@ -533,16 +535,17 @@ HttpObserverManager = {
if (!commonData) {
commonData = {
requestId: RequestId.get(channel),
url: uri.spec,
method: channel.requestMethod,
browser: browser,
type: WebRequestCommon.typeForPolicyType(policyType),
+ fromCache: getData(channel).fromCache,
};
if (loadInfo) {
let originPrincipal = loadInfo.triggeringPrincipal || loadInfo.loadingPrincipal;
if (originPrincipal && originPrincipal.URI) {
commonData.originUrl = originPrincipal.URI.spec;
}
Object.assign(commonData, {