From 56e74ccf748ef24075b1095170d764dcfda4ddeb Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Fri, 7 May 2021 10:58:44 -0300 Subject: [PATCH] feat(core): ensure `window.print()`works on macOS (#1738) --- .changes/config.json | 25 +++++++++++++------ .changes/print.md | 5 ++++ .github/workflows/artifacts-updater.yml | 2 +- .github/workflows/build-smoke-tests.yml | 2 +- .github/workflows/core-lint-fmt.yml | 4 +-- .../workflows/covector-version-or-publish.yml | 2 +- .github/workflows/smoke-test-prod.yml | 2 +- .github/workflows/test-bundler.yml | 4 +-- .github/workflows/test-core.yml | 4 +-- .github/workflows/test-cta.yml | 4 +-- .github/workflows/udeps.yml | 2 +- .github/workflows/update-docs.yml | 2 +- core/tauri/Cargo.toml | 2 +- core/tauri/scripts/core.js | 15 ++++++++--- core/tauri/src/endpoints/window.rs | 2 ++ core/tauri/src/runtime/flavors/wry.rs | 15 ++++++++++- core/tauri/src/runtime/mod.rs | 3 +++ core/tauri/src/runtime/window.rs | 7 ++++++ tooling/api/src/helpers/tauri.ts | 1 - 19 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 .changes/print.md diff --git a/.changes/config.json b/.changes/config.json index 94305df60..da12d7f3c 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -8,7 +8,7 @@ "getPublishedVersion": "cargo search ${ pkgFile.pkg.package.name } --limit 1 | sed -nE \"s/^[^\\\"]*\\\"//; s/\\\".*//1p\"", "prepublish": [ "sudo apt-get update", - "sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0", + "sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev", "cargo install cargo-audit --features=fix", { "command": "cargo generate-lockfile", @@ -217,29 +217,40 @@ "tauri-codegen": { "path": "./core/tauri-codegen", "manager": "rust", - "dependencies": ["tauri-utils"] + "dependencies": [ + "tauri-utils" + ] }, "tauri-macros": { "path": "./core/tauri-macros", "manager": "rust", - "dependencies": ["tauri-codegen"] + "dependencies": [ + "tauri-codegen" + ] }, "tauri-build": { "path": "./core/tauri-build", "manager": "rust", - "dependencies": ["tauri-codegen"], + "dependencies": [ + "tauri-codegen" + ], "postversion": "node ../../.scripts/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }" }, "tauri": { "path": "./core/tauri", "manager": "rust", - "dependencies": ["tauri-macros", "tauri-utils"], + "dependencies": [ + "tauri-macros", + "tauri-utils" + ], "postversion": "node ../../.scripts/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }" }, "cli.js": { "path": "./tooling/cli.js", "manager": "javascript", - "dependencies": ["cli.rs"], + "dependencies": [ + "cli.rs" + ], "postversion": "node ../../.scripts/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }", "assets": [ { @@ -265,4 +276,4 @@ "manager": "javascript" } } -} +} \ No newline at end of file diff --git a/.changes/print.md b/.changes/print.md new file mode 100644 index 000000000..62db4e424 --- /dev/null +++ b/.changes/print.md @@ -0,0 +1,5 @@ +--- +"tauri": patch +--- + +`window.print()` now works on all platforms. diff --git a/.github/workflows/artifacts-updater.yml b/.github/workflows/artifacts-updater.yml index 60f9add2c..7389202d4 100644 --- a/.github/workflows/artifacts-updater.yml +++ b/.github/workflows/artifacts-updater.yml @@ -35,7 +35,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: Get current date run: echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV diff --git a/.github/workflows/build-smoke-tests.yml b/.github/workflows/build-smoke-tests.yml index c96452941..37b81b820 100644 --- a/.github/workflows/build-smoke-tests.yml +++ b/.github/workflows/build-smoke-tests.yml @@ -69,7 +69,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: yarn install for cli working-directory: tauri/tooling/cli.js run: yarn diff --git a/.github/workflows/core-lint-fmt.yml b/.github/workflows/core-lint-fmt.yml index 3dd602e1c..ee6885d7f 100644 --- a/.github/workflows/core-lint-fmt.yml +++ b/.github/workflows/core-lint-fmt.yml @@ -24,7 +24,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - uses: actions-rs/toolchain@v1 with: @@ -151,7 +151,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/covector-version-or-publish.yml b/.github/workflows/covector-version-or-publish.yml index 3bdfda0a3..083fd9067 100644 --- a/.github/workflows/covector-version-or-publish.yml +++ b/.github/workflows/covector-version-or-publish.yml @@ -70,7 +70,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: generate rust docs working-directory: ./tauri/core/tauri run: cargo doc --no-deps diff --git a/.github/workflows/smoke-test-prod.yml b/.github/workflows/smoke-test-prod.yml index 430de6a9f..b1f582bfa 100644 --- a/.github/workflows/smoke-test-prod.yml +++ b/.github/workflows/smoke-test-prod.yml @@ -37,7 +37,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: cache rust bin id: cache_rust_bin uses: actions/cache@v1 diff --git a/.github/workflows/test-bundler.yml b/.github/workflows/test-bundler.yml index 107aab4d7..343d30e1e 100644 --- a/.github/workflows/test-bundler.yml +++ b/.github/workflows/test-bundler.yml @@ -35,7 +35,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: Get current date run: echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV @@ -100,7 +100,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: clippy check uses: actions-rs/clippy-check@v1 with: diff --git a/.github/workflows/test-core.yml b/.github/workflows/test-core.yml index ab708b30b..dd8d3d455 100644 --- a/.github/workflows/test-core.yml +++ b/.github/workflows/test-core.yml @@ -37,7 +37,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: Get current date run: echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV @@ -161,7 +161,7 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: Get current date run: echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV diff --git a/.github/workflows/test-cta.yml b/.github/workflows/test-cta.yml index b99a71a27..8449f74ce 100644 --- a/.github/workflows/test-cta.yml +++ b/.github/workflows/test-cta.yml @@ -47,7 +47,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - run: yarn working-directory: tooling/create-tauri-app - run: yarn build @@ -83,7 +83,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - run: yarn working-directory: tooling/create-tauri-app - run: yarn build diff --git a/.github/workflows/udeps.yml b/.github/workflows/udeps.yml index c7caef5a8..e00033c39 100644 --- a/.github/workflows/udeps.yml +++ b/.github/workflows/udeps.yml @@ -90,7 +90,7 @@ jobs: - name: Install required packages run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - uses: actions-rs/cargo@v1 with: diff --git a/.github/workflows/update-docs.yml b/.github/workflows/update-docs.yml index 1bf884471..c36446e17 100644 --- a/.github/workflows/update-docs.yml +++ b/.github/workflows/update-docs.yml @@ -32,7 +32,7 @@ jobs: - name: install webkit2gtk run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 + sudo apt-get install -y libgtk-3-dev libgtksourceview-3.0-dev webkit2gtk-4.0 libappindicator3-dev - name: generate rust docs working-directory: ./tauri/core/tauri run: cargo doc --no-deps diff --git a/core/tauri/Cargo.toml b/core/tauri/Cargo.toml index 18dd75aab..a7a8aaa9c 100644 --- a/core/tauri/Cargo.toml +++ b/core/tauri/Cargo.toml @@ -24,7 +24,7 @@ thiserror = "1.0.24" once_cell = "1.7.2" tauri-macros = { version = "1.0.0-beta-rc.1", path = "../tauri-macros" } tauri-utils = { version = "1.0.0-beta-rc.1", path = "../tauri-utils" } -wry = { git = "https://github.com/tauri-apps/wry", rev = "483bad0fc7e7564500f7183547c15604fa387258" } +wry = { git = "https://github.com/tauri-apps/wry", rev = "0570dcab90087af5b1d29218d9d25186a7ade357" } rand = "0.8" reqwest = { version = "0.11", features = [ "json", "multipart" ] } tempfile = "3" diff --git a/core/tauri/scripts/core.js b/core/tauri/scripts/core.js index bd66f024e..5e3b4aa4c 100644 --- a/core/tauri/scripts/core.js +++ b/core/tauri/scripts/core.js @@ -239,7 +239,6 @@ if (!String.prototype.startsWith) { return window.__TAURI__ .invoke('tauri', { __tauriModule: "Notification", - mainThread: true, message: { cmd: "requestNotificationPermission", }, @@ -308,7 +307,6 @@ if (!String.prototype.startsWith) { window.alert = function (message) { window.__TAURI__.invoke('tauri', { __tauriModule: "Dialog", - mainThread: true, message: { cmd: "messageDialog", message: message, @@ -319,11 +317,22 @@ if (!String.prototype.startsWith) { window.confirm = function (message) { return window.__TAURI__.invoke('tauri', { __tauriModule: "Dialog", - mainThread: true, message: { cmd: "askDialog", message: message, }, }); }; + + // window.print works on Linux/Windows; need to use the API on macOS + if (navigator.userAgent.includes('Mac')) { + window.print = function () { + return window.__TAURI__.invoke('tauri', { + __tauriModule: "Window", + message: { + cmd: "print" + }, + }); + } + } })(); diff --git a/core/tauri/src/endpoints/window.rs b/core/tauri/src/endpoints/window.rs index d53cbd739..68ef98c91 100644 --- a/core/tauri/src/endpoints/window.rs +++ b/core/tauri/src/endpoints/window.rs @@ -71,6 +71,7 @@ pub enum Cmd { icon: IconDto, }, StartDragging, + Print, } #[cfg(window_create)] @@ -146,6 +147,7 @@ impl Cmd { Self::SetFullscreen(fullscreen) => window.set_fullscreen(fullscreen)?, Self::SetIcon { icon } => window.set_icon(icon.into())?, Self::StartDragging => window.start_dragging()?, + Self::Print => window.print()?, } Ok(().into()) } diff --git a/core/tauri/src/runtime/flavors/wry.rs b/core/tauri/src/runtime/flavors/wry.rs index 2d390e10a..ac5f3646d 100644 --- a/core/tauri/src/runtime/flavors/wry.rs +++ b/core/tauri/src/runtime/flavors/wry.rs @@ -343,6 +343,7 @@ enum WindowMessage { #[derive(Debug, Clone)] enum WebviewMessage { EvaluateScript(String), + Print, } #[derive(Clone)] @@ -412,7 +413,7 @@ impl Dispatch for WryDispatcher { id } - // GETTERS + // Getters fn scale_factor(&self) -> crate::Result { Ok(dispatcher_getter!(self, WindowMessage::ScaleFactor)) @@ -459,6 +460,15 @@ impl Dispatch for WryDispatcher { ) } + // Setters + + fn print(&self) -> crate::Result<()> { + self + .proxy + .send_event(Message::Webview(self.window_id, WebviewMessage::Print)) + .map_err(|_| crate::Error::FailedToSendMessage) + } + fn create_window>( &mut self, pending: PendingWindow, @@ -818,6 +828,9 @@ impl Runtime for Wry { WebviewMessage::EvaluateScript(script) => { let _ = webview.dispatch_script(&script); } + WebviewMessage::Print => { + let _ = webview.print(); + } } } } diff --git a/core/tauri/src/runtime/mod.rs b/core/tauri/src/runtime/mod.rs index 9451acab7..939afdf8b 100644 --- a/core/tauri/src/runtime/mod.rs +++ b/core/tauri/src/runtime/mod.rs @@ -99,6 +99,9 @@ pub trait Dispatch: Clone + Send + Sized + 'static { // SETTERS + /// Opens the dialog to prints the contents of the webview. + fn print(&self) -> crate::Result<()>; + /// Create a new webview window. fn create_window>( &mut self, diff --git a/core/tauri/src/runtime/window.rs b/core/tauri/src/runtime/window.rs index 61110d933..de78d6cc0 100644 --- a/core/tauri/src/runtime/window.rs +++ b/core/tauri/src/runtime/window.rs @@ -412,6 +412,13 @@ pub(crate) mod export { // Setters + /// Opens the dialog to prints the contents of the webview. + /// Currently only supported on macOS on `wry`. + /// `window.print()` works on all platforms. + pub fn print(&self) -> crate::Result<()> { + self.window.dispatcher.print() + } + /// Determines if this window should be resizable. pub fn set_resizable(&self, resizable: bool) -> crate::Result<()> { self.window.dispatcher.set_resizable(resizable) diff --git a/tooling/api/src/helpers/tauri.ts b/tooling/api/src/helpers/tauri.ts index eeee41de1..de39df948 100644 --- a/tooling/api/src/helpers/tauri.ts +++ b/tooling/api/src/helpers/tauri.ts @@ -22,7 +22,6 @@ export type TauriModule = export interface TauriCommand { __tauriModule: TauriModule - mainThread?: boolean [key: string]: unknown }