« Firefox 3.6 にて HTMLElement.classList が実装 | userChrome.js スクリプト集のページ » |
Webページの拡大率を取得する
拡張機能などから、ブラウザのコンテンツエリアに表示された Web ページの拡大率(画像も含めたズームイン・ズームアウトによる拡大率)を調べる。
以下、 browser.xul へオーバーレイした状態を想定。
Firefox 3.5 以前
nsIMarkupDocumentViewer::fullZoom で取得可能。
var zoomFactor = gBrowser.mCurrentBrowser.markupDocumentViewer.fullZoom;
Firefox 3.6 以降
nsIDOMWindowUtils::screenPixelsPerCSSPixel でも取得可能。
var win = window.content; var winUtils = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); var zoomFactor = winUtils.screenPixelsPerCSSPixel;
両者の値の違い
Firefox 3.6 以降の screenPixelsPerCSSPixel で取得できる値は、厳密にはズームイン・ズームアウト機能の拡大率ではなく、 CSS での1ピクセルがスクリーン上で何ピクセルとして表示されるかを示した値である。そして、両者の値はなぜか微妙に異なる。 Firefox 3.5 で Firefox 3.6 とほぼ同等の値を取得するにはどうすれば良いか? All-in-One Gestures が面白いやり方で実践していた。
var doc = window.content.document; var div = doc.createElementNS("http://www.w3.org/1999/xhtml", "DIV"); div.style.position = "absolute"; div.style.top = "100000px"; doc.body.appendChild(div); var zoomFactor = (doc.getBoxObjectFor(div).screenY - doc.getBoxObjectFor(doc.body).screenY) / div.offsetTop; doc.body.removeChild(div);
ダミーの DIV 要素を、 Web ページの document.body を基点とした上から100000px(CSS上のピクセル)の絶対位置に配置し、 body と DIV 要素のスクリーン上のY座標の値を getBoxObjectFor で取得し、両者の差を100000で割ることで算出している。 getBoxObjectFor を使用しているので、もちろん Firefox 3.5 以下限定である。
関連記事
SCRAPBLOG : Firefox 3 のフルページズーム使用時はスクリーン上でのピクセル量とCSS上でのピクセル量は一致しない