aboutsummaryrefslogtreecommitdiffstats
path: root/xpathBlink.js
blob: 3175dc1131187dcbc57ca0e343b87803bf95c190 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
let INFO =
<plugin name="xpathBlink" version="1.1.2"
        href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/xpathBlink.js"
        summary="blink elements by XPath"
        xmlns="http://vimperator.org/namespaces/liberator">
    <author email="teramako@gmail.com">teramako</author>
    <license href="http://www.mozilla.org/MPL/MPL-1.1.txt">MPL 1.1</license>
    <project name="Vimperator" minVersion="2.2"/>
    <p>
        For test XPath.
    </p>
    <p>CAUTION: This plugin needs "DOM Inspector" addon.</p>
    <item>
        <tags>:xpathb :xpathblink</tags>
        <spec>:xpathb<oa>link</oa> <a>expression</a></spec>
        <description>
            <p>
                blink specified elements with XPath <a>expression</a>
            </p>
        </description>
    </item>
</plugin>;

let PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>blink elements by XPath</description>
<author mail="teramako@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/teramako/">teramako</author>
<require type="extension" id="inspector@mozilla.org">DOM Inspector</require>
<license>MPL 1.1</license>
<version>1.1.2</version>
<minVersion>2.2</minVersion>
<maxVersion>3.0</maxVersion>
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/xpathBlink.js</updateURL>
<detail><![CDATA[
for test xpath

== Usage==
:xpathb[link] {expression}:
:xb {expression}
    blink specified elements with XPath {expression} 

== Caution ==
It's need "DOM Inspector" addon
]]></detail>
</VimperatorPlugin>;

(function(){
let extid = "inspector@mozilla.org";
Application.getExtensions(
	function (extensions){
		if (!extensions.has(extid) || !extensions.get(extid).enabled){
			liberator.echomsg("DOM Inspector is not installed or enabled", 2);
			return;
		}
		let flasher = null;
		function getFlasher(){
			if (!flasher){
				flasher = Cc['@mozilla.org/inspector/flasher;1'].createInstance(Ci.inIFlasher);
				flasher.color = '#FF0000';
				flasher.thickness = 2;
			}
			return flasher;
		}
		/**
		 * @param {Node} aNode
		 */
		function blink(aNode){
			if (aNode.nodeType == 3) aNode = aNode.parentNode;
			let toggle = true;
			let flasher = getFlasher();
			function setOutline(){
				if (toggle){
					flasher.drawElementOutline(aNode);
				} else {
					flasher.repaintElement(aNode);
				}
				toggle = !toggle;
			}
			for (let i=1; i<7; ++i){
				setTimeout(setOutline, i * 100);
			}
		}
		commands.addUserCommand(['xpathb[link]','xb'],'XPath blink nodes',
			function(expression){
				let result;
				try {
					result = util.evaluateXPath(expression.string);
				} catch(e) {
					liberator.echoerr('XPath blink: ' + e);
				}
				if (!result.snapshotLength){
					liberator.echo('XPath blink: none');
					return;
				}
				for (let i=0; i<result.snapshotLength; i++){
					blink(result.snapshotItem(i));
				}
			},{}
		);
});
})();

// vim: set fdm=marker sw=4 ts=4 noet: