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

-- Views

October 19, 13

スライド概要

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

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
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/