15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "XMLNames.h" 30df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h" 31e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "bindings/v8/ScriptCallStackFactory.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attr.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ChildListMutationScope.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ChildNodeList.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ClassNodeList.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMImplementation.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentFragment.h" 41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/dom/DocumentMarkerController.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentType.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ElementRareData.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/LiveNodeList.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NameNodeList.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeRareData.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ProcessingInstruction.h" 51f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/dom/Range.h" 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/SelectorQuery.h" 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TagNodeList.h" 5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TemplateContentDocumentFragment.h" 5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h" 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScopeAdopter.h" 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/UserActionElementSet.h" 588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/dom/WheelController.h" 59e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h" 60f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/dom/shadow/InsertionPoint.h" 61e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/htmlediting.h" 631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/BeforeLoadEvent.h" 641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/Event.h" 651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventDispatchMediator.h" 661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventDispatcher.h" 671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventListener.h" 681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/GestureEvent.h" 691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h" 701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MouseEvent.h" 711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MutationEvent.h" 721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TextEvent.h" 731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ThreadLocalEventNames.h" 741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TouchEvent.h" 751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/UIEvent.h" 761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/WheelEvent.h" 77e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/html/HTMLAnchorElement.h" 78c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/html/HTMLDialogElement.h" 7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h" 8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLStyleElement.h" 8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/RadioNodeList.h" 8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ContextMenuController.h" 8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Frame.h" 8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 86e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/Settings.h" 87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/rendering/FlowThreadController.h" 8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h" 89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/svg/graphics/SVGImage.h" 901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Partitions.h" 915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/HashSet.h" 925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/PassOwnPtr.h" 935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/RefCountedLeakCounter.h" 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/Vector.h" 955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/CString.h" 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/StringBuilder.h" 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void* Node::operator new(size_t size) 1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 1061fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch ASSERT(isMainThread()); 107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return partitionAlloc(Partitions::getObjectModelPartition(), size); 1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void Node::operator delete(void* ptr) 1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 1121fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch ASSERT(isMainThread()); 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) partitionFree(ptr); 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isSupported(const String& feature, const String& version) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOMImplementation::hasFeature(feature, version); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static HashSet<Node*> liveNodeSet; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dumpStatistics() 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t nodesWithRareData = 0; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t elementNodes = 0; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t attrNodes = 0; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t textNodes = 0; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t cdataNodes = 0; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t commentNodes = 0; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t entityNodes = 0; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t piNodes = 0; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t documentNodes = 0; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t docTypeNodes = 0; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t fragmentNodes = 0; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t notationNodes = 0; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t xpathNSNodes = 0; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t shadowRootNodes = 0; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<String, size_t> perTagCount; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t attributes = 0; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t attributesWithAttr = 0; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t elementsWithAttributeStorage = 0; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t elementsWithRareData = 0; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t elementsWithNamedNodeMap = 0; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<Node*>::iterator it = liveNodeSet.begin(); it != liveNodeSet.end(); ++it) { 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = *it; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->hasRareData()) { 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++nodesWithRareData; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isElementNode()) { 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++elementsWithRareData; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (toElement(node)->hasNamedNodeMap()) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++elementsWithNamedNodeMap; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->nodeType()) { 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: { 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++elementNodes; 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Tag stats 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Element* element = toElement(node); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<String, size_t>::AddResult result = perTagCount.add(element->tagName(), 1); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!result.isNewEntry) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.iterator->value++; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (ElementData* elementData = element->elementData()) { 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) attributes += elementData->length(); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++elementsWithAttributeStorage; 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (unsigned i = 0; i < elementData->length(); ++i) { 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Attribute* attr = elementData->attributeItem(i); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->attr()) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++attributesWithAttr; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: { 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++attrNodes; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TEXT_NODE: { 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++textNodes; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CDATA_SECTION_NODE: { 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++cdataNodes; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case COMMENT_NODE: { 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++commentNodes; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ENTITY_NODE: { 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++entityNodes; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case PROCESSING_INSTRUCTION_NODE: { 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++piNodes; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_NODE: { 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++documentNodes; 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_TYPE_NODE: { 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++docTypeNodes; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_FRAGMENT_NODE: { 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isShadowRoot()) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++shadowRootNodes; 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++fragmentNodes; 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NOTATION_NODE: { 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++notationNodes; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XPATH_NAMESPACE_NODE: { 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++xpathNSNodes; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf("Number of Nodes: %d\n\n", liveNodeSet.size()); 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf("NodeType distribution:\n"); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Element nodes: %zu\n", elementNodes); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Attribute nodes: %zu\n", attrNodes); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Text nodes: %zu\n", textNodes); 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of CDATASection nodes: %zu\n", cdataNodes); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Comment nodes: %zu\n", commentNodes); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Entity nodes: %zu\n", entityNodes); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of ProcessingInstruction nodes: %zu\n", piNodes); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Document nodes: %zu\n", documentNodes); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of DocumentType nodes: %zu\n", docTypeNodes); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Notation nodes: %zu\n", notationNodes); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of XPathNS nodes: %zu\n", xpathNSNodes); 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of ShadowRoot nodes: %zu\n", shadowRootNodes); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf("Element tag name distibution:\n"); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTagCount.end(); ++it) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf("Attributes:\n"); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes, sizeof(Attribute)); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Attributes with an Attr: %zu\n", attributesWithAttr); 260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) printf(" Number of Elements with attribute storage: %zu [%zu]\n", elementsWithAttributeStorage, sizeof(ElementData)); 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Elements with RareData: %zu\n", elementsWithRareData); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printf(" Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNamedNodeMap, sizeof(NamedNodeMap)); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode")); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::trackForDebugging() 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 271e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch nodeCounter.increment(); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) liveNodeSet.add(this); 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::~Node() 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 282e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch nodeCounter.decrement(); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) liveNodeSet.remove(this); 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasRareData()) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearRareData(); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) RELEASE_ASSERT(!renderer()); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 294f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!isContainerNode()) 295f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) willBeDeletedFromDocument(); 29653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_previous) 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_previous->setNextSibling(0); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_next) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_next->setPreviousSibling(0); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 302e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (m_treeScope) 303e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) m_treeScope->guardDeref(); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCounters::decrementCounter(InspectorCounters::NodeCounter); 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 308f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void Node::willBeDeletedFromDocument() 30953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 310e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (!isTreeScopeInitialized()) 311f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return; 312f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 313e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) Document& document = this->document(); 314e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 31553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (hasEventTargetData()) { 316e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) document.didRemoveEventTargetNode(this); 31753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) clearEventTargetData(); 31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 31953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 320e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (AXObjectCache* cache = document.existingAXObjectCache()) 321f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) cache->remove(this); 322a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 323e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) document.markers()->removeMarkers(this); 32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 32553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NodeRareData* Node::rareData() const 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 328c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(hasRareData()); 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<NodeRareData*>(m_data.m_rareData); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 332bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)NodeRareData& Node::ensureRareData() 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasRareData()) 335bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return *rareData(); 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) NodeRareData* data; 338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isElementNode()) 339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) data = ElementRareData::create(m_data.m_renderer).leakPtr(); 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) data = NodeRareData::create(m_data.m_renderer).leakPtr(); 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(data); 343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.m_rareData = data; 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setFlag(HasRareDataFlag); 346bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return *data; 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::clearRareData() 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(hasRareData()); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty()); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer = m_data.m_rareData->renderer(); 355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isElementNode()) 356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) delete static_cast<ElementRareData*>(m_data.m_rareData); 357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) delete static_cast<NodeRareData*>(m_data.m_rareData); 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.m_renderer = renderer; 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearFlag(HasRareDataFlag); 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::toNode() 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)short Node::tabIndex() const 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Node::nodeValue() const 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 378e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::setNodeValue(const String&) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // By default, setting nodeValue has no effect. 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::childNodes() 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 385f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().ensureChildNodeList(this); 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)Node& Node::lastDescendant() const 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) Node* n = const_cast<Node*>(this); 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (n && n->lastChild()) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) n = n->lastChild(); 39319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT(n); 39419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return *n; 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwarePreviousSibling() const 39853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 39953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (parentElement() && !previousSibling()) { 40053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Element* parent = parentElement(); 40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isAfterPseudoElement() && parent->lastChild()) 40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return parent->lastChild(); 40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!isBeforePseudoElement()) 40453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return parent->pseudoElement(BEFORE); 40553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 40653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return previousSibling(); 40753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 40953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareNextSibling() const 41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 41153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (parentElement() && !nextSibling()) { 41253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Element* parent = parentElement(); 41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isBeforePseudoElement() && parent->firstChild()) 41453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return parent->firstChild(); 41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!isAfterPseudoElement()) 41653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return parent->pseudoElement(AFTER); 41753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 41853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return nextSibling(); 41953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 42053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareFirstChild() const 42253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 42353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isElementNode()) { 42453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Element* currentElement = toElement(this); 42553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* first = currentElement->pseudoElement(BEFORE); 42653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (first) 42753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return first; 42853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) first = currentElement->firstChild(); 42953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!first) 43053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) first = currentElement->pseudoElement(AFTER); 43153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return first; 43253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 43353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 43453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return firstChild(); 43553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 43653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 43753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareLastChild() const 43853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 43953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isElementNode()) { 44053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Element* currentElement = toElement(this); 44153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* last = currentElement->pseudoElement(AFTER); 44253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (last) 44353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return last; 44453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) last = currentElement->lastChild(); 44553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!last) 44653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) last = currentElement->pseudoElement(BEFORE); 44753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return last; 44853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 44953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 45053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return lastChild(); 45153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 45253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 45351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionState& exceptionState) 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 455e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (isContainerNode()) 45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) toContainerNode(this)->insertBefore(newChild, refChild, exceptionState); 457e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch else 458a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "This node type does not support this method."); 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionState& exceptionState) 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 463e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (isContainerNode()) 46451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) toContainerNode(this)->replaceChild(newChild, oldChild, exceptionState); 465e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch else 466a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "This node type does not support this method."); 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::removeChild(Node* oldChild, ExceptionState& exceptionState) 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 471e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (isContainerNode()) 47251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) toContainerNode(this)->removeChild(oldChild, exceptionState); 473e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch else 474a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "This node type does not support this method."); 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::appendChild(PassRefPtr<Node> newChild, ExceptionState& exceptionState) 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 479e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (isContainerNode()) 48051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) toContainerNode(this)->appendChild(newChild, exceptionState); 481e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch else 482a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "This node type does not support this method."); 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::remove(ExceptionState& exceptionState) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ContainerNode* parent = parentNode()) 48851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) parent->removeChild(this, exceptionState); 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::normalize() 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Go through the subtree beneath us, normalizing all nodes. This means that 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // any two adjacent text nodes are merged and any empty text nodes are removed. 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<Node> node = this; 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (Node* firstChild = node->firstChild()) 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = firstChild; 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node) { 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeType type = node->nodeType(); 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (type == ELEMENT_NODE) 502f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) toElement(node)->normalizeAttributes(); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == this) 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (type == TEXT_NODE) 508f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) node = toText(node)->mergeNextSiblingNodesIfPossible(); 50906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) else 51051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) node = NodeTraversal::nextPostOrder(*node); 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::prefix() const 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For nodes other than elements and attributes, the prefix is always null 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nullAtom; 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::setPrefix(const AtomicString& /*prefix*/, ExceptionState& exceptionState) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The spec says that for nodes other than elements and attributes, prefix is always null. 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It does not say what to do when the user tries to set the prefix on another type of 524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // node, however Mozilla throws a NamespaceError exception. 525a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NamespaceError, "Prefixes are only supported on element and attribute nodes."); 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::localName() const 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nullAtom; 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::namespaceURI() const 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nullAtom; 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isContentEditable(UserSelectAllTreatment treatment) 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateStyleIfNeeded(); 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return rendererIsEditable(Editable, treatment); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isContentRichlyEditable() 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateStyleIfNeeded(); 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return rendererIsEditable(RichlyEditable, UserSelectAllIsAlwaysNonEditable); 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::rendererIsEditable(EditableLevel editableLevel, UserSelectAllTreatment treatment) const 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isPseudoElement()) 553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // would fire in the middle of Document::setFocusedNode(). 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (const Node* node = this; node; node = node->parentNode()) { 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((node->isHTMLElement() || node->isDocumentNode()) && node->renderer()) { 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Elements with user-select: all style are considered atomic 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // therefore non editable. 5633c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (Position::nodeIsUserSelectAll(node) && treatment == UserSelectAllIsAlwaysNonEditable) 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->renderer()->style()->userModify()) { 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case READ_ONLY: 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case READ_WRITE: 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case READ_WRITE_PLAINTEXT_ONLY: 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return editableLevel != RichlyEditable; 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isEditableToAccessibility(EditableLevel editableLevel) const 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rendererIsEditable(editableLevel)) 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Respect editableLevel for ARIA editable elements. 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (editableLevel == RichlyEditable) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(AXObjectCache::accessibilityEnabled()); 5918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) ASSERT(document().existingAXObjectCache()); 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (AXObjectCache* cache = document().existingAXObjectCache()) 5948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return cache->rootAXEditableElement(this); 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::shouldUseInputMethod() 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isContentEditable(UserSelectAllIsAlwaysNonEditable); 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBox* Node::renderBox() const 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer = this->renderer(); 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer && renderer->isBox() ? toRenderBox(renderer) : 0; 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBoxModelObject* Node::renderBoxModelObject() const 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer = this->renderer(); 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer && renderer->isBoxModelObject() ? toRenderBoxModelObject(renderer) : 0; 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutRect Node::boundingBox() const 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()) 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer()->absoluteBoundingBoxRect(); 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return LayoutRect(); 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 62202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::hasNonEmptyBoundingBox() const 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Before calling absoluteRects, check for the common case where the renderer 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is non-empty, since this is a faster check and almost always returns true. 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBoxModelObject* box = renderBoxModelObject(); 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!box) 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!box->borderBoundingBox().isEmpty()) 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect> rects; 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint absPos = renderer()->localToAbsolute(); 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) renderer()->absoluteRects(rects, flooredLayoutPoint(absPos)); 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t n = rects.size(); 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < n; ++i) 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rects[i].isEmpty()) 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#ifndef NDEBUG 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline static ShadowRoot* oldestShadowRootFor(const Node* node) 6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node->isElementNode()) 6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ElementShadow* shadow = toElement(node)->shadow()) 6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shadow->oldestShadowRoot(); 6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 65351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#endif 6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void Node::recalcDistribution() 656f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 657f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (isElementNode()) { 658f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (ElementShadow* shadow = toElement(this)->shadow()) 659f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) shadow->distributeIfNeeded(); 660f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 661f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 662f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) for (Node* child = firstChild(); child; child = child->nextSibling()) { 663f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (child->childNeedsDistributionRecalc()) 664f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) child->recalcDistribution(); 665f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 666f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 667f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) { 668f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (root->childNeedsDistributionRecalc()) 669f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) root->recalcDistribution(); 670f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 671f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 672f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) clearChildNeedsDistributionRecalc(); 673f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)} 674f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 675e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void Node::setIsLink(bool isLink) 676e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 677e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) setFlag(isLink && !SVGImage::isInSVGImage(toElement(this)), IsLinkFlag); 678e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 679e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 680f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void Node::markAncestorsWithChildNeedsDistributionRecalc() 681f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 682f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) for (Node* node = this; node && !node->childNeedsDistributionRecalc(); node = node->parentOrShadowHostNode()) 683f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) node->setChildNeedsDistributionRecalc(); 6848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (document().childNeedsDistributionRecalc()) 6858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().scheduleStyleRecalc(); 686f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)} 687f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 688e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)namespace { 689e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 690e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSize(const Node*); 691e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 692e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSizeIgnoringSelfAndShadowRoots(const Node* rootNode) 693e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 694e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) unsigned nodeCount = 0; 695e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) for (Node* child = rootNode->firstChild(); child; child = child->nextSibling()) 696e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) nodeCount += styledSubtreeSize(child); 697e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return nodeCount; 698e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 699e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 700e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSize(const Node* rootNode) 701e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 702e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (rootNode->isTextNode()) 703e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return 1; 704e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (!rootNode->isElementNode()) 705e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return 0; 706e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 707e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) // FIXME: We should use a shadow-tree aware node-iterator when such exists. 708e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) unsigned nodeCount = 1 + styledSubtreeSizeIgnoringSelfAndShadowRoots(rootNode); 709e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 710e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) // ShadowRoots don't have style (so don't count them), but their children might. 711e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) for (ShadowRoot* shadowRoot = rootNode->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) 712e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) nodeCount += styledSubtreeSizeIgnoringSelfAndShadowRoots(shadowRoot); 713e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 714e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return nodeCount; 715e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 716e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 717e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)PassRefPtr<JSONArray> jsStackAsJSONArray() 718e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 719e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) RefPtr<JSONArray> jsonArray = JSONArray::create(); 720e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) RefPtr<ScriptCallStack> stack = createScriptCallStack(10); 721e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (!stack) 722e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return jsonArray.release(); 723e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) for (size_t i = 0; i < stack->size(); i++) 724e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) jsonArray->pushString(stack->at(i).functionName()); 725e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return jsonArray.release(); 726e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 727e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 728e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)PassRefPtr<JSONObject> jsonObjectForStyleInvalidation(unsigned nodeCount, const Node* rootNode) 729e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 730e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) RefPtr<JSONObject> jsonObject = JSONObject::create(); 731e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) jsonObject->setNumber("node_count", nodeCount); 732e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) jsonObject->setString("root_node", rootNode->debugName()); 733e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) jsonObject->setArray("js_stack", jsStackAsJSONArray()); 734e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return jsonObject.release(); 735e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 736e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 737e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} // anonymous namespace'd functions supporting traceStyleChange 738e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 739e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)void Node::traceStyleChange(StyleChangeType changeType) 740e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 741e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) static const unsigned kMinLoggedSize = 100; 742e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) unsigned nodeCount = styledSubtreeSize(this); 743e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (nodeCount < kMinLoggedSize) 744e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return; 745e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 746e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("style.debug"), 747e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) "Node::setNeedsStyleRecalc", 748e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) "data", jsonObjectForStyleInvalidation(nodeCount, this)->toJSONString().ascii() 749e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) ); 750e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 751e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 752e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)void Node::traceStyleChangeIfNeeded(StyleChangeType changeType) 753e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 754e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) // TRACE_EVENT_CATEGORY_GROUP_ENABLED macro loads a global static bool into our local bool. 755e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) bool styleTracingEnabled; 756e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("style.debug"), &styleTracingEnabled); 757e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (UNLIKELY(styleTracingEnabled)) 758e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) traceStyleChange(changeType); 759e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 760e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void Node::setStyleChange(StyleChangeType changeType) 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType; 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::markAncestorsWithChildNeedsStyleRecalc() 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (ContainerNode* p = parentOrShadowHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrShadowHostNode()) 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) p->setChildNeedsStyleRecalc(); 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (document().needsStyleRecalc() || document().childNeedsStyleRecalc()) 7728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().scheduleStyleRecalc(); 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::setNeedsStyleRecalc(StyleChangeType changeType, StyleChangeSource source) 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(changeType != NoStyleChange); 77819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!inActiveDocument()) 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 781e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (source == StyleChangeFromRenderer) 782e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch setFlag(NotifyRendererWithIdenticalStyles); 783591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleChangeType existingChangeType = styleChangeType(); 785e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (changeType > existingChangeType) { 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setStyleChange(changeType); 787e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) if (changeType >= SubtreeStyleChange) 788e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) traceStyleChangeIfNeeded(changeType); 789e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) } 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (existingChangeType == NoStyleChange) 7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) markAncestorsWithChildNeedsStyleRecalc(); 7939243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) 7949243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) if (isElementNode() && hasRareData()) 7959243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) toElement(*this).setAnimationStyleChange(false); 7969243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)} 7979243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) 7989243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)void Node::clearNeedsStyleRecalc() 7999243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles){ 8009243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) m_nodeFlags &= ~StyleChangeMask; 8019243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) clearFlag(NotifyRendererWithIdenticalStyles); 8029243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) 8039243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) if (isElementNode() && hasRareData()) 8049243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) toElement(*this).setAnimationStyleChange(false); 8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 807f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)bool Node::inActiveDocument() const 808f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){ 809f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return inDocument() && document().isActive(); 810f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)} 811f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::focusDelegate() 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 817591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool Node::shouldHaveFocusAppearance() const 818591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 819591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ASSERT(focused()); 820591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return true; 821591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 822591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 823e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool Node::isInert() const 824e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 8258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const HTMLDialogElement* dialog = document().activeModalDialog(); 826e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (dialog && !containsIncludingShadowDOM(dialog) && !dialog->containsIncludingShadowDOM(this)) 827e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return true; 8288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().ownerElement() && document().ownerElement()->isInert(); 829e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 830e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned Node::nodeIndex() const 8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *_tempNode = previousSibling(); 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned count=0; 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for ( count=0; _tempNode; count++ ) 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _tempNode = _tempNode->previousSibling(); 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return count; 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<unsigned type> 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool shouldInvalidateNodeListCachesForAttr(const unsigned nodeListCounts[], const QualifiedName& attrName) 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (nodeListCounts[type] && LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), attrName)) 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shouldInvalidateNodeListCachesForAttr<type + 1>(nodeListCounts, attrName); 8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> 8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool shouldInvalidateNodeListCachesForAttr<numNodeListInvalidationTypes>(const unsigned[], const QualifiedName&) 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) const 8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName) 8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeListCounts, *attrName); 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int type = 0; type < numNodeListInvalidationTypes; type++) { 8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nodeListCounts[type]) 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Document::invalidateNodeListCaches(const QualifiedName* attrName) 8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end(); 870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it) 8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*it)->invalidateCache(attrName); 8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::invalidateNodeListCachesInAncestors(const QualifiedName* attrName, Element* attributeOwnerElement) 8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hasRareData() && (!attrName || isAttributeNode())) { 877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (NodeListsNodeData* lists = rareData()->nodeLists()) 878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) lists->clearChildNodeListCache(); 879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches. 8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName && !attributeOwnerElement) 8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!document().shouldInvalidateNodeListCaches(attrName)) 8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().invalidateNodeListCaches(attrName); 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* node = this; node; node = node->parentNode()) { 8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node->hasRareData()) 8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeRareData* data = node->rareData(); 8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (data->nodeLists()) 8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data->nodeLists()->invalidateCaches(attrName); 8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NodeListsNodeData* Node::nodeLists() 9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return hasRareData() ? rareData()->nodeLists() : 0; 9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 904926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::clearNodeLists() 9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rareData()->clearNodeLists(); 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::checkSetPrefix(const AtomicString& prefix, ExceptionState& exceptionState) 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Perform error checking as required by spec for setting Node.prefix. Used by 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Element::setPrefix() and Attr::setPrefix() 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!prefix.isEmpty() && !Document::isValidName(prefix)) { 915a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(InvalidCharacterError, "The prefix '" + prefix + "' is not a valid name."); 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 919e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // FIXME: Raise NamespaceError if prefix is malformed per the Namespaces in XML specification. 9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& nodeNamespaceURI = namespaceURI(); 9229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (nodeNamespaceURI.isEmpty() && !prefix.isEmpty()) { 923a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NamespaceError, "No namespace is set, so a namespace prefix may not be set."); 9249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return; 9259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 9269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 9279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (prefix == xmlAtom && nodeNamespaceURI != XMLNames::xmlNamespaceURI) { 928a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NamespaceError, "The prefix '" + xmlAtom + "' may not be set on namespace '" + nodeNamespaceURI + "'."); 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attribute-specific checks are in Attr::setPrefix(). 9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isDescendantOf(const Node *other) const 9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return true if other is an ancestor of this, otherwise false 9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!other || !other->hasChildNodes() || inDocument() != other->inDocument()) 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (other->treeScope() != treeScope()) 940591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 941591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (other->isTreeScope()) 942591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return !isTreeScope(); 9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) { 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n == other) 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::contains(const Node* node) const 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this == node || node->isDescendantOf(this); 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 957926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::containsIncludingShadowDOM(const Node* node) const 9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 959f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!node) 960f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 961f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 962f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (this == node) 963f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return true; 964f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 9651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (document() != node->document()) 966f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 967f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 968f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (inDocument() != node->inDocument()) 969f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 970f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 971f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes(); 972f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) bool hasShadow = isElementNode() && toElement(this)->shadow(); 973f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!hasChildren && !hasShadow) 974f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 975f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 976f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) for (; node; node = node->shadowHost()) { 9771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (treeScope() == node->treeScope()) 978f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return contains(node); 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 980f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)bool Node::containsIncludingHostElements(const Node& node) const 985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 98619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) const Node* current = &node; 98719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) do { 98819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (current == this) 989926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 99019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (current->isDocumentFragment() && toDocumentFragment(current)->isTemplateContent()) 99119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) current = static_cast<const TemplateContentDocumentFragment*>(current)->host(); 992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 99319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) current = current->parentOrShadowHostNode(); 99419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } while (current); 995926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 9989243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)Node* Node::commonAncestor(const Node& other, Node* (*parent)(const Node&)) 99951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 100051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (this == other) 100151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return this; 100251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (document() != other.document()) 100351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return 0; 100451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int thisDepth = 0; 10059243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) for (Node* node = this; node; node = parent(*node)) { 100651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (node == &other) 100751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return node; 100851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) thisDepth++; 100951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 101051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int otherDepth = 0; 10119243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) for (const Node* node = &other; node; node = parent(*node)) { 101251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (node == this) 101351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return this; 101451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) otherDepth++; 101551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 101651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Node* thisIterator = this; 101751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const Node* otherIterator = &other; 101851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (thisDepth > otherDepth) { 101951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (int i = thisDepth; i > otherDepth; --i) 10209243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) thisIterator = parent(*thisIterator); 102151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } else if (otherDepth > thisDepth) { 102251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (int i = otherDepth; i > thisDepth; --i) 10239243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) otherIterator = parent(*otherIterator); 102451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 102551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) while (thisIterator) { 102651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (thisIterator == otherIterator) 102751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return thisIterator; 10289243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) thisIterator = parent(*thisIterator); 10299243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles) otherIterator = parent(*otherIterator); 103051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 103151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(!otherIterator); 103251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return 0; 103351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 103451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1035e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::reattach(const AttachContext& context) 1036e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 1037e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch AttachContext reattachContext(context); 1038e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch reattachContext.performingReattach = true; 1039e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 10401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // We only need to detach if the node has already been through attach(). 10411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (styleChangeType() < NeedsReattachStyleChange) 10421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) detach(reattachContext); 1043e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch attach(reattachContext); 1044e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 1045e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 1046521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void Node::attach(const AttachContext&) 10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) ASSERT(document().inStyleRecalc() || isDocumentNode()); 10491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(needsAttach()); 105093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ASSERT(!renderer() || (renderer()->style() && (renderer()->parent() || renderer()->isRenderView()))); 10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearNeedsStyleRecalc(); 10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1054926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (Document* doc = documentInternal()) { 1055926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (AXObjectCache* cache = doc->axObjectCache()) 1056926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) cache->updateCacheAfterNodeIsAttached(this); 1057926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Node* detachingNode; 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::inDetach() const 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return detachingNode == this; 10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1069521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void Node::detach(const AttachContext& context) 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!detachingNode); 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) detachingNode = this; 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1076926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (renderer()) 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) renderer()->destroyAndCleanupAnonymousWrappers(); 1078926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setRenderer(0); 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1080521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // Do not remove the element's hovered and active status 1081521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // if performing a reattach. 1082521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!context.performingReattach) { 10838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Document& doc = document(); 1084521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (isUserActionElement()) { 1085521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (hovered()) 10868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) doc.hoveredNodeDetached(this); 1087521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (inActiveChain()) 10888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) doc.activeChainNodeDetached(this); 10898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) doc.userActionElements().didDetach(this); 1090521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1091926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1092926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 109351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setStyleChange(NeedsReattachStyleChange); 109451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setChildNeedsStyleRecalc(); 10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) detachingNode = 0; 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::reattachWhitespaceSiblings(Text* start) 110251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 110351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (Node* sibling = start; sibling; sibling = sibling->nextSibling()) { 110451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (sibling->isTextNode() && toText(sibling)->containsOnlyWhitespace()) { 110551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool hadRenderer = sibling->hasRenderer(); 110651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) sibling->reattach(); 110751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // If the reattach didn't toggle the visibility of the whitespace we don't 110851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // need to continue reattaching siblings since they won't toggle visibility 110951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // either. 111051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (hadRenderer == sibling->hasRenderer()) 111151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 111251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } else if (sibling->renderer()) { 111351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 111451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 111551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 111651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 111751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This code is used by editing. Seems like it could move over there and not pollute Node. 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::previousNodeConsideringAtomicNodes() const 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (previousSibling()) { 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *n = previousSibling(); 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!isAtomicNode(n) && n->lastChild()) 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) n = n->lastChild(); 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return n; 11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (parentNode()) { 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parentNode(); 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::nextNodeConsideringAtomicNodes() const 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isAtomicNode(this) && firstChild()) 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return firstChild(); 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nextSibling()) 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nextSibling(); 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Node *n = this; 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (n && !n->nextSibling()) 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) n = n->parentNode(); 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n) 11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return n->nextSibling(); 11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::previousLeafNode() const 11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *node = previousNodeConsideringAtomicNodes(); 11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node) { 11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isAtomicNode(node)) 11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node->previousNodeConsideringAtomicNodes(); 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::nextLeafNode() const 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *node = nextNodeConsideringAtomicNodes(); 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node) { 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isAtomicNode(node)) 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node->nextNodeConsideringAtomicNodes(); 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* Node::virtualComputedStyle(PseudoId pseudoElementSpecifier) 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return parentOrShadowHostNode() ? parentOrShadowHostNode()->computedStyle(pseudoElementSpecifier) : 0; 11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Node::maxCharacterOffset() const 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Shouldn't these functions be in the editing code? Code that asks questions about HTML in the core DOM class 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// is obviously misplaced. 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::canStartSelection() const 11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rendererIsEditable()) 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()) { 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* style = renderer()->style(); 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We allow selections to begin within an element that has -webkit-user-select: none set, 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but if the element is draggable then dragging should take priority over selection. 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_NONE) 11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return parentOrShadowHostNode() ? parentOrShadowHostNode()->canStartSelection() : true; 11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1199591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool Node::isRegisteredWithNamedFlow() const 1200591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 12018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().renderView()->flowThreadController()->isContentNodeRegisteredWithAnyNamedFlow(this); 1202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 1203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::shadowHost() const 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (ShadowRoot* root = containingShadowRoot()) 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root->host(); 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Node* Node::deprecatedShadowAncestorNode() const 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (ShadowRoot* root = containingShadowRoot()) 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root->host(); 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<Node*>(this); 12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ShadowRoot* Node::containingShadowRoot() const 12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Node* root = treeScope().rootNode(); 1222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return root && root->isShadowRoot() ? toShadowRoot(root) : 0; 12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::nonBoundaryShadowTreeRootNode() 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!isShadowRoot()); 12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* root = this; 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (root) { 12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (root->isShadowRoot()) 12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root; 1232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) Node* parent = root->parentOrShadowHostNode(); 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent && parent->isShadowRoot()) 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root; 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root = parent; 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContainerNode* Node::nonShadowBoundaryParentNode() const 12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* parent = parentNode(); 12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parent && !parent->isShadowRoot() ? parent : 0; 12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* Node::parentOrShadowHostElement() const 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ContainerNode* parent = parentOrShadowHostNode(); 12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent) 12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent->isShadowRoot()) 12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toShadowRoot(parent)->host(); 12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent->isElementNode()) 12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toElement(parent); 12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 126151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)ContainerNode* Node::parentOrShadowHostOrTemplateHostNode() const 126251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 126351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (isDocumentFragment() && toDocumentFragment(this)->isTemplateContent()) 126451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return static_cast<const TemplateContentDocumentFragment*>(this)->host(); 126551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return parentOrShadowHostNode(); 126651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 126751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 126853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool Node::isBlockFlowElement() const 12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return isElementNode() && renderer() && renderer()->isRenderBlockFlow(); 12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element *Node::enclosingBlockFlowElement() const 12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *n = const_cast<Node *>(this); 127653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isBlockFlowElement()) 127753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return toElement(n); 12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (1) { 12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) n = n->parentNode(); 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!n) 12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 128353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (n->isBlockFlowElement() || n->hasTagName(bodyTag)) 128453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return toElement(n); 12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isRootEditableElement() const 12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return rendererIsEditable() && isElementNode() && (!parentNode() || !parentNode()->rendererIsEditable() 12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || !parentNode()->isElementNode() || hasTagName(bodyTag)); 12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::rootEditableElement(EditableType editableType) const 12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (editableType == HasEditableAXRole) { 12988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (AXObjectCache* cache = document().existingAXObjectCache()) 1299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return const_cast<Element*>(cache->rootAXEditableElement(this)); 1300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 130102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return rootEditableElement(); 13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::rootEditableElement() const 13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* result = 0; 13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n->parentNode()) { 13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n->isElementNode()) 1310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) result = toElement(n); 13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n->hasTagName(bodyTag)) 13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::inSameContainingBlockFlowElement(Node *n) 13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : false; 13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node. 13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName) 13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (localName.isNull()) 13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (document().isHTMLDocument()) 1330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTagNodeList>(this, HTMLTagNodeListType, localName); 1331f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithAtomicName<TagNodeList>(this, TagNodeListType, localName); 13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName) 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (localName.isNull()) 13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (namespaceURI == starAtom) 13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getElementsByTagName(localName); 13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithQualifiedName(this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName); 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByName(const String& elementName) 13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1347f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithAtomicName<NameNodeList>(this, NameNodeListType, elementName); 13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames) 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1352f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithName<ClassNodeList>(this, ClassNodeListType, classNames); 13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name) 13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag)); 1358f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return ensureRareData().ensureNodeLists().addCacheWithAtomicName<RadioNodeList>(this, RadioNodeListType, name); 13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 136151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, ExceptionState& exceptionState) 13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (selectors.isEmpty()) { 1364a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 136851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState); 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!selectorQuery) 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 137119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return selectorQuery->queryFirst(*this); 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 137451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<NodeList> Node::querySelectorAll(const AtomicString& selectors, ExceptionState& exceptionState) 13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (selectors.isEmpty()) { 1377a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 138151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState); 13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!selectorQuery) 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 138419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return selectorQuery->queryAll(*this); 13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Document* Node::ownerDocument() const 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Document* doc = &document(); 13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return doc == this ? 0 : doc; 13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL Node::baseURI() const 13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parentNode() ? parentNode()->baseURI() : KURL(); 13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isEqualNode(Node* other) const 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!other) 14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 140202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeType nodeType = this->nodeType(); 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeType != other->nodeType()) 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 140602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeName() != other->nodeName()) 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 140902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (localName() != other->localName()) 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 141202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (namespaceURI() != other->namespaceURI()) 14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 141502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (prefix() != other->prefix()) 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 141802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeValue() != other->nodeValue()) 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 142102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isElementNode() && !toElement(this)->hasEquivalentAttributes(toElement(other))) 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 142402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* child = firstChild(); 14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* otherChild = other->firstChild(); 142702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (child) { 14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child->isEqualNode(otherChild)) 14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 143102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child = child->nextSibling(); 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) otherChild = otherChild->nextSibling(); 14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 143502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (otherChild) 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 143802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeType == DOCUMENT_TYPE_NODE) { 14408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const DocumentType* documentTypeThis = toDocumentType(this); 14418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const DocumentType* documentTypeOther = toDocumentType(other); 144202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (documentTypeThis->publicId() != documentTypeOther->publicId()) 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (documentTypeThis->systemId() != documentTypeOther->systemId()) 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (documentTypeThis->internalSubset() != documentTypeOther->internalSubset()) 14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We don't compare entities or notations because currently both are always empty. 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 145402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAtom : namespaceURIMaybeEmpty; 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (nodeType()) { 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: { 1464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const Element* elem = toElement(this); 146502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elem->prefix().isNull()) 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return elem->namespaceURI() == namespaceURI; 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elem->hasAttributes()) { 14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < elem->attributeCount(); i++) { 14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Attribute* attr = elem->attributeItem(i); 147202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->localName() == xmlnsAtom) 14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->value() == namespaceURI; 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->isDefaultNamespace(namespaceURI); 14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_NODE: 1484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (Element* de = toDocument(this)->documentElement()) 14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return de->isDefaultNamespace(namespaceURI); 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ENTITY_NODE: 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NOTATION_NODE: 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_TYPE_NODE: 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_FRAGMENT_NODE: 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: { 1493591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch const Attr* attr = toAttr(this); 14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->ownerElement()) 14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->ownerElement()->isDefaultNamespace(namespaceURI); 14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->isDefaultNamespace(namespaceURI); 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupPrefix(const AtomicString& namespaceURI) const 15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Implemented according to 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespacePrefixAlgo 150902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (namespaceURI.isEmpty()) 1511a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 151202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (nodeType()) { 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: 1515591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return lookupNamespacePrefix(namespaceURI, toElement(this)); 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_NODE: 1517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (Element* de = toDocument(this)->documentElement()) 15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return de->lookupPrefix(namespaceURI); 1519a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ENTITY_NODE: 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NOTATION_NODE: 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_FRAGMENT_NODE: 15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_TYPE_NODE: 1524a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: { 1526e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) const Attr *attr = toAttr(this); 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->ownerElement()) 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->ownerElement()->lookupPrefix(namespaceURI); 1529a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->lookupPrefix(namespaceURI); 1534a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1538a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupNamespaceURI(const String& prefix) const 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Implemented according to 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespaceURIAlgo 154202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!prefix.isNull() && prefix.isEmpty()) 1544a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 154502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (nodeType()) { 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: { 1548591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch const Element *elem = toElement(this); 154902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!elem->namespaceURI().isNull() && elem->prefix() == prefix) 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return elem->namespaceURI(); 155202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elem->hasAttributes()) { 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < elem->attributeCount(); i++) { 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Attribute* attr = elem->attributeItem(i); 155602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->prefix() == xmlnsAtom && attr->localName() == prefix) { 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!attr->value().isEmpty()) 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->value(); 156002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1561a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (attr->localName() == xmlnsAtom && prefix.isNull()) { 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!attr->value().isEmpty()) 15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->value(); 156502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1566a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->lookupNamespaceURI(prefix); 1572a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_NODE: 1575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (Element* de = toDocument(this)->documentElement()) 15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return de->lookupNamespaceURI(prefix); 1577a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ENTITY_NODE: 15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NOTATION_NODE: 15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_TYPE_NODE: 15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_FRAGMENT_NODE: 1582a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: { 1584e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) const Attr *attr = toAttr(this); 15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->ownerElement()) 15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->ownerElement()->lookupNamespaceURI(prefix); 15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1588a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->lookupNamespaceURI(prefix); 1593a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1597a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupNamespacePrefix(const AtomicString& _namespaceURI, const Element* originalElement) const 15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (_namespaceURI.isNull()) 1600a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 160102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (originalElement->lookupNamespaceURI(prefix()) == _namespaceURI) 16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return prefix(); 160402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isElementNode()); 16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Element* thisElement = toElement(this); 16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (thisElement->hasAttributes()) { 16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < thisElement->attributeCount(); i++) { 16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Attribute* attr = thisElement->attributeItem(i); 161002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr->prefix() == xmlnsAtom && attr->value() == _namespaceURI 16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && originalElement->lookupNamespaceURI(attr->localName()) == _namespaceURI) 16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr->localName(); 16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 161602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Element* ancestor = ancestorElement()) 16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ancestor->lookupNamespacePrefix(_namespaceURI, originalElement); 1619a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return nullAtom; 16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void appendTextContent(const Node* node, bool convertBRsToNewlines, bool& isNullString, StringBuilder& content) 16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->nodeType()) { 16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::TEXT_NODE: 16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::CDATA_SECTION_NODE: 16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::COMMENT_NODE: 16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isNullString = false; 16298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) content.append(toCharacterData(node)->data()); 16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::PROCESSING_INSTRUCTION_NODE: 16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isNullString = false; 16348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) content.append(toProcessingInstruction(node)->data()); 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 163602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::ELEMENT_NODE: 16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->hasTagName(brTag) && convertBRsToNewlines) { 16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isNullString = false; 16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content.append('\n'); 16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fall through. 16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::ATTRIBUTE_NODE: 16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::ENTITY_NODE: 16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::DOCUMENT_FRAGMENT_NODE: 16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isNullString = false; 16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* child = node->firstChild(); child; child = child->nextSibling()) { 16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->nodeType() == Node::COMMENT_NODE || child->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) 16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) appendTextContent(child, convertBRsToNewlines, isNullString, content); 16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::DOCUMENT_NODE: 16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::DOCUMENT_TYPE_NODE: 16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::NOTATION_NODE: 16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Node::XPATH_NAMESPACE_NODE: 16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Node::textContent(bool convertBRsToNewlines) const 16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder content; 16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isNullString = true; 16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) appendTextContent(this, convertBRsToNewlines, isNullString, content); 16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isNullString ? String() : content.toString(); 16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1671a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void Node::setTextContent(const String& text) 167202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (nodeType()) { 16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TEXT_NODE: 16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CDATA_SECTION_NODE: 16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case COMMENT_NODE: 16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case PROCESSING_INSTRUCTION_NODE: 1678e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch setNodeValue(text); 16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: 16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: 16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ENTITY_NODE: 16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_FRAGMENT_NODE: { 16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<ContainerNode> container = toContainerNode(this); 1685f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope mutation(*this); 16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) container->removeChildren(); 16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!text.isEmpty()) 1688a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) container->appendChild(document().createTextNode(text), ASSERT_NO_EXCEPTION); 16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_NODE: 16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DOCUMENT_TYPE_NODE: 16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NOTATION_NODE: 16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XPATH_NAMESPACE_NODE: 16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Do nothing. 16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::ancestorElement() const 17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In theory, there can be EntityReference nodes between elements, but this is currently not supported. 17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ContainerNode* n = parentNode(); n; n = n->parentNode()) { 17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n->isElementNode()) 1706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return toElement(n); 17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::offsetInCharacters() const 17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned short Node::compareDocumentPosition(const Node* otherNode) const 17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 171853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return compareDocumentPositionInternal(otherNode, TreatShadowTreesAsDisconnected); 171953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 172053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 17215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned short Node::compareDocumentPositionInternal(const Node* otherNode, ShadowTreesTreatment treatment) const 172253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It is not clear what should be done if |otherNode| is 0. 17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!otherNode) 17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOCUMENT_POSITION_DISCONNECTED; 17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (otherNode == this) 17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOCUMENT_POSITION_EQUIVALENT; 172902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1730591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch const Attr* attr1 = nodeType() == ATTRIBUTE_NODE ? toAttr(this) : 0; 1731591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch const Attr* attr2 = otherNode->nodeType() == ATTRIBUTE_NODE ? toAttr(otherNode) : 0; 173202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 17335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Node* start1 = attr1 ? attr1->ownerElement() : this; 17345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Node* start2 = attr2 ? attr2->ownerElement() : otherNode; 173502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If either of start1 or start2 is null, then we are disconnected, since one of the nodes is 17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an orphaned attribute node. 17383464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch if (!start1 || !start2) { 17393464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING; 17403464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction; 17413464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch } 17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Vector<const Node*, 16> chain1; 17445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Vector<const Node*, 16> chain2; 17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr1) 17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chain1.append(attr1); 17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr2) 17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chain2.append(attr2); 174902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr1 && attr2 && start1 == start2 && start1) { 17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first. 17525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Element* owner1 = attr1->ownerElement(); 1753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) owner1->synchronizeAllAttributes(); 17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned length = owner1->attributeCount(); 17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < length; ++i) { 175602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // If neither of the two determining nodes is a child node and nodeType is the same for both determining nodes, then an 17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation-dependent order between the determining nodes is returned. This order is stable as long as no nodes of 175802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // the same nodeType are inserted into or removed from the direct container. This would be the case, for example, 175902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // when comparing two attributes of the same element, and inserting or removing additional attributes might change 17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the order between existing attributes. 17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Attribute* attribute = owner1->attributeItem(i); 17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr1->qualifiedName() == attribute->name()) 17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_FOLLOWING; 17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr2->qualifiedName() == attribute->name()) 17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_PRECEDING; 17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 176702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DOCUMENT_POSITION_DISCONNECTED; 17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If one node is in the document and the other is not, we must be disconnected. 17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the nodes have different owning documents, they must be disconnected. Note that we avoid 17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug). 17751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (start1->inDocument() != start2->inDocument() || (treatment == TreatShadowTreesAsDisconnected && start1->treeScope() != start2->treeScope())) { 17763464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING; 17773464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction; 17783464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch } 17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need to find a common ancestor container, and then compare the indices of the two immediate children. 17815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Node* current; 178253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (current = start1; current; current = current->parentOrShadowHostNode()) 17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chain1.append(current); 178453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (current = start2; current; current = current->parentOrShadowHostNode()) 17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chain2.append(current); 1786926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned index1 = chain1.size(); 17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned index2 = chain2.size(); 1789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1790926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If the two elements don't have a common root, they're not in the same tree. 1791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (chain1[index1 - 1] != chain2[index2 - 1]) { 17923464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING; 1793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction; 1794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 17961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) unsigned connection = start1->treeScope() != start2->treeScope() ? DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0; 179753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Walk the two chains backwards and look for the first difference. 17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = min(index1, index2); i; --i) { 18005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Node* child1 = chain1[--index1]; 18015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const Node* child2 = chain2[--index2]; 18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child1 != child2) { 18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If one of the children is an attribute, it wins. 18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child1->nodeType() == ATTRIBUTE_NODE) 180553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_FOLLOWING | connection; 18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child2->nodeType() == ATTRIBUTE_NODE) 180753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_PRECEDING | connection; 180853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 180953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // If one of the children is a shadow root, 181053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (child1->isShadowRoot() || child2->isShadowRoot()) { 181153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!child2->isShadowRoot()) 181253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return Node::DOCUMENT_POSITION_FOLLOWING | connection; 181353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!child1->isShadowRoot()) 181453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return Node::DOCUMENT_POSITION_PRECEDING | connection; 181553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 181653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (ShadowRoot* child = toShadowRoot(child2)->olderShadowRoot(); child; child = child->olderShadowRoot()) 181753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (child == child1) 181853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return Node::DOCUMENT_POSITION_FOLLOWING | connection; 181953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 182053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return Node::DOCUMENT_POSITION_PRECEDING | connection; 182153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 182253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child2->nextSibling()) 182453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_FOLLOWING | connection; 18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child1->nextSibling()) 182653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_PRECEDING | connection; 18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Otherwise we need to see which node occurs first. Crawl backwards from child2 looking for child1. 18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* child = child2->previousSibling(); child; child = child->previousSibling()) { 18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child == child1) 183153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_FOLLOWING | connection; 18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 183353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return DOCUMENT_POSITION_PRECEDING | connection; 18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 183602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There was no difference between the two parent chains, i.e., one was a subset of the other. The shorter 18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chain is the ancestor. 183902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return index1 < index2 ? 184053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) DOCUMENT_POSITION_FOLLOWING | DOCUMENT_POSITION_CONTAINED_BY | connection : 184153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS | connection; 18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint Node::convertToPage(const FloatPoint& p) const 18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a renderer, just ask it to do the conversion 18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()) 18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer()->localToAbsolute(p, UseTransforms); 184902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Otherwise go up the tree looking for a renderer 18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element *parent = ancestorElement(); 18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent) 18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parent->convertToPage(p); 18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No parent - no conversion needed 18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return p; 18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint Node::convertFromPage(const FloatPoint& p) const 18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a renderer, just ask it to do the conversion 18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()) 18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer()->absoluteToLocal(p, UseTransforms); 18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Otherwise go up the tree looking for a renderer 18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element *parent = ancestorElement(); 18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent) 18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parent->convertFromPage(p); 18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No parent - no conversion needed 18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return p; 18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 187453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String Node::debugName() const 187553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 187653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StringBuilder name; 187753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.append(nodeName()); 187853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 187953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (hasID()) { 188053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.appendLiteral(" id=\'"); 188153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.append(toElement(this)->getIdAttribute()); 188253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.append('\''); 188353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 188453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 188553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (hasClass()) { 188653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.appendLiteral(" class=\'"); 1887591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (size_t i = 0; i < toElement(this)->classNames().size(); ++i) { 188853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (i > 0) 188953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.append(' '); 1890591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch name.append(toElement(this)->classNames()[i]); 189153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 189253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) name.append('\''); 189353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 189453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 189553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return name.toString(); 189653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 189753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1898e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#ifndef NDEBUG 1899e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void appendAttributeDesc(const Node* node, StringBuilder& stringBuilder, const QualifiedName& name, const char* attrDesc) 19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node->isElementNode()) 19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) String attr = toElement(node)->getAttribute(name); 19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attr.isEmpty()) 19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stringBuilder.append(attrDesc); 19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stringBuilder.append(attr); 19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showNode(const char* prefix) const 19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!prefix) 19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prefix = ""; 19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isTextNode()) { 19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String value = nodeValue(); 19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.replaceWithLiteral('\\', "\\\\"); 19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.replaceWithLiteral('\n', "\\n"); 19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "%s%s\t%p \"%s\"\n", prefix, nodeName().utf8().data(), this, value.utf8().data()); 19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder attrs; 19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) appendAttributeDesc(this, attrs, classAttr, " CLASS="); 19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) appendAttributeDesc(this, attrs, styleAttr, " STYLE="); 19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "%s%s\t%p%s\n", prefix, nodeName().utf8().data(), this, attrs.toString().utf8().data()); 19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeForThis() const 19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) showTreeAndMark(this, "*"); 19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showNodePathForThis() const 19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<const Node*, 16> chain; 19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Node* node = this; 1939926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) while (node->parentOrShadowHostNode()) { 19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chain.append(node); 1941926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) node = node->parentOrShadowHostNode(); 19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned index = chain.size(); index > 0; --index) { 19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Node* node = chain[index - 1]; 19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isShadowRoot()) { 19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int count = 0; 1947f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) for (ShadowRoot* shadowRoot = toShadowRoot(node)->olderShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) 19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++count; 19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "/#shadow-root[%d]", count); 19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->nodeType()) { 19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ELEMENT_NODE: { 19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "/%s", node->nodeName().utf8().data()); 19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Element* element = toElement(node); 19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& idattr = element->getIdAttribute(); 19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasIdAttr = !idattr.isNull() && !idattr.isEmpty(); 19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->previousSibling() || node->nextSibling()) { 19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int count = 0; 19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* previous = node->previousSibling(); previous; previous = previous->previousSibling()) 19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (previous->nodeName() == node->nodeName()) 19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++count; 19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasIdAttr) 19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "[@id=\"%s\" and position()=%d]", idattr.string().utf8().data(), count); 19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "[%d]", count); 19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (hasIdAttr) 19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "[@id=\"%s\"]", idattr.string().utf8().data()); 19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TEXT_NODE: 19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "/text()"); 19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ATTRIBUTE_NODE: 19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "/@%s", node->nodeName().utf8().data()); 19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "\n"); 19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) 19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 198851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (const Node* node = rootNode; node; node = NodeTraversal::next(*node)) { 19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == markedNode1) 19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "%s", markedLabel1); 19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == markedNode2) 19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "%s", markedLabel2); 19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder indent; 19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indent.append(baseIndent); 1996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (const Node* tmpNode = node; tmpNode && tmpNode != rootNode; tmpNode = tmpNode->parentOrShadowHostNode()) 19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indent.append('\t'); 19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "%s", indent.toString().utf8().data()); 19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->showNode(); 20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indent.append('\t'); 20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isShadowRoot()) { 20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot()) 20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) traverseTreeAndMark(indent.toString(), youngerShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2); 20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node)) 20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) traverseTreeAndMark(indent.toString(), oldestShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2); 20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) const 20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Node* rootNode; 20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Node* node = this; 2013926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) while (node->parentOrShadowHostNode() && !node->hasTagName(bodyTag)) 2014926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) node = node->parentOrShadowHostNode(); 20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rootNode = node; 20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String startingIndent; 20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) traverseTreeAndMark(startingIndent, rootNode, markedNode1, markedLabel1, markedNode2, markedLabel2); 20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::formatForDebugger(char* buffer, unsigned length) const 20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String result; 20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String s; 20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = nodeName(); 20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (s.isEmpty()) 20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = "<none>"; 20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = s; 20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) strncpy(buffer, result.utf8().data(), length - 1); 20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static ContainerNode* parentOrShadowHostOrFrameOwner(const Node* node) 20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ContainerNode* parent = node->parentOrShadowHostNode(); 20388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!parent && node->document().frame()) 20398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) parent = node->document().frame()->ownerElement(); 20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parent; 20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, const String& indent) 20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == markedNode) 20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputs("*", stderr); 20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputs(indent.utf8().data(), stderr); 20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->showNode(); 20498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (node->isShadowRoot()) { 20508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot()) 20518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) showSubTreeAcrossFrame(youngerShadowRoot, markedNode, indent + "\t"); 20528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } else { 20538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (node->isFrameOwnerElement()) 20548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) showSubTreeAcrossFrame(toHTMLFrameOwnerElement(node)->contentDocument(), markedNode, indent + "\t"); 20558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node)) 20568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) showSubTreeAcrossFrame(oldestShadowRoot, markedNode, indent + "\t"); 20578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* child = node->firstChild(); child; child = child->nextSibling()) 20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) showSubTreeAcrossFrame(child, markedNode, indent + "\t"); 20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeForThisAcrossFrame() const 20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* rootNode = const_cast<Node*>(this); 2065926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) while (parentOrShadowHostOrFrameOwner(rootNode)) 2066926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rootNode = parentOrShadowHostOrFrameOwner(rootNode); 20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) showSubTreeAcrossFrame(rootNode, this, ""); 20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------- 20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NodeListsNodeData::invalidateCaches(const QualifiedName* attrName) 20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeListAtomicNameCacheMap::const_iterator atomicNameCacheEnd = m_atomicNameCaches.end(); 20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeListAtomicNameCacheMap::const_iterator it = m_atomicNameCaches.begin(); it != atomicNameCacheEnd; ++it) 20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->invalidateCache(attrName); 20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeListNameCacheMap::const_iterator nameCacheEnd = m_nameCaches.end(); 20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeListNameCacheMap::const_iterator it = m_nameCaches.begin(); it != nameCacheEnd; ++it) 20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->invalidateCache(attrName); 20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName) 20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TagNodeListCacheNS::iterator tagCacheEnd = m_tagNodeListCacheNS.end(); 20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (TagNodeListCacheNS::iterator it = m_tagNodeListCacheNS.begin(); it != tagCacheEnd; ++it) 20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->invalidateCache(); 20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::enclosingLinkEventParentOrSelf() 20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (Node* node = this; node; node = node->parentOrShadowHostNode()) { 20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For imagemaps, the enclosing link node is the associated area element not the image itself. 20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true 20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for them. 20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isLink() && !node->hasTagName(imgTag)) 20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; 21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& Node::interfaceName() const 21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return EventTargetNames::Node; 21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext* Node::executionContext() const 21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().contextDocument().get(); 21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void Node::didMoveToNewDocument(Document& oldDocument) 21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TreeScopeAdopter::ensureDidMoveToNewDocumentWasCalled(oldDocument); 21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 211953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (const EventTargetData* eventTargetData = this->eventTargetData()) { 212053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const EventListenerMap& listenerMap = eventTargetData->eventListenerMap; 212153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!listenerMap.isEmpty()) { 212253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<AtomicString> types = listenerMap.eventTypes(); 212353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned i = 0; i < types.size(); ++i) 21248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().addListenerTypeIfNeeded(types[i]); 212553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 212653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 212753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 21281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (AXObjectCache::accessibilityEnabled()) { 21291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (AXObjectCache* cache = oldDocument.existingAXObjectCache()) 2130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) cache->remove(this); 21311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 2132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 21331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) const EventListenerVector& mousewheelListeners = getEventListeners(EventTypeNames::mousewheel); 21341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WheelController* oldController = WheelController::from(&oldDocument); 21351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WheelController* newController = WheelController::from(&document()); 2136e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (size_t i = 0; i < mousewheelListeners.size(); ++i) { 21371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) oldController->didRemoveWheelEventHandler(&oldDocument); 21381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) newController->didAddWheelEventHandler(&document()); 2139e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 2140e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 21411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) const EventListenerVector& wheelListeners = getEventListeners(EventTypeNames::wheel); 21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < wheelListeners.size(); ++i) { 21431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) oldController->didRemoveWheelEventHandler(&oldDocument); 21441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) newController->didAddWheelEventHandler(&document()); 21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (const TouchEventTargetSet* touchHandlers = oldDocument.touchEventTargets()) { 214893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) while (touchHandlers->contains(this)) { 21491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) oldDocument.didRemoveTouchEventHandler(this); 21501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) document().didAddTouchEventHandler(this); 21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry()) { 21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < registry->size(); ++i) { 21568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().addMutationObserverTypes(registry->at(i)->mutationTypes()); 21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry()) { 21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) { 21628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().addMutationObserverTypes((*iter)->mutationTypes()); 21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) 21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!targetNode->EventTarget::addEventListener(eventType, listener, useCapture)) 21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Document& document = targetNode->document(); 21738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document.addListenerTypeIfNeeded(eventType); 21741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) 21758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) WheelController::from(&document)->didAddWheelEventHandler(&document); 21761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (isTouchEventType(eventType)) 21771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) document.didAddTouchEventHandler(targetNode); 21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) 21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tryAddEventListener(this, eventType, listener, useCapture); 21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture) 21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCapture)) 21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Notify Document that the listener has vanished. We need to keep track of a number of 21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listeners for each type, not just a bool - see https://bugs.webkit.org/show_bug.cgi?id=33861 21948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Document& document = targetNode->document(); 21951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) 21968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) WheelController::from(&document)->didAddWheelEventHandler(&document); 21971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (isTouchEventType(eventType)) 21981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) document.didRemoveTouchEventHandler(targetNode); 21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture) 22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tryRemoveEventListener(this, eventType, listener, useCapture); 22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<Node*, OwnPtr<EventTargetData> > EventTargetDataMap; 22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static EventTargetDataMap& eventTargetDataMap() 22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(EventTargetDataMap, map, ()); 22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return map; 22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventTargetData* Node::eventTargetData() 22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return hasEventTargetData() ? eventTargetDataMap().get(this) : 0; 22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)EventTargetData& Node::ensureEventTargetData() 22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasEventTargetData()) 22241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return *eventTargetDataMap().get(this); 22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasEventTargetData(true); 22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EventTargetData* data = new EventTargetData; 22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventTargetDataMap().set(this, adoptPtr(data)); 22281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return *data; 22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::clearEventTargetData() 22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventTargetDataMap().remove(this); 22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry() 22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!hasRareData()) 2239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 2240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) NodeMutationObserverData* data = rareData()->mutationObserverData(); 2241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!data) 2242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 2243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return &data->registry; 22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry() 22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!hasRareData()) 2249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 2250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) NodeMutationObserverData* data = rareData()->mutationObserverData(); 2251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!data) 2252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 2253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return &data->transientRegistry; 22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename Registry> 22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void collectMatchingObserversForMutation(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, Registry* registry, Node* target, MutationObserver::MutationType type, const QualifiedName* attributeName) 22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!registry) 22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (typename Registry::iterator iter = registry->begin(); iter != registry->end(); ++iter) { 22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MutationObserverRegistration& registration = **iter; 22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (registration.shouldReceiveMutationFrom(target, type, attributeName)) { 22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutationRecordDeliveryOptions deliveryOptions = registration.deliveryOptions(); 22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<MutationObserver*, MutationRecordDeliveryOptions>::AddResult result = observers.add(registration.observer(), deliveryOptions); 22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!result.isNewEntry) 22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.iterator->value |= deliveryOptions; 22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::getRegisteredMutationObserversOfType(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, MutationObserver::MutationType type, const QualifiedName* attributeName) 22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT((type == MutationObserver::Attributes && attributeName) || !attributeName); 22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectMatchingObserversForMutation(observers, mutationObserverRegistry(), this, type, attributeName); 22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectMatchingObserversForMutation(observers, transientMutationObserverRegistry(), this, type, attributeName); 22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* node = parentNode(); node; node = node->parentNode()) { 22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectMatchingObserversForMutation(observers, node->mutationObserverRegistry(), this, type, attributeName); 22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectMatchingObserversForMutation(observers, node->transientMutationObserverRegistry(), this, type, attributeName); 22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerMutationObserver(MutationObserver* observer, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter) 22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutationObserverRegistration* registration = 0; 2286f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Vector<OwnPtr<MutationObserverRegistration> >& registry = ensureRareData().ensureMutationObserverData().registry; 2287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t i = 0; i < registry.size(); ++i) { 2288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (registry[i]->observer() == observer) { 2289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) registration = registry[i].get(); 22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) registration->resetObservation(options, attributeFilter); 22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!registration) { 2295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) registry.append(MutationObserverRegistration::create(observer, this, options, attributeFilter)); 2296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) registration = registry.last().get(); 22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().addMutationObserverTypes(registration->mutationTypes()); 23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterMutationObserver(MutationObserverRegistration* registration) 23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry(); 23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(registry); 23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!registry) 23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t index = registry->find(registration); 231006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) ASSERT(index != kNotFound); 231106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (index == kNotFound) 23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2314e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // Deleting the registration may cause this node to be derefed, so we must make sure the Vector operation completes 2315e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // before that, in case |this| is destroyed (see MutationObserverRegistration::m_registrationNodeKeepAlive). 2316e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // FIXME: Simplify the registration/transient registration logic to make this understandable by humans. 2317e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch RefPtr<Node> protect(this); 23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) registry->remove(index); 23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerTransientMutationObserver(MutationObserverRegistration* registration) 23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2323f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ensureRareData().ensureMutationObserverData().transientRegistry.add(registration); 23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterTransientMutationObserver(MutationObserverRegistration* registration) 23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry(); 23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(transientRegistry); 23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!transientRegistry) 23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(transientRegistry->contains(registration)); 23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) transientRegistry->remove(registration); 23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::notifyMutationObserversNodeWillDetach() 23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!document().hasMutationObservers()) 23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* node = parentNode(); node; node = node->parentNode()) { 23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->mutationObserverRegistry()) { 23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const size_t size = registry->size(); 23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < size; ++i) 23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) registry->at(i)->observedSubtreeNodeWillDetach(this); 23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (HashSet<MutationObserverRegistration*>* transientRegistry = node->transientMutationObserverRegistry()) { 23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) 23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*iter)->observedSubtreeNodeWillDetach(this); 23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::handleLocalEvents(Event* event) 23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasEventTargetData()) 23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 236153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isDisabledFormControl(this) && event->isMouseEvent()) 23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fireEventListeners(event); 23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchScopedEvent(PassRefPtr<Event> event) 23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchScopedEventDispatchMediator(EventDispatchMediator::create(event)); 23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchScopedEventDispatchMediator(PassRefPtr<EventDispatchMediator> eventDispatchMediator) 23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EventDispatcher::dispatchScopedEvent(this, eventDispatchMediator); 23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchEvent(PassRefPtr<Event> event) 23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (event->isMouseEvent()) 2380f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(static_pointer_cast<MouseEvent>(event), MouseEventDispatchMediator::SyntheticMouseEvent)); 2381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (event->isTouchEvent()) 2382f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return dispatchTouchEvent(static_pointer_cast<TouchEvent>(event)); 23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(event)); 23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchSubtreeModifiedEvent() 23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isInShadowTree()) 23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); 23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!document().hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER)) 23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMSubtreeModified, true)); 23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent) 24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); 2402bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<UIEvent> event = UIEvent::create(EventTypeNames::DOMActivate, true, true, document().domWindow(), detail); 24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setUnderlyingEvent(underlyingEvent); 24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchScopedEvent(event); 24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return event->defaultHandled(); 24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event) 24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2410bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator::create(KeyboardEvent::create(event, document().domWindow()))); 24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType, 24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int detail, Node* relatedTarget) 24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2416bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(MouseEvent::create(eventType, document().domWindow(), event, detail, relatedTarget))); 24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchGestureEvent(const PlatformGestureEvent& event) 24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2421bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<GestureEvent> gestureEvent = GestureEvent::create(document().domWindow(), event); 24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!gestureEvent.get()) 24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, GestureEventDispatchMediator::create(gestureEvent)); 24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::dispatchTouchEvent(PassRefPtr<TouchEvent> event) 24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return EventDispatcher::dispatchEvent(this, TouchEventDispatchMediator::create(event)); 2430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 243251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions eventOptions) 2433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 243451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) EventDispatcher::dispatchSimulatedClick(this, underlyingEvent, eventOptions); 24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchBeforeLoadEvent(const String& sourceURL) 24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!document().hasListenerType(Document::BEFORELOAD_LISTENER)) 24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<Node> protector(this); 24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL); 24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchEvent(beforeLoadEvent.get()); 24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !beforeLoadEvent->defaultPrevented(); 24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchWheelEvent(const PlatformWheelEvent& event) 24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2450bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator::create(event, document().domWindow())); 24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchChangeEvent() 24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchScopedEvent(Event::createBubble(EventTypeNames::change)); 24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchInputEvent() 24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchScopedEvent(Event::createBubble(EventTypeNames::input)); 24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::defaultEventHandler(Event* event) 24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event->target() != this) 24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& eventType = event->type(); 24681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (eventType == EventTypeNames::keydown || eventType == EventTypeNames::keypress) { 2469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (event->isKeyboardEvent()) { 24708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Frame* frame = document().frame()) 2471f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->eventHandler().defaultKeyboardEventHandler(toKeyboardEvent(event)); 2472591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 24731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (eventType == EventTypeNames::click) { 24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0; 24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dispatchDOMActivateEvent(detail, event)) 24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 24771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (eventType == EventTypeNames::contextmenu) { 24788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Page* page = document().page()) 2479e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page->contextMenuController().handleContextMenuEvent(event); 24801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (eventType == EventTypeNames::textInput) { 24811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->hasInterface(EventNames::TextEvent)) { 24828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Frame* frame = document().frame()) 2483f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->eventHandler().defaultTextInputEventHandler(toTextEvent(event)); 24841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 24858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 24861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (eventType == EventTypeNames::mousedown && event->isMouseEvent()) { 2487591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch MouseEvent* mouseEvent = toMouseEvent(event); 24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mouseEvent->button() == MiddleButton) { 24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (enclosingLinkEventParentOrSelf()) 24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer = this->renderer(); 24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())) 24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) renderer = renderer->parent(); 24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer) { 24978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Frame* frame = document().frame()) 2498f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->eventHandler().startPanScrolling(renderer); 24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 25021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if ((eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) && event->hasInterface(EventNames::WheelEvent)) { 25031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WheelEvent* wheelEvent = toWheelEvent(event); 250453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we don't have a renderer, send the wheel event to the first node we find with a renderer. 25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll. 25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* startNode = this; 25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (startNode && !startNode->renderer()) 2509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) startNode = startNode->parentOrShadowHostNode(); 251002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2511f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (startNode && startNode->renderer()) { 25128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Frame* frame = document().frame()) 2513f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->eventHandler().defaultWheelEventHandler(startNode, wheelEvent); 2514f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 25151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } else if (event->type() == EventTypeNames::webkitEditableContentChanged) { 25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchInputEvent(); 25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2520591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid Node::willCallDefaultEventHandler(const Event&) 2521591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 2522591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 2523591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToMouseMoveEvents() 25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 252653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isDisabledFormControl(this)) 25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return hasEventListeners(EventTypeNames::mousemove) || hasEventListeners(EventTypeNames::mouseover) || hasEventListeners(EventTypeNames::mouseout); 25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToMouseClickEvents() 25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 253353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isDisabledFormControl(this)) 25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return isContentEditable(UserSelectAllIsAlwaysNonEditable) || hasEventListeners(EventTypeNames::mouseup) || hasEventListeners(EventTypeNames::mousedown) || hasEventListeners(EventTypeNames::click) || hasEventListeners(EventTypeNames::DOMActivate); 25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToTouchEvents() 25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 254053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isDisabledFormControl(this)) 25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return hasEventListeners(EventTypeNames::touchstart) || hasEventListeners(EventTypeNames::touchmove) || hasEventListeners(EventTypeNames::touchcancel) || hasEventListeners(EventTypeNames::touchend); 25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// This is here for inlining 2546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline void TreeScope::removedLastRefToScope() 2547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 25481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(!deletionHasBegun()); 2549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_guardRefCount) { 2550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If removing a child removes the last self-only ref, we don't 2551926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // want the scope to be destructed until after 2552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // removeDetachedChildren returns, so we guard ourselves with an 2553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // extra self-only ref. 2554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) guardRef(); 2555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dispose(); 25561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if !ASSERT_DISABLED 2557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // We need to do this right now since guardDeref() can delete this. 2558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rootNode()->m_inRemovedLastRefFunction = false; 2559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 2560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) guardDeref(); 2561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 25621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if !ASSERT_DISABLED 2563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rootNode()->m_inRemovedLastRefFunction = false; 25641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#endif 25651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if SECURITY_ASSERT_ENABLED 2566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) beginDeletion(); 2567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 2568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) delete this; 2569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 2570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// It's important not to inline removedLastRef, because we don't want to inline the code to 25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// delete a Node at each deref call site. 25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::removedLastRef() 25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An explicit check for Document here is better than a virtual function since it is 25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // faster for non-Document nodes, and because the call to removedLastRef that is inlined 25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at all deref call sites is smaller if it's a non-virtual function. 2579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isTreeScope()) { 25808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) treeScope().removedLastRefToScope(); 25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 25841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if SECURITY_ASSERT_ENABLED 25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_deletionHasBegun = true; 25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this; 25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned Node::connectedSubframeCount() const 2591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return hasRareData() ? rareData()->connectedSubframeCount() : 0; 2593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::incrementConnectedSubframeCount(unsigned amount) 2596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isContainerNode()); 2598bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ensureRareData().incrementConnectedSubframeCount(amount); 2599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::decrementConnectedSubframeCount(unsigned amount) 2602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rareData()->decrementConnectedSubframeCount(amount); 2604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::updateAncestorConnectedSubframeCountForRemoval() const 2607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned count = connectedSubframeCount(); 2609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!count) 2611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 2612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShadowHostNode()) 2614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) node->decrementConnectedSubframeCount(count); 2615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2617926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::updateAncestorConnectedSubframeCountForInsertion() const 2618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned count = connectedSubframeCount(); 2620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!count) 2622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 2623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShadowHostNode()) 2625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) node->incrementConnectedSubframeCount(count); 2626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 26283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochPassRefPtr<NodeList> Node::getDestinationInsertionPoints() 26293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{ 26308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateDistributionForNodeIfNeeded(this); 26313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch Vector<InsertionPoint*, 8> insertionPoints; 263219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) collectDestinationInsertionPoints(*this, insertionPoints); 2633e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Vector<RefPtr<Node> > filteredInsertionPoints; 26343c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch for (size_t i = 0; i < insertionPoints.size(); ++i) { 26353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch InsertionPoint* insertionPoint = insertionPoints[i]; 26363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch ASSERT(insertionPoint->containingShadowRoot()); 2637e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (insertionPoint->containingShadowRoot()->type() != ShadowRoot::UserAgentShadowRoot) 2638e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) filteredInsertionPoints.append(insertionPoint); 26393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch } 2640e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return StaticNodeList::adopt(filteredInsertionPoints); 26413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch} 26423c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerScopedHTMLStyleChild() 26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasScopedHTMLStyleChild(true); 26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterScopedHTMLStyleChild() 26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(hasScopedHTMLStyleChild()); 26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasScopedHTMLStyleChild(numberOfScopedHTMLStyleChildren()); 26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t Node::numberOfScopedHTMLStyleChildren() const 26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t count = 0; 26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Node* child = firstChild(); child; child = child->nextSibling()) { 2658591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (child->hasTagName(HTMLNames::styleTag) && toHTMLStyleElement(child)->isRegisteredAsScoped()) 26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) count++; 26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return count; 26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::setFocus(bool flag) 2666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().userActionElements().setFocused(this, flag); 2668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 267051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::setActive(bool flag) 2671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().userActionElements().setActive(this, flag); 2673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::setHovered(bool flag) 2676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().userActionElements().setHovered(this, flag); 2678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementActive() const 2681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isUserActionElement()); 26838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().userActionElements().isActive(this); 2684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementInActiveChain() const 2687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2688926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isUserActionElement()); 26898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().userActionElements().isInActiveChain(this); 2690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementHovered() const 2693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isUserActionElement()); 26958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().userActionElements().isHovered(this); 2696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementFocused() const 2699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isUserActionElement()); 27018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().userActionElements().isFocused(this); 2702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 27047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid Node::setCustomElementState(CustomElementState newState) 270553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 27067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch CustomElementState oldState = customElementState(); 27077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 27087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch switch (newState) { 27097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch case NotCustomElement: 27107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT_NOT_REACHED(); // Everything starts in this state 27117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return; 27127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2713e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case WaitingForUpgrade: 271451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(NotCustomElement == oldState); 27157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch break; 27167757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 27177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch case Upgraded: 271851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(WaitingForUpgrade == oldState); 27197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch break; 27207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 27217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 272253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(isHTMLElement() || isSVGElement()); 272351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setFlag(CustomElement); 272451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setFlag(newState == Upgraded, CustomElementUpgraded); 272553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 27267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (oldState == NotCustomElement || newState == Upgraded) 27277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch setNeedsStyleRecalc(); // :unresolved has changed 2728e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 2729e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::Node* node) 27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node) 27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->showTreeForThis(); 27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showNodePath(const WebCore::Node* node) 27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node) 27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->showNodePathForThis(); 27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2747