khtml Library API Documentation

kjs_binding.h

00001 // -*- c-basic-offset: 2 -*-
00002 /*
00003  *  This file is part of the KDE libraries
00004  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
00005  *  Copyright (C) 2003 Apple Computer, Inc.
00006  *
00007  *  This library is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU Library General Public
00009  *  License as published by the Free Software Foundation; either
00010  *  version 2 of the License, or (at your option) any later version.
00011  *
00012  *  This library is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  *  Library General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU Library General Public
00018  *  License along with this library; if not, write to the Free Software
00019  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 class KHTMLPart;
00035 
00036 namespace KJS {
00037 
00043   class DOMObject : public ObjectImp {
00044   public:
00045     DOMObject(const Object &proto) : ObjectImp(proto) {}
00046     virtual Value get(ExecState *exec, const Identifier &propertyName) const;
00047     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const
00048       { return ObjectImp::get(exec, propertyName); }
00049 
00050     virtual void put(ExecState *exec, const Identifier &propertyName,
00051                      const Value &value, int attr = None);
00052     virtual void tryPut(ExecState *exec, const Identifier &propertyName,
00053                         const Value& value, int attr = None)
00054       { ObjectImp::put(exec,propertyName,value,attr); }
00055 
00056     virtual UString toString(ExecState *exec) const;
00057   };
00058 
00064   class DOMFunction : public InternalFunctionImp {
00065   public:
00066     DOMFunction(ExecState* exec) : InternalFunctionImp(
00067       static_cast<FunctionPrototypeImp*>(exec->interpreter()->builtinFunctionPrototype().imp())
00068       ) {}
00069     virtual Value get(ExecState *exec, const Identifier &propertyName) const;
00070     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const
00071       { return ObjectImp::get(exec, propertyName); }
00072 
00073     virtual bool implementsCall() const { return true; }
00074     virtual Value call(ExecState *exec, Object &thisObj, const List &args);
00075 
00076     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args)
00077       { return ObjectImp::call(exec, thisObj, args); }
00078     virtual bool toBoolean(ExecState *) const { return true; }
00079   };
00080 
00086   class ScriptInterpreter : public Interpreter
00087   {
00088   public:
00089     ScriptInterpreter( const Object &global, KHTMLPart* part );
00090     virtual ~ScriptInterpreter();
00091 
00092     DOMObject* getDOMObject( void* objectHandle ) const {
00093       return m_domObjects[objectHandle];
00094     }
00095     void putDOMObject( void* objectHandle, DOMObject* obj ) {
00096       m_domObjects.insert( objectHandle, obj );
00097     }
00098     bool deleteDOMObject( void* objectHandle ) {
00099       return m_domObjects.remove( objectHandle );
00100     }
00101     void clear() {
00102       m_domObjects.clear();
00103     }
00107     static void forgetDOMObject( void* objectHandle );
00108 
00112     virtual void mark();
00113     KHTMLPart* part() const { return m_part; }
00114 
00115     virtual int rtti() { return 1; }
00116 
00120     void setCurrentEvent( DOM::Event *evt ) { m_evt = evt; }
00121     void setInlineCode( bool inlineCode ) { m_inlineCode = inlineCode; }
00122     void setProcessingTimerCallback( bool timerCallback ) { m_timerCallback = timerCallback; }
00126     bool isWindowOpenAllowed() const;
00127 
00128   private:
00129     KHTMLPart* m_part;
00130     QPtrDict<DOMObject> m_domObjects;
00131     DOM::Event *m_evt;
00132     bool m_inlineCode;
00133     bool m_timerCallback;
00134   };
00138   template<class DOMObj, class KJSDOMObj>
00139   inline Value cacheDOMObject(ExecState *exec, DOMObj domObj)
00140   {
00141     DOMObject *ret;
00142     if (domObj.isNull())
00143       return Null();
00144     ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter());
00145     if ((ret = interp->getDOMObject(domObj.handle())))
00146       return Value(ret);
00147     else {
00148       ret = new KJSDOMObj(exec, domObj);
00149       interp->putDOMObject(domObj.handle(),ret);
00150       return Value(ret);
00151     }
00152   }
00153 
00157   DOM::Node toNode(const Value&);
00161   Value getString(DOM::DOMString s);
00162 
00166   QVariant ValueToVariant(ExecState* exec, const Value& val);
00167 
00172   template <class FuncImp, class ThisImp, class ParentImp>
00173   inline Value DOMObjectLookupGet(ExecState *exec, const Identifier &propertyName,
00174                                   const HashTable* table, const ThisImp* thisObj)
00175   {
00176     const HashEntry* entry = Lookup::findEntry(table, propertyName);
00177 
00178     if (!entry) // not found, forward to parent
00179       return thisObj->ParentImp::tryGet(exec, propertyName);
00180 
00181     if (entry->attr & Function) {
00182       return lookupOrCreateFunction<FuncImp>(exec, propertyName, thisObj, entry->value, entry->params, entry->attr);
00183     }
00184     return thisObj->getValueProperty(exec, entry->value);
00185   }
00186 
00191   template <class ThisImp, class ParentImp>
00192   inline Value DOMObjectLookupGetValue(ExecState *exec, const Identifier &propertyName,
00193                                        const HashTable* table, const ThisImp* thisObj)
00194   {
00195     const HashEntry* entry = Lookup::findEntry(table, propertyName);
00196 
00197     if (!entry) // not found, forward to parent
00198       return thisObj->ParentImp::tryGet(exec, propertyName);
00199 
00200     if (entry->attr & Function)
00201       fprintf(stderr, "Function bit set! Shouldn't happen in lookupValue!\n" );
00202     return thisObj->getValueProperty(exec, entry->value);
00203   }
00204 
00209   template <class ThisImp, class ParentImp>
00210   inline void DOMObjectLookupPut(ExecState *exec, const Identifier &propertyName,
00211                                  const Value& value, int attr,
00212                                  const HashTable* table, ThisImp* thisObj)
00213   {
00214     const HashEntry* entry = Lookup::findEntry(table, propertyName);
00215 
00216     if (!entry) // not found: forward to parent
00217       thisObj->ParentImp::tryPut(exec, propertyName, value, attr);
00218     else if (entry->attr & Function) // function: put as override property
00219       thisObj->ObjectImp::put(exec, propertyName, value, attr);
00220     else if (entry->attr & ReadOnly) // readonly! Can't put!
00221 #ifdef KJS_VERBOSE
00222       fprintf(stderr,"WARNING: Attempt to change value of readonly property '%s'\n",propertyName.ascii());
00223 #else
00224     ; // do nothing
00225 #endif
00226     else
00227       thisObj->putValueProperty(exec, entry->value, value, attr);
00228   }
00229 
00230   // Modified version of IMPLEMENT_PROTOFUNC, to use DOMFunction and tryCall
00231 #define IMPLEMENT_PROTOFUNC_DOM(ClassFunc) \
00232   namespace KJS { \
00233   class ClassFunc : public DOMFunction { \
00234   public: \
00235     ClassFunc(ExecState *exec, int i, int len) \
00236        : DOMFunction( exec ), id(i) { \
00237        Value protect(this); \
00238        put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \
00239     } \
00240  \
00241     virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \
00242   private: \
00243     int id; \
00244   }; \
00245   }
00246 
00247 } // namespace
00248 
00249 #endif
KDE Logo
This file is part of the documentation for khtml Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Sep 23 17:13:18 2004 by doxygen 1.3.8-20040913 written by Dimitri van Heesch, © 1997-2003