aboutsummaryrefslogtreecommitdiffstats
path: root/options-migrate-user-pref.js
blob: 229c0b50d0004f62515c57f22c38c00464ac5e5e (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
var PLUGIN_INFO = xml`
<VimperatorPlugin>
<name>{NAME}</name>
<description>options migrate user_pref</description>
<description lang="ja">:set foobarbaz で簡単に user_pref をセットできるプラグイン</description>
<minVersion>2.0pre</minVersion>
<maxVersion>2.0</maxVersion>
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/options-migrate-user-pref.js</updateURL>
<author mail="hotchpotch@gmail.com" homepage="http://d.hatena.ne.jp/secondlife/">Yuichi Tateno</author>
<license>MIT</license>
<version>0.1</version>
<detail><![CDATA[
>||
:set! javascript.enabled=true
||<
>||
:set javascript
:set nojavascript
||<
のようにマッピングするためのプラグインです。
boolean/number を簡単にセットできるようになるため、よく user_pref を変更する場合などに便利です。

>||
js <<EOF
liberator.globalVariables.options_migrate_user_pref =
[
    {
        pref: 'javascript.enabled',
        description: 'Using JavaScript',
        command: ['javascript', 'js'],
    },
    {
        pref: 'font.size.fixed.ja',
        description: 'JA fixed font-size',
        command: ['jaffont'],
    }
];
EOF
||<

]]></detail>
</VimperatorPlugin>`;

(function() {
    let p = function(msg) {
        Application.console.log(msg);
    }

    liberator.plugins.migrateUserPref = function(config) {
        config.forEach(function(conf) {
            let pref = conf.pref;
            let type;
            try
            {
                switch (services.get('pref').getPrefType(conf.pref))
                {
                case Ci.nsIPrefBranch.PREF_STRING:
                    // XXX: string のとき、うまく user_pref に設定できていない?
                    type = 'string';
                    break;
                case Ci.nsIPrefBranch.PREF_INT:
                    type = 'number';
                    break;
                case Ci.nsIPrefBranch.PREF_BOOL:
                    type = 'boolean';
                    break;
                default:
                    return liberator.echoerr('migrate-user-pref: error pref: ' + pref);
                }
            }
            catch (e)
            {
                return liberator.echoerr('migrate-user-pref: error pref: ' + pref + ' ' + e);
            }

            options.add(conf.command, conf.description, type,
                (typeof conf.defaultValue == 'undefined' ? options.getPref(pref) : conf.defaultValue),
                {
                    setter: function(value) options.setPref(pref, value),
                    getter: function() options.getPref(pref),
                }
            );
        });
    }

    liberator.plugins.migrateUserPref(liberator.globalVariables['options_migrate_user_pref'] || []);
})();

s</updateURL> <detail lang="ja"><![CDATA[ Cookie の管理をするプラグイン == Command == -permオプションの有無で2種類に分かれる === Cookieのパーミッション === :cookiem[anager] list {hostname and path}: {hostname and path}のCookieを表示 :cookiem[anager] remove {hostname and path}: {hostname and path}のCookieを削除 === 現在保存されているCookie === :cookiem[anager] -p[erm] list {hostname}: {hostname}のCookieのパーミッションを表示 :cookiem[anager] -p[erm] add {hostname} {capability}: {hostname}のCookieのパーミッションを設定 :cookiem[anager] -p[erm] list {hostname}: {hostname}のCookieのパーミッションを削除 == pageinfo == :pageinfo c で現在開いているホストのCookieを表示 == どうでも良いこと == 補完機能を存分にお楽しみください :) ]]></detail> </VimperatorPlugin>; liberator.plugins.cookieManager = (function(){ const CM = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); const PM = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); const I_CPM = Ci.nsICookiePermission; const PERM_TYPE = "cookie"; function getIterator(enum, interface){ while (enum.hasMoreElements()){ let obj = enum.getNext().QueryInterface(interface); yield obj; } } function cookieIterator() getIterator(CM.enumerator, Ci.nsICookie2); function cookiePermissionIterator(){ for (let perm in getIterator(PM.enumerator, Ci.nsIPermission)){ if (perm.type = PERM_TYPE) yield perm; } } function capabilityToString(capability){ switch (capability){ case I_CPM.ACCESS_ALLOW: // 1 return "ALLOW"; case I_CPM.ACCESS_DENY: // 2 return "DENY"; case I_CPM.ACCESS_SESSION: // 8 return "ONLY_SESSION"; default: return "DEFAULT"; } } function stringToCapability(str){ switch (str){ case "ALLOW": return I_CPM.ACCESS_ALLOW; case "DENY": return I_CPM.ACCESS_DENY; case "ONLY_SESSION": return I_CPM.ACCESS_SESSION; default: return I_CPM.ACCESS_DEFAULT; } } function getHost(){ var host; try { host = content.document.location.host; } catch (e){} return host; } // -------------------------------------------------------- // PageInfo // -------------------------------------------------------- buffer.addPageInfoSection("c", "Cookies", function(verbose){ var hostname; try { hostname = content.window.location.host; } catch (e){ return []; } return [[c.rawHost + c.path, c.name + " = " + c.value] for (c in cManager.stored.getByHostAndPath(hostname))]; }); // -------------------------------------------------------- // Command // -----------------------------------------------------{{{ commands.addUserCommand(["cookiem[anager]"], "Cookie Management", function(args){ if (args["-perm"]){ switch (args[0]){ case "list": let list = cManager.permission.list(args[1]); liberator.echo(template.table("Cookie Permission", list)); break; case "remove": if (cManager.permission.remove(args[1])){ liberator.echo("Removed permission: `" + args[1] + "'"); } else { liberator.echo("Failed to removed permission: `" + args[1] + "'"); } break; case "add": cManager.permission.add(args[1], args[2]); break; default: liberator.echoerr("Invalid sub-command."); } return; } var host = args[1] || getHost(); if (!host) return; switch (args[0]){ case "list": let xml = <></>; let tree = cManager.stored.getTree(host); for (let name in tree){ xml += template.table(name, [[c.name, c.value] for each(c in tree[name])]); } liberator.echo(xml, true); break; case "remove": cManager.stored.remove(host); break; default: liberator.echoerr("Invalid sub-command."); } }, { options: [ [["-perm", "-p"], commands.OPTION_NOARG] ], completer: function(context, args){ if (args["-perm"]){ plugins.cookieManager.permission.completer(context, args); } else { plugins.cookieManager.stored.completer(context, args); } }, }, true); // Command End }}} var cManager = { stored: { // {{{ getByHostAndPath: function(hostAndPath){ for (let cookie in cookieIterator()){ if (!hostAndPath || (cookie.rawHost + cookie.path).indexOf(hostAndPath) == 0) yield cookie; } }, remove: function(hostAndPath){ if (!hostAndPath) return false; for (let cookie in this.getByHostAndPath(hostAndPath)){ CM.remove(cookie.host, cookie.name, cookie.path, false); } return true; }, getTree: function(hostAndPath){ var tree = {}; function getTree(name){ if (name in tree) return tree[name]; tree[name] = []; return tree[name]; } for (let cookie in this.getByHostAndPath(hostAndPath)){ getTree(cookie.rawHost + cookie.path).push(cookie); } return tree; }, subcommands: [ ["list", "list cookie permission"], ["remove", "remove cookie premission"] ], completer: function(context, args){ if (args.length == 1){ context.title = ["SubCommand", "Description"]; context.completions = context.filter ? this.subcommands.filter(function(c) c[0].indexOf(context.filter) >= 0) : this.subcommands; } else if (args.length == 2){ let list = util.Array.uniq([c.rawHost + c.path for (c in this.getByHostAndPath())]).map(function(host) [host, "-"]); context.title = ["Host and Path"]; context.completions = context.filter ? list.filter(function(c) c[0].indexOf(context.filter) >= 0) : list; } }, }, // }}} permission: { // {{{ getByHost: function(hostname){ for (let permission in cookiePermissionIterator()){ if (permission.host == hostname) return permission; } return null; }, add: function(hostname, capability, force){ var uri = util.newURI("http://" + hostname); var perm = this.getByHost(hostname); switch (typeof capability){ case "string": capability = stringToCapability(capability); break; case "number": break; default: throw "Invalid capability"; } if (perm && force){ this.remove(hostname); } PM.add(uri, PERM_TYPE, capability); }, remove: function(hostname){ if (this.getByHost(hostname)){ PM.remove(hostname, PERM_TYPE); return true; } return false; }, list: function(filterReg){ if (filterReg && !(filterReg instanceof RegExp)){ filterReg = new RegExp(filterReg.toString()); } else if (!filterReg){ filterReg = new RegExp(""); } return [[p.host, capabilityToString(p.capability)] for (p in cookiePermissionIterator())].filter(function($_) filterReg.test($_[0])); }, subcommands: [ ["list", "list cookie permission"], ["add", "add cookie permission"], ["remove", "remove cookie premission"] ], capabilityList: [ ["ALLOW", "-"], ["DENY", "-"], ["ONLY_SESSION", "-"] ], completer: function(context, args){ if (args.length == 1){ context.title = ["SubCommand", "Description"]; context.completions = context.filter ? this.subcommands.filter(function(c) c[0].indexOf(context.filter) >= 0) : this.subcommands; } else { let suggestion = []; switch (args[0]){ case "add": if (args.length == 3){ context.title = ["Capability"]; context.completions = context.filter ? this.capabilityList.filter(function($_) $_[0].toLowerCase().indexOf(context.filter.toLowerCase()) == 0) : this.capabilityList; } else if (args.length == 2){ let host = getHost(); if (host){ let hosts = []; host.split(".").reduceRight(function(p, c){ let domain = c + "." + p; hosts.push([domain, "-"]); return domain; }); suggestion = hosts.reverse(); context.title = ["Current Host"]; context.completions = context.filter ? suggestion.filter(function($_) $_[0].indexOf(context.filter) >= 0) : suggestion; return; } } case "list": case "remove": if (args.length > 2) return; context.title = ["Host", "Capability"]; let list = this.list(); context.completions = context.filter ? list.filter(function($_) $_[0].indexOf(context.filter) >= 0) : list; } } }, }, // }}} }; return cManager; })(); // vim: sw=4 ts=4 et fdm=marker: