Restore :load URL and DOM.

This commit is contained in:
Tom Ashworth 2013-07-01 16:52:26 +01:00
parent 98e632498a
commit 3151bad9e4
3 changed files with 122 additions and 25 deletions

View File

@ -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) {

View File

@ -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) {

View File

@ -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;
}());