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