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