Allow direct read/update of `WeakViewHandle` only in `AsyncAppContext`

Antonio Scandurra created

Change summary

crates/gpui/src/app.rs             |  6 +++---
crates/search/src/buffer_search.rs |  9 +++++----
crates/workspace/src/pane.rs       | 10 +++++-----
3 files changed, 13 insertions(+), 12 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -4086,10 +4086,10 @@ impl<V: View> WeakViewHandle<V> {
 
     pub fn read_with<T>(
         &self,
-        cx: &impl BorrowAppContext,
+        cx: &AsyncAppContext,
         read: impl FnOnce(&V, &ViewContext<V>) -> T,
     ) -> Result<T> {
-        cx.read_with(|cx| {
+        cx.read(|cx| {
             let handle = cx
                 .upgrade_view_handle(self)
                 .ok_or_else(|| anyhow!("view {} was dropped", V::ui_name()))?;
@@ -4100,7 +4100,7 @@ impl<V: View> WeakViewHandle<V> {
 
     pub fn update<T>(
         &self,
-        cx: &mut impl BorrowAppContext,
+        cx: &mut AsyncAppContext,
         update: impl FnOnce(&mut V, &mut ViewContext<V>) -> T,
     ) -> Result<T> {
         cx.update(|cx| {

crates/search/src/buffer_search.rs 🔗

@@ -201,10 +201,11 @@ impl ToolbarItemView for BufferSearchBar {
                 Some(searchable_item_handle.subscribe_to_search_events(
                     cx,
                     Box::new(move |search_event, cx| {
-                        this.update(cx, |this, cx| {
-                            this.on_active_searchable_item_event(search_event, cx)
-                        })
-                        .log_err();
+                        if let Some(this) = this.upgrade(cx) {
+                            this.update(cx, |this, cx| {
+                                this.on_active_searchable_item_event(search_event, cx)
+                            });
+                        }
                     }),
                 ));
 

crates/workspace/src/pane.rs 🔗

@@ -2005,11 +2005,11 @@ impl NavHistory {
     }
 
     fn did_update(&self, cx: &mut WindowContext) {
-        let pane = self.pane.clone();
-        cx.defer(move |cx| {
-            pane.update(cx, |pane, cx| pane.history_updated(cx))
-                .log_err();
-        });
+        if let Some(pane) = self.pane.upgrade(cx) {
+            cx.defer(move |cx| {
+                pane.update(cx, |pane, cx| pane.history_updated(cx));
+            });
+        }
     }
 }