Support Gecko >= 26 Downloads.jsm interface
[conkeror.git] / modules / user-agent-policy.jsx
blobe5727be6226bed77d15d6691cbec57364ba654a7
1 /**
2  * (C) Copyright 2013 John J. Foerch
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 require("http-request-hook");
10 var policies = {};
12 function user_agent_policy (name, user_agent, patterns) {
13     this.name = name;
14     this.user_agent = user_agent;
15     this.byhost = {};
16     this.byregexp = [];
17     for (var i = 0, n = patterns.length; i < n; ++i) {
18         var p = patterns[i];
19         if (p instanceof RegExp)
20             this.byregexp.push(p);
21         else
22             this.byhost[p] = true;
23     }
25 user_agent_policy.prototype = {
26     constructor: user_agent_policy,
27     name: null,
28     user_agent: null,
29     byhost: null,
30     byregexp: null
33 function define_policy (name, user_agent) {
34     var patterns = Array.prototype.slice.call(arguments, 2);
35     var o = new user_agent_policy(name, user_agent, patterns);
36     policies[o.name] = o;
37     return o;
40 function http_request_hook_function (channel) {
41     var uri = channel.URI;
42     var spec = uri.spec;
43     try {
44         var host = uri.host;
45     } catch (e) {}
46     outer: for each (let p in policies) {
47         if (host && p.byhost[host]) {
48             var user_agent = p.user_agent;
49             break;
50         }
51         for (var i = 0, r; r = p.byregexp[i]; ++i) {
52             if (r.test(spec)) {
53                 user_agent = p.user_agent;
54                 break outer;
55             }
56         }
57     }
58     if (user_agent != null) // allow empty-string ua
59         channel.setRequestHeader("User-Agent", user_agent, false);
61 add_hook("http_request_hook", http_request_hook_function);
63 provide("user-agent-policy");