Fix a missing follower update on re-activate (#7918)

This could cause following to get into a bad state temporarily

Release Notes:

- Fixed a bug around following if the follow started while the workspace
was inactive.
This commit is contained in:
Conrad Irwin 2024-02-16 11:33:49 -07:00 committed by GitHub
parent 5df1318e75
commit 43e8fdbe82
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 64 additions and 6 deletions

View file

@ -2077,3 +2077,66 @@ async fn test_following_to_channel_notes_other_workspace(
assert_eq!(editor.tab_description(0, cx).unwrap(), "1.txt"); assert_eq!(editor.tab_description(0, cx).unwrap(), "1.txt");
}); });
} }
#[gpui::test]
async fn test_following_while_deactivated(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
let (_, client_a, client_b, channel) = TestServer::start2(cx_a, cx_b).await;
let mut cx_a2 = cx_a.clone();
let (workspace_a, cx_a) = client_a.build_test_workspace(cx_a).await;
join_channel(channel, &client_a, cx_a).await.unwrap();
share_workspace(&workspace_a, cx_a).await.unwrap();
// a opens 1.txt
cx_a.simulate_keystrokes("cmd-p 1 enter");
cx_a.run_until_parked();
workspace_a.update(cx_a, |workspace, cx| {
let editor = workspace.active_item(cx).unwrap();
assert_eq!(editor.tab_description(0, cx).unwrap(), "1.txt");
});
// b joins channel and is following a
join_channel(channel, &client_b, cx_b).await.unwrap();
cx_b.run_until_parked();
let (workspace_b, cx_b) = client_b.active_workspace(cx_b);
workspace_b.update(cx_b, |workspace, cx| {
let editor = workspace.active_item(cx).unwrap();
assert_eq!(editor.tab_description(0, cx).unwrap(), "1.txt");
});
// stop following
cx_b.simulate_keystrokes("down");
// a opens a different file while not followed
cx_a.simulate_keystrokes("cmd-p 2 enter");
workspace_b.update(cx_b, |workspace, cx| {
let editor = workspace.active_item_as::<Editor>(cx).unwrap();
assert_eq!(editor.tab_description(0, cx).unwrap(), "1.txt");
});
// a opens a file in a new window
let (_, cx_a2) = client_a.build_test_workspace(&mut cx_a2).await;
cx_a2.update(|cx| cx.activate_window());
cx_a2.simulate_keystrokes("cmd-p 3 enter");
cx_a2.run_until_parked();
// b starts following a again
cx_b.simulate_keystrokes("cmd-ctrl-alt-f");
cx_a.run_until_parked();
// a returns to the shared project
cx_a.update(|cx| cx.activate_window());
cx_a.run_until_parked();
workspace_a.update(cx_a, |workspace, cx| {
let editor = workspace.active_item(cx).unwrap();
assert_eq!(editor.tab_description(0, cx).unwrap(), "2.js");
});
// b should follow a back
workspace_b.update(cx_b, |workspace, cx| {
let editor = workspace.active_item_as::<Editor>(cx).unwrap();
assert_eq!(editor.tab_description(0, cx).unwrap(), "2.js");
});
}

View file

@ -566,10 +566,7 @@ impl CollabTitlebarItem {
ActiveCall::global(cx) ActiveCall::global(cx)
.update(cx, |call, cx| call.set_location(Some(&self.project), cx)) .update(cx, |call, cx| call.set_location(Some(&self.project), cx))
.detach_and_log_err(cx); .detach_and_log_err(cx);
return; } else if cx.active_window().is_none() {
}
if cx.active_window().is_none() {
ActiveCall::global(cx) ActiveCall::global(cx)
.update(cx, |call, cx| call.set_location(None, cx)) .update(cx, |call, cx| call.set_location(None, cx))
.detach_and_log_err(cx); .detach_and_log_err(cx);

View file

@ -2743,7 +2743,6 @@ impl Workspace {
cx.notify(); cx.notify();
self.last_active_view_id = active_view_id.clone();
proto::FollowResponse { proto::FollowResponse {
active_view_id, active_view_id,
views: self views: self
@ -2917,7 +2916,6 @@ impl Workspace {
pub fn update_active_view_for_followers(&mut self, cx: &mut WindowContext) { pub fn update_active_view_for_followers(&mut self, cx: &mut WindowContext) {
let mut is_project_item = true; let mut is_project_item = true;
let mut update = proto::UpdateActiveView::default(); let mut update = proto::UpdateActiveView::default();
if cx.is_window_active() { if cx.is_window_active() {
if let Some(item) = self.active_item(cx) { if let Some(item) = self.active_item(cx) {
if item.focus_handle(cx).contains_focused(cx) { if item.focus_handle(cx).contains_focused(cx) {