summaryrefslogtreecommitdiffstats
path: root/krusader/KrJS/krjs.cpp
blob: efff3f8efdc0fd06f0eb8711c947cffe163aeb70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Implementation of our JavaScript-Interpreter
//
// Author: Jonas B�r (C) 2005
//
// Copyright: See COPYING file that comes with this distribution
//

#include "krjs.h"

#include "../krusader.h"
#include "../krusaderview.h"
#include "../panelmanager.h"

#include <kmessagebox.h>

KrJS::KrJS() : KJSEmbed::KJSEmbedPart() {

   // make this object, the object Krusader, available for scripting as "Krusader":
   addObject( krApp, "Krusader" );

   // make this object available for scripting
   addObject( ACTIVE_MNG, "PanelManager" );
}

bool KrJS::runFile(const TQString & filename) {

   KJS::ExecState *exec = globalExec();

   // set up the variable scriptDir with the directory of the current script
   putValue( "scriptDir", KJSEmbed::convertToValue(exec, KURL(filename).directory(false) ) );

   bool ok = KJSEmbedPart::runFile(filename);

   KJS::Completion jsres = completion();

   // this is based on this example-code http://webcvs.kde.org/tdebindings/kjsembed/kjscmd.cpp?rev=1.28&view=auto
   if ( jsres.complType() != KJS::Normal) {
      switch ( jsres.complType() ) {
         case KJS::Break:
         case KJS::Continue:
            // TODO: find out what this means
            krOut << "JavaScript: " << jsres.value().toString(exec).qstring() << endl;
            break;
         case KJS::ReturnValue:
            // that's only needed when a specific function is called
            //someString = jsres.value().toString(exec).qstring();
            break;
         case KJS::Throw:
            /*
              This is the interesting part: If the JS throws an exception which is not handled inside the script,
              we can catch it here and handle it with c++
            */
            {
#if KDE_IS_VERSION(3,4,0)
            KJS::Object exception = jsres.value().toObject(exec);
            int line = int( exception.get( exec, KJS::Identifier("line") ).toNumber(exec) );
            TQString type = exception.get( exec, KJS::Identifier("name") ).toString(exec).qstring();
            TQString message = exception.get( exec, KJS::Identifier("message") ).toString(exec).qstring();

            krOut << "JavaScript: Uncaught " << type << " exception at line " << line <<  " in " << filename << endl;
            krOut << message << endl;

            KMessageBox::error ( 0,	//parent
		( line < 0 ?
		TQString( i18n("In %1:\nUncaught JavaScript exception '%2'\n%3") ).tqarg(filename).tqarg(type).tqarg(message) :
		TQString( i18n("In %1:\nUncaught JavaScript exception '%2' at line %3\n%4") ).tqarg(filename).tqarg(type).tqarg(line).tqarg(message)
		),	//text
		i18n("JavaScript error"), 	//caption
		KMessageBox::Dangerous) ;
#else
            KMessageBox::error ( 0,	//parent
		TQString(i18n("In %1:\nThere is an error in the JavaScript")).tqarg(filename),	//text
		i18n("JavaScript error"), 	//caption
		KMessageBox::Dangerous) ;
#endif
            break;
            }
         default:
            krOut << "JavaScript: Unknown error." << endl;
            break;
      } // switch
   } // if


   krOut << "JS: done" << endl;

   return ok;
}