⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kjs_binding.h

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 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 + -