dom_nodeimpl.cpp
来自「将konqueror浏览器移植到ARM9 2410中」· C++ 代码 · 共 1,788 行 · 第 1/4 页
CPP
1,788 行
it.current()->listener->eventListenerType() == "_khtml_HTMLEventListener") { return it.current()->listener; } return 0;}bool NodeImpl::dispatchEvent(EventImpl *evt, int &exceptioncode){ evt->setTarget(this); return dispatchGenericEvent( evt, exceptioncode );}bool NodeImpl::dispatchGenericEvent( EventImpl *evt, int &/*exceptioncode */){ // ### check that type specified // work out what nodes to send event to QList<NodeImpl> nodeChain; NodeImpl *n; for (n = this; n; n = n->parentNode()) { n->ref(); nodeChain.prepend(n); } // trigger any capturing event handlers on our way down evt->setEventPhase(Event::CAPTURING_PHASE); QListIterator<NodeImpl> it(nodeChain); for (; it.current() && it.current() != this && !evt->propagationStopped(); ++it) { evt->setCurrentTarget(it.current()); it.current()->handleLocalEvents(evt,true); } // dispatch to the actual target node it.toLast(); if (!evt->propagationStopped()) { evt->setEventPhase(Event::AT_TARGET); evt->setCurrentTarget(it.current()); it.current()->handleLocalEvents(evt,false); } --it; // ok, now bubble up again (only non-capturing event handlers will be called) // ### recalculate the node chain here? (e.g. if target node moved in document by previous event handlers) if (evt->bubbles()) { evt->setEventPhase(Event::BUBBLING_PHASE); for (; it.current() && !evt->propagationStopped(); --it) { evt->setCurrentTarget(it.current()); it.current()->handleLocalEvents(evt,false); } } evt->setCurrentTarget(0); evt->setEventPhase(0); // I guess this is correct, the spec does not seem to say if (evt->bubbles()) { // now we call all default event handlers (this is not part of DOM - it is internal to khtml) it.toLast(); for (; it.current() && !evt->propagationStopped() && !evt->defaultPrevented() && !evt->defaultHandled(); --it) it.current()->defaultEventHandler(evt); } // copy this over into a local variable, as the following deref() calls might cause this to be deleted. DocumentPtr *doc = document; doc->ref(); // deref all nodes in chain it.toFirst(); for (; it.current(); ++it) it.current()->deref(); // this may delete us if (doc->document()) doc->document()->updateRendering(); doc->deref(); return !evt->defaultPrevented(); // ### what if defaultPrevented was called before dispatchEvent?}bool NodeImpl::dispatchHTMLEvent(int _id, bool canBubbleArg, bool cancelableArg){ int exceptioncode; EventImpl *evt = new EventImpl(static_cast<EventImpl::EventId>(_id),canBubbleArg,cancelableArg); evt->ref(); bool r = dispatchEvent(evt,exceptioncode); evt->deref(); return r;}bool NodeImpl::dispatchWindowEvent(int _id, bool canBubbleArg, bool cancelableArg){ int exceptioncode; EventImpl *evt = new EventImpl(static_cast<EventImpl::EventId>(_id),canBubbleArg,cancelableArg); evt->setTarget( 0 ); evt->ref(); DocumentPtr *doc = document; doc->ref(); bool r = dispatchGenericEvent( evt, exceptioncode ); if (!evt->defaultPrevented()) doc->document()->defaultEventHandler(evt); doc->deref(); evt->deref(); return r;}bool NodeImpl::dispatchMouseEvent(QMouseEvent *_mouse, int overrideId, int overrideDetail){ bool cancelable = true; int detail = overrideDetail; // defaults to 0 EventImpl::EventId evtId = EventImpl::UNKNOWN_EVENT; if (overrideId) { evtId = static_cast<EventImpl::EventId>(overrideId); } else { switch (_mouse->type()) { case QEvent::MouseButtonPress: evtId = EventImpl::MOUSEDOWN_EVENT; break; case QEvent::MouseButtonRelease: evtId = EventImpl::MOUSEUP_EVENT; break; case QEvent::MouseButtonDblClick: evtId = EventImpl::CLICK_EVENT; detail = 1; // ### support for multiple double clicks break; case QEvent::MouseMove: evtId = EventImpl::MOUSEMOVE_EVENT; cancelable = false; break; default: break; } } if (evtId == EventImpl::UNKNOWN_EVENT) return false; // shouldn't happen int exceptioncode;// int clientX, clientY;// viewportToContents(_mouse->x(), _mouse->y(), clientX, clientY); int clientX = _mouse->x(); // ### adjust to be relative to view int clientY = _mouse->y(); // ### adjust to be relative to view int screenX = _mouse->globalX(); int screenY = _mouse->globalY(); int button = -1; switch (_mouse->button()) { case Qt::LeftButton: button = 0; break; case Qt::MidButton: button = 1; break; case Qt::RightButton: button = 2; break; default: break; } bool ctrlKey = (_mouse->state() & Qt::ControlButton); bool altKey = (_mouse->state() & Qt::AltButton); bool shiftKey = (_mouse->state() & Qt::ShiftButton); bool metaKey = false; // ### qt support? EventImpl *evt = new MouseEventImpl(evtId,true,cancelable,getDocument()->defaultView(), detail,screenX,screenY,clientX,clientY,ctrlKey,altKey,shiftKey,metaKey, button,0); evt->ref(); bool r = dispatchEvent(evt,exceptioncode); evt->deref(); return r;}bool NodeImpl::dispatchUIEvent(int _id, int detail){ if (_id != EventImpl::DOMFOCUSIN_EVENT && _id != EventImpl::DOMFOCUSOUT_EVENT && _id != EventImpl::DOMACTIVATE_EVENT) return false; // shouldn't happen bool cancelable = false; if (_id == EventImpl::DOMACTIVATE_EVENT) cancelable = true; int exceptioncode; UIEventImpl *evt = new UIEventImpl(static_cast<EventImpl::EventId>(_id),true, cancelable,getDocument()->defaultView(),detail); evt->ref(); bool r = dispatchEvent(evt,exceptioncode); evt->deref(); return r;}bool NodeImpl::dispatchSubtreeModifiedEvent(){ if (!getDocument()->hasListenerType(DocumentImpl::DOMSUBTREEMODIFIED_LISTENER)) return false; int exceptioncode; return dispatchEvent(new MutationEventImpl(EventImpl::DOMSUBTREEMODIFIED_EVENT, true,false,0,DOMString(),DOMString(),DOMString(),0),exceptioncode);}void NodeImpl::handleLocalEvents(EventImpl *evt, bool useCapture){ if (!m_regdListeners) return; QListIterator<RegisteredEventListener> it(*m_regdListeners); Event ev = evt; for (; it.current(); ++it) { if (it.current()->id == evt->id() && it.current()->useCapture == useCapture) it.current()->listener->handleEvent(ev); }}void NodeImpl::defaultEventHandler(EventImpl */*evt*/){}unsigned long NodeImpl::childNodeCount(){ return 0;}NodeImpl *NodeImpl::childNode(unsigned long /*index*/){ return 0;}NodeImpl *NodeImpl::traverseNextNode(NodeImpl *stayWithin) { if (firstChild()) return firstChild(); else if (nextSibling()) return nextSibling(); else { NodeImpl *n = this; while (n && !n->nextSibling() && (!stayWithin || n->parentNode() != stayWithin)) n = n->parentNode(); if (n && (!stayWithin || n->parentNode() != stayWithin)) return n->nextSibling(); } return 0;}RenderObject *NodeImpl::nextRenderer(){ return 0;}//--------------------------------------------------------------------NodeWParentImpl::NodeWParentImpl(DocumentPtr *doc) : NodeImpl(doc){ _parent = 0; _previous = 0; _next = 0;}NodeWParentImpl::~NodeWParentImpl(){ // previous and next node may still reference this!!! // hope this fix is fine... if(_previous) _previous->setNextSibling(0); if(_next) _next->setPreviousSibling(0);}NodeImpl *NodeWParentImpl::parentNode() const{ return _parent;}NodeImpl *NodeWParentImpl::previousSibling() const{ return _previous;}NodeImpl *NodeWParentImpl::nextSibling() const{ return _next;}// not part of the DOMvoid NodeWParentImpl::setParent(NodeImpl *n){ _parent = n;}bool NodeWParentImpl::deleteMe(){ if(!_parent && _ref <= 0) return true; return false;}void NodeWParentImpl::setPreviousSibling(NodeImpl *n){ _previous = n;}void NodeWParentImpl::setNextSibling(NodeImpl *n){ _next = n;}bool NodeWParentImpl::checkReadOnly() const{ // #### return false;}unsigned long NodeWParentImpl::nodeIndex() const{ NodeImpl *_tempNode = _previous; unsigned long count=0; for( count=0; _tempNode; count++ ) _tempNode = _tempNode->previousSibling(); return count;}bool NodeWParentImpl::isReadOnly(){ // Entity & Entity Reference nodes and their descendants are read-only NodeImpl *n = this; while (n) { if (n->nodeType() == Node::ENTITY_NODE || n->nodeType() == Node::ENTITY_REFERENCE_NODE) return true; n = n->parentNode(); } return NodeImpl::isReadOnly();}RenderObject * NodeWParentImpl::nextRenderer(){ NodeImpl *n = _next; for (; n; n = n->nextSibling()) { if (n->renderer()) return n->renderer(); } return 0;}bool NodeWParentImpl::prepareMouseEvent( int _x, int _y, int _tx, int _ty, MouseEvent *ev){#ifdef EVENT_DEBUG kdDebug( 6030 ) << nodeName().string() << "::prepareMouseEvent" << endl;#endif bool inside = false; if(!m_render) return false; int origTx = _tx; int origTy = _ty; RenderObject *p = m_render->parent(); while( p && p->isAnonymousBox() ) {// kdDebug( 6030 ) << "parent is anonymous!" << endl; // we need to add the offset of the anonymous box _tx += p->xPos(); _ty += p->yPos(); p = p->parent(); } bool positioned = m_render->isPositioned(); int oldZIndex = ev->currentZIndex; // Positioned element -> store current zIndex, for children to use if ( positioned ) { ev->currentZIndex = m_render->style()->zIndex(); //kdDebug() << "ElementImpl::prepareMouseEvent storing currentZIndex=" << ev->currentZIndex << endl; } if(!m_render->isInline() || m_render->isReplaced() || m_render->isText()/*|| m_render->isFloating()*/ ) { bool known = m_render->absolutePosition(_tx, _ty); if (known && m_render->containsPoint(_x,_y,_tx,_ty)) { if ( m_render->style() && !m_render->style()->visiblity() == HIDDEN ) { //if ( positioned ) // kdDebug(6030) << " currentZIndex=" << ev->currentZIndex << " ev->zIndex=" << ev->zIndex << endl; if ( ev->currentZIndex >= ev->zIndex ) { //kdDebug(6030) << nodeName().string() << " SETTING innerNode " << endl; ev->innerNode = Node(this); ev->nodeAbsX = origTx; ev->nodeAbsY = origTy; ev->zIndex = ev->currentZIndex; inside = true; } } } } NodeImpl *child = firstChild(); while(child != 0) { if(child->prepareMouseEvent(_x, _y, _tx, _ty, ev)) inside = true; child = child->nextSibling(); }#ifdef EVENT_DEBUG if(inside) kdDebug( 6030 ) << nodeName().string() << " --> inside" << endl;#endif // reset previous z index if ( positioned ) ev->currentZIndex = oldZIndex; return inside;}//-------------------------------------------------------------------------NodeBaseImpl::NodeBaseImpl(DocumentPtr *doc) : NodeWParentImpl(doc){ _first = _last = 0; m_style = 0;}NodeBaseImpl::~NodeBaseImpl(){ //kdDebug( 6020 ) << "NodeBaseImpl destructor" << endl; // we have to tell all children, that the parent has died... NodeImpl *n; NodeImpl *next; for( n = _first; n != 0; n = next ) { next = n->nextSibling(); n->setPreviousSibling(0); n->setNextSibling(0); n->setParent(0); if(n->deleteMe()) delete n; } if (m_style) m_style->deref();}NodeImpl *NodeBaseImpl::firstChild() const{ return _first;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?