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;
}
|