Safari 4 Betaをなんとかして共存させたい

ずいぶん前だけどSafari 4 Betaが公開された。

いろいろな機能が追加され動作も高速になっているけれど、英語版のみの提供だし、ベータ版なので通常は3を使ったり使わせたりしたい。でも、検証作業なんかは3と4の両方でやりたいので、なんとかして共存させたい。

共存の方法としては、4をインストールした上で3を単独起動するようにする方法と、その逆でインストールをせずに4を単独起動させる方法があるけれども、インストールが必要ない後者の方法でなんとかする。

システムに異常が発生する可能性があるので、以下自己責任で。なお、Mac OS X 10.5(Leopard)以外は未検証。

ファイルの取り出し

Safari 4 Betaのインストールディスクイメージをダウンロード。マウントするとインストーラ(Safari4.0BetaLeo.pkg)が出てくるので、適当な場所にコピー。

コピーしたインストーラからUnpkgとかでデータを取り出す。中身はこんな感じ。


ファイルのコピー

まずはデータ/Applications/Safari.app を適当な場所にコピーして、名前を Safari 4.app とかにしておく。

パッケージの中にフレームワークとライブラリをコピー。具体的にはデータ/System/Library/Frameworksの中身と、データ/System/Library/PrivateFrameworksの中身を、Safari 4.app/Contents/frameworksフォルダを作ってその中にコピー。同様にデータ/usr/libの中身を、Safari 4.app/Contents/libフォルダを作ってその中にコピー。libxml2.dylibはエイリアスなので作り直しておく。

ブートスクリプトの作成

コピーしたフレームワークとライブラリを参照するように、環境変数DYLD_FRAMEWORK_PATHとDYLD_LIBRARY_PATHをセットした状態でSafari 4.app/Contents/Safariが実行されるようにする。

環境変数をセットするにはInfo.plistにLSEnvironmentを作ればいいのだけれども、この方法だと絶対パスしか指定できないっぽい。できればSafari 4.app/Contents/Safariからの相対パスにしたいので、ブート用のシェルスクリプト環境変数をセットするようにする。

まず、Safari 4.app/Contents/Safariの名前をSafari 4に変更。続いてSafari 4.app/Contents/Safariに以下みたいな内容のシェルスクリプトを置く。要実行権限。

#!/bin/sh
APPROOT=${0}/../..
export DYLD_LIBRARY_PATH="$APPROOT/lib"
export DYLD_FRAMEWORK_PATH="$APPROOT/frameworks"
exec "$APPROOT/MacOS/Safari 4" "$@"

起動テスト

だいたい作業完了したので、Safari 4.appをダブルクリックして起動してみるが、エラー。

Referenced from: /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore
Expected in: /Users/***/Desktop/Safari 4/Safari4.0BetaLeo/Applications/Safari 4.app/Contents/MacOS/Safari/../../frameworks/JavaScriptCore.framework/Versions/A/JavaScriptCore

Safari 4.app/Contents/frameworks/WebKit.framework/Versions/A/FrameworksにあるWebCore.frameworkを、Safari 4.app/Contents/frameworksに移動してやればよさそう。

再度起動テストすると見事起動成功。

動作確認

これで本当にSafari 4として起動しているのか?Safari 3はそのままなのか?

確認してみる。以下、Acid3の結果とnavigator.userAgent。

いちおう別物っぽい。まだちゃんと動いているか疑問。表示確認くらいになら使える感じがする。