From e7fd7830e88dd42ab2c357ea9e4d7dfcc12e00c1 Mon Sep 17 00:00:00 2001 From: lucka-me Date: Sat, 10 Apr 2021 16:01:11 +0800 Subject: [PATCH] Load remote file in extension --- .../Userscripts Extension/Functions.swift | 20 +++++++++++ .../SafariExtensionHandler.swift | 21 +++++++++++- src/Components/Editor/Editor.svelte | 2 +- src/handler.js | 4 +++ src/utils.js | 34 ++++++++++++------- 5 files changed, 66 insertions(+), 15 deletions(-) diff --git a/extension/Userscripts Extension/Functions.swift b/extension/Userscripts Extension/Functions.swift index cde9f8a0..8e0e4593 100644 --- a/extension/Userscripts Extension/Functions.swift +++ b/extension/Userscripts Extension/Functions.swift @@ -1182,3 +1182,23 @@ func getCode(_ url: String, _ isTop: Bool) -> [String: [String: [String: Any]]]? return allFiles } + +func getRemoteFile(_ url: String, _ callback: @escaping (String, Error?) -> Void) -> Bool { + guard let solidURL = URL(string: url) else { + return false + } + let request = URLRequest(url: solidURL, cachePolicy: .reloadIgnoringLocalCacheData) + URLSession.shared.dataTask(with: request) { data, _, error in + guard + let solidData = data, + let solidCode = String(data: solidData, encoding: .utf8) + else { + callback("", error) + return + } + callback(solidCode, nil) + return + } + .resume() + return true +} diff --git a/extension/Userscripts Extension/SafariExtensionHandler.swift b/extension/Userscripts Extension/SafariExtensionHandler.swift index d824baa9..5baa8088 100644 --- a/extension/Userscripts Extension/SafariExtensionHandler.swift +++ b/extension/Userscripts Extension/SafariExtensionHandler.swift @@ -102,10 +102,29 @@ class SafariExtensionHandler: SFSafariExtensionHandler { } else { responseError = "failed to get code" } + case "REQ_GET_REMOTE_FILE": + if + let data = userInfo, + let url = data["url"] as? String, + getRemoteFile(url, { code, error in + page.dispatchMessageToScript( + withName: "RESP_GET_REMOTE_FILE", + userInfo: [ "data": [ "url": url, "code": code ], "error": error?.localizedDescription ?? "" ] + ) + }) + { + // Started + } else { + responseName = "RESP_GET_REMOTE_FILE" + responseData = [ "url": userInfo?["url"] ] + responseError = "failed to download" + } default: err("message from js has no handler") } - page.dispatchMessageToScript(withName: responseName, userInfo: ["data": responseData, "error": responseError]) + if !responseName.isEmpty { + page.dispatchMessageToScript(withName: responseName, userInfo: ["data": responseData, "error": responseError]) + } } override func toolbarItemClicked(in window: SFSafariWindow) { diff --git a/src/Components/Editor/Editor.svelte b/src/Components/Editor/Editor.svelte index 5c4e3a8d..36c42f55 100644 --- a/src/Components/Editor/Editor.svelte +++ b/src/Components/Editor/Editor.svelte @@ -294,7 +294,7 @@ {:else if $state.includes("trashing")} (◞‸◟) {:else if $state.includes("updating")} - Updating code, cancel request + Updating code {:else if remote} Code was remotely fetched, check carefully before saving! {:else if temp} diff --git a/src/handler.js b/src/handler.js index 92e10ade..9e68a5a7 100644 --- a/src/handler.js +++ b/src/handler.js @@ -112,6 +112,10 @@ function handleMessage(e) { // in the event of a failure from one of the above, log error if needed and nothing else break; } + case "RESP_GET_REMOTE_FILE": { + // SHould be handled by callback in getRemoteFile() + break; + } default: { console.error(`message from swift has no handler - ${name}`); } diff --git a/src/utils.js b/src/utils.js index dfaa56ce..8260420b 100644 --- a/src/utils.js +++ b/src/utils.js @@ -27,20 +27,28 @@ export function sortBy(array, order) { return array; } -export async function getRemoteFile(url, signal) { - let r = {}; - // add delay for testing - // url = `http://slowwly.robertomurray.co.uk/delay/5000/url/${url}`; - await fetch(url, {signal}).then(response => { - if (!response.ok) throw Error(response.statusText); - return response.text(); - }).then(text => { - r.contents = text; - }).catch(error => { - console.log(error); - r.error = "Remote url bad response!"; +export function getRemoteFile(url, signal) { + return new Promise(resolve => { + const callback = (e) => { + if (e.name !== 'RESP_GET_REMOTE_FILE') return; + const message = e.message; + const data = message.data; + if (data.url !== url) return; + safari.self.removeEventListener('message', callback); + const response = { }; + if (message.error) { + response.error = message.error; + } else if (message.data.code) { + response.contents = message.data.code; + } else { + response.error = 'Remote url bad or empty response!'; + } + resolve(response); + }; + safari.self.addEventListener("message", callback); + const data = { url: url }; + safari.extension.dispatchMessage("REQ_GET_REMOTE_FILE", data); }); - return r; } export function validateURL(url) {