Skip to content

Instantly share code, notes, and snippets.

@volh
Last active October 11, 2015 00:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save volh/3773409 to your computer and use it in GitHub Desktop.
Save volh/3773409 to your computer and use it in GitHub Desktop.
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