2013年11月29日金曜日

OS が変わると動作が変わるのが悩ましい(Chrome 拡張機能)

Chrome の拡張機能を書いています。

バックグラウンドで処理をする機能を書いていて、ブラウザを終了すると処理も終了して欲しいのですが、Windows ではブラウザが終了してもバックグラウンドの処理は動き続けています。

Mac では終了します。Linux でも終了します。


悩ましい。


ならば、ブラウザの終了を検知して明示的に処理を終了させれば良いのだ。
・・・しかし、ブラウザの終了タイミングを検知するそのものズバリのイベントはないようです。

ウインドウが閉じられたタイミングを知らせるイベントはあるので、

「最後のウインドウが閉じられた」 = 「ブラウザが終了した」

と考えてこんな風に書いてみた。

// "onRemoved" は Chrome の API で、ウインドウが閉じられた時に発生するイベント

chrome.windows.onRemoved.addListener(function (windowId) {  
    chrome.windows.getAll(function (windows) {  // 全てのウインドウを取得するメソッド
        if (windows.length === 0) {
            // ブラウザ終了時の処理
        }
    });
});

結果は・・・、

Windows ではうまく終了をとらえられました。
Mac ではブラウザの終了時には onRemoved イベントが発生しませんでした・・・。ガーン。
Linux ではうまくいきました。


悩ましい。


ブラウザはプラットフォームの違いを吸収してくれると楽観したくなるが、過信してはいけない。


(補足ですが、Mac では×ボタンでウインドウを閉じますが、この時は最後のウインドウを閉じた時でも onRemoved イベントは発生します。
しかし、×ボタンで閉じた時はウインドウは閉じられているのですがブラウザのプロセスは終了していません。
通常、ブラウザを終了させるときは、Command + q で終了させます。この時に onRemoved が発生しないのです。)