Persistenceの概念

head img
    Photoshop
    Illustrator

IllustratorのCEPのデバッグはなぜやりづらいのか。

IllustratorのCEPパネルのデバッグをやっているとコードの修正が中々反映されないのに気づきます。これは パネルを開くとコードの修正が反映されるのがIllustratorのアプリケーションを閉じて再度起動した後になるからです。 Photoshopではパネルを閉じる、開くをするだけで修正後のコードが反映されます。 なぜPhotoshopはこんなに早くコードの修正が反映されるのでしょうか。そしてIllustratorの コードの修正をもっと早く反映させるようにするのが今回の本題です。

Persistenceという概念

PhotoshopのCEPにはPersistenceという概念があります。PhotoshopCEPの場合通常パネルのフォームに入力した 値、登録したイベント等パネルを閉じると全てリセットされます。パネル上の情報がパネルを閉じることにより そのままリセットされるからです。パネルを再度開いた時にリロードされて修正されたコードが反映されます。しかし 場合によってはパネルが隠れた時もパネルの機能が動いて欲しい時もあります。例えば登録したイベントは通常パネルを閉じると イベント自体消えてしまいます。しかしパネルを閉じた上でイベントが動いて欲しいこともあるでしょう。 この時にPersistenceをオンにします。以下そのサンプルコード。

CSEvent からインスタンスを作成。 extensionのidをcsinterface.getExtensionIDメソッドより事前に読み込んでインスタンスにプロパティを代入。 その後 dispatchEventメソッドよりPersistenceイベントを発火。Persistenceイベントは登録後に 消去することもできます。このイベントを発火させるとパネルを閉じた後もパネルの機能が動き続けますので 登録したイベントは動き続けますしフォームに入力した値やDOMの情報も維持されます。これでPhotoshop の仕様は理解できたと思いますが問題はIllustratorになります。

IllustratorにはPersistenceという概念は無い

それでIllustratorにはPersistenceという概念は無いので先程のコードは動きません。そして通常の 場合なぜかIllustratorはPersistenceでいうところのオンの状態、つまりパネルを閉じた所でパネルの機能は動き続けるので 入力したフォームの値、JavaScriptで動かしたDOMの情報も維持され続けます。 つまりパネルがずっと動いてリロードされないが故にどれだけコードを修正してパネルを閉じて再度開き直しても修正した内容は反映されません。 アプリケーションを再起動した時に初めてパネルの情報がリセットされてロードされます。 しかしコードを修正して、アプリケーションを再起動して、また修正して、再起動する、と繰り返すのはかなりの苦痛でしょう。

コードの修正をPhotoshopのように反映させてほしい。

IllustratorのCEPでもPhotoshopのようにアプリケーションを再起動しないまでもパネルの再表示でコードの内容を反映させるように してみます。ご存知のようにCEPはブラウザーがベースとなったシステムです。単純にパネルが再度開かれた時にリロードするように設定 すればいいわけです。という訳で以下のようなコードを追加します。

com.adobe.csxs.events.WindowVisibilityChangedはウィンドウの表示が変わった時に発火するイベントです。(イベントの詳細はCEPパネルのイベント参照。) ウインドウの表示が変わったときにリロードさせます。但しこれだけだと発火しないのでmanifestに以下--mixed-contextを追加します。

これでウィンドウを閉じて再度開いた時にパネルがリロードされてコードの内容が反映されます。しかしセキュリティー的に--mixed-contextを 入れたくない場合もあると思いますのでその場合は本番環境下で--mixed-contextを削除するようにします。これでPhotoshop同様再起動しなくても コードの内容を反映させることができるようにはなった訳ですがパネル上で例外処理が起きた場合、コードが止まってしまった場合はリロード自体が効かなくなるので その場合はアプリケーションを再起動させるしかありません。その他hostScriptに指定しているExtendScriptも再度読み込みを行いません。 hostScriptの内容を再度読み込みたい場合はアプリケーションを再起動させるしかありません。

パネルが閉じられた時と開かれた時のイベント

前述の通りcom.adobe.csxs.events.WindowVisibilityChangedでパネルが開かれた時と閉じられた時の状態を感知します。 しかしパネルが閉じらた時に特定のイベントを削除したい、もしくは開かれた時にフォームの情報をリセットしたい時はどうすれば良いのでしょうか。 com.adobe.csxs.events.WindowVisibilityChangedイベントのコールバックでパネルの開かれた時の状態と閉じられた時の状態 を受け取れます。具体的には以下の通りになります。

e.dataでウインドウの状態を受け取れますのでパネルが閉じられた時にイベントの削除をしたり 開かれた時にドキュメントの情報を読み込んだりできます。逆にPhotoshopと違って パネルのイベントやフォームのリセットをIllustratorのパネルで行う場合は このcom.adobe.csxs.events.WindowVisibilityChangedイベントを使用して イベント発火時リセットする事などになります。 正直Photoshopに比べて面倒であります。