📄 kjs_binding.h
字号:
// -*- c-basic-offset: 2 -*-/* * This file is part of the KDE libraries * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2003 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#ifndef _KJS_BINDING_H_#define _KJS_BINDING_H_#include <kjs/interpreter.h>#include <kjs/function_object.h> /// for FunctionPrototypeImp#include <dom/dom_node.h>#include <qvariant.h>#include <qptrdict.h>#include <kurl.h>#include <kjs/lookup.h>namespace KParts { class ReadOnlyPart; class LiveConnectExtension;}namespace khtml { class ChildFrame;}namespace KJS { /** * Base class for all objects in this binding - get() and put() run * tryGet() and tryPut() respectively, and catch exceptions if they * occur. */ class DOMObject : public ObjectImp { public: DOMObject(const Object &proto) : ObjectImp(proto) {} virtual Value get(ExecState *exec, const Identifier &propertyName) const; virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const { return ObjectImp::get(exec, propertyName); } virtual void put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr = None); virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); virtual UString toString(ExecState *exec) const; }; /** * Base class for all functions in this binding - get() and call() run * tryGet() and tryCall() respectively, and catch exceptions if they * occur. */ class DOMFunction : public InternalFunctionImp { public: DOMFunction(ExecState* exec) : InternalFunctionImp( static_cast<FunctionPrototypeImp*>(exec->interpreter()->builtinFunctionPrototype().imp()) ) {} virtual Value get(ExecState *exec, const Identifier &propertyName) const; virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const { return ObjectImp::get(exec, propertyName); } virtual bool implementsCall() const { return true; } virtual Value call(ExecState *exec, Object &thisObj, const List &args); virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args) { return ObjectImp::call(exec, thisObj, args); } virtual bool toBoolean(ExecState *) const { return true; } }; /** * We inherit from Interpreter, to save a pointer to the HTML part * that the interpreter runs for. * The interpreter also stores the DOM object - >KJS::DOMObject cache. */ class KDE_EXPORT ScriptInterpreter : public Interpreter { public: ScriptInterpreter( const Object &global, khtml::ChildFrame* frame ); virtual ~ScriptInterpreter(); DOMObject* getDOMObject( void* objectHandle ) const { return m_domObjects[objectHandle]; } void putDOMObject( void* objectHandle, DOMObject* obj ) { m_domObjects.insert( objectHandle, obj ); } void customizedDOMObject( DOMObject* obj ) { m_customizedDomObjects.replace( obj, this ); } bool deleteDOMObject( void* objectHandle ) { DOMObject* obj = m_domObjects.take( objectHandle ); if (obj) { m_customizedDomObjects.remove( obj ); return true; } else return false; } void clear() { m_customizedDomObjects.clear(); m_domObjects.clear(); } /** * Static method. Makes all interpreters forget about the object */ static void forgetDOMObject( void* objectHandle ); /** * Mark objects in the DOMObject cache. */ virtual void mark(); KParts::ReadOnlyPart* part() const; virtual int rtti() { return 1; } /** * Set the event that is triggering the execution of a script, if any */ void setCurrentEvent( DOM::Event *evt ) { m_evt = evt; } void setInlineCode( bool inlineCode ) { m_inlineCode = inlineCode; } void setProcessingTimerCallback( bool timerCallback ) { m_timerCallback = timerCallback; } /** * "Smart" window.open policy */ bool isWindowOpenAllowed() const; private: khtml::ChildFrame* m_frame; QPtrDict<DOMObject> m_domObjects; QPtrDict<void> m_customizedDomObjects; //Objects which had custom properties set, //and should not be GC'd. key is DOMObject* DOM::Event *m_evt; bool m_inlineCode; bool m_timerCallback; }; /** * Retrieve from cache, or create, a KJS object around a DOM object */ template<class DOMObj, class KJSDOMObj> inline Value cacheDOMObject(ExecState *exec, DOMObj domObj) { DOMObject *ret; if (domObj.isNull()) return Null(); ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); if ((ret = interp->getDOMObject(domObj.handle()))) return Value(ret); else { ret = new KJSDOMObj(exec, domObj); interp->putDOMObject(domObj.handle(),ret); return Value(ret); } } /** * Convert an object to a Node. Returns a null Node if not possible. */ DOM::Node toNode(const Value&); /** * Get a String object, or Null() if s is null */ Value getString(DOM::DOMString s); /** * Convery a KJS value into a QVariant */ QVariant ValueToVariant(ExecState* exec, const Value& val); /** * We need a modified version of lookupGet because * we call tryGet instead of get, in DOMObjects. */ template <class FuncImp, class ThisImp, class ParentImp> inline Value DOMObjectLookupGet(ExecState *exec, const Identifier &propertyName, const HashTable* table, const ThisImp* thisObj) { const HashEntry* entry = Lookup::findEntry(table, propertyName); if (!entry) // not found, forward to parent return thisObj->ParentImp::tryGet(exec, propertyName); if (entry->attr & Function) { return lookupOrCreateFunction<FuncImp>(exec, propertyName, thisObj, entry->value, entry->params, entry->attr); } return thisObj->getValueProperty(exec, entry->value); } /** * Simplified version of DOMObjectLookupGet in case there are no * functions, only "values". */ template <class ThisImp, class ParentImp> inline Value DOMObjectLookupGetValue(ExecState *exec, const Identifier &propertyName, const HashTable* table, const ThisImp* thisObj) { const HashEntry* entry = Lookup::findEntry(table, propertyName); if (!entry) // not found, forward to parent return thisObj->ParentImp::tryGet(exec, propertyName); if (entry->attr & Function) fprintf(stderr, "Function bit set! Shouldn't happen in lookupValue!\n" ); return thisObj->getValueProperty(exec, entry->value); } /** * We need a modified version of lookupPut because * we call tryPut instead of put, in DOMObjects. */ template <class ThisImp, class ParentImp> inline void DOMObjectLookupPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr, const HashTable* table, ThisImp* thisObj) { const HashEntry* entry = Lookup::findEntry(table, propertyName); if (!entry) // not found: forward to parent thisObj->ParentImp::tryPut(exec, propertyName, value, attr); else if (entry->attr & Function) // function: put as override property thisObj->ObjectImp::put(exec, propertyName, value, attr); else if (entry->attr & ReadOnly) // readonly! Can't put!#ifdef KJS_VERBOSE fprintf(stderr,"WARNING: Attempt to change value of readonly property '%s'\n",propertyName.ascii());#else ; // do nothing#endif else thisObj->putValueProperty(exec, entry->value, value, attr); } // Modified version of IMPLEMENT_PROTOFUNC, to use DOMFunction and tryCall#define IMPLEMENT_PROTOFUNC_DOM(ClassFunc) \ namespace KJS { \ class ClassFunc : public DOMFunction { \ public: \ ClassFunc(ExecState *exec, int i, int len) \ : DOMFunction( exec ), id(i) { \ Value protect(this); \ put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \ } \ /** You need to implement that one */ \ virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \ private: \ int id; \ }; \ } Value getLiveConnectValue(KParts::LiveConnectExtension *lc, const QString & name, const int type, const QString & value, int id);} // namespace#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -