diff --git a/.editorconfig b/.editorconfig
index 1c1266938..00bab1044 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,3 +1,8 @@
+[*.csproj]
+indent_style = space
+indent_size = 2
+tab_width = 2
+
[*.cs]
indent_style = space
tab_width = 4
diff --git a/OpenTween.Tests/OpenTween.Tests.csproj b/OpenTween.Tests/OpenTween.Tests.csproj
index a61fda3a5..3e6582c39 100644
--- a/OpenTween.Tests/OpenTween.Tests.csproj
+++ b/OpenTween.Tests/OpenTween.Tests.csproj
@@ -40,6 +40,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/OpenTween.Tests/TweetThumbnailTest.cs b/OpenTween.Tests/TweetThumbnailTest.cs
index 9f274ec8b..04cd7e305 100644
--- a/OpenTween.Tests/TweetThumbnailTest.cs
+++ b/OpenTween.Tests/TweetThumbnailTest.cs
@@ -104,7 +104,7 @@ private void MyCommonSetup()
MyCommon.EntryAssembly = mockAssembly.Object;
}
- [Fact]
+ [WinFormsFact]
public void CreatePictureBoxTest()
{
using var thumbBox = new TweetThumbnail();
@@ -121,7 +121,7 @@ public void CreatePictureBoxTest()
picbox.Dispose();
}
- [Fact]
+ [WinFormsFact]
public async Task CancelAsyncTest()
{
var post = new PostClass
@@ -138,7 +138,6 @@ public async Task CancelAsyncTest()
using var tokenSource = new CancellationTokenSource();
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var task = thumbbox.ShowThumbnailAsync(post, tokenSource.Token);
tokenSource.Cancel();
@@ -147,7 +146,7 @@ public async Task CancelAsyncTest()
Assert.True(task.IsCanceled);
}
- [Theory]
+ [WinFormsTheory]
[InlineData(0)]
[InlineData(1)]
[InlineData(2)]
@@ -178,7 +177,7 @@ public void SetThumbnailCountTest(int count)
Assert.Equal(count - 1, thumbbox.scrollBar.Maximum);
}
- [Fact]
+ [WinFormsFact]
public async Task ShowThumbnailAsyncTest()
{
var post = new PostClass
@@ -193,7 +192,6 @@ public async Task ShowThumbnailAsyncTest()
using var thumbbox = new TweetThumbnail();
thumbbox.Initialize(this.CreateThumbnailGenerator());
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
await thumbbox.ShowThumbnailAsync(post);
Assert.Equal(0, thumbbox.scrollBar.Maximum);
@@ -211,7 +209,7 @@ public async Task ShowThumbnailAsyncTest()
Assert.Equal("", thumbbox.toolTip.GetToolTip(thumbbox.PictureBox[0]));
}
- [Fact]
+ [WinFormsFact]
public async Task ShowThumbnailAsyncTest2()
{
var post = new PostClass
@@ -227,7 +225,6 @@ public async Task ShowThumbnailAsyncTest2()
using var thumbbox = new TweetThumbnail();
thumbbox.Initialize(this.CreateThumbnailGenerator());
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
await thumbbox.ShowThumbnailAsync(post);
Assert.Equal(1, thumbbox.scrollBar.Maximum);
@@ -253,14 +250,12 @@ public async Task ShowThumbnailAsyncTest2()
Assert.Equal("efgh", thumbbox.toolTip.GetToolTip(thumbbox.PictureBox[1]));
}
- [Fact]
+ [WinFormsFact]
public async Task ThumbnailLoadingEventTest()
{
using var thumbbox = new TweetThumbnail();
thumbbox.Initialize(this.CreateThumbnailGenerator());
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
-
var post = new PostClass
{
TextFromApi = "てすと",
@@ -274,8 +269,6 @@ await TestUtils.NotRaisesAsync(
() => thumbbox.ShowThumbnailAsync(post)
);
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
-
var post2 = new PostClass
{
TextFromApi = "てすと http://foo.example.com/abcd",
@@ -292,7 +285,7 @@ await Assert.RaisesAsync(
);
}
- [Fact]
+ [WinFormsFact]
public async Task ScrollTest()
{
var post = new PostClass
@@ -308,7 +301,6 @@ public async Task ScrollTest()
using var thumbbox = new TweetThumbnail();
thumbbox.Initialize(this.CreateThumbnailGenerator());
- SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
await thumbbox.ShowThumbnailAsync(post);
Assert.Equal(0, thumbbox.scrollBar.Minimum);
diff --git a/OpenTween/Api/MicrosoftTranslatorApi.cs b/OpenTween/Api/MicrosoftTranslatorApi.cs
index 363946841..6400a7ad7 100644
--- a/OpenTween/Api/MicrosoftTranslatorApi.cs
+++ b/OpenTween/Api/MicrosoftTranslatorApi.cs
@@ -128,7 +128,8 @@ public async Task UpdateAccessTokenIfExpired()
using var response = await this.Http.SendAsync(request)
.ConfigureAwait(false);
- response.EnsureSuccessStatusCode();
+ if (!response.IsSuccessStatusCode)
+ throw new WebApiException(response.StatusCode.ToString());
var accessToken = await response.Content.ReadAsStringAsync()
.ConfigureAwait(false);
diff --git a/OpenTween/ImageCache.cs b/OpenTween/ImageCache.cs
index 690a7aced..76bfb639e 100644
--- a/OpenTween/ImageCache.cs
+++ b/OpenTween/ImageCache.cs
@@ -91,25 +91,21 @@ public Task DownloadImageAsync(string address, bool force = false)
return Task.Run(() =>
{
+ Task? cachedImageTask;
lock (this.lockObject)
- {
- this.InnerDictionary.TryGetValue(address, out var cachedImageTask);
+ this.InnerDictionary.TryGetValue(address, out cachedImageTask);
- if (cachedImageTask != null)
- {
- if (force)
- this.InnerDictionary.Remove(address);
- else
- return cachedImageTask;
- }
+ if (cachedImageTask != null && !force)
+ return cachedImageTask;
- cancelToken.ThrowIfCancellationRequested();
+ cancelToken.ThrowIfCancellationRequested();
- var imageTask = this.FetchImageAsync(address, cancelToken);
+ var imageTask = this.FetchImageAsync(address, cancelToken);
+
+ lock (this.lockObject)
this.InnerDictionary[address] = imageTask;
- return imageTask;
- }
+ return imageTask;
},
cancelToken);
}
diff --git a/OpenTween/OTPictureBox.cs b/OpenTween/OTPictureBox.cs
index 5ebb65140..21a775323 100644
--- a/OpenTween/OTPictureBox.cs
+++ b/OpenTween/OTPictureBox.cs
@@ -112,7 +112,7 @@ public async Task SetImageFromTask(Func> imageTask, bool useSt
if (useStatusImage)
this.ShowInitialImage();
- var image = await imageTask();
+ var image = await Task.Run(imageTask);
if (id == this.currentImageTaskId)
this.Image = image;
diff --git a/OpenTween/Properties/AssemblyInfo.cs b/OpenTween/Properties/AssemblyInfo.cs
index 602090e76..41ecf4222 100644
--- a/OpenTween/Properties/AssemblyInfo.cs
+++ b/OpenTween/Properties/AssemblyInfo.cs
@@ -22,7 +22,7 @@
// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
[assembly: Guid("2d0ae0ba-adac-49a2-9b10-26fd69e695bf")]
-[assembly: AssemblyVersion("2.7.0.0")]
+[assembly: AssemblyVersion("2.7.1.0")]
[assembly: InternalsVisibleTo("OpenTween.Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // for Moq
diff --git a/OpenTween/Properties/Resources.Designer.cs b/OpenTween/Properties/Resources.Designer.cs
index 21be83480..baa0084e9 100644
--- a/OpenTween/Properties/Resources.Designer.cs
+++ b/OpenTween/Properties/Resources.Designer.cs
@@ -571,6 +571,10 @@ internal static string ChangeIconToolStripMenuItem_Confirm {
///
/// 更新履歴
///
+ ///==== Ver 2.7.1(2022/09/03)
+ /// * FIX: 発言一覧の選択位置を移動した際にデッドロックが発生する場合がある不具合を修正 (thx @Kazuki_Ashiya!)
+ /// * FIX: 発言本文の翻訳時に発生したエラーが適切に処理されない不具合を修正
+ ///
///==== Ver 2.7.0(2022/07/30)
/// * NEW: 発言詳細部の日時ラベルをクリックするとWebブラウザを起動してツイートを表示する機能を追加
/// * NEW: 設定画面に「Twitter API v2 の使用を有効にする」のチェックボックスを追加
@@ -578,11 +582,7 @@ internal static string ChangeIconToolStripMenuItem_Confirm {
/// - Twitter の API キーを独自に書き換えている場合で、Project への移行を完了できていない等の理由で API v2 を使用できない時はチェックを外してください
/// * CHG: 発言詳細部の名前ラベルを投稿者とRTしたユーザーで分けずに表示するように変更
/// * FIX: タブの移動後に発言一覧が空の表示になる不具合を修正
- /// * FIX: 読み込み中の待機ダイアログを表示する際にエラーが発生する不具合を修正
- /// * FIX: Recentタブの読み込み時にエラーダイアログが表示される場合がある不具合を修正
- /// * FIX: タブ名変更後にタイムラインを取得するとエラーが発生する不具合を修正
- ///
- ///==== Ver 2 [残りの文字列は切り詰められました]"; に類似しているローカライズされた文字列を検索します。
+ /// * FIX: [残りの文字列は切り詰められました]"; に類似しているローカライズされた文字列を検索します。
///
internal static string ChangeLog {
get {
diff --git a/OpenTween/Resources/ChangeLog.txt b/OpenTween/Resources/ChangeLog.txt
index 875763b8d..533eb13a4 100644
--- a/OpenTween/Resources/ChangeLog.txt
+++ b/OpenTween/Resources/ChangeLog.txt
@@ -1,5 +1,9 @@
更新履歴
+==== Ver 2.7.1(2022/09/03)
+ * FIX: 発言一覧の選択位置を移動した際にデッドロックが発生する場合がある不具合を修正 (thx @Kazuki_Ashiya!)
+ * FIX: 発言本文の翻訳時に発生したエラーが適切に処理されない不具合を修正
+
==== Ver 2.7.0(2022/07/30)
* NEW: 発言詳細部の日時ラベルをクリックするとWebブラウザを起動してツイートを表示する機能を追加
* NEW: 設定画面に「Twitter API v2 の使用を有効にする」のチェックボックスを追加
diff --git a/OpenTween/TweetThumbnail.cs b/OpenTween/TweetThumbnail.cs
index dddb955cb..c3b839918 100644
--- a/OpenTween/TweetThumbnail.cs
+++ b/OpenTween/TweetThumbnail.cs
@@ -131,8 +131,8 @@ private string GetImageSearchUriGoogle(string image_uri)
private string GetImageSearchUriSauceNao(string imageUri)
=> @"https://saucenao.com/search.php?url=" + Uri.EscapeDataString(imageUri);
- protected virtual Task> GetThumbailInfoAsync(PostClass post, CancellationToken token)
- => this.ThumbGenerator.GetThumbnailsAsync(post, token);
+ protected async virtual Task> GetThumbailInfoAsync(PostClass post, CancellationToken token)
+ => await Task.Run(() => this.ThumbGenerator.GetThumbnailsAsync(post, token));
///
/// 表示するサムネイルの数を設定する
diff --git a/appveyor.yml b/appveyor.yml
index 676677d00..f1a03ecfa 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: 2.6.0.{build}
+version: 2.7.0.{build}
os: Visual Studio 2022