phantomloader 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. phantom.onError = function(msg, trace) {
  2. var system = require('system'),
  3. date = new Date().toISOString().slice(0, -5),
  4. response = { 'content': date + ' [ERROR] PhantomJS - ' + msg },
  5. stack = [ date + ' [ERROR] PhantomJS - ' + msg ];
  6. if (trace && trace.length) {
  7. trace.forEach(function(t) {
  8. stack.push(date + ' [STACK] PhantomJS ->' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : ''));
  9. });
  10. }
  11. console.log(JSON.stringify(response, undefined, 4));
  12. system.stderr.write(stack.join('\n') + '\n');
  13. phantom.exit(1);
  14. };
  15. var wrappedWindow = (function() {
  16. var system = require('system'),
  17. fs = require('fs'),
  18. script;
  19. if (system.args.length < 2) {
  20. throw new Error('No script file was provided to PhantomJS executable.');
  21. }
  22. script = fs.absolute(system.args[1]);
  23. if (!fs.exists(script)) {
  24. throw new Error('Script file does not exist: ' + script);
  25. }
  26. if (!fs.isFile(script)) {
  27. throw new Error('Script file is not of type \'file\': ' + script);
  28. }
  29. if (!fs.isReadable(script)) {
  30. throw new Error('Script file is not readable: ' + script);
  31. }
  32. var p = Object.create(phantom),
  33. s = Object.create(system),
  34. w = Object.create(window);
  35. Object.defineProperty(p, 'scriptName', {
  36. value: system.args[1].replace(/\\/g, '/').split('/').slice(-1)[0],
  37. enumerable: true
  38. });
  39. Object.defineProperty(p, 'libraryPath', {
  40. value: require('fs').absolute(system.args[1].replace(/\\/g, '/').split('/').slice(0, -1).join('/')),
  41. enumerable: true
  42. });
  43. Object.defineProperty(p, 'args', {
  44. value: system.args.slice(2),
  45. enumerable: true
  46. });
  47. Object.defineProperty(s, 'args', {
  48. value: system.args.slice(1),
  49. enumerable: true
  50. });
  51. Object.defineProperty(w, 'phantom', {
  52. value: p,
  53. enumerable: true
  54. });
  55. var r = (function(require) {
  56. return function(moduleId) {
  57. if (moduleId === 'system') {
  58. return s;
  59. }
  60. return require(moduleId);
  61. };
  62. })(require);
  63. w.require = r;
  64. return w;
  65. })();
  66. (function(window, require, phantom) {
  67. phantom.injectJs(require('system').args[0]);
  68. }).call(
  69. wrappedWindow,
  70. wrappedWindow,
  71. wrappedWindow.require,
  72. wrappedWindow.phantom
  73. );