Merge branch 'master' of git://github.com/ariya/phantomjs

1.4
IceArmy 2011-10-17 21:01:45 -07:00
commit 005e54de56
8 changed files with 33 additions and 260 deletions

View File

@ -30,7 +30,7 @@ function waitFor(testFx, onReady, timeOutMillis) {
clearInterval(interval); //< Stop this interval
}
}
}, 100); //< repeat check every 250ms
}, 100); //< repeat check every 100ms
};

View File

@ -35,6 +35,7 @@
#include <QWebFrame>
#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));
}

View File

@ -30,9 +30,9 @@
#include "csconverter.h"
#include <QCoreApplication>
#include <QFile>
#include <QWebFrame>
#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);
}

View File

@ -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 <ivan.de.marino@gmail.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 <organization> 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 <COPYRIGHT HOLDER> 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');
};

View File

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

View File

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

View File

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

View File

@ -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 <ariya.hidayat@gmail.com>
Copyright (C) 2011 Ivan De Marino <ivan.de.marino@gmail.com>
Copyright (C) 2011 James Roe <roejames12@hotmail.com>
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 <organization> 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 <COPYRIGHT HOLDER> 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.
*/