diff --git a/examples/echoToFile.coffee b/examples/echoToFile.coffee index fd0cb34a..21934091 100644 --- a/examples/echoToFile.coffee +++ b/examples/echoToFile.coffee @@ -1,4 +1,5 @@ # echoToFile.coffee - Write in a given file all the parameters passed on the CLI +fs = require 'fs' if phantom.args.length < 2 console.log "Usage: echoToFile.js DESTINATION_FILE " @@ -15,4 +16,4 @@ else f.writeLine content catch e console.log e - phantom.exit() \ No newline at end of file + phantom.exit() diff --git a/examples/echoToFile.js b/examples/echoToFile.js index 95e92be1..9a6f1fa8 100644 --- a/examples/echoToFile.js +++ b/examples/echoToFile.js @@ -1,4 +1,5 @@ // echoToFile.js - Write in a given file all the parameters passed on the CLI +var fs = require('fs'); if (phantom.args.length < 2) { console.log("Usage: echoToFile.js DESTINATION_FILE "); @@ -18,4 +19,4 @@ if (phantom.args.length < 2) { } phantom.exit(); -} \ No newline at end of file +} diff --git a/examples/scandir.coffee b/examples/scandir.coffee index f8eb026b..431e222d 100644 --- a/examples/scandir.coffee +++ b/examples/scandir.coffee @@ -4,6 +4,7 @@ if phantom.args.length != 1 console.log "Usage: phantomjs scandir.js DIRECTORY_TO_SCAN" phantom.exit() scanDirectory = (path) -> + fs = require 'fs' if fs.exists(path) and fs.isFile(path) console.log path else if fs.isDirectory(path) @@ -11,4 +12,4 @@ scanDirectory = (path) -> scanDirectory path + "/" + e if e != "." and e != ".." scanDirectory phantom.args[0] -phantom.exit() \ No newline at end of file +phantom.exit() diff --git a/examples/scandir.js b/examples/scandir.js index fc1bf6cb..95ca1142 100644 --- a/examples/scandir.js +++ b/examples/scandir.js @@ -6,6 +6,7 @@ if (phantom.args.length !== 1) { } var scanDirectory = function (path) { + var fs = require('fs'); if (fs.exists(path) && fs.isFile(path)) { console.log(path); } else if (fs.isDirectory(path)) { @@ -17,4 +18,4 @@ var scanDirectory = function (path) { } }; scanDirectory(phantom.args[0]); -phantom.exit(); \ No newline at end of file +phantom.exit(); diff --git a/src/bootstrap.js b/src/bootstrap.js new file mode 100644 index 00000000..c85a0982 --- /dev/null +++ b/src/bootstrap.js @@ -0,0 +1,180 @@ +/*jslint sloppy: true, nomen: true */ +/*global window:true,phantom:true,fs:true */ + +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2011 Ivan De Marino + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +function require (name) { + + var exports; + + if (name === 'fs') { + + exports = phantom.createFilesystem(); + + // JavaScript "shim" to throw exceptions in case a critical operation fails. + + /** Open and return a "file" object. + * It will throw exception if it fails. + * + * @param path Path of the file to open + * @param mode Open Mode. A string made of 'r', 'w', 'a/+' characters. + * @return "file" object + */ + exports.open = function (path, mode) { + var file = exports._open(path, mode); + if (file) { + return file; + } + throw "Unable to open file '" + path + "'"; + }; + + /** Open, read and return content of a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @return file content + */ + exports.read = function (path) { + var f = fs.open(path, 'r'), + content = f.read(); + + f.close(); + return content; + }; + + /** Open and write content to a file + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @param content Content to write to the file + * @param mode Open Mode. A string made of 'w' or 'a / +' characters. + */ + exports.write = function (path, content, mode) { + var f = fs.open(path, mode); + + f.write(content); + f.close(); + }; + + /** Return the size of a file, in bytes. + * It will throw an exception if it fails. + * + * @param path Path of the file to read the size of + * @return File size in bytes + */ + exports.size = function (path) { + var size = fs._size(path); + if (size !== -1) { + return size; + } + throw "Unable to read file '" + path + "' size"; + }; + + /** Copy a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ + exports.copy = function (source, destination) { + if (!fs._copy(source, destination)) { + throw "Unable to copy file '" + source + "' at '" + destination + "'"; + } + }; + + /** Copy a directory tree. + * It will throw an exception if it fails. + * + * @param source Path of the source directory tree + * @param destination Path of the destination directory tree + */ + exports.copyTree = function (source, destination) { + if (!fs._copyTree(source, destination)) { + throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; + } + }; + + /** Move a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ + exports.move = function (source, destination) { + fs.copy(source, destination); + fs.remove(source); + }; + + /** Removes a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to remove + */ + exports.remove = function (path) { + if (!fs._remove(path)) { + throw "Unable to remove file '" + path + "'"; + } + }; + + /** Removes a directory. + * It will throw an exception if it fails. + * + * @param path Path of the directory to remove + */ + exports.removeDirectory = function (path) { + if (!fs._removeDirectory(path)) { + throw "Unable to remove directory '" + path + "'"; + } + }; + + /** Removes a directory tree. + * It will throw an exception if it fails. + * + * @param path Path of the directory tree to remove + */ + exports.removeTree = function (path) { + if (!fs._removeTree(path)) { + throw "Unable to remove directory tree '" + path + "'"; + } + }; + + exports.touch = function (path) { + fs.write(path, "", 'a'); + }; + + } + + if (typeof exports === 'undefined') { + throw 'Unknown module ' + name + ' for require()'; + } + + return exports; +} + diff --git a/src/phantom.cpp b/src/phantom.cpp index 918fe7bb..3b64c631 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -110,12 +110,11 @@ Phantom::Phantom(QObject *parent) // Add 'phantom' and 'fs' object to the global scope m_page->mainFrame()->addToJavaScriptWindowObject("phantom", this); - m_page->mainFrame()->addToJavaScriptWindowObject("fs", &m_filesystem); // Load all the required JavaScript 'shims' QString jsShims[2] = { - ":/webpage-shim.js", - ":/filesystem-shim.js" + ":/bootstrap.js", + ":/webpage-shim.js" }; for (int i = 0, len = 2; i < len; ++i) { QFile f(jsShims[i]); @@ -200,6 +199,11 @@ QObject *Phantom::createWebPage() return page; } +QObject *Phantom::createFilesystem() +{ + return &m_filesystem; +} + bool Phantom::injectJs(const QString &jsFilePath) { return Utils::injectJsInFrame(jsFilePath, libraryPath(), m_page->mainFrame()); } diff --git a/src/phantom.h b/src/phantom.h index b346df25..7f4b2fab 100644 --- a/src/phantom.h +++ b/src/phantom.h @@ -72,6 +72,7 @@ public: public slots: QObject *createWebPage(); + QObject *createFilesystem(); bool injectJs(const QString &jsFilePath); void exit(int code = 0); diff --git a/src/phantomjs.pro b/src/phantomjs.pro index 918ec976..4f91ea9b 100644 --- a/src/phantomjs.pro +++ b/src/phantomjs.pro @@ -37,7 +37,7 @@ SOURCES += phantom.cpp \ OTHER_FILES += usage.txt \ webpage-shim.js \ - filesystem-shim.js \ + bootstrap.js \ configurator.js include(gif/gif.pri) diff --git a/src/phantomjs.qrc b/src/phantomjs.qrc index b7a2ab13..ccce5f8f 100644 --- a/src/phantomjs.qrc +++ b/src/phantomjs.qrc @@ -4,7 +4,7 @@ coffee-script.js usage.txt webpage-shim.js - filesystem-shim.js + bootstrap.js configurator.js diff --git a/test/run-tests.js b/test/run-tests.js index 0dde4102..5c19464d 100644 --- a/test/run-tests.js +++ b/test/run-tests.js @@ -54,6 +54,7 @@ function expectHasPropertyString(o, name) { } // Load specs +var fs = require('fs'); phantom.injectJs("./phantom-spec.js"); phantom.injectJs("./webpage-spec.js"); phantom.injectJs("./fs-spec-01.js"); //< Filesystem Specs 01 (Basic)