From 1830409b204b22225b54da02e43a4dc6c52377f2 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 03:48:01 +0800 Subject: [PATCH 01/12] chore: fix dev compatibility --- src/page/main.js | 3 +-- src/popup/main.js | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) 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/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 { From 2d37a89f51a9915d2dde84b600579b0a6344e927 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 03:05:32 +0800 Subject: [PATCH 02/12] feat: add detail button for items in popup --- src/popup/App.svelte | 7 +++++- src/popup/Components/PopupItem.svelte | 35 ++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/popup/App.svelte b/src/popup/App.svelte index ca30f696..1e2fedb2 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -123,6 +123,10 @@ }); } + function detailItem(item) { + + } + function checkForUpdates() { disabled = true; initError = false; @@ -562,7 +566,8 @@ subframe={item.subframe} type={item.type} request={!!item.request} - on:click={() => toggleItem(item)} + toggleItem={() => toggleItem(item)} + detailItem={() => detailItem(item)} /> {/each} diff --git a/src/popup/Components/PopupItem.svelte b/src/popup/Components/PopupItem.svelte index 2a3e64a3..5f3584a3 100644 --- a/src/popup/Components/PopupItem.svelte +++ b/src/popup/Components/PopupItem.svelte @@ -7,16 +7,21 @@ export let type; export let subframe; export let request = false; + export let toggleItem; + export let detailItem;
- -
{name}
- {#if subframe}
SUB
{/if} - +
+ + +
{name}
+ {#if subframe}
SUB
{/if} +
+
\ No newline at end of file From 9bdbc2c99580f918d2e1129915bf571d39a1dbca Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 10:51:38 +0800 Subject: [PATCH 06/12] refactor: migrating `InstallView` to `DetailView` --- src/popup/App.svelte | 60 +++--- src/popup/Components/Views/InstallView.svelte | 180 ------------------ 2 files changed, 22 insertions(+), 218 deletions(-) delete mode 100644 src/popup/Components/Views/InstallView.svelte diff --git a/src/popup/App.svelte b/src/popup/App.svelte index 133688d9..4a7ea9c2 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -6,7 +6,6 @@ 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"; @@ -32,15 +31,12 @@ 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 showDetail; - let showDetailTitle; + let showDetailView; + let detailViewTitle; let detailViewItem; let showAll; let allItems = []; @@ -129,8 +125,8 @@ function detailItem(item) { detailViewItem = item; - showDetailTitle = "Userscript Detail"; - showDetail = true; + detailViewTitle = "Userscript Detail"; + showDetailView = true; } function checkForUpdates() { @@ -413,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; @@ -432,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() { @@ -446,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) { @@ -463,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; @@ -538,7 +536,7 @@ {showInstallPrompt} {:else} {scriptInstalled ? "Installed" : "Detected"}: - {showInstallPrompt} + {showInstallPrompt} {/if} {/if} @@ -611,30 +609,16 @@ {updates} /> -{:else if showInstall} +{:else if showDetailView} showInstall = false} - showLoaderOnDisabled={true} - > - showInstall = false} - installConfirmClick={installConfirm} - /> - -{:else if showDetail} - showDetail = false} + closeClick={() => showDetailView = false} showLoaderOnDisabled={true} > showDetail = false} + cancelClick={() => showDetailView = false} installConfirmClick={installConfirm} updateConfirmClick={updateConfirm} deleteConfirmClick={deleteConfirm} 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} -
    -
  • {userscript.name}
  • - {#if userscript.description} -
  • {userscript.description}
  • - {/if} - {#if userscript.match} -
  • -
    @match
    - {#each userscript.match as match} -
    {match}
    - {/each} -
  • - {/if} - {#if userscript.include} -
  • -
    @include
    - {#each userscript.include as include} -
    {include}
    - {/each} -
  • - {/if} - {#if userscript.require} -
  • -
    @require
    - {#each userscript.require as require} -
    {require}
    - {/each} -
  • - {/if} - {#if userscript.grant} -
  • -
    @grant
    - {#each userscript.grant as grant} -
    {grant}
    - {/each} -
  • - {/if} -
-
-
{@html iconWarn}
-
Be sure you trust the author before installing. Nefarious code can exploit your security and privacy.
-
-
- - -
- {/if} -
- - From fc9c7e63d856e413718a454c14d64bcc769d4866 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 12:16:06 +0800 Subject: [PATCH 07/12] style: adjust buttons --- src/popup/Components/Views/DetailView.svelte | 41 ++++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/popup/Components/Views/DetailView.svelte b/src/popup/Components/Views/DetailView.svelte index e61fbfe4..1c24bb46 100644 --- a/src/popup/Components/Views/DetailView.svelte +++ b/src/popup/Components/Views/DetailView.svelte @@ -18,8 +18,6 @@ ]; let errormsg = itemdata.error; let metadata = itemdata.metadata; - let variableButton; - let variableButtonClick; function metadataInit() { if (metadata) return; @@ -39,18 +37,6 @@ if (!metadata) { metadataInit(); } - if (itemdata.update) { - variableButton = "Update"; - variableButtonClick = updateConfirmClick; - } - if (itemdata.filename) { - variableButton = "Delete"; - variableButtonClick = deleteConfirmClick; - } - if (itemdata.url) { - variableButton = "Install"; - variableButtonClick = installConfirmClick; - } } @@ -81,7 +67,7 @@ {/if} {/each} - {#if !itemdata.filename} + {#if itemdata.url}
{@html iconWarn}
Be sure you trust the author before installing. Nefarious code can exploit your security and privacy.
@@ -91,9 +77,21 @@ - + {#if itemdata.url} + + {/if} + {#if itemdata.filename} + + {/if} + {#if itemdata.update} + + {/if}
{/if} @@ -201,19 +199,20 @@ background-color: #ffffffa6; /* -text-color-secondary */ border-radius: var(--border-radius); color: var(--color-bg-primary); + font-weight: 600; flex-grow: 1; height: 2rem; } - button.Install { + button.install { background-color: var(--color-blue); } - button.Update { + button.update { background-color: var(--color-yellow); } - button.Delete { + button.delete { background-color: var(--color-red); } \ No newline at end of file From 1167f5d272a49beb054ef0b3ef40f990922e8f75 Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 13:07:08 +0800 Subject: [PATCH 08/12] style: adjust media query --- src/popup/Components/PopupItem.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/popup/Components/PopupItem.svelte b/src/popup/Components/PopupItem.svelte index dc942f0c..df2b1175 100644 --- a/src/popup/Components/PopupItem.svelte +++ b/src/popup/Components/PopupItem.svelte @@ -50,7 +50,7 @@ } } - @media not (hover: hover) { + @media (hover: none) { .item .more { border-left: .1rem solid rgb(255 255 255 / 0.075); } From aceee2812fbf55617bff2170bf5c315345ef57db Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 22:31:49 +0800 Subject: [PATCH 09/12] feat: add `DetailView` for `AllItemsView` --- src/popup/App.svelte | 3 ++- src/popup/Components/Views/AllItemsView.svelte | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/popup/App.svelte b/src/popup/App.svelte index 4a7ea9c2..c1903c00 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -636,7 +636,8 @@ >
{/if} diff --git a/src/popup/Components/Views/AllItemsView.svelte b/src/popup/Components/Views/AllItemsView.svelte index 6906c6d0..ca784fce 100644 --- a/src/popup/Components/Views/AllItemsView.svelte +++ b/src/popup/Components/Views/AllItemsView.svelte @@ -2,7 +2,8 @@ import PopupItem from "../PopupItem.svelte"; export let allItems = []; - export let allItemsToggleItem; + export let toggleItem; + export let detailItem; let disabled; let rowColorsAll; @@ -27,7 +28,8 @@ subframe={item.subframe} type={item.type} request={!!item.request} - on:click={() => allItemsToggleItem(item)} + toggleItem={() => toggleItem(item)} + detailItem={() => detailItem(item)} /> {/each} From 357dc87cc1fc61338ca45609f9d8cfc6f2f0d72c Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Sat, 11 Mar 2023 22:42:05 +0800 Subject: [PATCH 10/12] chore(dev.js): reuse metadata --- src/shared/dev.js | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) 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) { From f82ce6bba3f04de0f26adbc591eeebde675d12af Mon Sep 17 00:00:00 2001 From: ACTCD <101378590+ACTCD@users.noreply.github.com> Date: Tue, 14 Mar 2023 05:07:27 +0800 Subject: [PATCH 11/12] feat: trash file and confirmation --- src/popup/App.svelte | 23 +++++-- src/popup/Components/Views/DetailView.svelte | 67 +++++++++++++------ .../SafariWebExtensionHandler.swift | 18 +++-- 3 files changed, 74 insertions(+), 34 deletions(-) diff --git a/src/popup/App.svelte b/src/popup/App.svelte index c1903c00..eca6127a 100644 --- a/src/popup/App.svelte +++ b/src/popup/App.svelte @@ -476,10 +476,25 @@ async function updateConfirm() { console.log("updateConfirm"); + // TODO + // will be implement after the new async update check is implemented } - async function deleteConfirm() { - console.log("deleteConfirm"); + 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 () => { @@ -618,10 +633,10 @@ > showDetailView = false} + goBackClick={() => showDetailView = false} installConfirmClick={installConfirm} updateConfirmClick={updateConfirm} - deleteConfirmClick={deleteConfirm} + trashConfirmClick={trashConfirm} /> {:else if showAll} diff --git a/src/popup/Components/Views/DetailView.svelte b/src/popup/Components/Views/DetailView.svelte index 1c24bb46..292229b4 100644 --- a/src/popup/Components/Views/DetailView.svelte +++ b/src/popup/Components/Views/DetailView.svelte @@ -4,10 +4,10 @@ import {parse} from "../../../shared/utils"; export let itemdata; - export let cancelClick; + export let goBackClick; export let installConfirmClick; export let updateConfirmClick; - export let deleteConfirmClick; + export let trashConfirmClick; const showItems = [ "version", @@ -18,6 +18,18 @@ ]; let errormsg = itemdata.error; let metadata = itemdata.metadata; + let checking; + let trashing; + let updating; // TODO + + $: checking = trashing || updating; + + function cancelClick() { + if (trashing) { + return trashing = undefined; + } + goBackClick(); + } function metadataInit() { if (metadata) return; @@ -53,19 +65,21 @@ {#if itemdata.filename}
  • {itemdata.filename}
  • {/if} - {#if metadata.description} -
  • {metadata.description}
  • - {/if} - {#each showItems as key} - {#if metadata[key]} -
  • -
    @{key}
    - {#each metadata[key] as val} -
    {val}
    - {/each} -
  • + {#if !checking} + {#if metadata.description} +
  • {metadata.description}
  • {/if} - {/each} + {#each showItems as key} + {#if metadata[key]} +
  • +
    @{key}
    + {#each metadata[key] as val} +
    {val}
    + {/each} +
  • + {/if} + {/each} + {/if} {#if itemdata.url}
    @@ -73,7 +87,18 @@
    Be sure you trust the author before installing. Nefarious code can exploit your security and privacy.
    {/if} + {#if trashing} +
    +
    {@html iconWarn}
    +
    Are you sure you want to trash this file?
    +
    + {/if}
    + {#if trashing} + + {/if} @@ -82,12 +107,12 @@ {itemdata.installed ? "Reinstall" : "Install"} {/if} - {#if itemdata.filename} - {/if} - {#if itemdata.update} + {#if itemdata.update && !checking} @@ -190,6 +215,7 @@ .buttons { display: flex; + flex-wrap: wrap; justify-content: space-between; gap: 1rem; padding-bottom: 1rem; @@ -200,7 +226,7 @@ border-radius: var(--border-radius); color: var(--color-bg-primary); font-weight: 600; - flex-grow: 1; + flex: 1 0 calc(33.333% - 1rem); height: 2rem; } @@ -212,7 +238,8 @@ background-color: var(--color-yellow); } - button.delete { + button.trash { + color: var(--text-color-primary); background-color: var(--color-red); } \ No newline at end of file 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) From 8cf0deb2dddc83126f3ab3cfab0c7d37111a20d7 Mon Sep 17 00:00:00 2001 From: quoid <7660254+quoid@users.noreply.github.com> Date: Tue, 14 Mar 2023 21:37:05 -0400 Subject: [PATCH 12/12] chore: update `i` button styles --- src/popup/Components/PopupItem.svelte | 38 ++++++++++++++++++--------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/popup/Components/PopupItem.svelte b/src/popup/Components/PopupItem.svelte index df2b1175..14a2919e 100644 --- a/src/popup/Components/PopupItem.svelte +++ b/src/popup/Components/PopupItem.svelte @@ -1,5 +1,7 @@