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

📄 kjs_dom.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void DOMNode::tryPut(ExecState *exec, const Identifier& propertyName, const Value& value, int attr){#ifdef KJS_VERBOSE  kdDebug(6070) << "DOMNode::tryPut " << propertyName.qstring() << endl;#endif  DOMObjectLookupPut<DOMNode,DOMObject>(exec, propertyName, value, attr,                                        &DOMNodeTable, this );}void DOMNode::putValue(ExecState *exec, int token, const Value& value, int /*attr*/){  switch (token) {  case NodeValue:    node.setNodeValue(value.toString(exec).string());    break;  case Prefix:    node.setPrefix(value.toString(exec).string());    break;  case OnAbort:    setListener(exec,DOM::EventImpl::ABORT_EVENT,value);    break;  case OnBlur:    setListener(exec,DOM::EventImpl::BLUR_EVENT,value);    break;  case OnChange:    setListener(exec,DOM::EventImpl::CHANGE_EVENT,value);    break;  case OnClick:    setListener(exec,DOM::EventImpl::KHTML_CLICK_EVENT,value);    break;  case OnContextMenu:    setListener(exec,DOM::EventImpl::CONTEXTMENU_EVENT,value);    break;  case OnDblClick:    setListener(exec,DOM::EventImpl::KHTML_DBLCLICK_EVENT,value);    break;  case OnDragDrop:    setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value);    break;  case OnError:    setListener(exec,DOM::EventImpl::KHTML_ERROR_EVENT,value);    break;  case OnFocus:    setListener(exec,DOM::EventImpl::FOCUS_EVENT,value);    break;  case OnInput:    setListener(exec,DOM::EventImpl::INPUT_EVENT,value);    break;  case OnKeyDown:    setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value);    break;  case OnKeyPress:    setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value);    break;  case OnKeyUp:    setListener(exec,DOM::EventImpl::KEYUP_EVENT,value);    break;  case OnLoad:    setListener(exec,DOM::EventImpl::LOAD_EVENT,value);    break;  case OnMouseDown:    setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value);    break;  case OnMouseMove:    setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value);    break;  case OnMouseOut:    setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value);    break;  case OnMouseOver:    setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value);    break;  case OnMouseUp:    setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value);    break;  case OnBeforeCut:    setListener(exec,DOM::EventImpl::BEFORECUT_EVENT,value);    break;  case OnCut:    setListener(exec,DOM::EventImpl::CUT_EVENT,value);    break;  case OnBeforeCopy:    setListener(exec,DOM::EventImpl::BEFORECOPY_EVENT,value);    break;  case OnCopy:    setListener(exec,DOM::EventImpl::COPY_EVENT,value);    break;  case OnBeforePaste:    setListener(exec,DOM::EventImpl::BEFOREPASTE_EVENT,value);    break;  case OnPaste:    setListener(exec,DOM::EventImpl::PASTE_EVENT,value);    break;  case OnDragEnter:    setListener(exec,DOM::EventImpl::DRAGENTER_EVENT,value);    break;  case OnDragOver:    setListener(exec,DOM::EventImpl::DRAGOVER_EVENT,value);    break;  case OnDragLeave:    setListener(exec,DOM::EventImpl::DRAGLEAVE_EVENT,value);    break;  case OnDrop:    setListener(exec,DOM::EventImpl::DROP_EVENT,value);    break;  case OnDragStart:    setListener(exec,DOM::EventImpl::DRAGSTART_EVENT,value);    break;  case OnDrag:    setListener(exec,DOM::EventImpl::DRAG_EVENT,value);    break;  case OnDragEnd:    setListener(exec,DOM::EventImpl::DRAGEND_EVENT,value);    break;  case OnMove:    setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value);    break;  case OnReset:    setListener(exec,DOM::EventImpl::RESET_EVENT,value);    break;  case OnResize:    setListener(exec,DOM::EventImpl::RESIZE_EVENT,value);    break;  case OnScroll:    setListener(exec,DOM::EventImpl::SCROLL_EVENT,value);#if APPLE_CHANGES  case OnSearch:    setListener(exec,DOM::EventImpl::SEARCH_EVENT,value);    break;#endif  case OnSelect:    setListener(exec,DOM::EventImpl::SELECT_EVENT,value);    break;  case OnSelectStart:    setListener(exec,DOM::EventImpl::SELECTSTART_EVENT,value);    break;  case OnSubmit:    setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value);    break;  case OnUnload:    setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value);    break;  case ScrollTop: {    khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;    if (rend && rend->hasOverflowClip())        rend->layer()->scrollToYOffset(value.toInt32(exec));    break;  }  case ScrollLeft: {    khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;    if (rend && rend->hasOverflowClip())      rend->layer()->scrollToXOffset(value.toInt32(exec));    break;  }  default:    kdWarning() << "DOMNode::putValue unhandled token " << token << endl;  }}Value DOMNode::toPrimitive(ExecState *exec, Type /*preferred*/) const{  if (node.isNull())    return Null();  return String(toString(exec));}UString DOMNode::toString(ExecState *) const{  if (node.isNull())    return "null";  UString s;  DOM::Element e = node;  if ( !e.isNull() ) {    s = UString(e.nodeName().string());  } else    s = className(); // fallback  return "[object " + s + "]";}void DOMNode::setListener(ExecState *exec, int eventId, Value func) const{  node.handle()->setHTMLEventListener(eventId,Window::retrieveActive(exec)->getJSEventListener(func,true));}Value DOMNode::getListener(int eventId) const{    DOM::EventListener *listener = node.handle()->getHTMLEventListener(eventId);    JSEventListener *jsListener = static_cast<JSEventListener*>(listener);    if ( jsListener && jsListener->listenerObjImp() )	return jsListener->listenerObj();    else	return Null();}void DOMNode::pushEventHandlerScope(ExecState *, ScopeChain &) const{}Value DOMNodeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){  if (!thisObj.inherits(&DOMNode::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode();  switch (id) {    case DOMNode::HasAttributes:      return Boolean(node.hasAttributes());    case DOMNode::HasChildNodes:      return Boolean(node.hasChildNodes());    case DOMNode::CloneNode:      return getDOMNode(exec,node.cloneNode(args[0].toBoolean(exec)));    case DOMNode::Normalize:      node.normalize();      return Undefined();    case DOMNode::IsSupported:      return Boolean(node.isSupported(args[0].toString(exec).string(),args[1].toString(exec).string()));    case DOMNode::AddEventListener: {        JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);        if (listener)            node.addEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec));        return Undefined();    }    case DOMNode::RemoveEventListener: {        JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);        if (listener)            node.removeEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec));        return Undefined();    }    case DOMNode::DispatchEvent:      return Boolean(node.dispatchEvent(toEvent(args[0])));    case DOMNode::AppendChild:      return getDOMNode(exec,node.appendChild(toNode(args[0])));    case DOMNode::RemoveChild:      return getDOMNode(exec,node.removeChild(toNode(args[0])));    case DOMNode::InsertBefore:      return getDOMNode(exec,node.insertBefore(toNode(args[0]), toNode(args[1])));    case DOMNode::ReplaceChild:      return getDOMNode(exec,node.replaceChild(toNode(args[0]), toNode(args[1])));    case DOMNode::Contains:    {        int exceptioncode=0;	DOM::Node other = toNode(args[0]);	if (!other.isNull() && node.nodeType()==DOM::Node::ELEMENT_NODE)	{	    DOM::NodeBaseImpl *impl = static_cast<DOM::NodeBaseImpl *>(node.handle());	    bool retval = !impl->checkNoOwner(other.handle(),exceptioncode);	    return Boolean(retval && exceptioncode == 0);	}        return Undefined();    }    case DOMNode::Item:      return getDOMNode(exec, node.childNodes().item(static_cast<unsigned long>(args[0].toNumber(exec))));  }  return Undefined();}// -------------------------------------------------------------------------const ClassInfo DOMNodeList::info = { "NodeList", 0, 0, 0 };DOMNodeList::~DOMNodeList(){  ScriptInterpreter::forgetDOMObject(list.handle());}Value DOMNodeList::toPrimitive(ExecState *exec, Type /*preferred*/) const{  if (list.isNull())    return Null();  return String(toString(exec));}// We have to implement hasProperty since we don't use a hashtable for 'length' and 'item'// ## this breaks "for (..in..)" though.bool DOMNodeList::hasProperty(ExecState *exec, const Identifier &p) const{  if (p == lengthPropertyName || p == "item")    return true;  return ObjectImp::hasProperty(exec, p);}Value DOMNodeList::tryGet(ExecState *exec, const Identifier &p) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "DOMNodeList::tryGet " << p.ascii() << endl;#endif  Value result;  if (p == lengthPropertyName)    result = Number(list.length());  else if (p == "item") {    // No need for a complete hashtable for a single func, but we still want    // to use the caching feature of lookupOrCreateFunction.    result = lookupOrCreateFunction<DOMNodeListFunc>(exec, p, this, DOMNodeListFunc::Item, 1, DontDelete|Function);    //result = new DOMNodeListFunc(exec, DOMNodeListFunc::Item, 1);  }  else {    // array index ?    bool ok;    long unsigned int idx = p.toULong(&ok);    if (ok)      result = getDOMNode(exec,list.item(idx));    else {      DOM::HTMLElement e;      unsigned long l = list.length();      bool found = false;      for ( unsigned long i = 0; i < l; i++ )        if ( ( e = list.item( i ) ).id() == p.string() ) {          result = getDOMNode(exec, list.item( i ) );          found = true;          break;        }      if ( !found )        result = ObjectImp::get(exec, p);    }  }  return result;}// Need to support both get and call, so that list[0] and list(0) work.Value DOMNodeList::call(ExecState *exec, Object &thisObj, const List &args){  // This code duplication is necessary, DOMNodeList isn't a DOMFunction  Value val;#ifdef KHTML_NO_EXCEPTIONS  DOM::_exceptioncode = 0;  val = tryCall(exec, thisObj, args);  if (DOM::_exceptioncode) {    Object err = Error::create(exec, GeneralError, "Exception from DOMNodeList");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -