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