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

スライド概要

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

profile-image

はせがわようすけ

@hasegawa

作者について:

https://utf-8.jp/

スライド一覧
シェア
埋め込む»CMSなどでJSが使えない場合

公開日

2013-10-19 00:00:00

各ページのテキスト

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

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

3. Chrome-eject ? @hasegawayosuke http://utf-8.jp/

4. Chrome-eject ? @hasegawayosuke http://utf-8.jp/

5. 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/

6. NPWIN32 • 何度もDLL書くのイヤだ • 何でもできるNPAPI DLLを書いた • JSから任意のWin32APIを呼び出せる • PerlのWin32::APIみたいなもの @hasegawayosuke http://utf-8.jp/

7. [beta]

Chrome-eject uses NPAPI
// manifest.json
"plugins" : [ { "path" : "win32api.dll", "public" : false } ]
// background.html
<embed type="application/x-win32api-dynamic-call" id="p" hidden="true" />
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 );
}
} );
} );

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

8. [beta]

NPWIN32 - callback
// import DLL functions
var EnumWindows = npwin32.import(
"user32.dll", "BOOL EnumWindows( CALLBACK, DWORD )" );
var GetWindowText = npwin32.import(
"user32.dll", "INT GetWindowTextW( DWORD, LPWSTR, INT )" );
// create CALLBACK object
var 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/

9. “Goodbye to Our Friend NPAPI” @hasegawayosuke http://utf-8.jp/

10. NPAPI plugins N P A P I 告 別 式

11. How do I eject without NPAPI? Native Messaging API @hasegawayosuke http://utf-8.jp/

12. How do I eject without NPAPI? Native Messaging API • http://developer.chrome.com/extensions /messaging.html#native-messaging • Chrome拡張と実行ファイル間でstdioを通じ て通信できる • 事前にmanifestファイルをレジストリに登録 する必要がある • しかもHKLM! (☝ ՞ਊ ՞)☝気軽にejectできない! @hasegawayosuke http://utf-8.jp/

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

14. How do I eject without NPAPI? キタ━━━━(゚∀゚)━━━━ !!!!! @hasegawayosuke http://utf-8.jp/

15. chrome.system.storage • ストレージデバイスの情報を取得 chrome.system.storage.getInfo( function( devices ){ console.log( devices ); } ); DVD-ROMデバイス え? fixed? @hasegawayosuke http://utf-8.jp/

16. [beta]

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/

17. chrome.system.storage • Chrome 30+ で使える(はず) • CD-ROMドライブでも ”removable” ではな く “fixed” が返ってくる • ejectDevice 失敗する (☝ ՞ਊ ՞)☝やっぱりejectできない! @hasegawayosuke http://utf-8.jp/

18. なんとか eject したい! 拡張に実行ファイル入れておいて、 ダウンロードさせてそれを実行だ!

19. How do I eject ? • 拡張のなかにejectするWSHファイル(*.vbs) を含めておく • chrome.downloads.download APIを使っ てvbsをローカルにダウンロードさせる • chrome.downloads.open APIを使ってダ ウンロードしたvbsファイルを実行する • うまくいけば eject 完了! @hasegawayosuke http://utf-8.jp/

20. chrome.downloads @hasegawayosuke http://utf-8.jp/

21. [beta]

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/

22. eject.vbs Dim Dim Dim Set Set wmp drives i wmp = CreateObject( "WMPlayer.OCX" ) drives = wmp.cdromCollection For i = 0 To drives.Count - 1 drives.Item( i ).Eject Next @hasegawayosuke http://utf-8.jp/

23. DEMO

24. 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 @hasegawayosuke http://utf-8.jp/