2 Copyright (C) 2017 Kai Uwe Broulik <kde@privat.broulik.de>
3 Copyright (C) 2018 David Edmundson <davidedmundson@kde.org>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License as
7 published by the Free Software Foundation; either version 3 of
8 the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 function tabClicked(tabbar, tabbutton) {
20 tabbar.buttons.forEach(function (button) {
21 var tablink = button.dataset.tabLink
23 var tabtarget = document.querySelector("[data-tab-id=" + tablink + "]");
25 if (tabbutton == button) {
26 button.classList.add("active");
27 tabtarget.classList.add("active");
29 button.classList.remove("active");
30 tabtarget.classList.remove("active");
35 function loadSettings() {
36 SettingsUtils.get().then((items) => {
37 for (let key in items) {
38 if (!items.hasOwnProperty(key)) {
42 let controls = document.querySelectorAll("[data-extension=" + key + "]");
43 for (let control of controls) {
44 let settingsKey = control.dataset.settingsKey;
46 console.warn("Invalid settings key in", control, "cannot load this");
50 let value = items[key][settingsKey]
52 if (control.type === "checkbox") {
53 control.checked = !!value;
56 control.value = "TRUE";
57 } else if (value === false) {
58 control.value = "FALSE";
60 control.value = value;
64 updateDependencies(control, key, settingsKey);
66 control.addEventListener("change", () => {
67 let saveFailureInfoElement = document.getElementById("save-failure-info");
68 saveFailureInfoElement.classList.add("hidden");
70 updateDependencies(control, key, settingsKey);
72 saveSettings((error) => {
74 saveFailureInfoElement.classList.remove("hidden");
76 let saveMessageElement = document.getElementById("save-message");
78 saveMessageElement.innerText = chrome.i18n.getMessage("options_save_failed");
80 // When the extension is reloaded, any call to extension APIs throws, make sure we show at least some form of error
81 saveMessageElement.innerText = "Saving settings failed (" + (error || e) + ")";
92 function saveSettings(cb) {
95 let controls = document.querySelectorAll("[data-extension]");
96 for (let control of controls) {
97 let extension = control.dataset.extension;
99 if (!DEFAULT_EXTENSION_SETTINGS.hasOwnProperty(extension)) {
100 console.warn("Cannot save settings for extension", extension, "which isn't in DEFAULT_EXTENSION_SETTINGS");
104 let settingsKey = control.dataset.settingsKey;
106 console.warn("Invalid settings key in", control, "cannot save this");
110 if (!settings[extension]) {
111 settings[extension] = {};
114 if (!DEFAULT_EXTENSION_SETTINGS[extension].hasOwnProperty(settingsKey)) {
115 console.warn("Cannot save settings key", settingsKey, "in extension", extension, "which isn't in DEFAULT_EXTENSION_SETTINGS");
119 if (control.type === "checkbox") {
120 settings[extension][settingsKey] = control.checked;
122 let value = control.value;
123 if (value === "TRUE") {
125 } else if (value === "FALSE") {
128 settings[extension][settingsKey] = value;
132 SettingsUtils.set(settings).then(() => {
139 function updateDependencies(control, extension, settingsKey) {
140 // Update all depending controls
141 let value = control.type === "checkbox" ? control.checked : control.value;
142 if (value === true) {
144 } else if (value === false) {
148 let dependencies = document.querySelectorAll("[data-depends-extension=" + extension + "][data-depends-settings-key=" + settingsKey + "]");
149 for (let dependency of dependencies) {
150 dependency.disabled = (value != dependency.dataset.dependsSettingsValue);
154 document.addEventListener("DOMContentLoaded", function () {
156 // poor man's tab widget :)
157 document.querySelectorAll(".tabbar").forEach(function (tabbar) {
160 tabbar.querySelectorAll("[data-tab-link]").forEach(function (button) {
162 var tablink = button.dataset.tabLink
164 var tabtarget = document.querySelector("[data-tab-id=" + tablink + "]");
166 console.warn("Tab target", tablink, "does not exist!");
170 button.addEventListener("click", function (event) {
171 tabClicked(tabbar, button);
172 event.preventDefault();
175 tabbar.buttons.push(button);
177 // start with the one tab page that is active
178 if (tabtarget.classList.contains("active")) {
179 tabClicked(tabbar, button);
185 document.querySelectorAll("[data-not-show-in=firefox]").forEach(function (item) {
186 item.style.display = "none";
190 // check whether the platform is supported before loading and activating settings
191 chrome.runtime.getPlatformInfo(function (info) {
192 if (!SUPPORTED_PLATFORMS.includes(info.os)) {
193 document.body.classList.add("os-not-supported");
199 // When getSubsystemStatus fails we assume it's an old host without any of the new features
200 // for which we added the requires-extension attributes. Disable all of them initially
201 // and then have the supported ones enabled below.
202 document.querySelectorAll("[data-requires-extension]").forEach((item) => {
203 item.classList.add("not-supported", "by-host");
206 sendMessage("settings", "getSubsystemStatus").then((status) => {
207 document.querySelectorAll("[data-requires-extension]").forEach((item) => {
208 let requiresExtension = item.dataset.requiresExtension;
210 if (requiresExtension && !status.hasOwnProperty(requiresExtension)) {
211 console.log("Extension", requiresExtension, "is not supported by this version of the host");
215 let requiresMinimumVersion = Number(item.dataset.requiresExtensionVersionMinimum);
216 if (requiresMinimumVersion) {
217 let runningVersion = status[requiresExtension].version;
218 if (runningVersion < requiresMinimumVersion) {
219 console.log("Extension", requiresExtension, "of version", requiresMinimumVersion, "is required but only", runningVersion, "is present in the host");
224 item.classList.remove("not-supported", "by-host");
227 // The host is most likely not working correctly
228 // If we run this against an older host which doesn't support message replies
229 // this handler is never entered, so we really encountered an error just now!
230 console.warn("Failed to determine subsystem status", e);
231 document.body.classList.add("startup-failure");
235 sendMessage("settings", "getVersion"),
236 chrome.runtime.getManifest()
237 ]).then((results) => {
238 const versionInfo = results[0];
239 const manifest = results[1];
241 document.getElementById("version-info-host").innerText = chrome.i18n.getMessage("options_about_host_version",
243 document.getElementById("version-info-extension").innerText = chrome.i18n.getMessage("options_about_extension_version", manifest.version);
245 document.getElementById("version-info").classList.remove("not-supported");
249 document.getElementById("open-krunner-settings").addEventListener("click", function (event) {
250 sendMessage("settings", "openKRunnerSettings");
251 event.preventDefault();
254 // Make translators credit behave like the one in KAboutData
255 var translatorsAboutData = "";
257 var translators = chrome.i18n.getMessage("options_about_translators");
258 if (translators && translators !== "Your names") {
259 translatorsAboutData = chrome.i18n.getMessage("options_about_translated_by", translators)
262 var translatorsAboutDataItem = document.getElementById("translators-aboutdata");
263 if (translatorsAboutData) {
264 translatorsAboutDataItem.innerText = translatorsAboutData;
266 translatorsAboutDataItem.style.display = "none";