view-as-mime-type: fix bug in interactive declaration
[conkeror.git] / modules / clicks-in-new-buffer.js
blobafbd7f836e32da2f21b1ad253ab5b6c88a454880
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 define_variable("clicks_in_new_buffer_button", 1,
9                 "Which mouse button should open links in a new buffer. " +
10                 "0 = left, 1 = middle, 2 = right. Default is 1.");
12 define_variable("clicks_in_new_buffer_target", OPEN_NEW_BUFFER,
13                 "How to open links in a new buffer, in the foreground or " +
14                 "the background. Set to one the constants OPEN_NEW_BUFFER " +
15                 "or OPEN_NEW_BUFFER_BACKGROUND. Default is OPEN_NEW_BUFFER.");
17 // Should mouse click event propagation be stopped?
18 var clicks_in_new_buffer_ev_stop_prop = true;
20 function find_tag_in_parents(tag, element) {
21     // FIXME If tag names will always be upper-case, toLowerCase() can
22     //       be eliminated. Also not sure that p will ever be null.
23     tag = tag.toLowerCase();
24     for (let p = element.parentNode;
25          p != null && p.tagName.toLowerCase() != "html";
26          p = p.parentNode)
27     {
28         if (p.tagName.toLowerCase() == tag)
29             return p;
30     }
31     return null;
34 function open_link_in_new_buffer(event) {
35     if (event.button != clicks_in_new_buffer_button)
36         return;
37     let element = event.target;
38     let anchor = null;
39     if (element instanceof Ci.nsIDOMHTMLAnchorElement)
40         anchor = element;
41     // FIXME The 'tostring() ==' is a terrible kludge.
42     else if (element.wrappedJSObject.toString() == "[object HTMLSpanElement]" ||
43              element instanceof Ci.nsIDOMHTMLImageElement)
44     {
45         anchor = find_tag_in_parents("a", element);
46     }
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     // FIXME Is there a better way to get the window?
54     let window = window_watcher.activeWindow;
55     let buffer = window.buffers.current;
56     create_buffer(window,
57                   buffer_creator(content_buffer, $load = spec),
58                   clicks_in_new_buffer_target);
61 function clicks_in_new_buffer_add_listener(buffer) {
62     buffer.browser.addEventListener("click",
63                                     open_link_in_new_buffer,
64                                     true);
67 function clicks_in_new_buffer_remove_listener(buffer) {
68     buffer.browser.removeEventListener("click",
69                                        open_link_in_new_buffer,
70                                        true);
73 function clicks_in_new_buffer_mode_enable() {
74     add_hook("create_buffer_hook",
75              clicks_in_new_buffer_add_listener);
76     for_each_buffer(clicks_in_new_buffer_add_listener);
79 function clicks_in_new_buffer_mode_disable() {
80     remove_hook("create_buffer_hook",
81                 clicks_in_new_buffer_add_listener);
82     for_each_buffer(clicks_in_new_buffer_remove_listener);
85 define_global_mode("clicks_in_new_buffer_mode",
86                    clicks_in_new_buffer_mode_enable,
87                    clicks_in_new_buffer_mode_disable);
89 clicks_in_new_buffer_mode(true);