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

📄 dom_nodeimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void NodeImpl::checkSetPrefix(const DOMString &_prefix, int &exceptioncode){    // Perform error checking as required by spec for setting Node.prefix. Used by    // ElementImpl::setPrefix() and AttrImpl::setPrefix()    // INVALID_CHARACTER_ERR: Raised if the specified prefix contains an illegal character.    if (!Element::khtmlValidPrefix(_prefix)) {        exceptioncode = DOMException::INVALID_CHARACTER_ERR;        return;    }    // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.    if (isReadOnly()) {        exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;        return;    }    // NAMESPACE_ERR: - Raised if the specified prefix is malformed    // - if the namespaceURI of this node is null,    // - if the specified prefix is "xml" and the namespaceURI of this node is different from    //   "http://www.w3.org/XML/1998/namespace",    // - if this node is an attribute and the specified prefix is "xmlns" and    //   the namespaceURI of this node is different from "http://www.w3.org/2000/xmlns/",    // - or if this node is an attribute and the qualifiedName of this node is "xmlns" [Namespaces].    if (Element::khtmlMalformedPrefix(_prefix) || (namespacePart(id()) == noNamespace && id() > ID_LAST_TAG) ||        (_prefix == "xml" && DOMString(getDocument()->namespaceURI(id())) != "http://www.w3.org/XML/1998/namespace")) {        exceptioncode = DOMException::NAMESPACE_ERR;        return;    }}void NodeImpl::checkAddChild(NodeImpl *newChild, int &exceptioncode){    // Perform error checking as required by spec for adding a new child. Used by    // appendChild(), replaceChild() and insertBefore()    // Not mentioned in spec: throw NOT_FOUND_ERR if newChild is null    if (!newChild) {        exceptioncode = DOMException::NOT_FOUND_ERR;        return;    }    // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly    if (isReadOnly()) {        exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;        return;    }    bool shouldAdoptChild = false;    // WRONG_DOCUMENT_ERR: Raised if newChild was created from a different document than the one that    // created this node.    // We assume that if newChild is a DocumentFragment, all children are created from the same document    // as the fragment itself (otherwise they could not have been added as children)    if (newChild->getDocument() != getDocument()) {	// but if the child is not in a document yet then loosen the	// restriction, so that e.g. creating an element with the Option()	// constructor and then adding it to a different document works,	// as it does in Mozilla and Mac IE.	if (!newChild->inDocument()) {	    shouldAdoptChild = true;	} else {	    exceptioncode = DOMException::WRONG_DOCUMENT_ERR;	    return;	}    }    // HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not allow children of the type of the    // newChild node, or if the node to append is one of this node's ancestors.    // check for ancestor/same node    if (newChild == this || isAncestor(newChild)) {        exceptioncode = DOMException::HIERARCHY_REQUEST_ERR;        return;    }    // check node allowed    if (newChild->nodeType() == Node::DOCUMENT_FRAGMENT_NODE) {        // newChild is a DocumentFragment... check all it's children instead of newChild itself        NodeImpl *child;        for (child = newChild->firstChild(); child; child = child->nextSibling()) {            if (!childAllowed(child)) {                exceptioncode = DOMException::HIERARCHY_REQUEST_ERR;                return;            }        }    }    else {        // newChild is not a DocumentFragment... check if it's allowed directly        if(!childAllowed(newChild)) {            exceptioncode = DOMException::HIERARCHY_REQUEST_ERR;            return;        }    }    // only do this once we know there won't be an exception    if (shouldAdoptChild) {	KJS::ScriptInterpreter::updateDOMObjectDocument(newChild, newChild->getDocument(), getDocument());	newChild->setDocument(getDocument()->docPtr());    }}bool NodeImpl::isAncestor(NodeImpl *node) const{    if (!node || node == this)        return false;    for (NodeImpl *p = node->parentNode(); p; p = p->parentNode()) {        if (p == this)            return true;    }    return false;}bool NodeImpl::childAllowed( NodeImpl *newChild ){    return childTypeAllowed(newChild->nodeType());}NodeImpl::StyleChange NodeImpl::diff( khtml::RenderStyle *s1, khtml::RenderStyle *s2 ) const{    // FIXME: The behavior of this function is just totally wrong.  It doesn't handle    // explicit inheritance of non-inherited properties and so you end up not re-resolving    // style in cases where you need to.    StyleChange ch = NoInherit;    EDisplay display1 = s1 ? s1->display() : NONE;    bool fl1 = s1 ? s1->hasPseudoStyle(RenderStyle::FIRST_LETTER) : false;    EDisplay display2 = s2 ? s2->display() : NONE;    bool fl2 = s2 ? s2->hasPseudoStyle(RenderStyle::FIRST_LETTER) : false;    if (display1 != display2 || fl1 != fl2)        ch = Detach;    else if ( !s1 || !s2 )	ch = Inherit;    else if ( *s1 == *s2 ) 	ch = NoChange;    else if ( s1->inheritedNotEqual( s2 ) )	ch = Inherit;    return ch;}#ifndef NDEBUGvoid NodeImpl::dump(QTextStream *stream, QString ind) const{    // ### implement dump() for all appropriate subclasses    if (m_hasId) { *stream << " hasId"; }    if (m_hasClass) { *stream << " hasClass"; }    if (m_hasStyle) { *stream << " hasStyle"; }    if (m_specified) { *stream << " specified"; }    if (m_focused) { *stream << " focused"; }    if (m_active) { *stream << " active"; }    if (m_styleElement) { *stream << " styleElement"; }    if (m_implicit) { *stream << " implicit"; }    *stream << " tabIndex=" << m_tabIndex;    if (m_regdListeners)	*stream << " #regdListeners=" << m_regdListeners->count(); // ### more detail    *stream << endl;    NodeImpl *child = firstChild();    while( child != 0 )    {	*stream << ind << child->nodeName().string().ascii() << ": ";        child->dump(stream,ind+"  ");        child = child->nextSibling();    }}#endifvoid NodeImpl::closeRenderer(){    // It's important that we close the renderer, even if it hasn't been    // created yet. This happens even more because of the FOUC fixes we did    // at Apple, which prevent renderers from being created until the stylesheets    // are all loaded. If the renderer is not here to be closed, we set a flag,    // then close it later when it's attached.    assert(!m_rendererNeedsClose);    if (m_render)        m_render->close();    else        m_rendererNeedsClose = true;}void NodeImpl::attach(){    assert(!attached());    assert(!m_render || (m_render->style() && m_render->parent()));    if (m_render && m_rendererNeedsClose) {        m_render->close();        m_rendererNeedsClose = false;    }    m_attached = true;}void NodeImpl::detach(){//    assert(m_attached);    if (m_render)        m_render->detach();    m_render = 0;    m_attached = false;}bool NodeImpl::maintainsState(){    return false;}QString NodeImpl::state(){    return QString::null;}void NodeImpl::restoreState(QStringList &/*states*/){}void NodeImpl::insertedIntoDocument(){    setInDocument(true);}void NodeImpl::removedFromDocument(){    setInDocument(false);}void NodeImpl::childrenChanged(){}bool NodeImpl::disabled() const{    return false;}bool NodeImpl::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 false;}NodeImpl *NodeImpl::previousEditable() const{    NodeImpl *node = previousLeafNode();    while (node) {        if (node->isContentEditable())            return node;        node = node->previousLeafNode();    }    return 0;}NodeImpl *NodeImpl::nextEditable() const{    NodeImpl *node = nextLeafNode();    while (node) {        if (node->isContentEditable())            return node;        node = node->nextLeafNode();    }    return 0;}RenderObject * NodeImpl::previousRenderer(){    for (NodeImpl *n = previousSibling(); n; n = n->previousSibling()) {        if (n->renderer())            return n->renderer();    }    return 0;}RenderObject * NodeImpl::nextRenderer(){    for (NodeImpl *n = nextSibling(); n; n = n->nextSibling()) {        if (n->renderer())            return n->renderer();    }    return 0;}NodeImpl *NodeImpl::previousLeafNode() const{    NodeImpl *node = traversePreviousNode();    while (node) {        if (!node->hasChildNodes())            return node;        node = node->traversePreviousNode();    }    return 0;}NodeImpl *NodeImpl::nextLeafNode() const{    NodeImpl *node = traverseNextNode();    while (node) {        if (!node->hasChildNodes())            return node;        node = node->traverseNextNode();    }    return 0;}void NodeImpl::createRendererIfNeeded(){#if APPLE_CHANGES    if (!getDocument()->shouldCreateRenderers())        return;#endif            assert(!attached());    assert(!m_render);        NodeImpl *parent = parentNode();        assert(parent);        RenderObject *parentRenderer = parent->renderer();    if (parentRenderer && parentRenderer->canHaveChildren()) {        RenderStyle *style = styleForRenderer(parentRenderer);        style->ref();#ifndef KHTML_NO_XBL        bool resolveStyle = false;        if (getDocument()->bindingManager()->loadBindings(this, style->bindingURIs(), true, &resolveStyle) &&             rendererIsNeeded(style)) {            if (resolveStyle) {                style->deref(getDocument()->renderArena());                style = styleForRenderer(parentRenderer);            }#else        if (rendererIsNeeded(style)) {#endif            m_render = createRenderer(getDocument()->renderArena(), style);            m_render->setStyle(style);            parentRenderer->addChild(m_render, nextRenderer());        }        style->deref(getDocument()->renderArena());    }}RenderStyle *NodeImpl::styleForRenderer(RenderObject *parent){    return parent->style();}bool NodeImpl::rendererIsNeeded(RenderStyle *style){    return (getDocument()->documentElement() == this) || (style->display() != NONE);}RenderObject *NodeImpl::createRenderer(RenderArena *arena, RenderStyle *style){    assert(false);    return 0;}long NodeImpl::maxOffset() const{    return 1;}long NodeImpl::caretMinOffset() const{    return renderer() ? renderer()->caretMinOffset() : 0;}long NodeImpl::caretMaxOffset() const{    return renderer() ? renderer()->caretMaxOffset() : 1;}unsigned long NodeImpl::caretMaxRenderedOffset() const{    return renderer() ? renderer()->caretMaxRenderedOffset() : 1;}bool NodeImpl::isBlockFlow() const{    return renderer() && renderer()->isBlockFlow();}bool NodeImpl::isEditableBlock() const{    return isContentEditable() && isBlockFlow();}ElementImpl *NodeImpl::enclosingBlockFlowElement() const{    NodeImpl *n = const_cast<NodeImpl *>(this);    if (isBlockFlow())        return static_cast<ElementImpl *>(n);    while (1) {        n = n->parentNode();        if (!n)            break;        if (n->isBlockFlow() || n->id() == ID_BODY)            return static_cast<ElementImpl *>(n);    }    return 0;}ElementImpl *NodeImpl::rootEditableElement() const{    if (!isContentEditable())        return 0;    NodeImpl *n = const_cast<NodeImpl *>(this);    NodeImpl *result = n->isEditableBlock() ? n : 0;    while (1) {        n = n->parentNode();        if (!n || !n->isContentEditable())            break;        if (n->id() == ID_BODY) {            result = n;            break;        }        if (n->isBlockFlow())            result = n;    }    return static_cast<ElementImpl *>(result);}bool NodeImpl::inSameRootEditableElement(NodeImpl *n){    return n ? rootEditableElement() == n->rootEditableElement() : false;}bool NodeImpl::inSameContainingBlockFlowElement(NodeImpl *n){    return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : false;}#if APPLE_CHANGESNodeImpl::Id NodeImpl::identifier() const{    return id();}#endifPosition NodeImpl::positionForCoordinates(int x, int y){    if (renderer())        return renderer()->positionForCoordinates(x, y);        return Position(this, 0);}//-------------------------------------------------------------------------NodeBaseImpl::NodeBaseImpl(DocumentPtr *doc)    : NodeImpl(doc){    _first = _last = 0;}

⌨️ 快捷键说明

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