Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions extension/Userscripts Extension/Functions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 20 additions & 1 deletion extension/Userscripts Extension/SafariExtensionHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/Components/Editor/Editor.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@
{:else if $state.includes("trashing")}
(◞‸◟)
{:else if $state.includes("updating")}
Updating code, <span class="link" on:click={abort}>cancel request</span>
Updating code<!--, <span class="link" on:click={abort}>cancel request</span>-->
{:else if remote}
Code was <span class="info" title={remote}>remotely fetched</span>, check carefully before saving!
{:else if temp}
Expand Down
4 changes: 4 additions & 0 deletions src/handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`);
}
Expand Down
34 changes: 21 additions & 13 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down