Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit d05ee40

Browse files
authored
Merge pull request #2174 from github/fixes/2149-search-box-crash
Fix crash when text entered into pull request search box
2 parents 285c664 + 2f3379b commit d05ee40

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

src/GitHub.VisualStudio/UI/GitHubPane.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ protected override void Initialize()
8282
// Using JoinableTaskFactory from parent AsyncPackage. That way if VS shuts down before this
8383
// work is done, we won't risk crashing due to arbitrary work going on in background threads.
8484
var asyncPackage = (AsyncPackage)Package;
85-
viewModelTask = asyncPackage.JoinableTaskFactory.RunAsync(() => InitializeAsync(asyncPackage));
85+
JoinableTaskFactory = asyncPackage.JoinableTaskFactory;
86+
87+
viewModelTask = JoinableTaskFactory.RunAsync(() => InitializeAsync(asyncPackage));
8688
}
8789

8890
public Task<IGitHubPaneViewModel> GetViewModelAsync() => viewModelTask.JoinAsync();
@@ -123,7 +125,7 @@ public override IVsSearchTask CreateSearch(uint dwCookie, IVsSearchQuery pSearch
123125

124126
if (pane != null)
125127
{
126-
return new SearchTask(pane, dwCookie, pSearchQuery, pSearchCallback);
128+
return new SearchTask(JoinableTaskFactory, pane, dwCookie, pSearchQuery, pSearchCallback);
127129
}
128130

129131
return null;
@@ -175,37 +177,38 @@ void UpdateSearchHost(bool enabled, string query)
175177
{
176178
SearchHost.IsEnabled = enabled;
177179

178-
var searchString = SearchHost.SearchQuery?.SearchString;
179-
if (searchString?.Trim() != query?.Trim())
180+
if (SearchHost.SearchQuery?.SearchString != query)
180181
{
181-
// SearchAsync will crash the process if we send it a duplicate string.
182-
// There is a SearchTrimsWhitespace setting that makes searched with leading or trailing
183-
// white-space appear as duplicates. We compare the query with trimmed white-space to avoid this.
184-
// https://github.com/github/VisualStudio/issues/1948
185182
SearchHost.SearchAsync(query != null ? new SearchQuery(query) : null);
186183
}
187184
}
188185
}
189186

190187
class SearchTask : VsSearchTask
191188
{
189+
readonly JoinableTaskFactory joinableTaskFactory;
192190
readonly IGitHubPaneViewModel viewModel;
193191

194192
public SearchTask(
193+
JoinableTaskFactory joinableTaskFactory,
195194
IGitHubPaneViewModel viewModel,
196195
uint dwCookie,
197196
IVsSearchQuery pSearchQuery,
198197
IVsSearchCallback pSearchCallback)
199198
: base(dwCookie, pSearchQuery, pSearchCallback)
200199
{
200+
this.joinableTaskFactory = joinableTaskFactory;
201201
this.viewModel = viewModel;
202202
}
203203

204204
protected override void OnStartSearch()
205205
{
206-
ThreadHelper.ThrowIfNotOnUIThread();
206+
joinableTaskFactory.RunAsync(async () =>
207+
{
208+
await joinableTaskFactory.SwitchToMainThreadAsync();
209+
viewModel.SearchQuery = SearchQuery.SearchString;
210+
});
207211

208-
viewModel.SearchQuery = SearchQuery.SearchString;
209212
base.OnStartSearch();
210213
}
211214

@@ -224,5 +227,7 @@ public SearchQuery(string query)
224227

225228
public uint GetTokens(uint dwMaxTokens, IVsSearchToken[] rgpSearchTokens) => 0;
226229
}
230+
231+
public JoinableTaskFactory JoinableTaskFactory { get; private set; }
227232
}
228233
}

0 commit comments

Comments
 (0)