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

📄 kjs_dom.cpp

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  case OnChange:    setListener(exec,DOM::EventImpl::CHANGE_EVENT,value);    break;  case OnClick:    setListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT,value);    break;  case OnDblClick:    setListener(exec,DOM::EventImpl::KHTML_ECMA_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 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 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 OnSelect:    setListener(exec,DOM::EventImpl::SELECT_EVENT,value);    break;  case OnSubmit:    setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value);    break;  case OnUnload:    setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value);    break;  default:    // Make sure our layout is up to date     DOM::DocumentImpl* docimpl = node.handle()->getDocument();    if (docimpl)      docimpl->updateLayout();    khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;    switch (token) {      case ScrollLeft:        if (rend && rend->layer()) {          if (rend->style()->hidesOverflow())            rend->layer()->scrollToXOffset(value.toInt32(exec));          else if (rend->isRoot()) {            QScrollView* sview = node.ownerDocument().view();            if (sview)              sview->setContentsPos(value.toInt32(exec), sview->contentsY());          }        }        break;      case ScrollTop:        if (rend && rend->layer()) {          if (rend->style()->hidesOverflow())            rend->layer()->scrollToYOffset(value.toInt32(exec));          else if (rend->isRoot()) {            QScrollView* sview = node.ownerDocument().view();            if (sview)              sview->setContentsPos(sview->contentsX(), value.toInt32(exec));          }        }        break;      default:      kdDebug(6070) << "WARNING: DOMNode::putValueProperty 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 = e.nodeName().string();  } else    s = className(); // fallback  return "[object " + s + "]";}void DOMNode::setListener(ExecState *exec, int eventId, const 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){  KJS_CHECK_THIS( DOMNode, thisObj );  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]);        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]);        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:    {	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 = other.handle()->isAncestor(impl);	    return Boolean(retval);	}        return Undefined();    }    case DOMNode::InsertAdjacentHTML:    {      // see http://www.faqts.com/knowledge_base/view.phtml/aid/5756      // and http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertAdjacentHTML.asp      Range range = node.ownerDocument().createRange();      range.setStartBefore(node);      DocumentFragment docFrag = range.createContextualFragment(args[1].toString(exec).string());      DOMString where = args[0].toString(exec).string();      if (where == "beforeBegin" || where == "BeforeBegin")        node.parentNode().insertBefore(docFrag, node);      else if (where == "afterBegin" || where == "AfterBegin")        node.insertBefore(docFrag, node.firstChild());      else if (where == "beforeEnd" || where == "BeforeEnd")        return getDOMNode(exec, node.appendChild(docFrag));      else if (where == "afterEnd" || where == "AfterEnd")        if (!node.nextSibling().isNull())	  node.parentNode().insertBefore(docFrag, node.nextSibling());	else	  node.parentNode().appendChild(docFrag);      return Undefined();    }    case DOMNode::Item:      return getDOMNode(exec, node.childNodes().item(static_cast<unsigned long>(args[0].toNumber(exec))));  }  return Undefined();}// -------------------------------------------------------------------------/*@begin DOMNodeListProtoTable 2  item		DOMNodeList::Item		DontDelete|Function 1# IE extension (IE treats DOMNodeList like an HTMLCollection)  namedItem	DOMNodeList::NamedItem		DontDelete|Function 1@end*/DEFINE_PROTOTYPE("DOMNodeList", DOMNodeListProto)IMPLEMENT_PROTOFUNC_DOM(DOMNodeListProtoFunc)IMPLEMENT_PROTOTYPE(DOMNodeListProto,DOMNodeListProtoFunc)const ClassInfo DOMNodeList::info = { "NodeList", 0, 0, 0 };DOMNodeList::DOMNodeList(ExecState *exec, const DOM::NodeList& l) : DOMObject(DOMNodeListProto::self(exec)), list(l) { }DOMNodeList::~DOMNodeList(){  ScriptInterpreter::forgetDOMObject(list.handle());}// We have to implement hasProperty since we don't use a hashtable for 'length'// ## this breaks "for (..in..)" though.bool DOMNodeList::hasProperty(ExecState *exec, const Identifier &p) const{  if (p == lengthPropertyName)    return true;  // ## missing: accept p if array index or item id...  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  if (p == lengthPropertyName)    return Number(list.length());  // Look in the prototype (for functions) before assuming it's an item's name  Object proto = Object::dynamicCast(prototype());  if (proto.isValid() && proto.hasProperty(exec,p))    return proto.get(exec,p);  Value result;  // array index ?  bool ok;  long unsigned int idx = p.toULong(&ok);  if (ok)    result = getDOMNode(exec,list.item(idx));  else {    // Find by ID    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;  try {    val = tryCall(exec, thisObj, args);  }  // pity there's no way to distinguish between these in JS code  catch (...) {    Object err = Error::create(exec, GeneralError, "Exception from DOMNodeList");    exec->setException(err);  }  return val;}Value DOMNodeList::tryCall(ExecState *exec, Object &, const List &args){  // Do not use thisObj here. See HTMLCollection.  UString s = args[0].toString(exec);  // index-based lookup?  bool ok;  unsigned int u = s.toULong(&ok);  if (ok)    return getDOMNode(exec,list.item(u));  // try lookup by name  // ### NodeList::namedItem() would be cool to have  // ### do we need to support the same two arg overload as in HTMLCollection?  Value result = tryGet(exec, Identifier(s));  if (result.isValid())    return result;  return Undefined();}// Not a prototype class currently, but should probably be converted to oneValue DOMNodeListProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){  KJS_CHECK_THIS( KJS::DOMNodeList, thisObj );  DOM::NodeList list = static_cast<DOMNodeList *>(thisObj.imp())->nodeList();  switch (id) {  case KJS::DOMNodeList::Item:

⌨️ 快捷键说明

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