diff --git a/extension/Userscripts Extension/Functions.swift b/extension/Userscripts Extension/Functions.swift
index d0ce9e49..e7ae3be3 100644
--- a/extension/Userscripts Extension/Functions.swift
+++ b/extension/Userscripts Extension/Functions.swift
@@ -1185,6 +1185,26 @@ func getCode(_ filenames: [String], _ isTop: Bool)-> [String: [String: [String:
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
+}
+
// popover
func updateBadgeCount(_ frames: [[String : Any]]) {
guard
diff --git a/extension/Userscripts Extension/SafariExtensionHandler.swift b/extension/Userscripts Extension/SafariExtensionHandler.swift
index 8df8400e..432b5298 100644
--- a/extension/Userscripts Extension/SafariExtensionHandler.swift
+++ b/extension/Userscripts Extension/SafariExtensionHandler.swift
@@ -109,10 +109,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) {