Debian package: Add support for xulrunner 18
[conkeror.git] / modules / extensions / noscript.js
blob57e35accc9a165dbfe19b2840df316fbc7cc08bd
2 var noscript_service = Cc["@maone.net/noscript-service;1"]
3     .createInstance().wrappedJSObject;
5 function unique (a) {
6     var r = new Array();
7     o:for (var i = 0, n = a.length; i < n; i++) {
8         for (var x = 0, y = r.length; x < y; x++) {
9             if (r[x]==a[i])
10                 continue o;
11         }
12         r[r.length] = a[i];
13     }
14     return r;
17 function hideObject (p, o) {
18     if (!p.mimeRx.test(o.type))
19         return;
20     var r = p.document.createElement("object");
21     r.style.width = o.offsetWidth + "px";
22     r.style.height = o.offsetHeight + "px";
23     r.style.display = "inline-block";
24     o.className += " " + p.className;
25     o.parentNode.insertBefore(r, o);
28 function showObject (p, o) {
29     var cs = o.className;
30     cs = cs.replace(p.classRx, '');
31     if (cs != o.className) {
32         o.className = cs;
33         var r = o.previousSibling;
34         if (r instanceof HTMLObjectElement)
35             r.parentNode.removeChild(r);
36     }
39 function setObjectVisibility (document, callback) {
40     var tags = ["object", "embed"];
41     var ns = noscript_service;
42     var rx = ns.hideOnUnloadRegExp;
43     if (!rx)
44         return;
45     var params = {
46         document: document,
47         mimeRx: rx,
48         classRx: ns.hideObjClassNameRx,
49         className: ns.hideObjClassName
50     };
51     var objects = null;
52     for each (var tag in tags) {
53         var local_objects = document.getElementsByTagName(tag);
54         var count = local_objects.count;
55         if (count) {
56             objects = objects || [local_objects[--count]];
57             while (count-- > 0) {
58                 objects.push(local_objects[count]);
59             }
60         }
61     }
62     if (objects) {
63         for (var counter = objects.length; counter-- > 0;) {
64             callback(params, objects[counter]);
65         }
66     }
70 function ns_allow_temp (url, buffer, P, allow) {
71     var ns = noscript_service;
72     if (allow) {
73         var enabled = true;
74         var temp = ns.getPref("toggle.temp");
75         ns.setTemp(url, enabled && temp);
76         ns.setJSEnabled(url, enabled, false, ns.mustCascadeTrust(url, temp));
77         setObjectVisibility(buffer.document,showObject);
78     } else {
79         enabled = false;
80         temp = ns.getPref("toggle.temp");
81         ns.setTemp(url, enabled && temp);
82         ns.setJSEnabled(url, enabled, false, ns.mustCascadeTrust(url, temp));
83         setObjectVisibility(buffer.document,hideObject);
84     }
87 interactive("ns-toggle-temp",
88     "Allow a site temporary access to javascript",
89     function (I) {
90         var ns = noscript_service;
91         var urls = [];
92         var level = ns.getPref("toolbarToggle", 3);
93         if (! level)
94             level = 3;
95         var url = ns.getQuickSite(I.buffer.document.documentURI, level);
96         var url2;
97         if (url) {
98             urls.push(url);
99             var scripts = I.buffer.document.getElementsByTagName("script");
100             for (var i = 0, n = scripts.length; i < n; i++) {
101                 if (scripts[i].getAttribute("src")) {
102                     var matches = scripts[i].getAttribute("src").split("/");
103                     if (matches[0] == "http:")
104                         urls.push(matches[2]);
105                 }
106             }
107             urls = unique(urls);
108             urls = urls.filter(function (u) { return !ns.isJSEnabled(u); });
109             while ((url2 = urls.pop())) {
110                 ns_allow_temp(url2, I.buffer, I.P,
111                               "y" == (yield I.minibuffer.read_single_character_option(
112                                   $prompt = "Allow " + url2 + "? [y/[n]]",
113                                   $options = ["y", "n"])));
114             }
115             reload(I.buffer, I.P);
116         }
117     });
119 provide("noscript");