Firefoxのアドオンを作ってみる 応用編
今回は、以前作成したブックマークレットの処理を右クリックメニューからできるようにするアドオンを作成してみた。
開発環境
・Ubuntu 11.04・FireFox 6.0
ファイル構成
初級編のhelloと同じ構成となっている。booksearcher
┠─ chrome.manifest
┠─ install.rdf
└─ content
┠─ booksearcher.xul
└─ booksearcher.js
booksearch.xul
コンテキストメニューの中に、書籍を検索するためのリンクを作成した。<?xml version="1.0" ?> <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="chrome://booksearcher/content/booksearcher.js" /> <!-- コンテキストメニューへの追加 --> <popup id="contentAreaContextMenu"> <menuseparator id="booksearcher-separator"/> <menuitem id="booksearcher-link" label="Search Book with Calil" oncommand='BookSearcher.search();'/> </popup> </overlay>
id「contentAreaContextMenu」の内部に、仕切となるmenuseparatorと、リンクとなるmenuitemを記述している。
そして、menuitemには、クリック時に検索するための関数が呼ばれるよう、oncommandにBookSearcher.search関数を記述している。
booksearcher.js
書籍の検索処理はこんな感じ。var BookSearcher = { search: function() { var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService( Components.interfaces.nsIWindowMediator ); // 最近操作したウインドウを取得 var mainWinodw = wm.getMostRecentWindow( "navigator:browser" ); // 選択中の文字列を取得 var selectString = mainWinodw.content.document.getSelection(); if( selectString ) { var url = 'http://calil.jp/search?q='; url += encodeURI( selectString ); // 新しいタブを開いて、カーリルで検索 mainWinodw.gBrowser.addTab( url ); } } };
前回、作成したブックマークレットの処理をそのまま使える・・・かと思いきや、「選択中の文字列を取得」や「リンクをタブで開く」など少し勝手が違うところがあった。
まず、「選択中の文字列を取得」は、window.getSlection.toStringでは取得することができなかった。
どうやら、FireFox内部から関数を呼び出す場合と、外部から呼ぶ場合では挙動が違うみたいで、選択中の文字列を取得するには、winodw.content.document.getSelectionを使用する。
また、「リンクでタブを開く」も外部と内部で方法が異なっていた。
外部ではwindow.openを使用したら、自動でタブにurlが読み込まれていたが、これはブラウザの設定によるものらしい。
内部でwinodw.openを使用した場合、新しいウインドウを開いてしまう。
なので、gBrowser.addTab関数で新しくタブを開くよう、明示的に処理を記述した。