2021-12-03 17:58:48 +01:00

198 lines
5.8 KiB
JavaScript

let pressed = !UI.unrestrictedTab;
let button = document.getElementById("enforce-tab");
button.setAttribute("aria-pressed", pressed);
button.title = _(pressed ? "NoEnforcementForTab" : "EnforceForTab");
if (UI.policy.enforced) {
button.onclick = async () => {
this.disabled = true;
await UI.updateSettings({
unrestrictedTab: pressed,
reloadAffected: true,
});
close();
}
} else {
button.disabled = true;
}
}
let mainFrame = UI.seen && UI.seen.find(thing => thing.request.type === "main_frame");
debug("Seen: %o", UI.seen);
if (!mainFrame) {
let isHttp = /^https?:/.test(pageTab.url);
try {
await browser.tabs.executeScript(tabId, { code: "" });
if (isHttp) {
document.body.classList.add("disabled");
showMessage("warning", _("freshInstallReload"));
let buttons = document.querySelector("#buttons");
let b = document.createElement("button");
b.textContent = _("OK");
b.onclick = document.getElementById("reload").onclick = () => {
reload();
close();
}
buttons.appendChild(b).focus();
b = document.createElement("button");
b.textContent = _("Cancel");
b.onclick = () => close();
buttons.appendChild(b);
return;
}
} catch (e) {
error(e, "Could not run scripts on %s: privileged page?", pageTab.url);
}
await include("/lib/restricted.js");
let isRestricted = isRestrictedURL(pageTab.url);
if (!isHttp || isRestricted) {
showMessage("warning", _("privilegedPage"));
let tempTrust = document.getElementById("temp-trust-page");
tempTrust.disabled = true;
return;
}
if (!UI.seen) {
if (!isHttp) return;
let {url} = pageTab;
UI.seen = [
mainFrame = {
request: { url, documentUrl: url, type: "main_frame" }
}
];
}
}
let justDomains = !UI.local.showFullAddresses;
sitesUI = new UI.Sites(document.getElementById("sites"));
sitesUI.onChange = (row) => {
pendingReload(sitesUI.anyPermissionsChanged());
if (optionsClosed) return;
browser.tabs.query({
url: browser.extension.getURL(
browser.runtime.getManifest().options_ui.page)
}).then(tabs => {
browser.tabs.remove(tabs.map(t => t.id));
});
optionsClosed = true;
};
initSitesUI();
UI.onSettings = initSitesUI;
if (UI.incognito) {
UI.wireOption("overrideTorBrowserPolicy", "sync", toggle => {
if (UI.forceIncognito !== !toggle) {
UI.forceIncognito = !toggle;
sitesUI.render();
}
});
}
function initSitesUI() {
pendingReload(false);
let {
typesMap
} = sitesUI;
typesMap.clear();
let policySites = UI.policy.sites;
let domains = new Map();
let protocols = new Set();
function urlToLabel(url) {
let origin = Sites.origin(url);
let match = policySites.match(url);
if (match) {
if (match === url.protocol) {
protocols.add(match);
} else {
return match;
}
}
if (domains.has(origin)) {
if (justDomains) return domains.get(origin);
} else {
let domain = tld.getDomain(url.hostname);
if (domain) {
domain = url.protocol === "https:" ? Sites.secureDomainKey(domain) : domain;
} else {
domain = url.protocol;
}
domains.set(origin, domain);
if (justDomains) return domain;
}
return origin;
}
let seen = UI.seen;
let parsedSeen = seen.map(thing => Object.assign({
type: thing.policyType
}, Sites.parse(thing.request.url)))
.filter(parsed => parsed.url && (
parsed.url.origin !== "null" || parsed.url.protocol === "file:"));
let sitesSet = new Set(
parsedSeen.map(parsed => parsed.label = urlToLabel(parsed.url))
);
if (!justDomains) {
for (let domain of domains.values()) sitesSet.add(domain);
}
for (let protocol of protocols) sitesSet.add(protocol);
let sites = [...sitesSet];
for (let parsed of parsedSeen) {
sites.filter(s => parsed.label === s || domains.get(Sites.origin(parsed.url)) === s).forEach(m => {
let siteTypes = typesMap.get(m);
if (!siteTypes) typesMap.set(m, siteTypes = new Set());
siteTypes.add(parsed.type);
});
}
sitesUI.mainUrl = new URL(mainFrame.request.url)
sitesUI.mainSite = urlToLabel(sitesUI.mainUrl);
sitesUI.mainDomain = tld.getDomain(sitesUI.mainUrl.hostname);
sitesUI.render(sites);
sitesUI.focus();
window.scrollTo(0, 0);
}
function reload() {
if (sitesUI) sitesUI.clear();
browser.tabs.reload(tabId);
pendingReload(false);
}
function close() {
if (isBrowserAction) {
window.close();
} else {
browser.tabs.remove(tab.id);
}
}
let {
onCompleted
} = browser.webNavigation;
let loadSnapshot = sitesUI.snapshot;
let onCompletedListener = navigated => {
if (navigated.tabId === tabId) {
setTimeout(() => UI.pullSettings(), 500);
}
};
onCompleted.addListener(onCompletedListener, {
url: [{
hostContains: sitesUI.mainDomain
}]
});
addEventListener("blur", e => {
onCompleted.removeListener(onCompletedListener);
port.disconnect(); // otherwise Vivaldi keeps it after closing
});
} catch (e) {
error(e, "Can't open popup");
close();
}
})();