From 87a177ab7b979549b973451bddecef96cfad13c6 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Fri, 2 Aug 2024 04:43:46 +0800 Subject: [PATCH 1/2] fix: correctly determine the remote file type Pre-verify URL validity, fetch directly in the JS layer instead of the native layer. --- .../Components/Sidebar/Sidebar.svelte | 42 ++++++++++++++----- .../SafariWebExtensionHandler.swift | 15 ------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/ext/extension-page/Components/Sidebar/Sidebar.svelte b/src/ext/extension-page/Components/Sidebar/Sidebar.svelte index df85340e..c5b4cb07 100644 --- a/src/ext/extension-page/Components/Sidebar/Sidebar.svelte +++ b/src/ext/extension-page/Components/Sidebar/Sidebar.svelte @@ -60,7 +60,10 @@ }; // if it's a remotely added script add prop to item object // is used to display url in editor and will be removed on save - if (remote) item.remote = remote; + if (remote) { + item.remote = remote; + item.name = remote; + } items.update((i) => [item, ...i]); await tick(); // if omitted invalid arg in activate function activate(item); @@ -111,17 +114,36 @@ const temp = $items.find((i) => i.temp); if ((cmChanged() || temp) && !warn()) return; // prompt user for url - const url = prompt("Enter remote url:"); + const input = prompt("Enter remote url:"); // stop execution is user cancels prompt - if (!url) return; - state.add("fetching"); - const message = { name: "PAGE_NEW_REMOTE", url }; - const response = await sendNativeMessage(message); - if (response.error) { - log.add(response.error, "error", true); + if (input === null) return; + /** @type {URL} */ + let url; + /** @type {"js"|"css"} */ + let type; + try { + url = new URL(input.trim()); + } catch { + log.add("Failed to get remote content, invalid url", "error", true); + return; + } + // check file type + if (url.pathname.endsWith(".js")) { + type = "js"; + } else if (url.pathname.endsWith(".css")) { + type = "css"; } else { - const type = url.substring(url.lastIndexOf(".") + 1); - newItem(type, response, url); + log.add("Failed to get remote content, invalid file type", "error", true); + return; + } + state.add("fetching"); + try { + const res = await fetch(url); + if (!res.ok) throw new Error(`httpcode-${res.status}`); + const content = await res.text(); + newItem(type, content, url); + } catch (error) { + log.add(`Failed to get remote content - ${error}`, "error", true); } state.remove("fetching"); } diff --git a/xcode/Ext-Safari/SafariWebExtensionHandler.swift b/xcode/Ext-Safari/SafariWebExtensionHandler.swift index 413d76fe..07e3e9e9 100644 --- a/xcode/Ext-Safari/SafariWebExtensionHandler.swift +++ b/xcode/Ext-Safari/SafariWebExtensionHandler.swift @@ -258,21 +258,6 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { } response.userInfo = [SFExtensionMessageKey: ["success": true]] } - else if name == "PAGE_NEW_REMOTE" { - #if os(macOS) - if let url = message?["url"] as? String { - if !validateUrl(url) { - response.userInfo = [SFExtensionMessageKey: ["error": "Failed to get remote content, invalid url"]] - } else if let content = getRemoteFileContents(url) { - response.userInfo = [SFExtensionMessageKey: content] - } else { - response.userInfo = [SFExtensionMessageKey: ["error": "Failed to get remote content"]] - } - } else { - inBoundError = true - } - #endif - } else if name == "PAGE_UPDATE_SETTINGS" { #if os(macOS) if let settings = message?["settings"] as? [String: String] { From 0fbf833c3a5bd450a93d4330fb57138257d8fbde Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:32:35 +0800 Subject: [PATCH 2/2] refactor: add some type checking and jsdoc --- src/ext/extension-page/Components/Sidebar/Sidebar.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ext/extension-page/Components/Sidebar/Sidebar.svelte b/src/ext/extension-page/Components/Sidebar/Sidebar.svelte index c5b4cb07..8c7307d8 100644 --- a/src/ext/extension-page/Components/Sidebar/Sidebar.svelte +++ b/src/ext/extension-page/Components/Sidebar/Sidebar.svelte @@ -32,7 +32,13 @@ scrollToEl(active.filename); } + /** + * @param {"js"|"css"} type + * @param {string=} content + * @param {string=} remote + */ async function newItem(type, content, remote) { + if (!["js", "css", "dnr"].includes(type)) return; // warn if there are unsaved changes or another temp script const temp = $items.find((i) => i.temp); if ((cmChanged() || temp) && !warn()) return; @@ -141,7 +147,7 @@ const res = await fetch(url); if (!res.ok) throw new Error(`httpcode-${res.status}`); const content = await res.text(); - newItem(type, content, url); + newItem(type, content, url.href); } catch (error) { log.add(`Failed to get remote content - ${error}`, "error", true); }