mirror of
https://github.com/jsbin/jsbin.git
synced 2026-02-01 16:46:05 +00:00
Restore :load URL and DOM.
This commit is contained in:
parent
98e632498a
commit
3151bad9e4
@ -175,40 +175,48 @@ function showhelp() {
|
||||
return commands.join('\n');
|
||||
}
|
||||
|
||||
function load(url) {
|
||||
if (navigator.onLine) {
|
||||
if (arguments.length > 1 || libraries[url] || url.indexOf('.js') !== -1) {
|
||||
return loadScript.apply(this, arguments);
|
||||
var load = (function () {
|
||||
|
||||
$document.on('console:load:script:error', function (event, err) {
|
||||
showResponse(['error', err]);
|
||||
});
|
||||
|
||||
$document.on('console:load:script:success', function (event, url) {
|
||||
showResponse(['response', 'Loaded "' + url + '"']);
|
||||
});
|
||||
|
||||
$document.on('console:load:dom:error', function (event, err) {
|
||||
showResponse(['error', err]);
|
||||
});
|
||||
|
||||
$document.on('console:load:dom:success', function (event, url) {
|
||||
showResponse(['response', 'Loaded DOM.']);
|
||||
});
|
||||
|
||||
return function (url) {
|
||||
if (navigator.onLine) {
|
||||
if (arguments.length > 1 || libraries[url] || url.indexOf('.js') !== -1) {
|
||||
return loadScript.apply(this, arguments);
|
||||
} else {
|
||||
return loadDOM(url);
|
||||
}
|
||||
} else {
|
||||
return loadDOM(url);
|
||||
return "You need to be online to use :load";
|
||||
}
|
||||
} else {
|
||||
return "You need to be online to use :load";
|
||||
}
|
||||
}
|
||||
}());
|
||||
|
||||
function loadScript() {
|
||||
var doc = sandboxframe.contentDocument || sandboxframe.contentWindow.document;
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
(function (url) {
|
||||
var script = document.createElement('script');
|
||||
script.src = url;
|
||||
script.onload = function () {
|
||||
window.top.info('Loaded ' + url, 'http://' + window.location.hostname);
|
||||
if (url == libraries.coffeescript) window.top.info('Now you can type CoffeeScript instead of plain old JS!');
|
||||
};
|
||||
script.onerror = function () {
|
||||
log('Failed to load ' + url, 'error');
|
||||
};
|
||||
doc.body.appendChild(script);
|
||||
$document.trigger('console:load:script', url);
|
||||
})(libraries[arguments[i]] || arguments[i]);
|
||||
}
|
||||
return "Loading script...";
|
||||
}
|
||||
|
||||
function loadDOM(url) {
|
||||
var doc = sandboxframe.contentWindow.document,
|
||||
script = document.createElement('script'),
|
||||
var script = document.createElement('script'),
|
||||
cb = 'loadDOM' + +new Date;
|
||||
|
||||
script.src = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=xml&callback=' + cb;
|
||||
@ -217,8 +225,7 @@ function loadDOM(url) {
|
||||
if (yql.results.length) {
|
||||
var html = yql.results[0].replace(/type="text\/javascript"/ig,'type="x"').replace(/<body.*?>/, '').replace(/<\/body>/, '');
|
||||
|
||||
doc.body.innerHTML = html;
|
||||
window.top.info('DOM load complete');
|
||||
$document.trigger('console:load:dom', html);
|
||||
} else {
|
||||
log('Failed to load DOM', 'error');
|
||||
}
|
||||
@ -231,7 +238,7 @@ function loadDOM(url) {
|
||||
|
||||
document.body.appendChild(script);
|
||||
|
||||
return "Loading url into DOM...";
|
||||
return "Loading URL into DOM...";
|
||||
}
|
||||
|
||||
function trim(s) {
|
||||
|
||||
@ -228,10 +228,34 @@ var renderer = (function () {
|
||||
method = 'error';
|
||||
args = ['Console arguments from the runner could not be parsed.'];
|
||||
}
|
||||
if (window._console && !window._console[method]) method = 'log';
|
||||
if (!window._console) return;
|
||||
if (!window._console[method]) method = 'log';
|
||||
window._console[method].apply(window._console, args);
|
||||
};
|
||||
|
||||
/**
|
||||
* Load scripts into rendered iframe
|
||||
*/
|
||||
renderer['console:load:script:success'] = function (url) {
|
||||
$document.trigger('console:load:script:success', url);
|
||||
};
|
||||
|
||||
renderer['console:load:script:error'] = function (err) {
|
||||
$document.trigger('console:load:script:error', err);
|
||||
};
|
||||
|
||||
/**
|
||||
* Load DOME into rendered iframe
|
||||
* TODO abstract these so that they are automatically triggered
|
||||
*/
|
||||
renderer['console:load:dom:success'] = function (url) {
|
||||
$document.trigger('console:load:dom:success', url);
|
||||
};
|
||||
|
||||
renderer['console:load:dom:error'] = function (err) {
|
||||
$document.trigger('console:load:dom:error', err);
|
||||
};
|
||||
|
||||
return renderer;
|
||||
|
||||
}());
|
||||
@ -292,11 +316,23 @@ var renderLivePreview = (function () {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Events
|
||||
*/
|
||||
|
||||
// Listen for console input and post it to the iframe
|
||||
$document.on('console:run', function (event, cmd) {
|
||||
renderer.postMessage('console:run', cmd);
|
||||
});
|
||||
|
||||
$document.on('console:load:script', function (event, url) {
|
||||
renderer.postMessage('console:load:script', url);
|
||||
});
|
||||
|
||||
$document.on('console:load:dom', function (event, html) {
|
||||
renderer.postMessage('console:load:dom', html);
|
||||
});
|
||||
|
||||
// When the iframe loads, swap round the callbacks and immediately invoke
|
||||
// if renderLivePreview was called already.
|
||||
return deferCallable(renderLivePreview, function (done) {
|
||||
|
||||
@ -328,6 +328,40 @@ var sandbox = (function () {
|
||||
return proxyconsole[type](output);
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject a script via a URL into the page
|
||||
*/
|
||||
sandbox.injectScript = function (url, cb) {
|
||||
if (!sandbox.active) throw new Error("Sandbox has no active iframe.");
|
||||
var childWindow = sandbox.active.contentWindow,
|
||||
childDocument = childWindow.document;
|
||||
var script = childDocument.createElement('script');
|
||||
script.src = url;
|
||||
script.onload = function () {
|
||||
cb();
|
||||
};
|
||||
script.onerror = function () {
|
||||
cb('Failed to load "' + url + '"');
|
||||
};
|
||||
childDocument.body.appendChild(script);
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject full DOM into the page
|
||||
*/
|
||||
sandbox.injectDOM = function (html, cb) {
|
||||
if (!sandbox.active) throw new Error("Sandbox has no active iframe.");
|
||||
var childWindow = sandbox.active.contentWindow,
|
||||
childDocument = childWindow.document;
|
||||
debugger;
|
||||
try {
|
||||
childDocument.body.innerHTML = html;
|
||||
} catch (e) {
|
||||
cb("Failed to load DOM.");
|
||||
}
|
||||
cb();
|
||||
};
|
||||
|
||||
return sandbox;
|
||||
|
||||
}());
|
||||
@ -415,6 +449,26 @@ var runner = (function () {
|
||||
sandbox.eval(cmd);
|
||||
};
|
||||
|
||||
/**
|
||||
* Load script into the apge
|
||||
*/
|
||||
runner['console:load:script'] = function (url) {
|
||||
sandbox.injectScript(url, function (err) {
|
||||
if (err) return runner.postMessage('console:load:script:error', err);
|
||||
runner.postMessage('console:load:script:success', url);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Load DOM into the apge
|
||||
*/
|
||||
runner['console:load:dom'] = function (html) {
|
||||
sandbox.injectDOM(html, function (err) {
|
||||
if (err) return runner.postMessage('console:load:dom:error', err);
|
||||
runner.postMessage('console:load:dom:success');
|
||||
});
|
||||
};
|
||||
|
||||
return runner;
|
||||
|
||||
}());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user