chrome-eject がこの先生きのこるには
DESCRIPTION
カーネル/VM+K*BUG勉強会@関西 ごかいめTRANSCRIPT
Chrome-eject がこの先生きのこるには
@hasegawayosuke http://utf-8.jp/
Who am I ?
はせがわようすけ• http://utf-8.jp/• 顔文字で JavaScript 書いたり• 顔文字で 86 バイナリ書いたり
@hasegawayosuke http://utf-8.jp/
Chrome-eject ?
@hasegawayosuke http://utf-8.jp/
Chrome-eject ?
@hasegawayosuke http://utf-8.jp/
Chrome-eject uses NPAPI
NPAPI plugin• Netscape Plugin API• DLL 形式でブラウザの機能を拡張• Flash Player, Silverlight, ...• http://www.slideshare.net/TNaruto/npapi-26722229
NPAPI plugin in Chrome Extension• JavaScript だけで出来ないことを実現• Chrome 拡張の制約を超えて何でも可能• でも DLL 書かないと…
@hasegawayosuke http://utf-8.jp/
NPWIN32
• 何度も DLL 書くのイヤだ• 何でもできる NPAPI DLL を書いた• JS から任意の Win32API を呼び出せる• Perl の Win32::API みたいなもの
@hasegawayosuke http://utf-8.jp/
Chrome-eject uses NPAPI
var npwin32;var mciSendString;
document.addEventListener( "DOMContentLoaded", function (){ chrome.browserAction.onClicked.addListener( function( tab ){ if( npwin32 === undefined ){ npwin32 = document.getElementById( "p" ); } if( mciSendString === undefined ){ mciSendString = npwin32.import( "winmm.dll", "DWORD mciSendStringW( LPCWSTR, DWORD, UINT, DWORD )" ); } if( mciSendString){ var r = mciSendString( "set cdaudio door open", 0, 0, 0 ); } } );} );
// manifest.json"plugins" : [ { "path" : "win32api.dll", "public" : false } ]
// background.html<embed type="application/x-win32api-dynamic-call" id="p" hidden="true" />
@hasegawayosuke http://utf-8.jp/
NPWIN32 - callback
// import DLL functionsvar EnumWindows = npwin32.import( "user32.dll", "BOOL EnumWindows( CALLBACK, DWORD )" );var GetWindowText = npwin32.import( "user32.dll", "INT GetWindowTextW( DWORD, LPWSTR, INT )" );
// create CALLBACK objectvar func = npwin32.callback( function ( hwnd, lparam ){ var buf = new Array( 257 ).join( " " ); // space * 256 if( GetWindowText( hwnd, buf, 256 ) ){ alert( hwnd + " : " + GetwindowText.arg( 1 ) ); } }, "BOOL (DWORD, DWORD)");
EnumWindows( func, 0 );
@hasegawayosuke http://utf-8.jp/
“Goodbye to Our Friend NPAPI”
NPAPI
告別式
NPAPI plugins
@hasegawayosuke http://utf-8.jp/
How do I eject without NPAPI?
Native Messaging API
@hasegawayosuke http://utf-8.jp/
How do I eject without NPAPI?
Native Messaging API• http://developer.chrome.com/extensions/messaging.html#native-messaging• Chrome 拡張と実行ファイル間で stdio を通
じて通信できる• 事前に manifest ファイルをレジストリに登
録する必要がある• しかも HKLM!
( ☝ ՞ ਊ )☝☝ 気軽に eject できない !
なんか API 追加されてる !?おっ ?
@hasegawayosuke http://utf-8.jp/
How do I eject without NPAPI?
キタ━━━━ ( ゚∀゚ ) !!!!!━━━━
@hasegawayosuke http://utf-8.jp/
chrome.system.storage
• ストレージデバイスの情報を取得chrome.system.storage.getInfo( function( devices ){ console.log( devices ); });
DVD-ROM デバイス
え? fixed?
@hasegawayosuke http://utf-8.jp/
chrome.system.storage
• とりあえず eject してみるchrome.system.storage.getInfo( function( devices ){ devices.forEach( function( device ){ if( device.capacity == 0 ){ chrome.system.storage.ejectDevice( device.id, function ( result ){ console.log( result ); } ); } } ); });
result === "failure"
@hasegawayosuke http://utf-8.jp/
chrome.system.storage
• Chrome 30+ で使える ( はず )• CD-ROM ドライブでも ” removable” で
はなく “ fixed” が返ってくる• ejectDevice 失敗する
( ☝ ՞ ਊ )☝☝ やっぱり eject できない !
なんとか eject したい !
拡張に実行ファイル入れておいて、ダウンロードさせてそれを実行だ !
@hasegawayosuke http://utf-8.jp/
How do I eject ?
• 拡張のなかに eject する WSH ファイル(*.vbs) を含めておく• chrome.downloads.download API を
使って vbs をローカルにダウンロードさせる• chrome.downloads.open API を使って
ダウンロードした vbs ファイルを実行する• うまくいけば eject 完了 !
@hasegawayosuke http://utf-8.jp/
chrome.downloads
@hasegawayosuke http://utf-8.jp/
chrome.downloads
var url = chrome.extension.getURL( "eject.vbs" );chrome.downloads.download( { url : url, filename : "./" + url.replace( /^chrome-extension:\/\//, "" ), conflictAction : "overwrite"}, function( id ){ if( id === undefined ) return; setTimeout( function(){ chrome.downloads.open( id ); chrome.downloads.erase( { id : id } ); }, 2000 );} );いまいち動きがおかしい。 donload の callback が呼ばれてすぐだとファイルを開けないので 2 秒待ちを入れている
@hasegawayosuke http://utf-8.jp/
eject.vbs
Dim wmpDim drivesDim iSet wmp = CreateObject( "WMPlayer.OCX" )Set drives = wmp.cdromCollection For i = 0 To drives.Count - 1 drives.Item( i ).EjectNext
DEMO
@hasegawayosuke http://utf-8.jp/
Conclusion - how to eject from Chrome Extension
• NPAPI は今後使えない• Native Messaging は NPAPI ほど気軽に
は使いにくい• chrome.system.storage はいまいちおか
しい• chrome.downloads は ZoneId つけてく
れる• もう少し待てばもっと eject しやすくなるは
ず !
Special Thanks to @Akkiesoft and Eject-command Users Group
( ☝ ՞ ਊ )☝☝ ウイーン