Last active
October 11, 2015 00:18
-
-
Save volh/3773409 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const OPEN_MASTER_WINDOW = 7; | |
function master_window () { | |
let windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] | |
.getService(Components.interfaces.nsIWindowMediator); | |
let windows = windowMediator.getEnumerator(null); | |
let max_width = 0; | |
let master = null; | |
while (windows.hasMoreElements()) { | |
let win = windows.getNext() | |
let width = win.innerWidth; | |
if (width > max_width) { | |
max_width = width; | |
master = win; | |
} | |
} | |
return master; | |
} | |
// test test | |
function open_master_window (spec) { | |
target = OPEN_NEW_BUFFER; | |
create_buffer(master_window(), | |
buffer_creator(content_buffer, | |
$opener = null, | |
$load = spec), | |
target); | |
} | |
// a monkeypatch. too bad it's not emacs and doesn't have advices | |
function browser_object_follow (buffer, target, elem) { | |
// XXX: would be better to let nsILocalFile objects be load_specs | |
if (elem instanceof Ci.nsILocalFile) | |
elem = elem.path; | |
var e; | |
if (elem instanceof load_spec) | |
e = load_spec_element(elem); | |
if (! e) | |
e = elem; | |
browser_set_element_focus(buffer, e, true /* no scroll */); | |
var no_click = (((elem instanceof load_spec) && | |
load_spec_forced_charset(elem)) || | |
(e instanceof load_spec) || | |
(e instanceof Ci.nsIDOMWindow) || | |
(e instanceof Ci.nsIDOMHTMLFrameElement) || | |
(e instanceof Ci.nsIDOMHTMLIFrameElement) || | |
(e instanceof Ci.nsIDOMHTMLLinkElement) || | |
(e instanceof Ci.nsIDOMHTMLImageElement && | |
!e.hasAttribute("onmousedown") && !e.hasAttribute("onclick"))); | |
if (target == FOLLOW_DEFAULT && !no_click) { | |
var x = 1, y = 1; | |
if (e instanceof Ci.nsIDOMHTMLAreaElement) { | |
var coords = e.getAttribute("coords").split(","); | |
if (coords.length >= 2) { | |
x = Number(coords[0]) + 1; | |
y = Number(coords[1]) + 1; | |
} | |
} | |
dom_node_click(e, x, y); | |
return; | |
} | |
var spec = load_spec(elem); | |
if (load_spec_uri_string(spec).match(/^\s*javascript:/)) { | |
// it is nonsensical to follow a javascript url in a different | |
// buffer or window | |
target = FOLLOW_DEFAULT; | |
} else if (!(buffer instanceof content_buffer) && | |
(target == FOLLOW_CURRENT_FRAME || | |
target == FOLLOW_DEFAULT || | |
target == OPEN_CURRENT_BUFFER)) | |
{ | |
target = OPEN_NEW_BUFFER; | |
} | |
switch (target) { | |
case FOLLOW_CURRENT_FRAME: | |
var current_frame = load_spec_source_frame(spec); | |
if (current_frame && current_frame != buffer.top_frame) { | |
var target_obj = get_web_navigation_for_frame(current_frame); | |
apply_load_spec(target_obj, spec); | |
break; | |
} | |
case FOLLOW_DEFAULT: | |
case OPEN_CURRENT_BUFFER: | |
buffer.load(spec); | |
break; | |
case OPEN_NEW_WINDOW: | |
case OPEN_NEW_BUFFER: | |
case OPEN_NEW_BUFFER_BACKGROUND: | |
if (dom_node_or_window_p(e)) | |
var opener = buffer; | |
else | |
opener = null; | |
create_buffer(buffer.window, | |
buffer_creator(content_buffer, | |
$opener = opener, | |
$load = spec), | |
target); | |
case OPEN_MASTER_WINDOW: | |
if (dom_node_or_window_p(e)) | |
var opener = buffer; | |
else | |
opener = null; | |
create_buffer(master_window(), | |
buffer_creator(content_buffer, | |
$opener = opener, | |
$load = spec), | |
target); | |
} | |
} | |
// another monkeypatch | |
function create_buffer (window, creator, target) { | |
switch (target) { | |
case OPEN_NEW_BUFFER: | |
case OPEN_MASTER_WINDOW: | |
window.buffers.current = creator(window, null); | |
break; | |
case OPEN_NEW_BUFFER_BACKGROUND: | |
creator(window, null); | |
break; | |
case OPEN_NEW_WINDOW: | |
make_window(creator); | |
break; | |
default: | |
throw new Error("invalid target"); | |
} | |
} | |
function follow_master_window (I) { | |
yield follow(I, OPEN_MASTER_WINDOW); | |
} | |
interactive("follow-master-window", | |
"Follow a link in a master window", | |
follow_master_window, | |
$browser_object = browser_object_links, | |
$prompt = "Follow"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment