Chromeで(☝ ՞ਊ ՞)☝ウイーン

この記事はEject Advent Calendar 20133日目の記事です。ちなみに今日は僕の誕生日です

かつて一世を風靡し世界中のChromeユーザーを病院送りにしたCD-ROM トレイを取り出せる Chrome拡張、「chrome-eject」ですが、内部でNPAPIを使っていたために近い将来確実に動かなくなります。

そこで人類が平和に暮らせるようEjectできる代替措置を探す必要に駆られ、非常に限定的ながらChromeからEjectする方法を確立し、Chrome-eject2としてリリースしましたのでAdvent Calendarの記事として記す次第です。

上記スライド内にも書いてあるとおり、Chrome拡張では chrome.system.storage.ejectDevice というまさに Eject のためのAPIが用意されているのですが、残念ながら現在はうまくCD-ROMをejectできていません。。
Windows版のChromeでは、

  • CD-ROMドライブに対する chrome.system.storage.getInfo では、StorageUnitInfo.capacity が0なので、対象デバイスがCD-ROMであることは簡単に判断できる
  • とはいうものの、CD-ROMドライブに対するStorageUnitInfo.type が"fixed" であって "removable" ではない
  • そのため(?)CD-ROMドライブに対する chrome.system.storage.ejectDevice が "failure" となりEjectできない。

という状況です(このあたりを見ると、CD-ROMはremovable扱いされていない感じです…)。
Linux版のChromeではさらに問題があり(Debian GNU/Linux on x86で確認)、

  • chrome.system.storage.getInfoで列挙できるデバイスの一覧はChrome起動時点のスナップショットでありChrome起動後に変更されたデバイスの状態は反映されていない
  • CD-ROMドライブに対する StorageUnitInfo.type は "removable" であるものの、chrome.system.storage.getInfo では StorageUnitInfo.capacity が0ではないため、そもそもどのデバイスがCD-ROMなのか判断できない
  • CD-ROMドライブに対してchrome.system.storage.ejectDeviceした場合にはroot権限でないためにumountに失敗する

という状況です。
(さらに余談ですが、chrome.system.stora.getAvailableCapacity というAPIChrome beta版でもまだ実装されていないようです。)

そのようなわけで、Windows上では拡張内にEjectするためのVBScriptファイルを含めておき、これを拡張内で自らダウンロードして実行することによりEjectするという強引な手法を採っていますが、Linux版ではなかなかうまい方法がまだ見つかっていません。そんなわけで、早くLinuxでも(☝ ՞ਊ ՞)☝ウイーンできる日が来るよう、日々精進せねばと気を引き締める毎日です。

Eject Advent Calendar、明日は…だれ?