Debian package: Support xulrunner 9+10 in debian/conkeror.bin, drop support for unver...
[conkeror.git] / modules / clicks-in-new-buffer.js
blobaccff848fb3977401a76ce788f3e47cb133ab47d
1 /**
2  * (C) Copyright 2008 Nicholas Zigarovich
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 in_module(null);
10 define_variable("clicks_in_new_buffer_button", 1,
11                 "Which mouse button should open links in a new buffer. " +
12                 "0 = left, 1 = middle, 2 = right. Default is 1.");
14 define_variable("clicks_in_new_buffer_target", OPEN_NEW_BUFFER,
15                 "How to open links in a new buffer, in the foreground or " +
16                 "the background. Set to one the constants OPEN_NEW_BUFFER " +
17                 "or OPEN_NEW_BUFFER_BACKGROUND. Default is OPEN_NEW_BUFFER.");
19 // Should mouse click event propagation be stopped?
20 var clicks_in_new_buffer_ev_stop_prop = true;
22 function find_tag_in_parents (tag, element) {
23     // FIXME If tag names will always be upper-case, toLowerCase() can
24     //       be eliminated. Also not sure that p will ever be null.
25     tag = tag.toLowerCase();
26     for (let p = element.parentNode;
27          p != null && p.tagName.toLowerCase() != "html";
28          p = p.parentNode)
29     {
30         if (p.tagName.toLowerCase() == tag)
31             return p;
32     }
33     return null;
36 function open_link_in_new_buffer (event) {
37     if (event.button != clicks_in_new_buffer_button)
38         return;
39     let element = event.target;
40     let anchor = null;
41     if (element instanceof Ci.nsIDOMHTMLAnchorElement ||
42         element instanceof Ci.nsIDOMHTMLAreaElement)
43     {
44         anchor = element;
45     } else
46         anchor = find_tag_in_parents("a", element);
47     if (anchor == null)
48         return;
49     event.preventDefault();
50     if (clicks_in_new_buffer_ev_stop_prop)
51         event.stopPropagation();
52     let spec = load_spec(anchor);
53     let window = this.ownerDocument.defaultView;
54     let buffer = window.buffers.current;
55     create_buffer(window,
56                   buffer_creator(content_buffer,
57                                  $opener = buffer,
58                                  $load = spec),
59                   clicks_in_new_buffer_target);
62 function clicks_in_new_buffer_add_listener (buffer) {
63     buffer.browser.addEventListener("click",
64                                     open_link_in_new_buffer,
65                                     true);
68 function clicks_in_new_buffer_remove_listener (buffer) {
69     buffer.browser.removeEventListener("click",
70                                        open_link_in_new_buffer,
71                                        true);
74 function clicks_in_new_buffer_mode_enable () {
75     add_hook("create_buffer_hook",
76              clicks_in_new_buffer_add_listener);
77     for_each_buffer(clicks_in_new_buffer_add_listener);
80 function clicks_in_new_buffer_mode_disable () {
81     remove_hook("create_buffer_hook",
82                 clicks_in_new_buffer_add_listener);
83     for_each_buffer(clicks_in_new_buffer_remove_listener);
86 define_global_mode("clicks_in_new_buffer_mode",
87                    clicks_in_new_buffer_mode_enable,
88                    clicks_in_new_buffer_mode_disable);
90 clicks_in_new_buffer_mode(true);
92 provide("clicks-in-new-buffer");