From 119e1ba516deee21bcf91c6c5f276b6df950cd24 Mon Sep 17 00:00:00 2001 From: Ariya Hidayat Date: Wed, 14 Mar 2012 23:17:03 -0700 Subject: [PATCH] Implement the plumbing for CommonJS System module support. See http://wiki.commonjs.org/wiki/System. Based on the initial work from execjosh: https://github.com/ariya/phantomjs/pull/192 http://code.google.com/p/phantomjs/issues/detail?id=270 --- src/bootstrap.js | 4 +++- src/modules/system.js | 6 +++++ src/phantom.cpp | 10 ++++++++ src/phantom.h | 3 +++ src/phantomjs.pro | 2 ++ src/phantomjs.qrc | 1 + src/system.cpp | 40 ++++++++++++++++++++++++++++++++ src/system.h | 53 +++++++++++++++++++++++++++++++++++++++++++ test/run-tests.js | 1 + test/system-spec.js | 16 +++++++++++++ 10 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/modules/system.js create mode 100644 src/system.cpp create mode 100644 src/system.h create mode 100644 test/system-spec.js diff --git a/src/bootstrap.js b/src/bootstrap.js index 2ff3f39d..207833ca 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -37,12 +37,14 @@ function require(name) { var code, func, exports; - if (name === 'webpage' || name === 'fs' || name === 'webserver') { + if (name === 'webpage' || name === 'fs' || name === 'webserver' | name === 'system') { code = phantom.loadModuleSource(name); func = new Function("exports", "window", code); exports = {}; if (name === 'fs') { exports = phantom.createFilesystem(); + } else if (name === 'system') { + exports = phantom.createSystem(); } func.call({}, exports, {}); return exports; diff --git a/src/modules/system.js b/src/modules/system.js new file mode 100644 index 00000000..e01d684e --- /dev/null +++ b/src/modules/system.js @@ -0,0 +1,6 @@ +/* + * CommonJS System/1.0 + * Spec: http://wiki.commonjs.org/wiki/System/1.0 + */ + +exports.platform = 'phantomjs'; diff --git a/src/phantom.cpp b/src/phantom.cpp index ed063099..89aafaf3 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -42,6 +42,7 @@ #include "webpage.h" #include "webserver.h" #include "repl.h" +#include "system.h" // public: @@ -50,6 +51,7 @@ Phantom::Phantom(QObject *parent) , m_terminated(false) , m_returnValue(0) , m_filesystem(0) + , m_system(0) { // second argument: script name QStringList args = QApplication::arguments(); @@ -239,6 +241,14 @@ QObject *Phantom::createFilesystem() return m_filesystem; } +QObject *Phantom::createSystem() +{ + if (!m_system) + m_system = new System(this); + + return m_system; +} + QString Phantom::loadModuleSource(const QString &name) { QString moduleSource; diff --git a/src/phantom.h b/src/phantom.h index 916fc07e..e01f109e 100644 --- a/src/phantom.h +++ b/src/phantom.h @@ -38,6 +38,7 @@ #include "encoding.h" #include "config.h" #include "replcompletable.h" +#include "system.h" class WebPage; class WebServer; @@ -77,6 +78,7 @@ public slots: QObject *createWebPage(); QObject *createWebServer(); QObject *createFilesystem(); + QObject *createSystem(); QString loadModuleSource(const QString &name); bool injectJs(const QString &jsFilePath); @@ -102,6 +104,7 @@ private: QString m_script; QVariantMap m_defaultPageSettings; FileSystem *m_filesystem; + System *m_system; QList > m_pages; QList > m_servers; Config m_config; diff --git a/src/phantomjs.pro b/src/phantomjs.pro index 064e3341..dba1011f 100644 --- a/src/phantomjs.pro +++ b/src/phantomjs.pro @@ -19,6 +19,7 @@ HEADERS += csconverter.h \ networkaccessmanager.h \ cookiejar.h \ filesystem.h \ + system.h \ terminal.h \ encoding.h \ config.h \ @@ -34,6 +35,7 @@ SOURCES += phantom.cpp \ networkaccessmanager.cpp \ cookiejar.cpp \ filesystem.cpp \ + system.cpp \ terminal.cpp \ encoding.cpp \ config.cpp \ diff --git a/src/phantomjs.qrc b/src/phantomjs.qrc index c6e0f2a2..18f13982 100644 --- a/src/phantomjs.qrc +++ b/src/phantomjs.qrc @@ -9,6 +9,7 @@ modules/webpage.js modules/webserver.js modules/fs.js + modules/system.js repl.js diff --git a/src/system.cpp b/src/system.cpp new file mode 100644 index 00000000..7a6e7720 --- /dev/null +++ b/src/system.cpp @@ -0,0 +1,40 @@ +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2012 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. +*/ + +#include "system.h" + +System::System(QObject *parent) : + REPLCompletable(parent) +{ +} + +void System::initCompletions() +{ + addCompletion("platform"); +} diff --git a/src/system.h b/src/system.h new file mode 100644 index 00000000..6d83306b --- /dev/null +++ b/src/system.h @@ -0,0 +1,53 @@ +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2012 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. +*/ + +#ifndef SYSTEM_H +#define SYSTEM_H + +#include +#include +#include +#include + +#include "replcompletable.h" + +// This class implements the CommonJS System/1.0 spec. +// See: http://wiki.commonjs.org/wiki/System/1.0 +class System : public REPLCompletable +{ + Q_OBJECT + +public: + explicit System(QObject *parent = 0); + +private: + virtual void initCompletions(); +}; + +#endif // SYSTEM_H diff --git a/test/run-tests.js b/test/run-tests.js index eda0c26b..b6d68409 100644 --- a/test/run-tests.js +++ b/test/run-tests.js @@ -63,6 +63,7 @@ phantom.injectJs("./fs-spec-01.js"); //< Filesystem Specs 01 (Basic) phantom.injectJs("./fs-spec-02.js"); //< Filesystem Specs 02 (Attributes) phantom.injectJs("./fs-spec-03.js"); //< Filesystem Specs 03 (Paths) phantom.injectJs("./fs-spec-04.js"); //< Filesystem Specs 04 (Tests) +phantom.injectJs("./system-spec.js"); // Launch tests var jasmineEnv = jasmine.getEnv(); diff --git a/test/system-spec.js b/test/system-spec.js new file mode 100644 index 00000000..6edbb731 --- /dev/null +++ b/test/system-spec.js @@ -0,0 +1,16 @@ +describe("System object", function() { + var system = require('system'); + + it("should exist", function() { + expect(typeof system).toEqual('object'); + expect(system).toNotEqual(null); + }); + + it("should have platform as string", function() { + expect(typeof system.platform).toEqual('string'); + }); + + it("should have platform set to 'phantomjs'", function() { + expect(system.platform).toEqual('phantomjs'); + }); +});