📄 kjs_dom.cpp
字号:
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 + -