250 lines
6.6 KiB
JavaScript
250 lines
6.6 KiB
JavaScript
|
var BrowserWindowProxy, a, getHistoryOperation, ipcRenderer, ref, remote, resolveURL, sendHistoryOperation,
|
||
|
slice = [].slice;
|
||
|
|
||
|
ref = require('electron'), ipcRenderer = ref.ipcRenderer, remote = ref.remote;
|
||
|
|
||
|
|
||
|
/* Helper function to resolve relative url. */
|
||
|
|
||
|
a = window.top.document.createElement('a');
|
||
|
|
||
|
resolveURL = function(url) {
|
||
|
a.href = url;
|
||
|
return a.href;
|
||
|
};
|
||
|
|
||
|
|
||
|
/* Window object returned by "window.open". */
|
||
|
|
||
|
BrowserWindowProxy = (function() {
|
||
|
BrowserWindowProxy.proxies = {};
|
||
|
|
||
|
BrowserWindowProxy.getOrCreate = function(guestId) {
|
||
|
var base;
|
||
|
return (base = this.proxies)[guestId] != null ? base[guestId] : base[guestId] = new BrowserWindowProxy(guestId);
|
||
|
};
|
||
|
|
||
|
BrowserWindowProxy.remove = function(guestId) {
|
||
|
return delete this.proxies[guestId];
|
||
|
};
|
||
|
|
||
|
function BrowserWindowProxy(guestId1) {
|
||
|
this.guestId = guestId1;
|
||
|
this.closed = false;
|
||
|
ipcRenderer.once("ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_" + this.guestId, (function(_this) {
|
||
|
return function() {
|
||
|
BrowserWindowProxy.remove(_this.guestId);
|
||
|
return _this.closed = true;
|
||
|
};
|
||
|
})(this));
|
||
|
}
|
||
|
|
||
|
BrowserWindowProxy.prototype.close = function() {
|
||
|
return ipcRenderer.send('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', this.guestId);
|
||
|
};
|
||
|
|
||
|
BrowserWindowProxy.prototype.focus = function() {
|
||
|
return ipcRenderer.send('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'focus');
|
||
|
};
|
||
|
|
||
|
BrowserWindowProxy.prototype.blur = function() {
|
||
|
return ipcRenderer.send('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'blur');
|
||
|
};
|
||
|
|
||
|
BrowserWindowProxy.prototype.postMessage = function(message, targetOrigin) {
|
||
|
if (targetOrigin == null) {
|
||
|
targetOrigin = '*';
|
||
|
}
|
||
|
return ipcRenderer.send('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', this.guestId, message, targetOrigin, location.origin);
|
||
|
};
|
||
|
|
||
|
BrowserWindowProxy.prototype["eval"] = function() {
|
||
|
var args;
|
||
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||
|
return ipcRenderer.send.apply(ipcRenderer, ['ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', this.guestId, 'executeJavaScript'].concat(slice.call(args)));
|
||
|
};
|
||
|
|
||
|
return BrowserWindowProxy;
|
||
|
|
||
|
})();
|
||
|
|
||
|
if (process.guestInstanceId == null) {
|
||
|
|
||
|
/* Override default window.close. */
|
||
|
window.close = function() {
|
||
|
return remote.getCurrentWindow().close();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Make the browser window or guest view emit "new-window" event. */
|
||
|
|
||
|
window.open = function(url, frameName, features) {
|
||
|
var feature, guestId, i, ints, j, len, len1, name, options, ref1, ref2, value;
|
||
|
if (frameName == null) {
|
||
|
frameName = '';
|
||
|
}
|
||
|
if (features == null) {
|
||
|
features = '';
|
||
|
}
|
||
|
options = {};
|
||
|
ints = ['x', 'y', 'width', 'height', 'min-width', 'max-width', 'min-height', 'max-height', 'zoom-factor'];
|
||
|
|
||
|
/* Make sure to get rid of excessive whitespace in the property name */
|
||
|
ref1 = features.split(/,\s*/);
|
||
|
for (i = 0, len = ref1.length; i < len; i++) {
|
||
|
feature = ref1[i];
|
||
|
ref2 = feature.split(/\s*=/), name = ref2[0], value = ref2[1];
|
||
|
options[name] = value === 'yes' || value === '1' ? true : value === 'no' || value === '0' ? false : value;
|
||
|
}
|
||
|
if (options.left) {
|
||
|
if (options.x == null) {
|
||
|
options.x = options.left;
|
||
|
}
|
||
|
}
|
||
|
if (options.top) {
|
||
|
if (options.y == null) {
|
||
|
options.y = options.top;
|
||
|
}
|
||
|
}
|
||
|
if (options.title == null) {
|
||
|
options.title = frameName;
|
||
|
}
|
||
|
if (options.width == null) {
|
||
|
options.width = 800;
|
||
|
}
|
||
|
if (options.height == null) {
|
||
|
options.height = 600;
|
||
|
}
|
||
|
|
||
|
/* Resolve relative urls. */
|
||
|
url = resolveURL(url);
|
||
|
for (j = 0, len1 = ints.length; j < len1; j++) {
|
||
|
name = ints[j];
|
||
|
if (options[name] != null) {
|
||
|
options[name] = parseInt(options[name], 10);
|
||
|
}
|
||
|
}
|
||
|
guestId = ipcRenderer.sendSync('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options);
|
||
|
if (guestId) {
|
||
|
return BrowserWindowProxy.getOrCreate(guestId);
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/* Use the dialog API to implement alert(). */
|
||
|
|
||
|
window.alert = function(message, title) {
|
||
|
var buttons;
|
||
|
if (title == null) {
|
||
|
title = '';
|
||
|
}
|
||
|
buttons = ['OK'];
|
||
|
message = message.toString();
|
||
|
remote.dialog.showMessageBox(remote.getCurrentWindow(), {
|
||
|
message: message,
|
||
|
title: title,
|
||
|
buttons: buttons
|
||
|
});
|
||
|
|
||
|
/* Alert should always return undefined. */
|
||
|
};
|
||
|
|
||
|
|
||
|
/* And the confirm(). */
|
||
|
|
||
|
window.confirm = function(message, title) {
|
||
|
var buttons, cancelId;
|
||
|
if (title == null) {
|
||
|
title = '';
|
||
|
}
|
||
|
buttons = ['OK', 'Cancel'];
|
||
|
cancelId = 1;
|
||
|
return !remote.dialog.showMessageBox(remote.getCurrentWindow(), {
|
||
|
message: message,
|
||
|
title: title,
|
||
|
buttons: buttons,
|
||
|
cancelId: cancelId
|
||
|
});
|
||
|
};
|
||
|
|
||
|
|
||
|
/* But we do not support prompt(). */
|
||
|
|
||
|
window.prompt = function() {
|
||
|
throw new Error('prompt() is and will not be supported.');
|
||
|
};
|
||
|
|
||
|
if (process.openerId != null) {
|
||
|
window.opener = BrowserWindowProxy.getOrCreate(process.openerId);
|
||
|
}
|
||
|
|
||
|
ipcRenderer.on('ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', function(event, sourceId, message, sourceOrigin) {
|
||
|
|
||
|
/* Manually dispatch event instead of using postMessage because we also need to */
|
||
|
|
||
|
/* set event.source. */
|
||
|
event = document.createEvent('Event');
|
||
|
event.initEvent('message', false, false);
|
||
|
event.data = message;
|
||
|
event.origin = sourceOrigin;
|
||
|
event.source = BrowserWindowProxy.getOrCreate(sourceId);
|
||
|
return window.dispatchEvent(event);
|
||
|
});
|
||
|
|
||
|
|
||
|
/* Forward history operations to browser. */
|
||
|
|
||
|
sendHistoryOperation = function() {
|
||
|
var args;
|
||
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||
|
return ipcRenderer.send.apply(ipcRenderer, ['ATOM_SHELL_NAVIGATION_CONTROLLER'].concat(slice.call(args)));
|
||
|
};
|
||
|
|
||
|
getHistoryOperation = function() {
|
||
|
var args;
|
||
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||
|
return ipcRenderer.sendSync.apply(ipcRenderer, ['ATOM_SHELL_SYNC_NAVIGATION_CONTROLLER'].concat(slice.call(args)));
|
||
|
};
|
||
|
|
||
|
window.history.back = function() {
|
||
|
return sendHistoryOperation('goBack');
|
||
|
};
|
||
|
|
||
|
window.history.forward = function() {
|
||
|
return sendHistoryOperation('goForward');
|
||
|
};
|
||
|
|
||
|
window.history.go = function(offset) {
|
||
|
return sendHistoryOperation('goToOffset', offset);
|
||
|
};
|
||
|
|
||
|
Object.defineProperty(window.history, 'length', {
|
||
|
get: function() {
|
||
|
return getHistoryOperation('length');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
/* Make document.hidden and document.visibilityState return the correct value. */
|
||
|
|
||
|
Object.defineProperty(document, 'hidden', {
|
||
|
get: function() {
|
||
|
var currentWindow;
|
||
|
currentWindow = remote.getCurrentWindow();
|
||
|
return currentWindow.isMinimized() || !currentWindow.isVisible();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
Object.defineProperty(document, 'visibilityState', {
|
||
|
get: function() {
|
||
|
if (document.hidden) {
|
||
|
return "hidden";
|
||
|
} else {
|
||
|
return "visible";
|
||
|
}
|
||
|
}
|
||
|
});
|