com.apple.Safari.plistを掃除してSafariのクラッシュを直す

なんかOSのアップデートしたら、Safariが再現性アリで落ちるようになって使い物にならないので調べてたメモ。

### 事象

いくつかのサイトで、リンクのクリックイベント奪って勝手に新規ウインドウで開く系のWeb広告が開こうとするタイミングで落ちるっぽい。
素直に、やめてくれ。


### コンソールのログ

```console
デフォルト	02:22:59.965799+0900	Safari	*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Returned WKWebView was not created with the given configuration.'
*** First throw call stack:
(
	0   CoreFoundation                      0x0000000185952ca0 __exceptionPreprocess + 176
	1   libobjc.A.dylib                     0x0000000185416b90 objc_exception_throw + 88
	2   CoreFoundation                      0x0000000185952b90 +[NSException exceptionWithName:reason:userInfo:] + 0
	3   WebKit                              0x00000001ac6ca4b0 _ZN6WebKit10UIDelegate8UIClient13createNewPageERNS_12WebPageProxyEON3WTF3RefIN3API17PageConfigurationENS4_12RawPtrTraitsIS7_EENS4_21DefaultRefDerefTraitsIS7_EEEEONS5_INS6_16NavigationActionENS8_I	4   WebKit                              0x00000001ac77d89c _ZN6WebKit26SOAuthorizationCoordinator12tryAuthorizeEON3WTF3RefIN3API17PageConfigurationENS1_12RawPtrTraitsIS4_EENS1_21DefaultRefDerefTraitsIS4_EEEEONS2_INS3_16NavigationActionENS5_ISB_EENS7_ISB_	5   WebKit                   <…>
エラー	02:22:59.965828+0900	Safari	An uncaught exception was raised
エラー	02:22:59.965867+0900	Safari	Returned WKWebView was not created with the given configuration.
エラー	02:22:59.965920+0900	Safari	(
	0   CoreFoundation                      0x0000000185952ca0 __exceptionPreprocess + 176
	1   libobjc.A.dylib                     0x0000000185416b90 objc_exception_throw + 88
	2   CoreFoundation                      0x0000000185952b90 +[NSException exceptionWithName:reason:userInfo:] + 0
	3   WebKit                              0x00000001ac6ca4b0 _ZN6WebKit10UIDelegate8UIClient13createNewPageERNS_12WebPageProxyEON3WTF3RefIN3API17PageConfigurationENS4_12RawPtrTraitsIS7_EENS4_21DefaultRefDerefTraitsIS7_EEEEONS5_INS6_16NavigationActionENS8_ISE_EENSA_ISE_EEEEONS4_17CompletionHandlerIFvONS4_6RefPtrIS2_NS8_IS2_EENSA_IS2_EEEEEEE + 1276
	4   WebKit                              0x00000001ac77d89c _ZN6WebKit26SOAuthorizationCoordinator12tryAuthorizeEON3WTF3RefIN3API17PageConfigurationENS1_12RawPtrTraitsIS4_EENS1_21DefaultRefDerefTraitsIS4_EEEEONS2_INS3_16NavigationActionENS5_ISB_EENS7_ISB_EEEERNS_12WebPageProxyEONS1_17CompletionHandlerIFvONS1_6RefPtrISG_NS5_ISG_EENS7_ISG_EEEEEEEONS1_8FunctionIFvSF_SQ_EEE + 432
	5   WebKit                              0x00000001ac9f44f4 _ZN6WebKit12WebPageProxy13createNewPageERN3IPC10ConnectionEON7WebCore14WindowFeaturesEONS_20NavigationActionDataEON3WTF17CompletionHandlerIFvNSt3__18optionalINS9_23ObjectIdentifierGenericINS4_18PageIdentifierTypeENS9_38ObjectIdentifierMainThreadAccessTraitsIyEEyEEEENSC_INS_25WebPageCreationParametersEEEEEE + 2192
	6   WebKit                              0x00000001ac512f00 _ZN6WebKit12WebPageProxy21didReceiveSyncMessageERN3IPC10ConnectionERNS1_7DecoderERN3WTF9UniqueRefINS1_7EncoderEEE + 7832
	7   WebKit                              0x00000001ad024874 _ZN3IPC18MessageReceiverMap19dispatchSyncMessageERNS_10ConnectionERNS_7DecoderERN3WTF9UniqueRefINS_7EncoderEEE + 312
	8   WebKit                              0x00000001aca7217c _ZN6WebKit15WebProcessProxy19dispatchSyncMessageERN3IPC10ConnectionERNS1_7DecoderERN3WTF9UniqueRefINS1_7EncoderEEE + 48
	9   WebKit                              0x00000001ac5468cc _ZN6WebKit15WebProcessProxy21didReceiveSyncMessageERN3IPC10ConnectionERNS1_7DecoderERN3WTF9UniqueRefINS1_7EncoderEEE + 404
	10  WebKit                              0x00000001ad01e0e4 _ZN3IPC10Connection19dispatchSyncMessageERNS_7DecoderE + 172
	11  WebKit                              0x00000001ad01e5b0 _ZN3IPC10Connection15dispatchMessageEN3WTF9UniqueRefINS_7DecoderEEE + 584
	12  WebKit                              0x00000001ad0197c4 _ZN3IPC10Connection16SyncMessageState28ConnectionAndIncomingMessage8dispatchEv + 92
	13  WebKit                              0x00000001ad020620 _ZN3WTF6Detail15CallableWrapperIZN3IPC10Connection16SyncMessageState22processIncomingMessageERS3_RNS_9UniqueRefINS2_7DecoderEEEE3$_0vJEE4callEv + 776
	14  JavaScriptCore                      0x00000001a46a024c _ZN3WTF7RunLoop11performWorkEv + 524
	15  JavaScriptCore                      0x00000001a46a10e8 _ZN3WTF7RunLoop11performWorkEPv + 36
	16  CoreFoundation                      0x00000001858e1cd4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 28
	17  CoreFoundation                      0x00000001858e1c68 __CFRunLoopDoSource0 + 172
	18  CoreFoundation                      0x00000001858e19d4 __CFRunLoopDoSources0 + 232
	19  CoreFoundation                      0x00000001858e0628 __CFRunLoopRun + 840
	20  CoreFoundation                      0x00000001858dfc58 CFRunLoopRunSpecific + 572
	21  HIToolbox                           0x000000019137427c RunCurrentEventLoopInMode + 324
	22  HIToolbox                           0x00000001913774e8 ReceiveNextEventCommon + 676
	23  HIToolbox                           0x0000000191502484 _BlockUntilNextEventMatchingListInModeWithFilter + 76
	24  AppKit                              0x0000000189807ab4 _DPSNextEvent + 684
	25  AppKit                              0x000000018a1a65b0 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 688
	26  Safari                              0x00000001b85b485c -[BrowserApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 228
	27  AppKit                              0x00000001897fac64 -[NSApplication run] + 480
	28  AppKit                              0x00000001897d135c NSApplicationMain + 880
	29  Safari                              0x00000001b8973fa8 SafariMain + 468
	30  dyld                                0x0000000185456b98 start + 6076
)
失敗	02:22:59.967941+0900	Safari	FAULT: NSInternalInconsistencyException: Returned WKWebView was not created with the given configuration.; (user info absent)

```

