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 + -
显示快捷键?