日向夏特殊応援部隊

俺様向けメモ

第六回Mozilla拡張機能勉強会まとめ

と言う訳で

本日、第六回Mozilla拡張機能勉強会が行われたので、折角メモを取ったので書いてみるです。
ちなみに寝坊しましたので、メインの話は半分くらいしか聞けてないですw
あと、割と飲んでたのでその辺りを勘案して巧みにスルー力を発揮して読んでいただけると幸いです。

Web系の人はみんな遅刻したです。

遅刻者一覧

特にながやまんの遅刻は本当に酷かった。

Firemacs (山本さん)

grep, find, Google

基本はMozillaのソースをgrep, findしまくって、後はググって作った。
うん、素晴らしい。

C-sの検索

Firefoxの左下に検索のエリアが出るけど、その検索をC-sでやりたい。
その検索に入る際にstatusに文言を出したい。(I-searchみたいなの)

普通なら、

window.status = "I-search";

みたいに出来るけど拡張の世界じゃ出来ないので、代替手段として、

document.getElementById("statusbar-display").label = "I-search";

こんな感じでやる。
とりあえず、デフォのFirefoxでid属性がついてる主要な要素のまとめとか多分どこかにあると思うけど、どう考えてもBK以外の何者でもない。

commandに対する引数の話

commandってのがあるんだけど、これって引数が渡せない。
そこで、nsICommandController, nsICommandParamsを使う。
isCommandEnable()で指定したコマンドが実行可能かどうかが分かる。

検索の部分

gFindBarで取れる。ってかgなんちゃらって大杉無いか?w

repl> repl.search(/^g[A-Z]/, window);                                                                                                  
gNavigatorBundle
gCZPanMouseY
gCZPanMouseX
gCZStatusBarFormat
gCZEyedropperLaunchTimerID
gCZSavedStatus
gShorcutKeyName
gCZPrevSelectedY
gCZPrevSelectedX
gCZSelectedElementBackupStyle
gCZSelectedClientY
gCZSelectedClientX
gCZSelectedElement
gCZSelectedY
gCZSelectedX
gCZLastStatusValue
gCZSelectedColor
gCZComponent
gCZIOUtils
gCZCustomPaletteUI
gCZClickListener
gCZPref
gCZPrefService
gYBLoginWindow
gYBObservService
gYB_loadFavIconOld
gYB_loadFavIconNew
gYB_saveIcon
gYB_getMimeType
gYB_b64
gYB_rscIcon
gYB_rdfs
gYB_bms
gYBXUL_NS
gYBrscBundleRoot
gYBrscBundleValue
gYBrscBundle
gYBrscLastVisitDate
gYBrscVisitCount
gYBrscTag
gYBrscTagValue
gYBrscUrl
gYBrscGenTitle
gYBrscName
gYBRdfService
gJavaConsole1_6_0_02
gOrigName
gCancelLabel
gSavedName
gHideElmParam
gThisWinClosedtabs
gThisWinTabs
gThisWin
gSessionPath
gRDFRoot
gBackupLabel
gTab
gFirefox2DefaultTheme
gSingleWindowMode
gTabbarPosition
gObserver
gURIFixer
gWindowManager
gIOService
gAutoReloadDialogAccepted
gChromeDir
gIsPlaces
gIsFirefox2
gIsOldBrowser
gPref
gViewSourceUtils
gMissingPluginInstaller
gWebPanelURI
gHomeButton
gXPInstallObserver
gPopupBlockerObserver
gSessionHistoryObserver
gGoButtonPrefListener
gAutoHideTabbarPrefListener
gURLBarAutoFillPrefListener
gSanitizeListener
gChromeState
gContextMenu
gSidebarCommand
gBrowser
gPrefService
gProgressCollapseTimer
gProgressMeterPanel
gMustLoadSidebar
gClickSelectsAll
gHaveUpdatedToolbarState
gLastValidURL
gLastValidURLStr
gIsLoadingBlank
gProxyDeck
gProxyFavIcon
gProxyButton
gURLBarContainer
gURLBar
gPrevCharset
gLastBrowserCharset
gCharsetMenu
gPageStyleButton
gURIFixup
gGlobalHistory
gRDF
gBrowserGlue
gBkmkTxnSvc
gBmProperties
gNC_NS_CMD
gXUL_NS
gRDF_NS
gWEB_NS
gNC_NS
gBidiUI
gSavePrintSettings
gPrintSettingsAreGlobal
gFindBar
gTraceOnAssert

とりあえず僕の実行結果。

あと検索フィールド自体は、

document.getElementById("find-field");

って事でid属性としてfind-fieldを指定すれば取れる。

キーイベントの奪い方

Firemacsで一番面白い話。

eventの奪い方

captureフェーズで奪って、stopPropergation(), preventDefatult()でOK

accesskeyで割り当てられてる場合

accesskey属性を持っている要素からaccesskey属性を消せばOKかと思いきやそれでは駄目。
要素ごと差し替えが必要なので、

  • accesskey属性を持つ要素を抽出
  • removeAttribute("accessskey")
  • cloneNode()して、親からreplaceChild()すると指し換わる

と言う手段をとる。

キー割り当てとpreference

この辺りはPiroたんが詳しく解説してくれる予定。
nsIPrefBranch辺りを上手く使えばスマートに書ける。

XULRunner - WidgetRunnerの紹介 (id:smellman)

組長の発表。20after4って人がWidgetRunnerってのを作ってる件。

多分ここらへん。

  • Extension Managerを再利用してる
  • まだ不安定

なんだけど、ガジェットのランタイムのようにして使えるところは凄い注目。
XULRunner系だとSSB(Site Specific Browser)としてWebRunnerが最も注目されてる。

設定ファイルは標準で入ってて、.webappって拡張子である。
大体内容はiniファイルっぽぃ感じ。
Google Calendarとかの設定ファイルとかあるんで、内容見てとりあえず感覚は掴むべし。

でダウンロード出来るお。

XUL preLoader (by mar's)

overlayするときにid属性が振られていない要素があったらどうする?と言う話。
普通ならchrome.manifestで指定したxulでoverlayしたい要素をつらつら書くんだけど、
そうじゃない場合はjsで制御する。

でもjsで書いた途端、イリーガルな処理になって萎える。
それpreLoaderで出来るよ。

ざっくり言えばchrome.manifestで指定するファイルをpreLoader.xulにして、
その中でoverlayしたい要素とか一切書かずに、jsだけ書く。
そこで本来overlayしたい要素にidつけてから、jsでloadOverlay()して、本来chrome.manifestからoverlayしたいxulを指定して終了。

って説明で大体分かる?w

辺りの話も興味深かった。
後で調べる。

まとめ

凄い面白かった。特にFiremacsの内容はとても初心者向けだったし、
山本さんの苦心の程は伺い知れて良かったです。

あとid:nagayamaMozillaの何かで協力してくれるらしい。

もっとノウハウは共有しなきゃですな。

あと飲み会も面白かったし、会いたい人にも会えた。

飲み会で周りがドン引きするぐらい、Piroたんと話したんだけど、その内容は濃かった。
成果は追々出る予定でございます。

まったくまとまってないけど気にしない。