]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/buffer.jsm
Import 1.0 supporting Firefox up to 14.*
[dactyl.git] / common / modules / buffer.jsm
index 94b1692e762d840e0759af5834058630d003804b..357beea6556566c60eac0ce21dad1b9a82224b55 100644 (file)
@@ -13,8 +13,9 @@ defineModule("buffer", {
 }, this);
 
 this.lazyRequire("finder", ["RangeFind"]);
+this.lazyRequire("io", ["io"]);
 this.lazyRequire("overlay", ["overlay"]);
-this.lazyRequire("storage", ["storage"]);
+this.lazyRequire("storage", ["File", "storage"]);
 this.lazyRequire("template", ["template"]);
 
 /**
@@ -72,7 +73,7 @@ var Buffer = Module("Buffer", {
         dactyl.assert(url instanceof Ci.nsIURL);
 
         while (count-- && url.path != "/")
-            url.path = url.path.replace(/[^\/]+\/*$/, "");
+            url.path = url.path.replace(/[^\/]*\/*$/, "");
 
         dactyl.assert(!url.equals(this.documentURI));
         dactyl.open(url.spec);
@@ -394,7 +395,7 @@ var Buffer = Module("Buffer", {
 
             function a(regexp, elem) regexp.test(elem.textContent) === regexp.result ||
                             Array.some(elem.childNodes, function (child) regexp.test(child.alt) === regexp.result);
-            function b(regexp, elem) regexp.test(elem.title);
+            function b(regexp, elem) regexp.test(elem.title) === regexp.result;
 
             let res = Array.filter(frame.document.querySelectorAll(selector), Hints.isVisible);
             for (let test in values([a, b]))
@@ -456,10 +457,11 @@ var Buffer = Module("Buffer", {
         let { dactyl } = this.modules;
 
         let ctrlKey = false, shiftKey = false;
+        let button = 0;
         switch (dactyl.forceTarget || where) {
         case dactyl.NEW_TAB:
         case dactyl.NEW_BACKGROUND_TAB:
-            ctrlKey = true;
+            button = 1;
             shiftKey = dactyl.forceBackground != null ? dactyl.forceBackground
                                                       : where != dactyl.NEW_BACKGROUND_TAB;
             break;
@@ -475,7 +477,7 @@ var Buffer = Module("Buffer", {
         prefs.withContext(function () {
             prefs.set("browser.tabs.loadInBackground", true);
             let params = {
-                screenX: offsetX, screenY: offsetY,
+                button: button, screenX: offsetX, screenY: offsetY,
                 ctrlKey: ctrlKey, shiftKey: shiftKey, metaKey: ctrlKey
             };
 
@@ -633,18 +635,24 @@ var Buffer = Module("Buffer", {
                              | persist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
 
         let window = this.topWindow;
+        if (!file.exists())
+            file.create(Ci.nsIFile.NORMAL_FILE_TYPE, octal(666));
+
         let downloadListener = new window.DownloadListener(window,
                 services.Transfer(uri, File(file).URI, "",
                                   null, null, null, persist));
 
-        persist.progressListener = update(Object.create(downloadListener), {
-            onStateChange: util.wrapCallback(function onStateChange(progress, request, flags, status) {
-                if (callback && (flags & Ci.nsIWebProgressListener.STATE_STOP) && status == 0)
-                    util.trapErrors(callback, self, uri, file, progress, request, flags, status);
+        if (callback)
+            persist.progressListener = update(Object.create(downloadListener), {
+                onStateChange: util.wrapCallback(function onStateChange(progress, request, flags, status) {
+                    if (callback && (flags & Ci.nsIWebProgressListener.STATE_STOP) && status == 0)
+                        util.trapErrors(callback, self, uri, file, progress, request, flags, status);
 
-                return onStateChange.superapply(this, arguments);
-            })
-        });
+                    return onStateChange.superapply(this, arguments);
+                })
+            });
+        else
+            persist.progressListener = downloadListener;
 
         persist.saveURI(uri, null, null, null, null, file);
     },
@@ -1580,18 +1588,19 @@ var Buffer = Module("Buffer", {
                 dactyl.assert(!arg || arg[0] == ">" && !config.OS.isWindows,
                               _("error.trailingCharacters"));
 
-                const PRINTER = "PostScript/default";
-                const BRANCH  = "print.printer_" + PRINTER + ".";
+                const PRINTER  = "PostScript/default";
+                const BRANCH   = "printer_" + PRINTER + ".";
+                const BRANCHES = ["print.", BRANCH, "print." + BRANCH];
+                function set(pref, value) {
+                    BRANCHES.forEach(function (branch) { prefs.set(branch + pref, value) });
+                }
 
                 prefs.withContext(function () {
                     if (arg) {
                         prefs.set("print.print_printer", PRINTER);
 
-                        prefs.set(   "print.print_to_file", true);
-                        prefs.set(BRANCH + "print_to_file", true);
-
-                        prefs.set(   "print.print_to_filename", io.File(arg.substr(1)).path);
-                        prefs.set(BRANCH + "print_to_filename", io.File(arg.substr(1)).path);
+                        set("print_to_file", true);
+                        set("print_to_filename", io.File(arg.substr(1)).path);
 
                         dactyl.echomsg(_("print.toFile", arg.substr(1)));
                     }
@@ -1599,19 +1608,21 @@ var Buffer = Module("Buffer", {
                         dactyl.echomsg(_("print.sending"));
 
                     prefs.set("print.always_print_silent", args.bang);
-                    prefs.set("print.show_print_progress", !args.bang);
+                    if (false)
+                        prefs.set("print.show_print_progress", !args.bang);
 
                     config.browser.contentWindow.print();
                 });
 
-                if (arg)
-                    dactyl.echomsg(_("print.printed", arg.substr(1)));
-                else
-                    dactyl.echomsg(_("print.sent"));
+                dactyl.echomsg(_("print.sent"));
             },
             {
                 argCount: "?",
                 bang: true,
+                completer: function (context, args) {
+                    if (args.bang && /^>/.test(context.filter))
+                        context.fork("file", 1, modules.completion, "file");
+                },
                 literal: 0
             });
 
@@ -1806,7 +1817,8 @@ var Buffer = Module("Buffer", {
                             context.incomplete = false;
                             try {
                                 if (/filename="(.*?)"/.test(xhr.getResponseHeader("Content-Disposition")))
-                                    context.completions.push([decodeURIComponent(RegExp.$1), _("buffer.save.suggested")]);
+                                    context.completions.push([decodeURIComponent(RegExp.$1),
+                                                             _("buffer.save.suggested")]);
                             }
                             finally {
                                 context.completions = context.completions.slice();
@@ -2020,7 +2032,7 @@ var Buffer = Module("Buffer", {
         mappings.add([modes.NORMAL], ["[[", "<previous-page>"],
             "Follow the link labeled 'prev', 'previous' or '<' if it exists",
             function (args) {
-                buffer.findLink("previous", options["previouspattern"], (args.count || 1) - 1, true);
+                buffer.findLink("prev", options["previouspattern"], (args.count || 1) - 1, true);
             },
             { count: true });
 
@@ -2230,11 +2242,14 @@ var Buffer = Module("Buffer", {
         options.add(["linenumbers", "ln"],
             "Patterns used to determine line numbers used by G",
             "sitemap", {
+                // Make sure to update the docs when you change this.
+                "view-source:*": 'body,[id^=line]',
                 "code.google.com": '#nums [id^="nums_table"] a[href^="#"]',
                 "github.com": '.line_numbers>*',
                 "mxr.mozilla.org": 'a.l',
                 "pastebin.com": '#code_frame>div>ol>li',
                 "addons.mozilla.org": '.gutter>.line>a',
+                "bugzilla.mozilla.org": ".bz_comment:not(.bz_first_comment):not(.ih_history)",
                 "*": '/* Hgweb/Gitweb */ .completecodeline a.codeline, a.linenr'
             },
             {
@@ -2277,12 +2292,12 @@ var Buffer = Module("Buffer", {
 
         options.add(["nextpattern"],
             "Patterns to use when guessing the next page in a document sequence",
-            "regexplist", UTF8(/'\bnext\b',^>$,^(>>|»)$,^(>|»),(>|»)$,'\bmore\b'/.source),
+            "regexplist", UTF8(/'^Next [>»]','^Next »','\bnext\b',^>$,^(>>|»)$,^(>|»),(>|»)$,'\bmore\b'/.source),
             { regexpFlags: "i" });
 
         options.add(["previouspattern"],
             "Patterns to use when guessing the previous page in a document sequence",
-            "regexplist", UTF8(/'\bprev|previous\b',^<$,^(<<|«)$,^(<|«),(<|«)$/.source),
+            "regexplist", UTF8(/'[<«] Prev$','« Prev$','\bprev(ious)?\b',^<$,^(<<|«)$,^(<|«),(<|«)$/.source),
             { regexpFlags: "i" });
 
         options.add(["pageinfo", "pa"],