うん、WKWebKitが例外出してるのはわかった。

で、なんでそんなのが出るのよ・・・


### 試したこと
- キャッシュをクリアする
    - 効果なし
- pluginとかを無効にしてみる
    - 効果なし
- 再起動
    - 効果なし

コンソール眺めてると
```console
エラー	02:22:59.963198+0900	Safari	IIOImageSource:513: *** ERROR: can't open '/Users/xxx/Library/Containers/com.apple.Safari/Data/Library/Safari/StartPage/defaultBackground'  (fileExists == false)
```

これが気になる。

多分関係ないけど、眺めに行くと、この辺のフォルダにSafariのキャッシュだの設定だのが置いてあるみたい。

ふーむ、この辺の設定ファイル、多分、秘伝のタレになってそうよねぇ。
このホームフォルダ、何年・何台に渡って、転送や上書きアップデートで使い続けてるかわからんもんな。

- とりあえず、`/Library/Containers/com.apple.Safari`をゴミ箱に突っ込む
  - Safariを起動してみる
      - 効いた！落ちなくなった！

### 落ちる原因の特定
これで終わりにしてもよかったけど、設定が飛ぶのが嫌だったのでもう少し追求。


ゴミ箱に突っ込んだ元々の設定を、新しく自動生成された設定に上書きしていって、動かなくなるとこを探していく。


すると、なんか、、、
だいぶ色々いらなそうなファイルがあることがわかる。

`com.apple.Safari.RSS.plist`とかさ。
懐かしいよね。
最終更新日、2011年だったよ。

### `com.apple.Safari.plist`の中身を特定していく
どうやら`com.apple.Safari.plist`を差し替えると動かなくなるのがわかったので、次はこれの中身。

