2015-02-10 19:41:24 +00:00
|
|
|
<!doctype html>
|
|
|
|
<html>
|
|
|
|
<base id="base" href="../">
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<!-- loading screen -->
|
|
|
|
<link rel="stylesheet" type="text/css" href="./plugins/c9.ide.layout.classic/loading.css" />
|
|
|
|
<div id="loadingide">
|
|
|
|
<style>
|
|
|
|
.window-titlebar {
|
|
|
|
position: fixed;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
top: 0;
|
|
|
|
height: 23px;
|
|
|
|
z-index: 1000000;
|
|
|
|
background-image: -webkit-linear-gradient(top, rgb(61, 61, 61) 0%, rgb(37, 37, 37) 100%);
|
|
|
|
background-image: linear-gradient(top, rgb(61, 61, 61) 0%, rgb(37, 37, 37) 100%);
|
|
|
|
color: #ccc;
|
|
|
|
cursor: default;
|
|
|
|
box-sizing: border-box;
|
|
|
|
font-family:"Segoe ui", Lucida Grande;
|
|
|
|
font-size: 13px;
|
|
|
|
text-align: center;
|
|
|
|
border-radius: 3px 3px 0 0;
|
|
|
|
-webkit-user-select: none;
|
|
|
|
overflow: hidden;
|
|
|
|
-webkit-app-region: drag;
|
|
|
|
}
|
|
|
|
.window-titlebar .caption {
|
|
|
|
padding: 4px 0 0 34px;
|
|
|
|
height: 100%;
|
|
|
|
display: inline-block;
|
|
|
|
background: url("./plugins/c9.ide.local/images/winc9.png") no-repeat 0 1px;
|
|
|
|
cursor: default;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
<!--var platform = c9.platform-->
|
|
|
|
<!--var titleHeight = platform == "win32" ? 27 : 23;-->
|
|
|
|
|
|
|
|
<div class="window-titlebar darwin">
|
|
|
|
<div class="caption">Cloud9</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div id="content" class="loading-progress">
|
|
|
|
<div id="progress-msg">
|
|
|
|
Loading your workspace <span id="dots"></span>
|
|
|
|
</div>
|
|
|
|
<div class="loading-seperator"></div>
|
|
|
|
<div class="loading-msg">It will be just as you left it</div>
|
|
|
|
|
|
|
|
<div class="ui-progress-bar ui-container" id="progress_bar" style="display:none">
|
|
|
|
<div class="ui-progress" style="width: 7%;">
|
|
|
|
<span class="ui-label" style="display:none;"></span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!--<div class="footer">
|
|
|
|
<a href="https://docs.c9.io">Documentation</a> |
|
|
|
|
<a href="http://status.c9.io">Server Status</a> |
|
|
|
|
<a href="http://support.c9.io">Support</a>
|
|
|
|
</div>-->
|
|
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
|
|
var dots = document.getElementById("dots");
|
|
|
|
var cnt = 0;
|
|
|
|
window.dotsAnim = setInterval(function () {
|
|
|
|
dots.textContent = "...".slice(0, (++cnt)%4);
|
|
|
|
}, 500);
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<script src="./plugins/c9.login.client/bootstrap.js"></script>
|
|
|
|
<!-- Node.js Context -->
|
|
|
|
<script>
|
|
|
|
var nwGui = require("nw.gui");
|
|
|
|
var argv = nwGui.App.argv;
|
|
|
|
var win = nwGui.Window.get();
|
|
|
|
var spawn = require("child_process").spawn;
|
|
|
|
|
|
|
|
process.on("uncaughtException", function(err) {
|
|
|
|
console && console.error(err.stack);
|
|
|
|
});
|
|
|
|
|
|
|
|
var path = argv.parsed && argv.parsed["-w"] || "/";
|
|
|
|
var wait = argv.indexOf("--wait") != -1;
|
|
|
|
var devel = argv.indexOf("--devel") != -1;
|
|
|
|
var packed = argv.indexOf("--unpacked") == -1;
|
|
|
|
var noWorker = argv.indexOf("--no-worker") != -1;
|
|
|
|
var inProcess = argv.indexOf("--in-process") != -1;
|
|
|
|
var reset = argv.indexOf("--reset") != -1;
|
|
|
|
|
|
|
|
/*::dev::*/ packed = argv.indexOf("--packed") != -1;
|
|
|
|
/*::dev::*/ if (argv.indexOf("--no-devtools") == -1) {
|
|
|
|
/*::dev::*/ win.showDevTools();
|
|
|
|
/*::dev::*/ }
|
|
|
|
|
|
|
|
// have to use this since new-instance windows have wrong root module path
|
2015-11-17 13:38:09 +00:00
|
|
|
var __dirname = decodeURIComponent(document.baseURI).substr(
|
2015-02-10 19:41:24 +00:00
|
|
|
"file://".length + (process.platform == "win32" ? 1 : 0)
|
|
|
|
).replace(/\/*$/, "/local");
|
|
|
|
|
|
|
|
if (packed)
|
|
|
|
require(__dirname + "/logger.js");
|
|
|
|
|
|
|
|
if (argv.indexOf("--devtools") > -1)
|
|
|
|
win.showDevTools();
|
|
|
|
|
|
|
|
// Show window after 4 seconds if it wasn't shown already
|
|
|
|
wait || packed || setTimeout(function(){ win.shown || win.show(); }, 4000);
|
|
|
|
|
|
|
|
var server = require(__dirname + "/server.js");
|
|
|
|
var windowManager = server.windowManager;
|
2015-11-17 13:38:09 +00:00
|
|
|
windowManager.registerWindow(win, decodeURIComponent(/id=([^&#?=]+)/.exec(window.location)[1]));
|
2015-02-10 19:41:24 +00:00
|
|
|
|
|
|
|
var performance = window.performance;
|
|
|
|
var time = {
|
|
|
|
start: function(name) {
|
|
|
|
this[name + "StartT"] = performance.now();
|
|
|
|
},
|
|
|
|
done: function (name, start) {
|
|
|
|
this[name + "DoneT"] = performance.now();
|
|
|
|
this.delta[name + "Delta"] = this[name + "DoneT"] - this[(start || name) + "StartT"];
|
|
|
|
},
|
|
|
|
toString: function() {
|
|
|
|
return JSON.stringify(this, null, 4);
|
|
|
|
},
|
|
|
|
delta: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
var loadScript = function(path, callback, errback) {
|
|
|
|
var head = document.head || document.documentElement;
|
|
|
|
var s = document.createElement('script');
|
|
|
|
|
|
|
|
s.src = path;
|
|
|
|
head.appendChild(s);
|
|
|
|
|
|
|
|
s.onload = s.onreadystatechange = function(_, isAbort) {
|
|
|
|
if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") {
|
|
|
|
s = s.onload = s.onreadystatechange = null;
|
|
|
|
if (!isAbort)
|
|
|
|
callback();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
s.onerror = errback;
|
|
|
|
};
|
|
|
|
|
|
|
|
var setBasePath = function(href) {
|
|
|
|
window.baseURI = href;
|
|
|
|
document.getElementById("base").setAttribute("href", href);
|
|
|
|
vfsServerReqests.forEach(function(fn) {
|
|
|
|
fn(href);
|
|
|
|
});
|
|
|
|
vfsServerReqests = [];
|
|
|
|
};
|
|
|
|
|
|
|
|
var plugins;
|
|
|
|
var vfsServerReqests = [];
|
|
|
|
var windowLocation = document.baseURI.replace(/\/$/, "")
|
|
|
|
.replace(/[()"'\[\]<>]/g, escape); // needed because apf doesn't always escape url when using in css
|
|
|
|
function readConfig() {
|
|
|
|
var windowConfig = win.options || {};
|
|
|
|
|
|
|
|
time.start("getPlugins");
|
|
|
|
server.getPlugins({
|
|
|
|
getServers: function(cb) {
|
|
|
|
if (window.baseURI)
|
|
|
|
cb(window.baseURI);
|
|
|
|
else
|
|
|
|
vfsServerReqests.push(cb);
|
|
|
|
},
|
|
|
|
workspaceDir: path,
|
|
|
|
packed: packed,
|
|
|
|
windowLocation: devel ? "" : windowLocation,
|
|
|
|
noWorker: noWorker,
|
|
|
|
windowConfig: windowConfig,
|
|
|
|
plugins: plugins
|
|
|
|
}, function(plugins, settings) {
|
|
|
|
time.done("getPlugins");
|
|
|
|
window.plugins = plugins;
|
|
|
|
window.settings = settings;
|
|
|
|
if (windowConfig.isRemote && settings.url)
|
|
|
|
setBasePath(settings.url);
|
|
|
|
startIde();
|
|
|
|
}, function(s) {
|
|
|
|
if (win.shown) {
|
|
|
|
restoreWindow(s);
|
|
|
|
} else {
|
|
|
|
restoreWindow.settings = s;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function restoreWindow(settings) {
|
|
|
|
var s = settings && settings.local && settings.local.window;
|
|
|
|
if (s && !restoreWindow.disabled) {
|
|
|
|
var pos = (s["@position"] || "").match(/(\d+):(\d+)/);
|
|
|
|
if (pos) {
|
|
|
|
win.moveTo(pos[1], pos[2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
var size = (s["@size"] || "").match(/(\d+):(\d+)/);
|
|
|
|
if (size) {
|
|
|
|
win.resizeTo(size[1], size[2]);
|
|
|
|
}
|
|
|
|
// if (s["@minimized"])
|
|
|
|
// win.minimize();
|
|
|
|
if (s["@maximized"])
|
|
|
|
win.maximize();
|
|
|
|
if (s["@fullscreen"])
|
|
|
|
win.enterFullscreen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function disableRestore() {
|
|
|
|
win.removeListener("move", disableRestore);
|
|
|
|
win.removeListener("resize", disableRestore);
|
|
|
|
restoreWindow.disabled = true;
|
|
|
|
}
|
|
|
|
win.on("move", disableRestore);
|
|
|
|
win.on("resize", disableRestore);
|
|
|
|
|
|
|
|
document.onreadystatechange = function () {
|
|
|
|
if (document.readyState == "complete") {
|
|
|
|
restoreWindow(restoreWindow.settings);
|
|
|
|
|
|
|
|
// Show Window
|
|
|
|
win.show();
|
|
|
|
win.shown = true;
|
|
|
|
server.windowManager.onShowWindow(win);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function removeNwRequire() {
|
|
|
|
if (!window.require || window.nativeRequire)
|
|
|
|
return;
|
|
|
|
var nRequire = window.require;
|
|
|
|
window.nativeRequire = function(path){
|
|
|
|
var oldRequire = window.require;
|
|
|
|
window.require = nRequire;
|
|
|
|
var obj = window.require(path);
|
|
|
|
window.require = oldRequire;
|
|
|
|
return obj;
|
|
|
|
};
|
|
|
|
window.isLocalVersion = nRequire ? true : false;
|
|
|
|
// window.require = undefined;
|
|
|
|
|
|
|
|
window.nativeOpen = window.open;
|
|
|
|
window.open = function(url){
|
|
|
|
window.nativeRequire('nw.gui').Shell.openExternal(url);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function startIde() {
|
|
|
|
if (!window.plugins || !window.requirejs)
|
|
|
|
return;
|
|
|
|
if (!packed && !window.requirejs.baseConfig) {
|
|
|
|
if (!window.baseURI)
|
|
|
|
return;
|
|
|
|
loadRequireJsConfig();
|
|
|
|
} else {
|
|
|
|
if (devel && !window.baseURI)
|
|
|
|
return;
|
|
|
|
|
|
|
|
window.startArchitectApp(plugins);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var packageIsLoading, requirejsBaseUrl = "";
|
|
|
|
function setRequireBasePath(val) {
|
|
|
|
requirejsBaseUrl = val;
|
|
|
|
}
|
|
|
|
function loadRequireJsConfig(cb) {
|
|
|
|
var requirejs = window.requirejs;
|
|
|
|
window.require = requirejs;
|
2015-10-05 09:22:30 +00:00
|
|
|
requirejs.setConfig = requirejs.setConfig || requirejs.config;
|
2015-02-10 19:41:24 +00:00
|
|
|
requirejs.config = function(config) {
|
|
|
|
config.baseUrl = requirejsBaseUrl + (config.baseUrl || "");
|
|
|
|
if (config.paths) {
|
|
|
|
for (var i in config.paths)
|
|
|
|
config.paths[i] = requirejsBaseUrl + config.paths[i];
|
|
|
|
}
|
|
|
|
requirejs.setConfig(config);
|
|
|
|
requirejs.baseConfig = config;
|
|
|
|
};
|
|
|
|
loadScript(requirejsBaseUrl + "/configs/require_config.js", function() {
|
|
|
|
cb && cb();
|
|
|
|
startIde();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function loadRequireJS() {
|
|
|
|
if (packageIsLoading)
|
|
|
|
return;
|
|
|
|
if (require)
|
|
|
|
require.packaged = true;
|
|
|
|
if (!packed || devel) {
|
|
|
|
packageIsLoading = true;
|
2015-10-05 09:22:30 +00:00
|
|
|
loadScript("node_modules/architect-build/build_support/mini_require.js", function() {
|
2015-02-10 19:41:24 +00:00
|
|
|
removeNwRequire();
|
|
|
|
startIde();
|
|
|
|
packageIsLoading = false;
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
packageIsLoading = true;
|
|
|
|
time.start("packedFile");
|
|
|
|
var scriptUrl = windowLocation + "/build/standalone/config/";
|
|
|
|
scriptUrl += (win.options && win.options.isRemote)
|
|
|
|
? "full.js"
|
|
|
|
: "default-local.js";
|
|
|
|
|
|
|
|
loadScript(scriptUrl, function() {
|
|
|
|
time.done("packedFile");
|
|
|
|
updateMiniRequire();
|
|
|
|
startIde();
|
|
|
|
}, function(e) {
|
|
|
|
/*::dev::*/ return $rebuild();
|
|
|
|
fatalError(e);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function updateMiniRequire() {
|
|
|
|
removeNwRequire();
|
|
|
|
window.requirejs = window.miniRequire;
|
|
|
|
delete window.miniRequire.original;
|
|
|
|
window.requirejs.MODULE_LOAD_URL = windowLocation + "/build/standalone/modules";
|
|
|
|
packageIsLoading = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//::dev:{*/
|
|
|
|
function $rebuild() {
|
2015-05-29 19:47:01 +00:00
|
|
|
var progressMsg = document.getElementById("progress-msg");
|
2015-02-10 19:41:24 +00:00
|
|
|
if (!window.rebuildProc) {
|
2015-05-29 19:47:01 +00:00
|
|
|
if (sessionStorage.triedToReload) {
|
|
|
|
win.showDevTools();
|
|
|
|
progressMsg.textContent = "there were errors starting application";
|
|
|
|
return
|
|
|
|
}
|
|
|
|
sessionStorage.triedToReload = 1;
|
|
|
|
|
|
|
|
if (progressMsg)
|
|
|
|
progressMsg.firstChild.data = "Rebuilding";
|
2015-02-10 19:41:24 +00:00
|
|
|
var proc = window.rebuildProc = spawn("bash", ["./scripts/makelocal.sh", "--quick"]);
|
|
|
|
proc = spawn("bash", ["../scripts/makelocal.sh"], {cwd: server.__dirname});
|
|
|
|
proc.stdout.on("data", function(d) { console.log(d + "") });
|
|
|
|
proc.stderr.on("data", function(d) { console.log(d + "") });
|
|
|
|
proc.on("exit", function() {
|
|
|
|
win.reloadIgnoringCache();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//::dev:}*/
|
|
|
|
|
|
|
|
function startServer() {
|
|
|
|
time.start("server");
|
|
|
|
server.start({
|
|
|
|
/*::dev:*/ collab: true,
|
|
|
|
port: 2222,
|
|
|
|
path: path,
|
|
|
|
workspaceType: null,
|
|
|
|
inProcess: inProcess,
|
|
|
|
host: "localhost"
|
|
|
|
}, function start(err, port) {
|
|
|
|
time.done("server");
|
|
|
|
if (err && err.code == "EADDRINUSE") {
|
|
|
|
server.findFreePort("localhost", function(e, port) {
|
|
|
|
err.options.port = port;
|
|
|
|
server.start(err.options, start);
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setBasePath("http://localhost:" + port + "/ide.html");
|
|
|
|
setRequireBasePath("http://localhost:" + port);
|
|
|
|
|
|
|
|
startIde();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function start() {
|
|
|
|
process.nextTick(startServer);
|
|
|
|
process.nextTick(readConfig);
|
|
|
|
process.nextTick(loadRequireJS);
|
|
|
|
if (win.onStart)
|
|
|
|
win.onStart(window);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!wait) {
|
|
|
|
start();
|
|
|
|
}
|
|
|
|
|
|
|
|
function initAuth() {
|
|
|
|
if (!window.auth)
|
|
|
|
return initAuth.auth;
|
|
|
|
var a = window.auth({
|
|
|
|
clientId: "desktop",
|
|
|
|
authorizationUrl: window.settings.authorizationUrl
|
|
|
|
});
|
|
|
|
var login = a.login;
|
|
|
|
delete window.auth;
|
|
|
|
delete window.settings;
|
|
|
|
|
|
|
|
return (initAuth.auth = {
|
|
|
|
consumes: [],
|
|
|
|
provides: ["auth.bootstrap"],
|
|
|
|
setup: function(options, imports, register) {
|
|
|
|
register(null, {
|
|
|
|
"auth.bootstrap": {
|
|
|
|
login: login
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function startArchitectApp(plugins) {
|
|
|
|
if (plugins.started) return;
|
|
|
|
time.start("client");
|
|
|
|
plugins.started = true;
|
|
|
|
|
|
|
|
window.requirejs(["lib/architect/architect"], function (architect) {
|
|
|
|
plugins.push(initAuth());
|
|
|
|
|
|
|
|
architect.resolveConfig(plugins, function (err, config) {
|
|
|
|
if (err) throw err;
|
|
|
|
|
|
|
|
plugins.forEach(function(plugin) {
|
|
|
|
if ("accessToken" in plugin)
|
|
|
|
plugin.accessToken = "fake_token";
|
|
|
|
if (plugin.packagePath === "plugins/c9.core/settings")
|
|
|
|
plugin.reset = reset && "1";
|
|
|
|
});
|
|
|
|
|
|
|
|
var app = architect.createApp(config, function(err, app){
|
|
|
|
if (err) return fatalError(err);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.on("error", function(err){
|
|
|
|
fatalError(err);
|
|
|
|
});
|
|
|
|
|
2015-03-28 23:35:23 +00:00
|
|
|
app.on("service", function(name, plugin) {
|
|
|
|
if (name == "plugin.loader" || name == "plugin.installer" || name == "plugin.debug" || name == "plugin.manager")
|
|
|
|
plugin.architect = app; // TODO why we rename app to architect?
|
|
|
|
if (name == "c9")
|
|
|
|
plugin.startLoadTime = start;
|
2015-02-10 19:41:24 +00:00
|
|
|
if (!plugin.name)
|
|
|
|
plugin.name = name;
|
|
|
|
});
|
|
|
|
|
|
|
|
app.on("ready", function(){
|
|
|
|
if (app.services.configure)
|
|
|
|
app.services.configure.services = app.services;
|
|
|
|
|
|
|
|
done();
|
|
|
|
|
|
|
|
// if (app.services.c9.debug) {
|
|
|
|
window.app = app.services;
|
|
|
|
window.app._main = app;
|
|
|
|
window.app.__defineGetter__("_ace", function(){
|
|
|
|
return this.tabManager.focussedTab.editor.ace;
|
|
|
|
});
|
|
|
|
Object.keys(window.app).forEach(function(n) {
|
|
|
|
if (/[^\w]/.test(n))
|
|
|
|
window.app[n.replace(/[^\w]/, "_") + "_"] = window.app[n];
|
|
|
|
});
|
|
|
|
// }
|
|
|
|
app.services.tabManager.once("ready", function () {
|
|
|
|
time.done("tabManager", "client");
|
|
|
|
removeLoader();
|
|
|
|
});
|
|
|
|
app.services.tree.once("ready", function () {
|
|
|
|
time.done("tree", "client");
|
|
|
|
});
|
|
|
|
app.services.c9.once("connect", function () {
|
|
|
|
time.done("connect", "client");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// For Development only
|
|
|
|
function done(){
|
|
|
|
app.services.c9.ready();
|
|
|
|
time.done("client");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
var fatalShown;
|
|
|
|
function fatalError(err) {
|
|
|
|
var message = err.stack || err.message || err;
|
|
|
|
var pluginDetails = err.plugin
|
|
|
|
? "\n\nCaused by plugin: " + err.plugin.packagePath
|
|
|
|
: "";
|
|
|
|
|
|
|
|
console && console.error("FATAL ERROR\n\n" + message + pluginDetails);
|
|
|
|
|
|
|
|
if (fatalShown) return;
|
|
|
|
fatalShown = true;
|
|
|
|
|
|
|
|
alert("FATAL ERROR\n\n"
|
|
|
|
+ message + pluginDetails
|
|
|
|
+ "\n\nA full error log has been saved under " + server.installPath + "/log.txt.");
|
|
|
|
// window.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
function removeLoader() {
|
|
|
|
time.done("removeLoader", "server");
|
|
|
|
clearInterval(window.dotsAnim); // stop the dots animation
|
|
|
|
var loader = document.getElementById("loadingide");
|
|
|
|
loader.parentNode.removeChild(loader);
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
</html>
|