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