バイナリ形式のplistで、QuickLookで中身は覗けるが、このままじゃ比較・編集しづらい、、、
ので、VisualStudio CodeにBinaryEditorとかいうエクステンションぶち込んでいく。

https://marketplace.visualstudio.com/items?itemName=dnicolson.binary-plist

流石に項目数が多すぎるので、１つ１つ見ていくのは早々に諦め、
適当な範囲で項目をざっくり消して、Safari起動＆再現確認。を繰り返す。

再現してれば、そこは関係ない。
再現しなくなったら、消した範囲の中の項目に問題なのがいる。

したら、`<key>RecentWebSearches</key>`を消すと再現しなくなることがわかった。

よし、消そう。

終わり。


詳しい中身の確認まではせんかったけど、Recentとか書いてあるし、なんかMigrationミスってるだろ。

### 再発した
↑ので直ったと思ってたんだけど、再発した。

とりあえず、`TabCreationPolicy`が0、「ウインドウの代わりにタブでページを開く」が「常にしない」なのを消してやると収まった。
デフォルトの「自動」だと大丈夫みたいだけど
Cmd+Opt+クリックで「リンクを新規ウインドウで開く」の操作するとやはり落ちるので、
新規ウインドウ作るまわりのバグでは、これ。
いや、広告が邪悪なことしてるせいなのかもしれないけれど。


### おまけ
この辺のって、古のSafariのエンジニアが残した系のアレだよね。
UserDefaults、どんどん肥大化していってしまう問題、純正アプリでもあるんだねぇ、的なやつ。

```
	<key>NSWindow Frame ActivityViewer</key>
	<string>160 165 832 679 0 0 1680 1028 </string>
	<key>NSWindow Frame Authentication Panel</key>
	<string>1084 859 416 271 0 0 2560 1417 </string>
	<key>NSWindow Frame BrowserWindowFrame</key>
	<string>1783 358 1466 1399 0 0 3360 2215 </string>
	<key>NSWindow Frame Downloads</key>
	<string>1247 282 400 746 0 0 1680 1028 </string>
	<key>NSWindow Frame Extension Builder</key>
	<string>520 289 717 523 0 0 2560 1417 </string>
	<key>NSWindow Frame GoToSheet</key>
	<string>1621 1317 460 292 0 0 3360 2215 </string>
	<key>NSWindow Frame HTMLSource</key>
	<string>673 145 880 705 0 0 1680 1028 </string>
	<key>NSWindow Frame NSColorPanel</key>
	<string>30 83 224 275 0 0 2560 1417 </string>
	<key>NSWindow Frame NSNavGotoPanel</key>
	<string>555 798 432 134 0 0 1680 1028 </string>
	<key>NSWindow Frame NSNavPanelAutosaveName</key>
	<string>1451 1229 799 441 0 0 3360 2215 </string>
	<key>NSWindow Frame NSSpellCheckerSubstitutionsPanel2</key>
	<string>952 678 440 137 0 0 3360 2215 </string>
	<key>NSWindow Frame NewBookmarksSheet</key>
	<string>1190 1276 462 209 0 0 3360 2215 </string>
	<key>NSWindow Frame OtherUserAgentSheet</key>
	<string>2060 747 370 191 0 0 3360 2215 </string>
	<key>NSWindow Frame Preferences</key>
	<string>991 1144 858 414 0 0 3360 2215 </string>
	<key>NSWindow Frame PrivacyReportWindow</key>
	<string>450 1142 656 838 0 0 3008 1980 </string>
	<key>NSWindow Frame SourceWindowFrame</key>
	<string>673 145 880 705 0 0 1680 1028 </string>
	<key>NSWindow Frame WBBWebGLPolicies</key>
	<string>3042 185 499 472 2560 -1120 1440 2537 </string>
	<key>NSWindow Frame WBBlockedPlugins</key>
	<string>2913 262 752 522 2560 -1120 1440 2537 </string>
	<key>NSWindow Frame WBCookies</key>
	<string>287 386 1167 452 0 0 1680 1028 </string>
	<key>NSWindow Frame WBCookiesAndOtherWebsiteData</key>
	<string>1101 961 625 448 0 0 3360 2215 </string>
	<key>NSWindow Frame WBDatabases</key>
	<string>1008 512 424 337 0 0 1680 1028 </string>
	<key>NSWindow Frame Web Inspector 2</key>
	<string>658 0 1675 667 0 0 2560 1418 </string>
```