00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#ifndef _KJS_BINDING_H_
00023
#define _KJS_BINDING_H_
00024
00025
#include <kjs/interpreter.h>
00026
#include <kjs/function_object.h>
00027
00028
#include <dom/dom_node.h>
00029
#include <qvariant.h>
00030
#include <qptrdict.h>
00031
#include <kurl.h>
00032
#include <kjs/lookup.h>
00033
00034 namespace KParts {
00035
class ReadOnlyPart;
00036
class LiveConnectExtension;
00037 }
00038
00039
namespace khtml {
00040
class ChildFrame;
00041 }
00042
00043
namespace KJS {
00044
00050 class DOMObject :
public ObjectImp {
00051
public:
00052
DOMObject(
const Object &proto) : ObjectImp(proto) {}
00053
virtual Value get(ExecState *exec,
const Identifier &propertyName)
const;
00054
virtual Value tryGet(ExecState *exec,
const Identifier &propertyName)
const
00055
{
return ObjectImp::get(exec, propertyName); }
00056
00057
virtual void put(ExecState *exec,
const Identifier &propertyName,
00058
const Value &value,
int attr = None);
00059
virtual void tryPut(ExecState *exec,
const Identifier &propertyName,
00060
const Value& value,
int attr = None)
00061 { ObjectImp::put(exec,propertyName,value,attr); }
00062
00063
virtual UString toString(ExecState *exec)
const;
00064 };
00065
00071 class DOMFunction :
public InternalFunctionImp {
00072
public:
00073
DOMFunction(ExecState* exec) : InternalFunctionImp(
00074 static_cast<FunctionPrototypeImp*>(exec->interpreter()->builtinFunctionPrototype().imp())
00075 ) {}
00076
virtual Value get(ExecState *exec,
const Identifier &propertyName)
const;
00077
virtual Value tryGet(ExecState *exec,
const Identifier &propertyName)
const
00078
{
return ObjectImp::get(exec, propertyName); }
00079
00080
virtual bool implementsCall()
const {
return true; }
00081
virtual Value call(ExecState *exec, Object &thisObj,
const List &args);
00082
00083
virtual Value tryCall(ExecState *exec, Object &thisObj,
const List&args)
00084 {
return ObjectImp::call(exec, thisObj, args); }
00085
virtual bool toBoolean(ExecState *)
const {
return true; }
00086 };
00087
00093 class ScriptInterpreter :
public Interpreter
00094 {
00095
public:
00096
ScriptInterpreter(
const Object &global, khtml::ChildFrame* frame );
00097
virtual ~
ScriptInterpreter();
00098
00099
DOMObject* getDOMObject(
void* objectHandle )
const {
00100
return m_domObjects[objectHandle];
00101 }
00102
void putDOMObject(
void* objectHandle,
DOMObject* obj ) {
00103 m_domObjects.insert( objectHandle, obj );
00104 }
00105
bool deleteDOMObject(
void* objectHandle ) {
00106
return m_domObjects.remove( objectHandle );
00107 }
00108
void clear() {
00109 m_domObjects.clear();
00110 }
00114
static void forgetDOMObject(
void* objectHandle );
00115
00119
virtual void mark();
00120
KParts::ReadOnlyPart* part()
const;
00121
00122
virtual int rtti() {
return 1; }
00123
00127 void setCurrentEvent(
DOM::Event *evt ) { m_evt = evt; }
00128
void setInlineCode(
bool inlineCode ) { m_inlineCode = inlineCode; }
00129
void setProcessingTimerCallback(
bool timerCallback ) { m_timerCallback = timerCallback; }
00133
bool isWindowOpenAllowed() const;
00134
00135 private:
00136 khtml::ChildFrame* m_frame;
00137
QPtrDict<
DOMObject> m_domObjects;
00138 DOM::
Event *m_evt;
00139
bool m_inlineCode;
00140
bool m_timerCallback;
00141 };
00145 template<class DOMObj, class KJSDOMObj>
00146 inline Value cacheDOMObject(ExecState *exec, DOMObj domObj)
00147 {
00148
DOMObject *ret;
00149
if (domObj.isNull())
00150
return Null();
00151
ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter());
00152
if ((ret = interp->
getDOMObject(domObj.handle())))
00153
return Value(ret);
00154
else {
00155 ret =
new KJSDOMObj(exec, domObj);
00156 interp->
putDOMObject(domObj.handle(),ret);
00157
return Value(ret);
00158 }
00159 }
00160
00164
DOM::Node toNode(
const Value&);
00168 Value getString(
DOM::DOMString s);
00169
00173
QVariant ValueToVariant(ExecState* exec,
const Value& val);
00174
00179
template <
class FuncImp,
class ThisImp,
class ParentImp>
00180
inline Value DOMObjectLookupGet(ExecState *exec,
const Identifier &propertyName,
00181
const HashTable* table,
const ThisImp* thisObj)
00182 {
00183
const HashEntry* entry = Lookup::findEntry(table, propertyName);
00184
00185
if (!entry)
00186
return thisObj->ParentImp::tryGet(exec, propertyName);
00187
00188
if (entry->attr & Function) {
00189
return lookupOrCreateFunction<FuncImp>(exec, propertyName, thisObj, entry->value, entry->params, entry->attr);
00190 }
00191
return thisObj->getValueProperty(exec, entry->value);
00192 }
00193
00198
template <
class ThisImp,
class ParentImp>
00199
inline Value DOMObjectLookupGetValue(ExecState *exec,
const Identifier &propertyName,
00200
const HashTable* table,
const ThisImp* thisObj)
00201 {
00202
const HashEntry* entry = Lookup::findEntry(table, propertyName);
00203
00204
if (!entry)
00205
return thisObj->ParentImp::tryGet(exec, propertyName);
00206
00207
if (entry->attr & Function)
00208 fprintf(stderr,
"Function bit set! Shouldn't happen in lookupValue!\n" );
00209
return thisObj->getValueProperty(exec, entry->value);
00210 }
00211
00216
template <
class ThisImp,
class ParentImp>
00217
inline void DOMObjectLookupPut(ExecState *exec,
const Identifier &propertyName,
00218
const Value& value,
int attr,
00219
const HashTable* table, ThisImp* thisObj)
00220 {
00221
const HashEntry* entry = Lookup::findEntry(table, propertyName);
00222
00223
if (!entry)
00224 thisObj->ParentImp::tryPut(exec, propertyName, value, attr);
00225
else if (entry->attr & Function)
00226 thisObj->ObjectImp::put(exec, propertyName, value, attr);
00227
else if (entry->attr & ReadOnly)
00228
#ifdef KJS_VERBOSE
00229
fprintf(stderr,
"WARNING: Attempt to change value of readonly property '%s'\n",propertyName.ascii());
00230
#else
00231
;
00232
#endif
00233
else
00234 thisObj->putValueProperty(exec, entry->value, value, attr);
00235 }
00236
00237
00238
#define IMPLEMENT_PROTOFUNC_DOM(ClassFunc) \
00239
namespace KJS { \
00240
class ClassFunc : public DOMFunction { \
00241
public: \
00242
ClassFunc(ExecState *exec, int i, int len) \
00243
: DOMFunction( exec ), id(i) { \
00244
Value protect(this); \
00245
put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \
00246
} \
00247
\
00248
virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \
00249
private: \
00250
int id; \
00251
}; \
00252
}
00253
00254 Value getLiveConnectValue(
KParts::LiveConnectExtension *lc,
const QString & name,
const int type,
const QString & value,
int id);
00255
00256 }
00257
00258
#endif