Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
Go言語
Next
Download to read offline and view in fullscreen.

Share

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

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

  1. 1. Chrome-eject が この先生きのこるには
  2. 2. Who am I ? はせがわようすけ • http://utf-8.jp/ • 顔文字でJavaScript書いたり • 顔文字で86バイナリ書いたり @hasegawayosuke http://utf-8.jp/
  3. 3. Chrome-eject ? @hasegawayosuke http://utf-8.jp/
  4. 4. Chrome-eject ? @hasegawayosuke http://utf-8.jp/
  5. 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. 6. NPWIN32 • 何度もDLL書くのイヤだ • 何でもできるNPAPI DLLを書いた • JSから任意のWin32APIを呼び出せる • PerlのWin32::APIみたいなもの @hasegawayosuke http://utf-8.jp/
  7. 7. 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. 8. 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. 9. “Goodbye to Our Friend NPAPI” @hasegawayosuke http://utf-8.jp/
  10. 10. NPAPI plugins N P A P I 告 別 式
  11. 11. How do I eject without NPAPI? Native Messaging API @hasegawayosuke http://utf-8.jp/
  12. 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. 13. おっ? なんかAPI追加されてる!?
  14. 14. How do I eject without NPAPI? キタ━━━━(゚∀゚)━━━━ !!!!! @hasegawayosuke http://utf-8.jp/
  15. 15. chrome.system.storage • ストレージデバイスの情報を取得 chrome.system.storage.getInfo( function( devices ){ console.log( devices ); } ); DVD-ROMデバイス え? fixed? @hasegawayosuke http://utf-8.jp/
  16. 16. 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. 17. chrome.system.storage • Chrome 30+ で使える(はず) • CD-ROMドライブでも ”removable” ではなく “fixed” が返ってくる • ejectDevice 失敗する (☝ ՞ ՞)☝やっぱりejectできない! @hasegawayosuke http://utf-8.jp/
  18. 18. なんとか eject したい! 拡張に実行ファイル入れておいて、 ダウンロードさせてそれを実行だ!
  19. 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. 20. chrome.downloads @hasegawayosuke http://utf-8.jp/
  21. 21. 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. 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. 23. DEMO
  24. 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/
  • rti7743

    Dec. 8, 2013
  • tomoakifude

    Dec. 3, 2013
  • haraguroicha

    Nov. 27, 2013
  • shimabukuro

    Oct. 24, 2013
  • TakeshiWatanabe2

    Oct. 22, 2013
  • TokyoIncidents

    Oct. 20, 2013
  • yasuyukimaeda52

    Oct. 20, 2013
  • mi_kana

    Oct. 20, 2013
  • Akkiesoft

    Oct. 19, 2013
  • esehara

    Oct. 19, 2013
  • freedom404

    Oct. 19, 2013
  • kuro_m88

    Oct. 19, 2013

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

Views

Total views

13,395

On Slideshare

0

From embeds

0

Number of embeds

8,134

Actions

Downloads

11

Shares

0

Comments

0

Likes

12

×