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(); } })();