From 725ff4295e56df9c30c099813bd64b96fe61b945 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Tue, 23 Jul 2024 13:10:58 +0200 Subject: [PATCH] fix(notification/windows): Grant permission without invoking backend (#1556) * fix(notification/windows): Grant permission without invoking backend * fmt --- .changes/fix-notification-access-violation.md | 5 +++++ plugins/notification/guest-js/init.ts | 3 ++- plugins/notification/src/init-iife.js | 2 +- plugins/notification/src/lib.rs | 5 ++++- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changes/fix-notification-access-violation.md 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..73d25fac 100644 --- a/plugins/notification/guest-js/init.ts +++ b/plugins/notification/guest-js/init.ts @@ -10,7 +10,8 @@ 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", ); 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)?;