mirror of https://github.com/vitalif/phantomjs
Merge branch 'master' of git://github.com/ariya/phantomjs
commit
005e54de56
|
@ -30,7 +30,7 @@ function waitFor(testFx, onReady, timeOutMillis) {
|
|||
clearInterval(interval); //< Stop this interval
|
||||
}
|
||||
}
|
||||
}, 100); //< repeat check every 250ms
|
||||
}, 100); //< repeat check every 100ms
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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');
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue