From kde-commits Sat Nov 28 00:42:23 2009 From: =?utf-8?q?Aaron=20J=2E=20Seigo?= Date: Sat, 28 Nov 2009 00:42:23 +0000 To: kde-commits Subject: KDE/kdebase/runtime/plasma/scriptengines/javascript [POSSIBLY UNSAFE] Message-Id: <1259368943.280341.3961.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125936896112199 SVN commit 1055423 by aseigo: * actually process the optional list, not the required list, in the optional loop * LaunchApp M +77 -4 simplejavascriptapplet.cpp [POSSIBLY UNSAFE: KRun::runCommand] M +5 -0 simplejavascriptapplet.h --- trunk/KDE/kdebase/runtime/plasma/scriptengines/javascript/simplejavascriptapplet.cpp #1055422:1055423 @@ -26,12 +26,15 @@ #include #include +#include #include #include #include +#include +#include +#include #include -#include -#include +#include #include #include @@ -395,6 +398,72 @@ return include(mainScript()); } +QScriptValue SimpleJavaScriptApplet::runApplication(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(engine) + if (context->argumentCount() == 0) { + return false; + } + + KUrl::List urls; + if (context->argumentCount() > 1) { + urls = qscriptvalue_cast(context->argument(1)); + } + + const QString app = context->argument(0).toString(); + + KService::Ptr service = KService::serviceByStorageId(app); + if (service) { + return KRun::run(*service, urls, 0); + } + + const QString exec = KGlobal::dirs()->findExe(app); + if (!exec.isEmpty()) { + return KRun::run(exec, urls, 0); + } + + return false; +} + +QScriptValue SimpleJavaScriptApplet::runCommand(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(engine) + if (context->argumentCount() == 0) { + return false; + } + + const QString exec = KGlobal::dirs()->findExe(context->argument(0).toString()); + if (!exec.isEmpty()) { + QString args; + if (context->argumentCount() > 1) { + const QStringList argList = qscriptvalue_cast(context->argument(1)); + if (!argList.isEmpty()) { + args = ' ' + KShell::joinArgs(argList); + } + } + + return KRun::runCommand(exec + args, 0); + } + + return false; +} + +QScriptValue SimpleJavaScriptApplet::openUrl(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(engine) + if (context->argumentCount() == 0) { + return false; + } + + QScriptValue v = context->argument(0); + KUrl url = v.isString() ? KUrl(v.toString()) : qscriptvalue_cast(v); + if (url.isValid()) { + return KRun::runUrl(url, KMimeType::findByUrl(url)->name(), 0); + } + + return false; +} + bool SimpleJavaScriptApplet::importBuiltinExtesion(const QString &extension) { kDebug() << extension; @@ -402,6 +471,9 @@ FileDialogProxy::registerWithRuntime(m_engine); return true; } else if ("launchapp" == extension) { + m_self.setProperty("runApplication", m_engine->newFunction(SimpleJavaScriptApplet::runApplication)); + m_self.setProperty("runCommand", m_engine->newFunction(SimpleJavaScriptApplet::runCommand)); + m_self.setProperty("openUrl", m_engine->newFunction(SimpleJavaScriptApplet::openUrl)); return true; } else if ("http" == extension) { return true; @@ -445,8 +517,8 @@ } QStringList optionalExtensions = info.service()->property("X-Plasma-OptionalExtensions", QVariant::StringList).toStringList(); - kDebug() << "extensions are" << optionalExtensions; - foreach (const QString &ext, requiredExtensions) { + kDebug() << "optional extensions are" << optionalExtensions; + foreach (const QString &ext, optionalExtensions) { QString extension = ext.toLower(); if (m_extensions.contains(extension)) { @@ -559,6 +631,7 @@ global.setProperty("AnchorLayout", constructAnchorLayoutClass(m_engine)); // Add stuff from KDE libs + qScriptRegisterSequenceMetaType(m_engine); global.setProperty("Url", constructKUrlClass(m_engine)); // Add stuff from Plasma --- trunk/KDE/kdebase/runtime/plasma/scriptengines/javascript/simplejavascriptapplet.h #1055422:1055423 @@ -86,6 +86,11 @@ static QScriptValue createPrototype(QScriptEngine *engine, const QString &name); static QScriptValue widgetAdjustSize(QScriptContext *context, QScriptEngine *engine); + // run extension + static QScriptValue runApplication(QScriptContext *context, QScriptEngine *engine); + static QScriptValue runCommand(QScriptContext *context, QScriptEngine *engine); + static QScriptValue openUrl(QScriptContext *context, QScriptEngine *engine); + private: static KSharedPtr s_widgetLoader; static QHash s_animationDefs;