mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-29 11:57:32 +09:00
(from mypal68) Add incognito and windowId support to webRequest filtering
This commit is contained in:
parent
223d5d6a25
commit
d90e52fac4
3 changed files with 33 additions and 46 deletions
|
|
@ -77,6 +77,8 @@ extensions.on("page-shutdown", (type, context) => {
|
||||||
|
|
||||||
extensions.on("fill-browser-data", (type, browser, data) => {
|
extensions.on("fill-browser-data", (type, browser, data) => {
|
||||||
data.tabId = browser ? TabManager.getBrowserId(browser) : -1;
|
data.tabId = browser ? TabManager.getBrowserId(browser) : -1;
|
||||||
|
data.windowId = browser && browser.ownerGlobal ? WindowManager.getId(browser.ownerGlobal) : -1;
|
||||||
|
data.incognito = !!(browser && PrivateBrowsingUtils.isBrowserPrivate(browser));
|
||||||
});
|
});
|
||||||
/* eslint-enable mozilla/balanced-listeners */
|
/* eslint-enable mozilla/balanced-listeners */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,10 +48,27 @@ function WebRequestEventManager(context, eventName) {
|
||||||
data2.ip = data.ip;
|
data2.ip = data.ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("incognito" in data) {
|
||||||
|
data2.incognito = data.incognito;
|
||||||
|
}
|
||||||
|
|
||||||
extensions.emit("fill-browser-data", data.browser, data2);
|
extensions.emit("fill-browser-data", data.browser, data2);
|
||||||
|
|
||||||
|
if ("tabId" in filter && data2.tabId !== filter.tabId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("windowId" in filter && data2.windowId !== filter.windowId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("incognito" in filter && !!data2.incognito !== filter.incognito) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let optional = ["requestHeaders", "responseHeaders", "statusCode", "statusLine", "error", "redirectUrl",
|
let optional = ["requestHeaders", "responseHeaders", "statusCode", "statusLine", "error", "redirectUrl",
|
||||||
"requestBody"];
|
"requestBody", "documentUrl", "scheme", "realm", "isProxy", "challenger",
|
||||||
|
"proxyInfo", "frameAncestors"];
|
||||||
for (let opt of optional) {
|
for (let opt of optional) {
|
||||||
if (opt in data) {
|
if (opt in data) {
|
||||||
data2[opt] = data[opt];
|
data2[opt] = data[opt];
|
||||||
|
|
@ -66,12 +83,15 @@ function WebRequestEventManager(context, eventName) {
|
||||||
if (filter.types) {
|
if (filter.types) {
|
||||||
filter2.types = filter.types;
|
filter2.types = filter.types;
|
||||||
}
|
}
|
||||||
if (filter.tabId) {
|
if ("tabId" in filter) {
|
||||||
filter2.tabId = filter.tabId;
|
filter2.tabId = filter.tabId;
|
||||||
}
|
}
|
||||||
if (filter.windowId) {
|
if ("windowId" in filter) {
|
||||||
filter2.windowId = filter.windowId;
|
filter2.windowId = filter.windowId;
|
||||||
}
|
}
|
||||||
|
if ("incognito" in filter) {
|
||||||
|
filter2.incognito = filter.incognito;
|
||||||
|
}
|
||||||
|
|
||||||
let info2 = [];
|
let info2 = [];
|
||||||
if (info) {
|
if (info) {
|
||||||
|
|
@ -96,42 +116,6 @@ function WebRequestEventManager(context, eventName) {
|
||||||
|
|
||||||
WebRequestEventManager.prototype = Object.create(SingletonEventManager.prototype);
|
WebRequestEventManager.prototype = Object.create(SingletonEventManager.prototype);
|
||||||
|
|
||||||
// StreamFilter stub for response data filtering
|
|
||||||
// Modern extensions may use filterResponseData(), we provide a basic stub
|
|
||||||
function StreamFilterStub(requestId) {
|
|
||||||
this.requestId = requestId;
|
|
||||||
this.status = "unattached";
|
|
||||||
this.onstart = null;
|
|
||||||
this.ondata = null;
|
|
||||||
this.onstop = null;
|
|
||||||
this.onerror = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
StreamFilterStub.prototype = {
|
|
||||||
write: function(data) {
|
|
||||||
// Stub: no-op - just accept the data without modification
|
|
||||||
},
|
|
||||||
close: function() {
|
|
||||||
this.status = "closed";
|
|
||||||
if (this.onstop) {
|
|
||||||
try {
|
|
||||||
this.onstop();
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: function(error) {
|
|
||||||
this.status = "errored";
|
|
||||||
if (this.onerror) {
|
|
||||||
try {
|
|
||||||
this.onerror(error);
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
disconnect: function() {
|
|
||||||
this.status = "closed";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
extensions.registerSchemaAPI("webRequest", "addon_parent", context => {
|
extensions.registerSchemaAPI("webRequest", "addon_parent", context => {
|
||||||
return {
|
return {
|
||||||
webRequest: {
|
webRequest: {
|
||||||
|
|
@ -145,6 +129,7 @@ extensions.registerSchemaAPI("webRequest", "addon_parent", context => {
|
||||||
onCompleted: new WebRequestEventManager(context, "onCompleted").api(),
|
onCompleted: new WebRequestEventManager(context, "onCompleted").api(),
|
||||||
handlerBehaviorChanged: function() {
|
handlerBehaviorChanged: function() {
|
||||||
// TODO: Flush all caches.
|
// TODO: Flush all caches.
|
||||||
|
return Promise.resolve();
|
||||||
},
|
},
|
||||||
// Resource type constants for feature detection and filtering
|
// Resource type constants for feature detection and filtering
|
||||||
ResourceType: Object.freeze({
|
ResourceType: Object.freeze({
|
||||||
|
|
@ -168,11 +153,6 @@ extensions.registerSchemaAPI("webRequest", "addon_parent", context => {
|
||||||
WEB_MANIFEST: "web_manifest",
|
WEB_MANIFEST: "web_manifest",
|
||||||
OTHER: "other"
|
OTHER: "other"
|
||||||
}),
|
}),
|
||||||
// Stub implementation of filterResponseData for extensions that need it
|
|
||||||
// Returns a StreamFilter-like object that extensions can use to intercept responses
|
|
||||||
filterResponseData: function(requestId) {
|
|
||||||
return new StreamFilterStub(requestId);
|
|
||||||
},
|
|
||||||
// Maximum handler behavior change calls per 10 minutes (per MDN spec)
|
// Maximum handler behavior change calls per 10 minutes (per MDN spec)
|
||||||
MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES: 20,
|
MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES: 20,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -75,8 +75,13 @@ function parseFilter(filter) {
|
||||||
filter = {};
|
filter = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Support windowId filtering.
|
return {
|
||||||
return {urls: filter.urls || null, types: filter.types || null};
|
urls: filter.urls || null,
|
||||||
|
types: filter.types || null,
|
||||||
|
tabId: filter.tabId === undefined ? null : filter.tabId,
|
||||||
|
windowId: filter.windowId === undefined ? null : filter.windowId,
|
||||||
|
incognito: filter.incognito === undefined ? null : filter.incognito,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseExtra(extra, allowed = []) {
|
function parseExtra(extra, allowed = []) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue