24
Chrome-eject が がががががががががが

Chrome-eject がこの先生きのこるには

Embed Size (px)

DESCRIPTION

カーネル/VM+K*BUG勉強会@関西 ごかいめ

Citation preview

Page 1: Chrome-eject がこの先生きのこるには

Chrome-eject がこの先生きのこるには

Page 2: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

Who am I ?

はせがわようすけ• http://utf-8.jp/• 顔文字で JavaScript 書いたり• 顔文字で 86 バイナリ書いたり

Page 3: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

Chrome-eject ?

Page 4: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

Chrome-eject ?

Page 5: 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 書かないと…

Page 6: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

NPWIN32

• 何度も DLL 書くのイヤだ• 何でもできる NPAPI DLL を書いた• JS から任意の Win32API を呼び出せる• Perl の Win32::API みたいなもの

Page 7: Chrome-eject がこの先生きのこるには

@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" />

Page 8: Chrome-eject がこの先生きのこるには

@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 );

Page 9: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

“Goodbye to Our Friend NPAPI”

Page 10: Chrome-eject がこの先生きのこるには

NPAPI

告別式

NPAPI plugins

Page 11: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

How do I eject without NPAPI?

Native Messaging API

Page 12: Chrome-eject がこの先生きのこるには

@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 できない !

Page 13: Chrome-eject がこの先生きのこるには

なんか API 追加されてる !?おっ ?

Page 14: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

How do I eject without NPAPI?

キタ━━━━ ( ゚∀゚ ) !!!!!━━━━

Page 15: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

chrome.system.storage

• ストレージデバイスの情報を取得chrome.system.storage.getInfo( function( devices ){ console.log( devices ); });

DVD-ROM デバイス

え? fixed?

Page 16: Chrome-eject がこの先生きのこるには

@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"

Page 17: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

chrome.system.storage

• Chrome 30+ で使える ( はず )• CD-ROM ドライブでも ” removable” で

はなく “ fixed” が返ってくる• ejectDevice 失敗する

( ☝ ՞ ਊ )☝☝ やっぱり eject できない !

Page 18: Chrome-eject がこの先生きのこるには

なんとか eject したい !

拡張に実行ファイル入れておいて、ダウンロードさせてそれを実行だ !

Page 19: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

How do I eject ?

• 拡張のなかに eject する WSH ファイル(*.vbs) を含めておく• chrome.downloads.download API を

使って vbs をローカルにダウンロードさせる• chrome.downloads.open API を使って

ダウンロードした vbs ファイルを実行する• うまくいけば eject 完了 !

Page 20: Chrome-eject がこの先生きのこるには

@hasegawayosuke http://utf-8.jp/

chrome.downloads

Page 21: Chrome-eject がこの先生きのこるには

@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 秒待ちを入れている

Page 22: Chrome-eject がこの先生きのこるには

@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

Page 23: Chrome-eject がこの先生きのこるには

DEMO

Page 24: Chrome-eject がこの先生きのこるには

@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

( ☝ ՞ ਊ )☝☝ ウイーン