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