2 * (C) Copyright 2008 Nicholas Zigarovich
4 * Use, modification, and distribution are subject to the terms specified in the
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";
30 if (p.tagName.toLowerCase() == tag)
36 function open_link_in_new_buffer (event) {
37 if (event.button != clicks_in_new_buffer_button)
39 let element = event.target;
41 if (element instanceof Ci.nsIDOMHTMLAnchorElement)
43 // FIXME The 'tostring() ==' is a terrible kludge.
44 else if (element.wrappedJSObject.toString() == "[object HTMLSpanElement]" ||
45 element instanceof Ci.nsIDOMHTMLImageElement)
47 anchor = find_tag_in_parents("a", element);
51 event.preventDefault();
52 if (clicks_in_new_buffer_ev_stop_prop)
53 event.stopPropagation();
54 let spec = load_spec(anchor);
55 // FIXME Is there a better way to get the window?
56 let window = window_watcher.activeWindow;
57 let buffer = window.buffers.current;
59 buffer_creator(content_buffer, $load = spec),
60 clicks_in_new_buffer_target);
63 function clicks_in_new_buffer_add_listener (buffer) {
64 buffer.browser.addEventListener("click",
65 open_link_in_new_buffer,
69 function clicks_in_new_buffer_remove_listener (buffer) {
70 buffer.browser.removeEventListener("click",
71 open_link_in_new_buffer,
75 function clicks_in_new_buffer_mode_enable () {
76 add_hook("create_buffer_hook",
77 clicks_in_new_buffer_add_listener);
78 for_each_buffer(clicks_in_new_buffer_add_listener);
81 function clicks_in_new_buffer_mode_disable () {
82 remove_hook("create_buffer_hook",
83 clicks_in_new_buffer_add_listener);
84 for_each_buffer(clicks_in_new_buffer_remove_listener);
87 define_global_mode("clicks_in_new_buffer_mode",
88 clicks_in_new_buffer_mode_enable,
89 clicks_in_new_buffer_mode_disable);
91 clicks_in_new_buffer_mode(true);
93 provide("clicks-in-new-buffer");