https://bugs.webkit.org/show_bug.cgi?id=77514
Reviewed by Dimitri Glazkov.
NodeType.SHADOW_ROOT_NODE type is finally gone.
Source/WebCore:
* bindings/js/JSNodeCustom.cpp:
(WebCore::createWrapperInline):
* bindings/objc/DOM.mm:
(kitClass):
* bindings/v8/custom/V8NodeCustom.cpp:
(WebCore::toV8Slow):
* dom/ContainerNode.cpp:
(WebCore::collectTargetNodes):
(WebCore::ContainerNode::replaceChild):
* dom/Document.cpp:
(WebCore::Document::importNode):
(WebCore::Document::childTypeAllowed):
(WebCore::Document::canReplaceChild):
* dom/Node.cpp:
(WebCore::Node::dumpStatistics):
(WebCore::Node::isDefaultNamespace):
(WebCore::Node::lookupPrefix):
(WebCore::Node::lookupNamespaceURI):
(WebCore::appendTextContent):
(WebCore::Node::setTextContent):
* dom/Node.h:
* dom/Range.cpp:
(WebCore::lengthOfContentsInNode):
(WebCore::Range::processContentsBetweenOffsets):
(WebCore::Range::insertNode):
(WebCore::Range::checkNodeWOffset):
(WebCore::Range::checkNodeBA):
(WebCore::Range::selectNode):
(WebCore::Range::selectNodeContents):
(WebCore::Range::surroundContents):
* dom/ShadowRoot.cpp:
* dom/ShadowRoot.h:
(ShadowRoot):
(WebCore::toShadowRoot):
* editing/FrameSelection.cpp:
(WebCore::nodeIsDetachedFromDocument):
(WebCore):
(WebCore::FrameSelection::textWillBeReplaced):
* editing/MarkupAccumulator.cpp:
(WebCore::MarkupAccumulator::appendStartMarkup):
* html/parser/HTMLElementStack.cpp:
(WebCore::HTMLNames::isRootNode):
(WebCore::HTMLElementStack::pushRootNode):
* html/parser/HTMLElementStack.h:
(WebCore::isInHTMLNamespace):
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::pushChildNodesToFrontend):
(WebCore::InspectorDOMAgent::buildObjectForNode):
* xml/XPathUtil.cpp:
(WebCore::XPath::isValidContextNode):
Source/WebKit/chromium:
* src/WebPageSerializerImpl.cpp:
(WebKit::WebPageSerializerImpl::buildContentForNode):
LayoutTests:
* fast/dom/shadow/nodetype-expected.txt:
* fast/dom/shadow/nodetype.html:
* resources/dump-as-markup.js:
(Markup._get):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107700
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-02-14 Hayato Ito <hayato@chromium.org>
+
+ Make ShadowRoot.nodeType return DOCUMENT_FRAGMENT_NODE.
+ https://bugs.webkit.org/show_bug.cgi?id=77514
+
+ Reviewed by Dimitri Glazkov.
+
+ NodeType.SHADOW_ROOT_NODE type is finally gone.
+
+ * fast/dom/shadow/nodetype-expected.txt:
+ * fast/dom/shadow/nodetype.html:
+ * resources/dump-as-markup.js:
+ (Markup._get):
+
2012-02-14 Nikolas Zimmermann <nzimmermann@rim.com>
svg/hixie/perf has different repaint region in debug vs release
This tests the shadow host's and shadow root's nodeType.
PASS keygen.nodeType is Node.ELEMENT_NODE
-PASS shadow.nodeType is 14
+PASS shadow.nodeType is Node.DOCUMENT_FRAGMENT_NODE
PASS shadowChild is non-null.
-PASS shadowChild.nodeType != 14 is true
+PASS shadowChild.nodeType != Node.DOCUMENT_FRAGMENT_NODE is true
PASS successfullyParsed is true
TEST COMPLETE
var shadow = internals.shadowRoot(keygen);
var shadowChild = shadow.firstChild;
shouldBe('keygen.nodeType', 'Node.ELEMENT_NODE');
- shouldBe('shadow.nodeType', '14');
+ shouldBe('shadow.nodeType', 'Node.DOCUMENT_FRAGMENT_NODE');
shouldBeNonNull('shadowChild');
- shouldBeTrue('shadowChild.nodeType != 14');
+ shouldBeTrue('shadowChild.nodeType != Node.DOCUMENT_FRAGMENT_NODE');
}
</script>
<script src="../../js/resources/js-test-post.js"></script>
str += Markup._indent(depth + 1) + 'this.value="' + node.value + '"';
break;
- case 14: // See SHADOW_ROOT_NODE on Node::NodeType
- str += "<shadow:root>";
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ if (node.nodeName == "#shadow-root")
+ str += "<shadow:root>";
}
for (var i = 0, len = node.childNodes.length; i < len; i++) {
+2012-02-14 Hayato Ito <hayato@chromium.org>
+
+ Make ShadowRoot.nodeType return DOCUMENT_FRAGMENT_NODE.
+ https://bugs.webkit.org/show_bug.cgi?id=77514
+
+ Reviewed by Dimitri Glazkov.
+
+ NodeType.SHADOW_ROOT_NODE type is finally gone.
+
+ * bindings/js/JSNodeCustom.cpp:
+ (WebCore::createWrapperInline):
+ * bindings/objc/DOM.mm:
+ (kitClass):
+ * bindings/v8/custom/V8NodeCustom.cpp:
+ (WebCore::toV8Slow):
+ * dom/ContainerNode.cpp:
+ (WebCore::collectTargetNodes):
+ (WebCore::ContainerNode::replaceChild):
+ * dom/Document.cpp:
+ (WebCore::Document::importNode):
+ (WebCore::Document::childTypeAllowed):
+ (WebCore::Document::canReplaceChild):
+ * dom/Node.cpp:
+ (WebCore::Node::dumpStatistics):
+ (WebCore::Node::isDefaultNamespace):
+ (WebCore::Node::lookupPrefix):
+ (WebCore::Node::lookupNamespaceURI):
+ (WebCore::appendTextContent):
+ (WebCore::Node::setTextContent):
+ * dom/Node.h:
+ * dom/Range.cpp:
+ (WebCore::lengthOfContentsInNode):
+ (WebCore::Range::processContentsBetweenOffsets):
+ (WebCore::Range::insertNode):
+ (WebCore::Range::checkNodeWOffset):
+ (WebCore::Range::checkNodeBA):
+ (WebCore::Range::selectNode):
+ (WebCore::Range::selectNodeContents):
+ (WebCore::Range::surroundContents):
+ * dom/ShadowRoot.cpp:
+ * dom/ShadowRoot.h:
+ (ShadowRoot):
+ (WebCore::toShadowRoot):
+ * editing/FrameSelection.cpp:
+ (WebCore::nodeIsDetachedFromDocument):
+ (WebCore):
+ (WebCore::FrameSelection::textWillBeReplaced):
+ * editing/MarkupAccumulator.cpp:
+ (WebCore::MarkupAccumulator::appendStartMarkup):
+ * html/parser/HTMLElementStack.cpp:
+ (WebCore::HTMLNames::isRootNode):
+ (WebCore::HTMLElementStack::pushRootNode):
+ * html/parser/HTMLElementStack.h:
+ (WebCore::isInHTMLNamespace):
+ * inspector/InspectorDOMAgent.cpp:
+ (WebCore::InspectorDOMAgent::pushChildNodesToFrontend):
+ (WebCore::InspectorDOMAgent::buildObjectForNode):
+ * xml/XPathUtil.cpp:
+ (WebCore::XPath::isValidContextNode):
+
2012-02-14 Andreas Kling <awesomekling@apple.com>
StylePropertySet: Try to find a CSSValuePool for identifier values.
case Node::DOCUMENT_FRAGMENT_NODE:
wrapper = CREATE_DOM_WRAPPER(exec, globalObject, DocumentFragment, node);
break;
- case Node::SHADOW_ROOT_NODE:
- wrapper = CREATE_DOM_WRAPPER(exec, globalObject, Node, node);
- break;
case Node::ENTITY_REFERENCE_NODE:
wrapper = CREATE_DOM_WRAPPER(exec, globalObject, EntityReference, node);
break;
// FIXME: Create an XPath objective C wrapper
// See http://bugs.webkit.org/show_bug.cgi?id=8755
return nil;
- case WebCore::Node::SHADOW_ROOT_NODE:
- return [DOMNode class];
}
ASSERT_NOT_REACHED();
return nil;
return toV8(static_cast<DocumentFragment*>(impl), forceNewObject);
case Node::NOTATION_NODE:
return toV8(static_cast<Notation*>(impl), forceNewObject);
- case Node::SHADOW_ROOT_NODE: // There's no IDL class for ShadowRoot, fall-through to default and use Node instead.
default: break; // XPATH_NAMESPACE_NODE
}
return V8Node::wrap(impl, forceNewObject);
static void collectTargetNodes(Node* node, NodeVector& nodes)
{
- if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) {
+ if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE || node->isShadowRoot()) {
nodes.append(node);
return;
}
// that no callers call with ref count == 0 and parent = 0 (as of this
// writing, there are definitely callers who call that way).
- bool isFragment = newChild->nodeType() == DOCUMENT_FRAGMENT_NODE;
+ bool isFragment = newChild->nodeType() == DOCUMENT_FRAGMENT_NODE && !newChild->isShadowRoot();
// Add the new child(ren)
RefPtr<Node> child = isFragment ? newChild->firstChild() : newChild;
case ATTRIBUTE_NODE:
return Attr::create(0, this, static_cast<Attr*>(importedNode)->attr()->clone());
case DOCUMENT_FRAGMENT_NODE: {
+ if (importedNode->isShadowRoot()) {
+ // ShadowRoot nodes should not be explicitly importable.
+ // Either they are imported along with their host node, or created implicitly.
+ break;
+ }
DocumentFragment* oldFragment = static_cast<DocumentFragment*>(importedNode);
RefPtr<DocumentFragment> newFragment = createDocumentFragment();
if (deep) {
case DOCUMENT_NODE:
case DOCUMENT_TYPE_NODE:
case XPATH_NAMESPACE_NODE:
- case SHADOW_ROOT_NODE:
- // ShadowRoot nodes should not be explicitly importable.
- // Either they are imported along with their host node, or created implicitly.
break;
}
ec = NOT_SUPPORTED_ERR;
case NOTATION_NODE:
case TEXT_NODE:
case XPATH_NAMESPACE_NODE:
- case SHADOW_ROOT_NODE:
return false;
case COMMENT_NODE:
case PROCESSING_INSTRUCTION_NODE:
case ELEMENT_NODE:
numElements++;
break;
- case SHADOW_ROOT_NODE:
- ASSERT_NOT_REACHED();
- return false;
}
}
} else {
case NOTATION_NODE:
case TEXT_NODE:
case XPATH_NAMESPACE_NODE:
- case SHADOW_ROOT_NODE:
return false;
case COMMENT_NODE:
case PROCESSING_INSTRUCTION_NODE:
break;
}
case DOCUMENT_FRAGMENT_NODE: {
- ++fragmentNodes;
+ if (node->isShadowRoot())
+ ++shadowRootNodes;
+ else
+ ++fragmentNodes;
break;
}
case NOTATION_NODE: {
++xpathNSNodes;
break;
}
- case SHADOW_ROOT_NODE: {
- ++shadowRootNodes;
- break;
- }
}
}
case NOTATION_NODE:
case DOCUMENT_TYPE_NODE:
case DOCUMENT_FRAGMENT_NODE:
- case SHADOW_ROOT_NODE:
return false;
case ATTRIBUTE_NODE: {
const Attr* attr = static_cast<const Attr*>(this);
case NOTATION_NODE:
case DOCUMENT_FRAGMENT_NODE:
case DOCUMENT_TYPE_NODE:
- case SHADOW_ROOT_NODE:
return String();
case ATTRIBUTE_NODE: {
const Attr *attr = static_cast<const Attr *>(this);
case NOTATION_NODE:
case DOCUMENT_TYPE_NODE:
case DOCUMENT_FRAGMENT_NODE:
- case SHADOW_ROOT_NODE:
return String();
case ATTRIBUTE_NODE: {
const Attr *attr = static_cast<const Attr *>(this);
case Node::ENTITY_NODE:
case Node::ENTITY_REFERENCE_NODE:
case Node::DOCUMENT_FRAGMENT_NODE:
- case Node::SHADOW_ROOT_NODE:
isNullString = false;
for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
if (child->nodeType() == Node::COMMENT_NODE || child->nodeType() == Node::PROCESSING_INSTRUCTION_NODE)
case ATTRIBUTE_NODE:
case ENTITY_NODE:
case ENTITY_REFERENCE_NODE:
- case DOCUMENT_FRAGMENT_NODE:
- case SHADOW_ROOT_NODE: {
+ case DOCUMENT_FRAGMENT_NODE: {
ContainerNode* container = toContainerNode(this);
#if ENABLE(MUTATION_OBSERVERS)
ChildListMutationScope mutation(this);
DOCUMENT_FRAGMENT_NODE = 11,
NOTATION_NODE = 12,
XPATH_NAMESPACE_NODE = 13,
- SHADOW_ROOT_NODE = 14
};
enum DocumentPosition {
DOCUMENT_POSITION_EQUIVALENT = 0x00,
case Node::DOCUMENT_FRAGMENT_NODE:
case Node::NOTATION_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
return node->childNodeCount();
}
ASSERT_NOT_REACHED();
case Node::DOCUMENT_FRAGMENT_NODE:
case Node::NOTATION_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
// FIXME: Should we assert that some nodes never appear here?
if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) {
if (fragment)
Node::NodeType newNodeType = newNode->nodeType();
int numNewChildren;
- if (newNodeType == Node::DOCUMENT_FRAGMENT_NODE) {
+ if (newNodeType == Node::DOCUMENT_FRAGMENT_NODE && !newNode->isShadowRoot()) {
// check each child node, not the DocumentFragment itself
numNewChildren = 0;
for (Node* c = newNode->firstChild(); c; c = c->nextSibling()) {
case Node::ENTITY_NODE:
case Node::NOTATION_NODE:
case Node::DOCUMENT_NODE:
- case Node::SHADOW_ROOT_NODE:
ec = RangeException::INVALID_NODE_TYPE_ERR;
return;
default:
+ if (newNode->isShadowRoot()) {
+ ec = RangeException::INVALID_NODE_TYPE_ERR;
+ return;
+ }
break;
}
case Node::DOCUMENT_NODE:
case Node::ELEMENT_NODE:
case Node::ENTITY_REFERENCE_NODE:
- case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE: {
+ case Node::XPATH_NAMESPACE_NODE: {
if (!offset)
return 0;
Node* childBefore = n->childNode(offset - 1);
case Node::DOCUMENT_NODE:
case Node::ENTITY_NODE:
case Node::NOTATION_NODE:
- case Node::SHADOW_ROOT_NODE:
ec = RangeException::INVALID_NODE_TYPE_ERR;
return;
case Node::CDATA_SECTION_NODE:
case Node::ATTRIBUTE_NODE:
case Node::DOCUMENT_NODE:
case Node::DOCUMENT_FRAGMENT_NODE:
- case Node::SHADOW_ROOT_NODE:
break;
case Node::CDATA_SECTION_NODE:
case Node::COMMENT_NODE:
case Node::PROCESSING_INSTRUCTION_NODE:
case Node::TEXT_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
break;
case Node::DOCUMENT_TYPE_NODE:
case Node::ENTITY_NODE:
case Node::DOCUMENT_NODE:
case Node::ENTITY_NODE:
case Node::NOTATION_NODE:
- case Node::SHADOW_ROOT_NODE:
ec = RangeException::INVALID_NODE_TYPE_ERR;
return;
}
case Node::PROCESSING_INSTRUCTION_NODE:
case Node::TEXT_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
break;
case Node::DOCUMENT_TYPE_NODE:
case Node::ENTITY_NODE:
case Node::PROCESSING_INSTRUCTION_NODE:
case Node::TEXT_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
break;
}
return "#shadow-root";
}
-Node::NodeType ShadowRoot::nodeType() const
-{
- return SHADOW_ROOT_NODE;
-}
-
PassRefPtr<Node> ShadowRoot::cloneNode(bool)
{
// ShadowRoot should not be arbitrarily cloned.
virtual ~ShadowRoot();
virtual String nodeName() const;
- virtual NodeType nodeType() const;
virtual PassRefPtr<Node> cloneNode(bool deep);
virtual bool childTypeAllowed(NodeType) const;
inline ShadowRoot* toShadowRoot(Node* node)
{
- ASSERT(!node || node->nodeType() == Node::SHADOW_ROOT_NODE);
+ ASSERT(!node || node->isShadowRoot());
return static_cast<ShadowRoot*>(node);
}
position.moveToOffset(positionOffset - oldLength + newLength);
}
+static inline bool nodeIsDetachedFromDocument(Node* node)
+{
+ ASSERT(node);
+ Node* highest = highestAncestor(node);
+ return highest->nodeType() == Node::DOCUMENT_FRAGMENT_NODE && !highest->isShadowRoot();
+}
+
void FrameSelection::textWillBeReplaced(CharacterData* node, unsigned offset, unsigned oldLength, unsigned newLength)
{
// The fragment check is a performance optimization. See http://trac.webkit.org/changeset/30062.
- if (isNone() || !node || highestAncestor(node)->nodeType() == Node::DOCUMENT_FRAGMENT_NODE)
+ if (isNone() || !node || nodeIsDetachedFromDocument(node))
return;
Position base = m_selection.base();
case Node::ENTITY_REFERENCE_NODE:
case Node::NOTATION_NODE:
case Node::XPATH_NAMESPACE_NODE:
- case Node::SHADOW_ROOT_NODE:
ASSERT_NOT_REACHED();
break;
}
inline bool isRootNode(ContainerNode* node)
{
return node->nodeType() == Node::DOCUMENT_FRAGMENT_NODE
- || node->nodeType() == Node::SHADOW_ROOT_NODE
|| node->hasTagName(htmlTag);
}
void HTMLElementStack::pushRootNode(PassRefPtr<ContainerNode> rootNode)
{
- ASSERT(rootNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE || rootNode->nodeType() == Node::SHADOW_ROOT_NODE);
+ ASSERT(rootNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE);
pushRootNodeCommon(rootNode);
}
// A DocumentFragment takes the place of the document element when parsing
// fragments and should be considered in the HTML namespace.
return node->namespaceURI() == HTMLNames::xhtmlNamespaceURI
- || node->nodeType() == Node::DOCUMENT_FRAGMENT_NODE
- || node->nodeType() == Node::SHADOW_ROOT_NODE; // FIXME: Does this also apply to ShadowRoot?
+ || node->nodeType() == Node::DOCUMENT_FRAGMENT_NODE; // FIXME: Does this also apply to ShadowRoot?
}
void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId)
{
Node* node = nodeForId(nodeId);
- if (!node || (node->nodeType() != Node::ELEMENT_NODE && node->nodeType() != Node::DOCUMENT_NODE && node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE))
+ if (!node || (node->nodeType() != Node::ELEMENT_NODE && node->nodeType() != Node::DOCUMENT_NODE && node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) || node->isShadowRoot())
return;
if (m_childrenRequested.contains(nodeId))
return;
localName = node->localName();
break;
case Node::DOCUMENT_FRAGMENT_NODE:
- break;
+ if (!node->isShadowRoot())
+ break;
+ // Fall through
case Node::DOCUMENT_NODE:
case Node::ELEMENT_NODE:
default:
case Node::ENTITY_NODE:
case Node::ENTITY_REFERENCE_NODE:
case Node::NOTATION_NODE:
- case Node::SHADOW_ROOT_NODE:
return false;
case Node::TEXT_NODE:
return !(node->parentNode() && node->parentNode()->isAttributeNode());
+2012-02-14 Hayato Ito <hayato@chromium.org>
+
+ Make ShadowRoot.nodeType return DOCUMENT_FRAGMENT_NODE.
+ https://bugs.webkit.org/show_bug.cgi?id=77514
+
+ Reviewed by Dimitri Glazkov.
+
+ NodeType.SHADOW_ROOT_NODE type is finally gone.
+
+ * src/WebPageSerializerImpl.cpp:
+ (WebKit::WebPageSerializerImpl::buildContentForNode):
+
2012-02-14 David Reveman <reveman@chromium.org>
[Chromium] Inconsistent initialization of CCSettings in WebLayerTreeView.
case Node::ATTRIBUTE_NODE:
case Node::DOCUMENT_NODE:
case Node::DOCUMENT_FRAGMENT_NODE:
- case Node::SHADOW_ROOT_NODE:
// Should not exist.
ASSERT_NOT_REACHED();
break;