From 56f470e3a14ab2a4c20beb0be4745cf237f9c4f3 Mon Sep 17 00:00:00 2001 From: Nick Rowe Date: Thu, 6 Oct 2011 13:43:12 -0700 Subject: [PATCH 1/2] Change comment in run-jasmine example to be consistent with the way the code is written --- examples/run-jasmine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/run-jasmine.js b/examples/run-jasmine.js index f26b9b54..a871619f 100644 --- a/examples/run-jasmine.js +++ b/examples/run-jasmine.js @@ -30,7 +30,7 @@ function waitFor(testFx, onReady, timeOutMillis) { clearInterval(interval); //< Stop this interval } } - }, 100); //< repeat check every 250ms + }, 100); //< repeat check every 100ms }; From 19b32cff0a73b869da70890fcf2d90514d828cb7 Mon Sep 17 00:00:00 2001 From: Ivan De Marino Date: Sun, 16 Oct 2011 20:35:21 +0100 Subject: [PATCH 2/2] Refactored and Centralised how we handle the loading of resource files. * Some code reuse * Centralised in Utils the loading of resource files * It is safe to assume, when loading a resource file, that IT'S THERE and IT'S READABLE * ALSO, I removed the unused 'shims' (we forgot them in there :P) --- src/config.cpp | 52 +++++-------- src/csconverter.cpp | 11 +-- src/filesystem-shim.js | 163 ----------------------------------------- src/phantom.cpp | 13 +--- src/utils.cpp | 16 ++-- src/utils.h | 1 + src/webpage-shim.js | 35 --------- 7 files changed, 32 insertions(+), 259 deletions(-) delete mode 100644 src/filesystem-shim.js delete mode 100644 src/webpage-shim.js diff --git a/src/config.cpp b/src/config.cpp index 8727ed84..9fa9d01f 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -35,6 +35,7 @@ #include #include "terminal.h" +#include "utils.h" // public: Config::Config(QObject *parent) @@ -146,54 +147,35 @@ static QString normalizePath(const QString &path) return path.isEmpty() ? path : QDir::fromNativeSeparators(path); } -// THIS METHOD ASSUMES THAT content IS *NEVER* NULL! -static bool readFile(const QString &path, QString *const content) -{ - // Ensure empty content - content->clear(); - - // Check existence and try to open as text - QFile file(path); - if (!file.exists() || !file.open(QFile::ReadOnly | QFile::Text)) { - return false; - } - - content->append(QString::fromUtf8(file.readAll()).trimmed()); - - file.close(); - - return true; -} - void Config::loadJsonFile(const QString &filePath) { QString jsonConfig; - if (!readFile(normalizePath(filePath), &jsonConfig)) { + QFile f(filePath); + + // Check file exists and is readable + if (!f.exists() || !f.open(QFile::ReadOnly | QFile::Text)) { Terminal::instance()->cerr("Unable to open config: \"" + filePath + "\""); return; - } else if (jsonConfig.isEmpty()) { - return; - } else if (!jsonConfig.startsWith('{') || !jsonConfig.endsWith('}')) { + } + + // Read content + jsonConfig = QString::fromUtf8(f.readAll().trimmed()); + f.close(); + + // Check it's a valid JSON format + if (jsonConfig.isEmpty() || !jsonConfig.startsWith('{') || !jsonConfig.endsWith('}')) { Terminal::instance()->cerr("Config file MUST be in JSON format!"); return; } // Load configurator - QString configurator; - if (!readFile(":/configurator.js", &configurator)) { - Terminal::instance()->cerr("Unable to load JSON configurator!"); - return; - } else if (configurator.isEmpty()) { - Terminal::instance()->cerr("Unable to set-up JSON configurator!"); - return; - } + QString configurator = Utils::readResourceFileUtf8(":/configurator.js"); + // Use a temporary QWebPage to load the JSON configuration in this Object using the 'configurator' above QWebPage webPage; - - // Add the config object + // Add this object to the global scope webPage.mainFrame()->addToJavaScriptWindowObject("config", this); - - // Apply the settings + // Apply the JSON config settings to this very object webPage.mainFrame()->evaluateJavaScript(configurator.arg(jsonConfig)); } diff --git a/src/csconverter.cpp b/src/csconverter.cpp index 0f4a1d14..4baecb42 100644 --- a/src/csconverter.cpp +++ b/src/csconverter.cpp @@ -30,9 +30,9 @@ #include "csconverter.h" #include -#include #include +#include "utils.h" #include "terminal.h" static CSConverter *csconverter_instance = 0; @@ -48,14 +48,7 @@ CSConverter *CSConverter::instance() CSConverter::CSConverter() : QObject(QCoreApplication::instance()) { - QFile file(":/coffee-script.js"); - if (!file.open(QFile::ReadOnly)) { - Terminal::instance()->cerr("CoffeeScript compiler is not available!"); - exit(1); - } - QString script = QString::fromUtf8(file.readAll()); - file.close(); - m_webPage.mainFrame()->evaluateJavaScript(script); + m_webPage.mainFrame()->evaluateJavaScript(Utils::readResourceFileUtf8(":/coffee-script.js")); m_webPage.mainFrame()->addToJavaScriptWindowObject("converter", this); } diff --git a/src/filesystem-shim.js b/src/filesystem-shim.js deleted file mode 100644 index 0a8a173c..00000000 --- a/src/filesystem-shim.js +++ /dev/null @@ -1,163 +0,0 @@ -/*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. -*/ - -// window.fs -// 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 - */ -window.fs.open = function (path, mode) { - var file = window.fs._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 - */ -window.fs.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. - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.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 - */ -window.fs.removeTree = function (path) { - if (!fs._removeTree(path)) { - throw "Unable to remove directory tree '" + path + "'"; - } -}; - -window.fs.touch = function (path) { - fs.write(path, "", 'a'); -}; \ No newline at end of file diff --git a/src/phantom.cpp b/src/phantom.cpp index 04f7301b..0adc54c4 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -103,12 +103,11 @@ Phantom::Phantom(QObject *parent) setLibraryPath(QFileInfo(m_config.scriptFile()).dir().absolutePath()); - // Add 'phantom' and 'fs' object to the global scope + // Add 'phantom' object to the global scope m_page->mainFrame()->addToJavaScriptWindowObject("phantom", this); - QFile f(":/bootstrap.js"); - f.open(QFile::ReadOnly); //< It's OK to assume this succeed. If it doesn't, we have a bigger problem. - m_page->mainFrame()->evaluateJavaScript(QString::fromUtf8(f.readAll())); + // Bootstrap the PhantomJS scope + m_page->mainFrame()->evaluateJavaScript(Utils::readResourceFileUtf8(":/bootstrap.js")); } QStringList Phantom::args() const @@ -199,11 +198,7 @@ QString Phantom::loadModuleSource(const QString &name) QString moduleSource; QString moduleSourceFilePath = ":/modules/" + name + ".js"; - QFile f(moduleSourceFilePath); - if (f.open(QFile::ReadOnly)) { - moduleSource = QString::fromUtf8(f.readAll()); - f.close(); - } + moduleSource = Utils::readResourceFileUtf8(moduleSourceFilePath); return moduleSource; } diff --git a/src/utils.cpp b/src/utils.cpp index 406d0149..8faa0b87 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -40,14 +40,7 @@ // public: void Utils::showUsage() { - QFile file; - file.setFileName(":/usage.txt"); - if ( !file.open(QFile::ReadOnly) ) { - Terminal::instance()->cerr("Unable to print the usage message"); - exit(1); - } - Terminal::instance()->cout(QString::fromUtf8(file.readAll())); - file.close(); + Terminal::instance()->cout(Utils::readResourceFileUtf8(":/usage.txt")); } void Utils::messageHandler(QtMsgType type, const char *msg) @@ -130,6 +123,13 @@ bool Utils::injectJsInFrame(const QString &jsFilePath, const Encoding &jsFileEnc return false; } +QString Utils::readResourceFileUtf8(const QString &resourceFilePath) +{ + QFile f(resourceFilePath); + f.open(QFile::ReadOnly); //< It's OK to assume this succeed. If it doesn't, we have a bigger problem. + return QString::fromUtf8(f.readAll()); +} + // private: Utils::Utils() { diff --git a/src/utils.h b/src/utils.h index 0e7e265f..e978a7dc 100644 --- a/src/utils.h +++ b/src/utils.h @@ -50,6 +50,7 @@ public: static QVariant coffee2js(const QString &script); static bool injectJsInFrame(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false); static bool injectJsInFrame(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false); + static QString readResourceFileUtf8(const QString &resourceFilePath); private: Utils(); //< This class shouldn't be instantiated diff --git a/src/webpage-shim.js b/src/webpage-shim.js deleted file mode 100644 index c4269974..00000000 --- a/src/webpage-shim.js +++ /dev/null @@ -1,35 +0,0 @@ -/*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 Ariya Hidayat - Copyright (C) 2011 Ivan De Marino - Copyright (C) 2011 James Roe - Copyright (C) 2011 execjosh, http://execjosh.blogspot.com - - 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. -*/ -