[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/runtime/plasma/scriptengines/javascript [POSSIBLY UNSAFE]
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2009-11-28 0:42:23
Message-ID: 1259368943.280341.3961.nullmailer () svn ! kde ! org
[Download RAW message or body]

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 <QGraphicsLayout>
 #include <QWidget>
 
+#include <KConfigGroup>
 #include <KDebug>
 #include <KFileDialog>
 #include <KIcon>
+#include <KMimeType>
+#include <KShell>
+#include <KStandardDirs>
 #include <KLocale>
-#include <KStandardDirs>
-#include <KConfigGroup>
+#include <KRun>
 
 #include <Plasma/AbstractAnimation>
 #include <Plasma/AnimationGroup>
@@ -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<KUrl::List>(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<QStringList>(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<KUrl>(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<KUrl::List>(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<UiLoader> s_widgetLoader;
     static QHash<QString, Plasma::Animator::Animation> s_animationDefs;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic