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上でのピクセル量は一致しない

TOP

TOP