May 06, 2007
タブカタログでTab Scopeをパクってみた
第2回拡張機能勉強会でTab Scopeのプロトタイプを見てから、公開されたらぜひタブカタログでこの機能を使わせてもらおうと思っていて、気がついたら公開されてたので早速見てみたんだけども、他の拡張機能とかで機能を利用できるような設計になってなかったので、仕方ないから関係してるコードをコピペしてタブカタログに仕込んでみた。
ただ、画像を含むリンクで画像の前後に改行があったりすると上手くいかなかったので、そこだけ手を加えた。
具体的にはこんな感じにしてある。
getImageInLink : function(aNode)
{
var d = aNode.ownerDocument;
try {
var xpathResult = d.evaluate(
'descendant::*[local-name() = "img" or local-name() = "IMG"]',
aNode,
d.createNSResolver(this.NSResolver),
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
);
}
catch(e) {
return null;
}
return xpathResult.singleNodeValue;
},
NSResolver : {
lookupNamespaceURI : function(aPrefix)
{
switch (aPrefix)
{
case 'xul':
return 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
case 'html':
case 'xhtml':
return 'http://www.w3.org/1999/xhtml';
case 'xlink':
return 'http://www.w3.org/1999/xlink';
default:
return '';
}
}
},
(中略)
var walker = aWindow.document.createTreeWalker(doc,
NodeFilter.SHOW_ELEMENT, filter, false);
for (var node = walker.firstChild(); node != null; node = walker.nextNode())
{
if (
node.hasChildNodes() &&
(img = this.getImageInLink(node))
)
node = img;
var box = doc.getBoxObjectFor(node);
var l = box.screenX;
var t = box.screenY;
var r = l + box.width;
var b = t + box.height;
if (l <= aScreenX && aScreenX <= r && t <= aScreenY && aScreenY <= b)
return node;
}
別にXPathでやる必要はないんだけどね……
Tab Scopeに比べて「戻る」も「進む」も「再読み込み」も何も操作のためのUIがなくて、ただリンクを辿ることとスクロールすることしかできないんで、実用性はあんまりないけど、まあ、やってみたかったんですよ。
wikieditish message: Ready to edit this entry.