From 19d0a9af28d89526eb77f48305444c2a2378b3a1 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 22 Dec 2022 02:32:45 -0500 Subject: [PATCH 1/6] chore: send message when websocket is open --- packages/liveview/src/main.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/liveview/src/main.js b/packages/liveview/src/main.js index e37ac7b67..4096fd7c5 100644 --- a/packages/liveview/src/main.js +++ b/packages/liveview/src/main.js @@ -1,10 +1,7 @@ function main() { let root = window.document.getElementById("main"); - if (root != null) { - // create a new ipc window.ipc = new IPC(root); - window.ipc.postMessage(serializeIpcMessage("initialize")); } } @@ -13,21 +10,22 @@ class IPC { // connect to the websocket window.interpreter = new Interpreter(root); - this.ws = new WebSocket(WS_ADDR); + let ws = new WebSocket(WS_ADDR); - this.ws.onopen = () => { - console.log("Connected to the websocket"); + ws.onopen = () => { + window.ipc.postMessage(serializeIpcMessage("initialize")); }; - this.ws.onerror = (err) => { - console.error("Error: ", err); + ws.onerror = (err) => { + // todo: retry the connection }; - this.ws.onmessage = (event) => { - console.log("Received message: ", event.data); + ws.onmessage = (event) => { let edits = JSON.parse(event.data); window.interpreter.handleEdits(edits); }; + + this.ws = ws; } postMessage(msg) { From 3c1786b7f180470ea1414591211a3ba1bb999808 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 22 Dec 2022 02:56:33 -0500 Subject: [PATCH 2/6] chore: use ws instead of global --- packages/liveview/src/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/liveview/src/main.js b/packages/liveview/src/main.js index 4096fd7c5..bdf656b50 100644 --- a/packages/liveview/src/main.js +++ b/packages/liveview/src/main.js @@ -13,7 +13,7 @@ class IPC { let ws = new WebSocket(WS_ADDR); ws.onopen = () => { - window.ipc.postMessage(serializeIpcMessage("initialize")); + ws.send(serializeIpcMessage("initialize")); }; ws.onerror = (err) => { From 56d193d1966691f0acc2078b0142d9d919d8cdc4 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 22 Dec 2022 11:30:30 -0500 Subject: [PATCH 3/6] fix: try to guard against double drop --- packages/core/src/arena.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index 9d723d89c..a18fa7ad6 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -136,8 +136,8 @@ impl VirtualDom { } /// Descend through the tree, removing any borrowed props and listeners - pub(crate) fn ensure_drop_safety(&self, scope: ScopeId) { - let scope = &self.scopes[scope.0]; + pub(crate) fn ensure_drop_safety(&self, scope_id: ScopeId) { + let scope = &self.scopes[scope_id.0]; // make sure we drop all borrowed props manually to guarantee that their drop implementation is called before we // run the hooks (which hold an &mut Reference) @@ -145,8 +145,9 @@ impl VirtualDom { let mut props = scope.borrowed_props.borrow_mut(); props.drain(..).for_each(|comp| { let comp = unsafe { &*comp }; - if let Some(scope_id) = comp.scope.get() { - self.ensure_drop_safety(scope_id); + match comp.scope.get() { + Some(child) if child != scope_id => self.ensure_drop_safety(child), + _ => (), } drop(comp.props.take()); }); From 870d857a9376d190457d89824e66cc2a58857e62 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 22 Dec 2022 11:32:42 -0500 Subject: [PATCH 4/6] fix: prevent double borrow --- packages/core/src/arena.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index a18fa7ad6..8e5858a4c 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -149,7 +149,9 @@ impl VirtualDom { Some(child) if child != scope_id => self.ensure_drop_safety(child), _ => (), } - drop(comp.props.take()); + if let Ok(mut props) = comp.props.try_borrow_mut() { + *props = None; + } }); // Now that all the references are gone, we can safely drop our own references in our listeners. From f99991b23bdf7442011a12dd86e058557d1107d5 Mon Sep 17 00:00:00 2001 From: Stuart Woodbury Date: Fri, 23 Dec 2022 09:52:12 -0500 Subject: [PATCH 5/6] feat(DesktopContext): expose set_inner_size --- packages/desktop/src/desktop_context.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 89d0e2fe4..84e321e18 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -1,5 +1,6 @@ use crate::controller::DesktopController; use dioxus_core::ScopeState; +use wry::application::dpi::LogicalSize; use wry::application::event_loop::ControlFlow; use wry::application::event_loop::EventLoopProxy; use wry::application::window::Fullscreen as WryFullscreen; @@ -120,6 +121,11 @@ impl DesktopContext { let _ = self.proxy.send_event(SetZoomLevel(scale_factor)); } + /// modifies the inner size of the window + pub fn set_inner_size(&self, logical_size: LogicalSize) { + let _ = self.proxy.send_event(SetInnerSize(logical_size)); + } + /// launch print modal pub fn print(&self) { let _ = self.proxy.send_event(Print); @@ -159,6 +165,7 @@ pub enum UserWindowEvent { SetDecorations(bool), SetZoomLevel(f64), + SetInnerSize(LogicalSize), Print, DevTool, @@ -205,6 +212,7 @@ pub(super) fn handler( SetDecorations(state) => window.set_decorations(state), SetZoomLevel(scale_factor) => webview.zoom(scale_factor), + SetInnerSize(logical_size) => window.set_inner_size(logical_size), Print => { if let Err(e) = webview.print() { From fe9c482afbdc14298fa81263c6fdfc93c2f6f47f Mon Sep 17 00:00:00 2001 From: Stuart Woodbury Date: Fri, 23 Dec 2022 11:40:51 -0500 Subject: [PATCH 6/6] fix(clippy) --- packages/desktop/src/desktop_context.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 321be314c..7b41d33e0 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -2,12 +2,12 @@ use std::rc::Rc; use crate::controller::DesktopController; use dioxus_core::ScopeState; -use wry::application::dpi::LogicalSize; use serde::de::Error; use serde_json::Value; use std::future::Future; use std::future::IntoFuture; use std::pin::Pin; +use wry::application::dpi::LogicalSize; use wry::application::event_loop::ControlFlow; use wry::application::event_loop::EventLoopProxy; #[cfg(target_os = "ios")]