diff --git a/src/page/store.js b/src/page/store.js index 749f9a22..a19f83a6 100644 --- a/src/page/store.js +++ b/src/page/store.js @@ -109,6 +109,9 @@ function settingsStore() { } }); } + if (key === "active") { + browser.runtime.sendNativeMessage({name: "TOGGLE_EXTENSION", active: String(value)}); + } }; const updateSingleSetting = (key, value) => { // update(settings => (settings[key] = value, settings)); diff --git a/src/popup/App.svelte b/src/popup/App.svelte index 293ab3e0..f12154c7 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -57,6 +57,8 @@ async function toggleExtension() { await settingsStorage.set({global_active: !active}); active = await settingsStorage.get("global_active"); + // TODO: delete after migrating all related logic on the native + browser.runtime.sendNativeMessage({name: "TOGGLE_EXTENSION", active: String(active)}); } function updateAll() { diff --git a/src/shared/dev.js b/src/shared/dev.js index 5bf75d5d..9b1037d2 100644 --- a/src/shared/dev.js +++ b/src/shared/dev.js @@ -203,7 +203,7 @@ const _browser = { response = result; // response.error = "Something went wrong!"; // response.info = "No updates found"; - } else if (name === "POPUP_TOGGLE_EXTENSION") { + } else if (name === "TOGGLE_EXTENSION") { // response = {error: "Failed toggle extension"}; response = {success: true}; } else if (name === "POPUP_UPDATE_ALL" || name === "POPUP_UPDATE_SINGLE") { diff --git a/xcode/Safari-Extension/Functions.swift b/xcode/Safari-Extension/Functions.swift index 4a9ec557..8e5fcffb 100644 --- a/xcode/Safari-Extension/Functions.swift +++ b/xcode/Safari-Extension/Functions.swift @@ -1622,24 +1622,16 @@ func getPopupBadgeCount(_ url: String, _ subframeUrls: [String]) -> Int? { } let manifest = getManifest() guard - var matches = getPopupMatches(url, subframeUrls), - let active = manifest.settings["active"], - let showCount = manifest.settings["showCount"] + var matches = getPopupMatches(url, subframeUrls) else { err("getPopupBadgeCount failed at (1)") return nil } - if showCount == "false" { - return 0 - } for pattern in manifest.blacklist { if match(url, pattern) { return 0 } } - if active != "true" { - return 0 - } matches = matches.filter{!manifest.disabled.contains($0["filename"] as! String)} return matches.count } diff --git a/xcode/Safari-Extension/Resources/background.js b/xcode/Safari-Extension/Resources/background.js index 3b7d243f..7eae15e0 100644 --- a/xcode/Safari-Extension/Resources/background.js +++ b/xcode/Safari-Extension/Resources/background.js @@ -81,23 +81,22 @@ function setClipboard(data, type = "text/plain") { } async function setBadgeCount() { - // only set badge on macOS - const platform = await getPlatform(); - if (platform !== "macos") return; + const clearBadge = () => browser.browserAction.setBadgeText({text: ""}); + // TODO: after the background script is modularized, import and use: + // settingsStorage.get(["global_active","toolbar_badge_count","global_exclude_match"]) + const results = await browser.storage.local.get(["US_GLOBAL_ACTIVE", "US_TOOLBAR_BADGE_COUNT"]); + if (results?.US_GLOBAL_ACTIVE === false) return clearBadge(); + if (results?.US_TOOLBAR_BADGE_COUNT === false) return clearBadge(); + const currentTab = await browser.tabs.getCurrent(); // no active tabs exist (user closed all windows) - if (!currentTab) return; + if (!currentTab) return clearBadge(); const url = currentTab.url; // if url doesn't exist, stop - if (!url) { - browser.browserAction.setBadgeText({text: ""}); - return; - } + if (!url) return clearBadge(); // only check for http/s pages - if (!url.startsWith("http://") && !url.startsWith("https://")) { - browser.browserAction.setBadgeText({text: ""}); - return; - } + if (!url.startsWith("http://") && !url.startsWith("https://")) return clearBadge(); + // TODO: if url match in global exclude list, clear badge const frameUrls = new Set(); const frames = await browser.webNavigation.getAllFrames({tabId: currentTab.id}); for (let i = 0; i < frames.length; i++) { @@ -117,7 +116,12 @@ async function setBadgeCount() { if (count > 0) { browser.browserAction.setBadgeText({text: count.toString()}); } else { - browser.browserAction.setBadgeText({text: ""}); + const _url = new URL(url); + if (_url.pathname.endsWith(".user.js")) { + browser.browserAction.setBadgeText({text: "JS"}); + } else { + clearBadge(); + } } }); } diff --git a/xcode/Safari-Extension/SafariWebExtensionHandler.swift b/xcode/Safari-Extension/SafariWebExtensionHandler.swift index 4805adf0..8f64175c 100644 --- a/xcode/Safari-Extension/SafariWebExtensionHandler.swift +++ b/xcode/Safari-Extension/SafariWebExtensionHandler.swift @@ -58,17 +58,15 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { } } else if name == "POPUP_BADGE_COUNT" { - #if os(macOS) - if let url = message?["url"] as? String, let frameUrls = message?["frameUrls"] as? [String] { - if let matches = getPopupBadgeCount(url, frameUrls) { - response.userInfo = [SFExtensionMessageKey: ["count": matches]] - } else { - response.userInfo = [SFExtensionMessageKey: ["error": "failed to update badge count"]] - } + if let url = message?["url"] as? String, let frameUrls = message?["frameUrls"] as? [String] { + if let matches = getPopupBadgeCount(url, frameUrls) { + response.userInfo = [SFExtensionMessageKey: ["count": matches]] } else { - inBoundError = true + response.userInfo = [SFExtensionMessageKey: ["error": "failed to update badge count"]] } - #endif + } else { + inBoundError = true + } } else if name == "POPUP_INIT" { if let initData = popupInit() { @@ -124,21 +122,17 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { response.userInfo = [SFExtensionMessageKey: ["error": "failed to check for updates"]] } } - else if name == "POPUP_TOGGLE_EXTENSION" { - var manifest = getManifest() - if let active = manifest.settings["active"] { - if active == "true" { - manifest.settings["active"] = "false" - } else { - manifest.settings["active"] = "true" - } + else if name == "TOGGLE_EXTENSION" { + if let active = message?["active"] as? String, ["true", "false"].contains(active) { + var manifest = getManifest() + manifest.settings["active"] = active if updateManifest(with: manifest) { response.userInfo = [SFExtensionMessageKey: ["success": true]] } else { response.userInfo = [SFExtensionMessageKey: ["error": "failed to update injection state"]] } } else { - response.userInfo = [SFExtensionMessageKey: ["error": "failed to update injection state"]] + response.userInfo = [SFExtensionMessageKey: ["error": "missing or wrong message content"]] } } else if name == "TOGGLE_ITEM" {