diff --git a/src/page/main.js b/src/page/main.js index 0c38b58f..66ad9d11 100644 --- a/src/page/main.js +++ b/src/page/main.js @@ -6,8 +6,7 @@ import "./cm.css"; if (import.meta.env.DEV) { // vite feat that only import in dev mode const modules = import.meta.glob("../shared/dev.js", {eager: true}); - // eslint-disable-next-line no-global-assign - browser = modules["../shared/dev.js"].browser; + window.browser = modules["../shared/dev.js"].browser; console.info("DEV-ENV", import.meta.env, modules, browser); } diff --git a/src/popup/App.svelte b/src/popup/App.svelte index ca30f696..eca6127a 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -6,7 +6,7 @@ import PopupItem from "./Components/PopupItem.svelte"; import View from "./Components/View.svelte"; import UpdateView from "./Components/Views/UpdateView.svelte"; - import InstallView from "./Components/Views/InstallView.svelte"; + import DetailView from "./Components/Views/DetailView.svelte"; import AllItemsView from "./Components/Views/AllItemsView.svelte"; import iconOpen from "../shared/img/icon-open.svg?raw"; import iconUpdate from "../shared/img/icon-update.svg?raw"; @@ -31,13 +31,13 @@ let header; let warn; let err; + let currentTabItem; let scriptChecking; let scriptInstalled; let showInstallPrompt; - let showInstall; - let installUserscript; // url, content - let installViewUserscript; // metadata - let installViewUserscriptError; + let showDetailView; + let detailViewTitle; + let detailViewItem; let showAll; let allItems = []; let resizeTimer; @@ -123,6 +123,12 @@ }); } + function detailItem(item) { + detailViewItem = item; + detailViewTitle = "Userscript Detail"; + showDetailView = true; + } + function checkForUpdates() { disabled = true; initError = false; @@ -403,18 +409,18 @@ } const content = await res.text(); // caching script data - installUserscript = {url: currentTab.url, content}; + currentTabItem = {url: currentTab.url, content}; // send native swift a message, parse metadata and check if installed const response = await browser.runtime.sendNativeMessage({name: "POPUP_INSTALL_CHECK", content}); console.info("POPUP_INSTALL_CHECK:", response); if (response.error) { console.error(`Error checking .user.js url: ${response.error}`); // errorNotification = response.error; - installViewUserscriptError = response.error; + currentTabItem.error = response.error; } else { scriptInstalled = response.installed; - // caching script metadata - installViewUserscript = response.metadata; + currentTabItem.installed = response.installed; + currentTabItem.metadata = response.metadata; // the response will contain the string to display // ex: {success: "Click to install"} showInstallPrompt = response.success; @@ -422,9 +428,11 @@ scriptChecking = false; } - async function showInstallView() { + async function installItem() { + detailViewItem = currentTabItem; + detailViewTitle = "Install Userscript"; // show the install view - showInstall = true; + showDetailView = true; } async function installConfirm() { @@ -436,13 +444,13 @@ // show loading element loading = true; // go back to main view - showInstall = false; + showDetailView = false; // double check before send install message - if (!installUserscript || !installUserscript.content) { + if (!currentTabItem) { errorNotification = "Install failed: userscript missing"; } const currentTab = await browser.tabs.getCurrent(); - if (currentTab.url !== installUserscript.url) { + if (currentTab.url !== currentTabItem.url) { errorNotification = "Install failed: tab changed unexpectedly"; } if (errorNotification) { @@ -453,7 +461,7 @@ // send native swift a message, which will start the install process const response = await browser.runtime.sendNativeMessage({ name: "POPUP_INSTALL_SCRIPT", - content: installUserscript.content + content: currentTabItem.content }); if (response.error) { errorNotification = response.error; @@ -466,6 +474,29 @@ refreshView(); } + async function updateConfirm() { + console.log("updateConfirm"); + // TODO + // will be implement after the new async update check is implemented + } + + async function trashConfirm() { + disabled = true; + const message = {name: "POPUP_TRASH", item: detailViewItem}; + const response = await browser.runtime.sendNativeMessage(message); + if (response.error) { + errorNotification = response.error; + } else { + // delete the item in the cache array after success + allItems = allItems.filter(obj => obj.filename !== detailViewItem.filename); + // refresh main view + refreshView(); + } + disabled = false; + // exit detail view + showDetailView = undefined; + } + onMount(async () => { await initialize(); // run resize again for good measure @@ -520,7 +551,7 @@ {showInstallPrompt} {:else} {scriptInstalled ? "Installed" : "Detected"}: - {showInstallPrompt} + {showInstallPrompt} {/if} {/if} @@ -562,7 +593,8 @@ subframe={item.subframe} type={item.type} request={!!item.request} - on:click={() => toggleItem(item)} + toggleItem={() => toggleItem(item)} + detailItem={() => detailItem(item)} /> {/each} @@ -592,18 +624,19 @@ {updates} /> -{:else if showInstall} +{:else if showDetailView} showInstall = false} + closeClick={() => showDetailView = false} showLoaderOnDisabled={true} > - showInstall = false} + showDetailView = false} installConfirmClick={installConfirm} + updateConfirmClick={updateConfirm} + trashConfirmClick={trashConfirm} /> {:else if showAll} @@ -618,7 +651,8 @@ > {/if} diff --git a/src/popup/Components/PopupItem.svelte b/src/popup/Components/PopupItem.svelte index 2a3e64a3..14a2919e 100644 --- a/src/popup/Components/PopupItem.svelte +++ b/src/popup/Components/PopupItem.svelte @@ -1,5 +1,7 @@
- -
{name}
- {#if subframe}
SUB
{/if} - +
+ + +
{name}
+ {#if subframe}
SUB
{/if} +
+
+ +
\ No newline at end of file diff --git a/src/popup/Components/Views/InstallView.svelte b/src/popup/Components/Views/InstallView.svelte deleted file mode 100644 index e1dca2cb..00000000 --- a/src/popup/Components/Views/InstallView.svelte +++ /dev/null @@ -1,180 +0,0 @@ - - -
- {#if installError} -
- {@html iconError} -
Couldn't install userscript
-

{installError}

-
- {:else if userscript} - -
-
{@html iconWarn}
-
Be sure you trust the author before installing. Nefarious code can exploit your security and privacy.
-
-
- - -
- {/if} -
- - diff --git a/src/popup/main.js b/src/popup/main.js index 23e0ab93..03752163 100644 --- a/src/popup/main.js +++ b/src/popup/main.js @@ -5,10 +5,9 @@ import App from "./App.svelte"; if (import.meta.env.DEV) { // vite feat that only import in dev mode const modules = import.meta.glob("../shared/dev.js", {eager: true}); - // eslint-disable-next-line no-global-assign - browser = modules["../shared/dev.js"].browser; + window.browser = modules["../shared/dev.js"].browser; console.info("DEV-ENV", import.meta.env, modules, browser); - // macos popup style + // macos popup simulation const style = document.createElement("style"); style.textContent = ` body { diff --git a/src/shared/dev.js b/src/shared/dev.js index 5bf75d5d..4a052791 100644 --- a/src/shared/dev.js +++ b/src/shared/dev.js @@ -55,6 +55,25 @@ function generateFile(type, updates = false, longName = false, request = false) }; } +function generateMetadata(type, updates = false, longName = false) { + const metadata = { + description: "This userscript re-implements the \"View Image\" and \"Search by image\" buttons into google images.", + grant: ["GM.getValue", "GM.setValue", "GM.xmlHttpRequest"], + match: ["https://www.example.com/*", "https://www.example.com/somethingReallylong/goesRightHere"], + name: "Test Install Userscript", + require: ["https://code.jquery.com/jquery-3.5.1.min.js", "https://code.jquery.com/jquery-1.7.1.min.js"], + source: "https://greasyforx.org/scripts/00000-something-something-long-name/code/Something%20something%20long20name.user.js" + }; + if (updates) { + metadata.updateURL = ["https://www.k21p.com/example.user.js"]; + metadata.downloadURL = ["https://www.k21p.com/example.user.js"]; + } + if (longName) { + metadata.name = "Test Install Userscript with loooooooooooooooooooooooooooooooooooooooooong name"; + } + return metadata; +} + const files = [ generateFile("js", true, true), generateFile("css"), @@ -341,7 +360,7 @@ const _browser = { filename: "Google Images Restored.js", disabled: false, type: "js", - metadata: [] + metadata: generateMetadata() }, { name: "Subframe Script Managerial Staffing Company", @@ -365,14 +384,7 @@ const _browser = { {success: "Click to install", installed: false}, {success: "Click to re-install", installed: true} ]); - response.metadata = { - description: "This userscript re-implements the \"View Image\" and \"Search by image\" buttons into google images.", - grant: ["GM.getValue", "GM.setValue", "GM.xmlHttpRequest"], - match: ["https://www.example.com/*", "https://www.example.com/somethingReallylong/goesRightHere"], - name: "Test Install Userscript", - require: ["https://code.jquery.com/jquery-3.5.1.min.js", "https://code.jquery.com/jquery-1.7.1.min.js"], - source: "https://greasyforx.org/scripts/00000-something-something-long-name/code/Something%20something%20long20name.user.js" - }; + response.metadata = generateMetadata(); // response.error = "something went wrong (dev)"; } if (!responseCallback) { diff --git a/xcode/Safari-Extension/SafariWebExtensionHandler.swift b/xcode/Safari-Extension/SafariWebExtensionHandler.swift index 4805adf0..65a95a91 100644 --- a/xcode/Safari-Extension/SafariWebExtensionHandler.swift +++ b/xcode/Safari-Extension/SafariWebExtensionHandler.swift @@ -233,18 +233,16 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { } #endif } - else if name == "PAGE_TRASH" { - #if os(macOS) - if let item = message?["item"] as? [String: Any] { - if trashFile(item) { - response.userInfo = [SFExtensionMessageKey: ["success": true]] - } else { - response.userInfo = [SFExtensionMessageKey: ["error": "failed to trash file"]] - } + else if name == "PAGE_TRASH" || name == "POPUP_TRASH" { + if let item = message?["item"] as? [String: Any] { + if trashFile(item) { + response.userInfo = [SFExtensionMessageKey: ["success": true]] } else { - inBoundError = true + response.userInfo = [SFExtensionMessageKey: ["error": "failed to trash file"]] } - #endif + } else { + inBoundError = true + } } else if name == "PAGE_UPDATE" { #if os(macOS)