ThinBridge / Chronos

Chromiumベースの業務ブラウザ
Other
5 stars 3 forks source link

Make cache directory uniq #199

Closed HashidaTKS closed 2 weeks ago

HashidaTKS commented 1 month ago

Which issue(s) this PR fixes:

https://github.com/ThinBridge/Chronos/issues/197

What this PR does / why we need it:

https://magpcss.org/ceforum/viewtopic.php?f=6&t=19677&p=54689&hilit=OnAlreadyRunningAppRelaunch#p54689

CEF120以降では、複数のCEFのインスタンスが起動する際、CefSettings.root_cache_pathが重複していると動作しないため、インタンス単位でCefSettings.root_cache_pathが重複しないように変更。 本修正ではプロセスIDを使用しキャッシュパスが以下のようになるよう変更している。

また、プロセスIDを使うようになった都合上、キャッシュフォルダを次回以降の起動で再利用できないので、IsEnableDeleteCache(ブラウザーキャッシュ(インターネット一時ファイル)を起動/終了時に削除する)の設定に関わらずキャッシュフォルダを毎回削除するように修正。 なお、従来からSGモードではIsEnableDeleteCacheの設定に関わらずキャッシュフォルダは削除されていたので、ユーザーへの実影響はないはずである。

また、CefSettings.root_cache_pathが重複した場合のハンドラーであるOnAlreadyRunningAppRelaunchも実装。 CefSettings.root_cache_pathが重複した場合、デフォルトではChromeスタイルの新しいウィンドウが起動するが、そうではなく、Chronos独自の処理をそのまま続けるようこのハンドラーで設定した。

https://cef-builds.spotifycdn.com/docs/121.0/classCefBrowserProcessHandler.html#a052a91639483467c0b546d57a05c2f06

ただし、修正後はCefSettings.root_cache_pathは重複しないため、OnAlreadyRunningAppRelaunchも呼ばれないはずである(呼ばれたとしたらバグ)。そのため、これは念のための対処である。

How to verify the fixed issue:

以下ChronosのネイティブアプリとSGモードの両方でテストする。

準備:

テスト:

kenhys commented 3 weeks ago

修正自体は問題なさそうにみえるんですが、複数インスタンス起動して終了すると、削除されないパターンがありませんか。 SGモードだとまるっと削除されてしまうので見落としがちなんですけれども。

程度で再現するように見えます。

kenhys commented 3 weeks ago

https://github.com/ThinBridge/Chronos/blob/master/Sazabi.cpp#L4164-L4169 これはIsEnableDeleteCacheでガードしているけどこれもいらない?

HashidaTKS commented 3 weeks ago

https://github.com/ThinBridge/Chronos/blob/master/Sazabi.cpp#L4164-L4169 これはIsEnableDeleteCacheでガードしているけどこれもいらない?

いらなかったため削除しました。

HashidaTKS commented 3 weeks ago

修正自体は問題なさそうにみえるんですが、複数インスタンス起動して終了すると、削除されないパターンがありませんか。 SGモードだとまるっと削除されてしまうので見落としがちなんですけれども。

* Chronos.exe起動 (A)

* Chronos.exe起動 (B)

* B終了

* A終了

程度で再現するように見えます。

確認中です。

HashidaTKS commented 3 weeks ago

修正自体は問題なさそうにみえるんですが、複数インスタンス起動して終了すると、削除されないパターンがありませんか。 SGモードだとまるっと削除されてしまうので見落としがちなんですけれども。

* Chronos.exe起動 (A)

* Chronos.exe起動 (B)

* B終了

* A終了

程度で再現するように見えます。

確認中です。

再現した。 終了時、自分が最後のインスタンスでないとキャッシュを削除しようとせず、削除するときも削除するキャッシュが自分のpidのものだけなことが原因。 また、起動時にも自分のpidのキャッシュしか削除しないので、それらのキャッシュは削除されずに残り続ける。

以下の方針で対応した。

終了時については、最後のインスタンスかどうかにかかわらず、常に自分のpidのキャッシュを削除するようにしても良いと思うが、変更差分が少なくなるように上記のように対応した。