diff --git a/config-overrides.js b/config-overrides.js index 32654fa..1f6431a 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -89,7 +89,7 @@ const userscriptWebpack = (config, env) => { // @grant GM.getValue // @grant GM.deleteValue // @grant GM.info -// @inject-into content +// @grant unsafeWindow // @connect translate.googleapis.com // @connect api-edge.cognitive.microsofttranslator.com // @connect edge.microsoft.com diff --git a/package.json b/package.json index 568bdbf..cafbf4e 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,9 @@ "build:firefox": "rm -rf build/firefox && cp -r build/chrome build/firefox && cat ./build/firefox/manifest.firefox.json > ./build/firefox/manifest.json", "build:web": "rm -rf build/web && BUILD_PATH=./build/web REACT_APP_CLIENT=userscript react-app-rewired build", "build:userscript": "rm -rf build/userscript && mkdir build/userscript && cp build/web/kiss-translator.user.js build/userscript/kiss-translator.user.js", + "build:userscript-ios": "file1=build/userscript/kiss-translator.user.js file2=build/userscript/kiss-translator-ios-safari.user.js && cp $file1 $file2 && sed -i 's|// @grant unsafeWindow|// @inject-into content|g' $file2", "build:rules": "babel-node src/rules.js", - "build": "yarn build:chrome && yarn build:edge && yarn build:firefox && yarn build:web && yarn build:userscript && yarn build:rules", + "build": "yarn build:chrome && yarn build:edge && yarn build:firefox && yarn build:web && yarn build:userscript && yarn build:userscript-ios && yarn build:rules", "deploy:web": "wrangler pages deploy ./build/web --project-name kiss-translator", "test": "react-app-rewired test", "eject": "react-scripts eject" @@ -37,7 +38,8 @@ "react-app/jest" ], "globals": { - "GM": true + "GM": true, + "unsafeWindow": true } }, "browserslist": { diff --git a/src/userscript.js b/src/userscript.js index ba5f062..14186f9 100644 --- a/src/userscript.js +++ b/src/userscript.js @@ -3,7 +3,11 @@ import ReactDOM from "react-dom/client"; import Action from "./views/Action"; import createCache from "@emotion/cache"; import { CacheProvider } from "@emotion/react"; -import { getSettingWithDefault, getRulesWithDefault, getFabWithDefault } from "./libs/storage"; +import { + getSettingWithDefault, + getRulesWithDefault, + getFabWithDefault, +} from "./libs/storage"; import { Translator } from "./libs/translator"; import { trySyncAllSubRules } from "./libs/subRules"; import { isGm } from "./libs/client"; @@ -22,16 +26,18 @@ const init = async () => { document.location.href.includes(process.env.REACT_APP_OPTIONSPAGE) || document.location.href.includes(process.env.REACT_APP_OPTIONSPAGE2) ) { - // unsafeWindow.GM = GM; - // unsafeWindow.APP_NAME = process.env.REACT_APP_NAME; - const ping = btoa(Math.random()).slice(3, 11); - window.addEventListener(ping, handlePing); - // window.eval(`(${injectScript})("${ping}")`); // eslint-disable-line - const script = document.createElement("script"); - script.textContent = `(${injectScript})("${ping}")`; - if (document.head) { + if (GM?.info?.script?.grant?.includes("unsafeWindow")) { + unsafeWindow.GM = GM; + unsafeWindow.APP_NAME = process.env.REACT_APP_NAME; + } else { + const ping = btoa(Math.random()).slice(3, 11); + window.addEventListener(ping, handlePing); + // window.eval(`(${injectScript})("${ping}")`); // eslint-disable-line + const script = document.createElement("script"); + script.textContent = `(${injectScript})("${ping}")`; document.head.append(script); } + return; }