diff --git a/.changes/fix-notification-access-violation.md b/.changes/fix-notification-access-violation.md new file mode 100644 index 00000000..7bf51e39 --- /dev/null +++ b/.changes/fix-notification-access-violation.md @@ -0,0 +1,5 @@ +--- +notification: patch +--- + +Fixed an issue that caused the `notification` plugin's initialization script to cause the WebView on Windows to throw a `STATUS_ACCESS_VIOLATION` error on remote websites. diff --git a/plugins/notification/guest-js/init.ts b/plugins/notification/guest-js/init.ts index 650720c5..15d976d4 100644 --- a/plugins/notification/guest-js/init.ts +++ b/plugins/notification/guest-js/init.ts @@ -10,16 +10,17 @@ import type { Options } from "./index"; let permissionValue = "default"; async function isPermissionGranted(): Promise { - if (window.Notification.permission !== "default") { + // @ts-expect-error __TEMPLATE_windows__ will be replaced in rust before it's injected. + if (window.Notification.permission !== "default" || __TEMPLATE_windows__) { return await Promise.resolve( - window.Notification.permission === "granted", + window.Notification.permission === "granted" ); } return await invoke("plugin:notification|is_permission_granted"); } function setNotificationPermission( - value: "granted" | "denied" | "default", + value: "granted" | "denied" | "default" ): void { permissionSettable = true; // @ts-expect-error we can actually set this value on the webview @@ -31,10 +32,10 @@ import type { Options } from "./index"; "default" | "denied" | "granted" | "prompt" > { return await invoke<"prompt" | "default" | "granted" | "denied">( - "plugin:notification|request_permission", + "plugin:notification|request_permission" ).then((permission) => { setNotificationPermission( - permission === "prompt" ? "default" : permission, + permission === "prompt" ? "default" : permission ); return permission; }); @@ -64,7 +65,7 @@ import type { Options } from "./index"; Object.assign(opts, { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment title, - }), + }) ); }; diff --git a/plugins/notification/src/init-iife.js b/plugins/notification/src/init-iife.js index eddbeb05..eb3b0cce 100644 --- a/plugins/notification/src/init-iife.js +++ b/plugins/notification/src/init-iife.js @@ -1 +1 @@ -!function(){"use strict";async function i(i,n={},t){return window.__TAURI_INTERNALS__.invoke(i,n,t)}"function"==typeof SuppressedError&&SuppressedError,function(){let n=!1,t="default";function o(i){n=!0,window.Notification.permission=i,n=!1}window.Notification=function(n,t){const o=t||{};!async function(n){"object"==typeof n&&Object.freeze(n),await i("plugin:notification|notify",{options:"string"==typeof n?{title:n}:n})}(Object.assign(o,{title:n}))},window.Notification.requestPermission=async function(){return await i("plugin:notification|request_permission").then((i=>(o("prompt"===i?"default":i),i)))},Object.defineProperty(window.Notification,"permission",{enumerable:!0,get:()=>t,set:i=>{if(!n)throw new Error("Readonly property");t=i}}),async function(){return"default"!==window.Notification.permission?await Promise.resolve("granted"===window.Notification.permission):await i("plugin:notification|is_permission_granted")}().then((function(i){o(null===i?"default":i?"granted":"denied")}))}()}(); +!function(){"use strict";async function i(i,n={},t){return window.__TAURI_INTERNALS__.invoke(i,n,t)}"function"==typeof SuppressedError&&SuppressedError,function(){let n=!1,t="default";function o(i){n=!0,window.Notification.permission=i,n=!1}window.Notification=function(n,t){const o=t||{};!async function(n){"object"==typeof n&&Object.freeze(n),await i("plugin:notification|notify",{options:"string"==typeof n?{title:n}:n})}(Object.assign(o,{title:n}))},window.Notification.requestPermission=async function(){return await i("plugin:notification|request_permission").then((i=>(o("prompt"===i?"default":i),i)))},Object.defineProperty(window.Notification,"permission",{enumerable:!0,get:()=>t,set:i=>{if(!n)throw new Error("Readonly property");t=i}}),async function(){return"default"!==window.Notification.permission||__TEMPLATE_windows__?await Promise.resolve("granted"===window.Notification.permission):await i("plugin:notification|is_permission_granted")}().then((function(i){o(null===i?"default":i?"granted":"denied")}))}()}(); diff --git a/plugins/notification/src/lib.rs b/plugins/notification/src/lib.rs index e4a902cc..35304a6b 100644 --- a/plugins/notification/src/lib.rs +++ b/plugins/notification/src/lib.rs @@ -227,7 +227,10 @@ pub fn init() -> TauriPlugin { commands::request_permission, commands::is_permission_granted ]) - .js_init_script(include_str!("init-iife.js").to_string()) + .js_init_script(include_str!("init-iife.js").replace( + "__TEMPLATE_windows__", + if cfg!(windows) { "true" } else { "false" }, + )) .setup(|app, api| { #[cfg(mobile)] let notification = mobile::init(app, api)?;