15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All Rights Reserved. 3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScope.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/css/resolver/ScopedStyleResolver.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContainerNode.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h" 35e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/dom/ElementTraversal.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/IdTargetObserverRegistry.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/NodeRenderStyle.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScopeAdopter.h" 39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/dom/shadow/ElementShadow.h" 405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h" 41e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/editing/DOMSelection.h" 42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/events/EventPath.h" 43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameView.h" 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLAnchorElement.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLLabelElement.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMapElement.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h" 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 53591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h" 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TreeScope::TreeScope(ContainerNode& rootNode, Document& document) 60323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) : m_rootNode(&rootNode) 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_document(&document) 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_parentTreeScope(&document) 63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_guardRefCount(0) 65f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(rootNode != document); 69f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_parentTreeScope->guardRef(); 71f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 72323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_rootNode->setTreeScope(this); 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TreeScope::TreeScope(Document& document) 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_rootNode(document) 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_document(&document) 78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu , m_parentTreeScope(nullptr) 79f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_guardRefCount(0) 81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 84323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_rootNode->setTreeScope(this); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TreeScope::~TreeScope() 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 89f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_guardRefCount); 91323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_rootNode->setTreeScope(0); 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selection) { 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selection->clearTreeScope(); 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_selection = nullptr; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_parentTreeScope) 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_parentTreeScope->guardDeref(); 100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TreeScope* TreeScope::olderShadowRootOrParentTreeScope() const 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (rootNode().isShadowRoot()) { 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (ShadowRoot* olderShadowRoot = toShadowRoot(rootNode()).olderShadowRoot()) 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return olderShadowRoot; 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return parentTreeScope(); 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool TreeScope::isInclusiveOlderSiblingShadowRootOrAncestorTreeScopeOf(const TreeScope& scope) const 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (const TreeScope* current = &scope; current; current = current->olderShadowRootOrParentTreeScope()) { 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (current == this) 11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return true; 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdochbool TreeScope::rootNodeHasTreeSharedParent() const 12223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch{ 12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return rootNode().hasTreeSharedParent(); 12423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch} 12523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch 126323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::destroyTreeScopeData() 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_elementsById.clear(); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_imageMapsByName.clear(); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labelsByForAttribute.clear(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 133323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TreeScope::setParentTreeScope(TreeScope& newParentScope) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A document node cannot be re-parented. 13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!rootNode().isDocumentNode()); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 140f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) newParentScope.guardRef(); 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_parentTreeScope) 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_parentTreeScope->guardDeref(); 144f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_parentTreeScope = &newParentScope; 14609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setDocument(newParentScope.document()); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScopedStyleResolver& TreeScope::ensureScopedStyleResolver() 150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RELEASE_ASSERT(this); 152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!m_scopedStyleResolver) 153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_scopedStyleResolver = ScopedStyleResolver::create(*this); 154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return *m_scopedStyleResolver; 155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void TreeScope::clearScopedStyleResolver() 158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_scopedStyleResolver.clear(); 160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* TreeScope::getElementById(const AtomicString& elementId) const 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elementId.isEmpty()) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_elementsById) 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return m_elementsById->getElementById(elementId, this); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 171197021e6b966cfb06891637935ef33fff06433d1Ben Murdochconst WillBeHeapVector<RawPtrWillBeMember<Element> >& TreeScope::getAllElementsById(const AtomicString& elementId) const 17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WillBeHeapVector<RawPtrWillBeMember<Element> > >, emptyVector, (adoptPtrWillBeNoop(new WillBeHeapVector<RawPtrWillBeMember<Element> >()))); 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (elementId.isEmpty()) 175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return *emptyVector; 17609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_elementsById) 177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return *emptyVector; 178e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return m_elementsById->getAllElementsById(elementId, this); 17909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::addElementById(const AtomicString& elementId, Element* element) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_elementsById) 184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_elementsById = DocumentOrderedMap::create(); 185e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_elementsById->add(elementId, element); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idTargetObserverRegistry->notifyObservers(elementId); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::removeElementById(const AtomicString& elementId, Element* element) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_elementsById) 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 193e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_elementsById->remove(elementId, element); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idTargetObserverRegistry->notifyObservers(elementId); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* TreeScope::ancestorInThisScope(Node* node) const 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node) { 2001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (node->treeScope() == this) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node->isInShadowTree()) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node->shadowHost(); 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::addImageMap(HTMLMapElement* imageMap) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 213e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const AtomicString& name = imageMap->getName(); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!name) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_imageMapsByName) 217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_imageMapsByName = DocumentOrderedMap::create(); 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_imageMapsByName->add(name, imageMap); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::removeImageMap(HTMLMapElement* imageMap) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_imageMapsByName) 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 225e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const AtomicString& name = imageMap->getName(); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!name) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_imageMapsByName->remove(name, imageMap); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLMapElement* TreeScope::getImageMap(const String& url) const 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (url.isNull()) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_imageMapsByName) 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t hashPos = url.find('#'); 238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) String name = hashPos == kNotFound ? url : url.substring(hashPos + 1); 23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (rootNode().document().isHTMLDocument()) 240e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return toHTMLMapElement(m_imageMapsByName->getElementByLowercasedMapName(AtomicString(name.lower()), this)); 241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return toHTMLMapElement(m_imageMapsByName->getElementByMapName(AtomicString(name), this)); 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)HitTestResult hitTestInDocument(const Document* document, int x, int y) 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = document->frame(); 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frame) 24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return HitTestResult(); 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FrameView* frameView = frame->view(); 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameView) 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return HitTestResult(); 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 25453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) float scaleFactor = frame->pageZoomFactor(); 255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->scrollX(), y * scaleFactor + frameView->scrollY())); 256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameView->visibleContentRect().contains(point)) 25809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return HitTestResult(); 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 260197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); 261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HitTestResult result(point); 262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) document->renderView()->hitTest(request, result); 26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return result; 264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* TreeScope::elementFromPoint(int x, int y) const 267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) HitTestResult result = hitTestInDocument(&rootNode().document(), x, y); 26909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* node = result.innerNode(); 27009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!node || node->isDocumentNode()) 2711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return 0; 2721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (node->isPseudoElement() || node->isTextNode()) 2731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) node = node->parentOrShadowHostNode(); 274e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!node || node->isElementNode() || node->isShadowRoot()); 275e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch node = ancestorInThisScope(node); 276e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!node || !node->isElementNode()) 277e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return 0; 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return toElement(node); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::addLabel(const AtomicString& forAttributeValue, HTMLLabelElement* element) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_labelsByForAttribute); 284e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_labelsByForAttribute->add(forAttributeValue, element); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TreeScope::removeLabel(const AtomicString& forAttributeValue, HTMLLabelElement* element) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_labelsByForAttribute); 290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_labelsByForAttribute->remove(forAttributeValue, element); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLLabelElement* TreeScope::labelElementForId(const AtomicString& forAttributeValue) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (forAttributeValue.isEmpty()) 296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_labelsByForAttribute) { 299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Populate the map on first access. 300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_labelsByForAttribute = DocumentOrderedMap::create(); 301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (HTMLLabelElement* label = Traversal<HTMLLabelElement>::firstWithin(rootNode()); label; label = Traversal<HTMLLabelElement>::next(*label)) { 302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const AtomicString& forValue = label->fastGetAttribute(forAttr); 303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!forValue.isEmpty()) 304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) addLabel(forValue, label); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return toHTMLLabelElement(m_labelsByForAttribute->getElementByLabelForAttribute(forAttributeValue, this)); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DOMSelection* TreeScope::getSelection() const 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!rootNode().document().frame()) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selection) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selection.get(); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: The correct selection in Shadow DOM requires that Position can have a ShadowRoot 32053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // as a container. 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See https://bugs.webkit.org/show_bug.cgi?id=82697 32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_selection = DOMSelection::create(this); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selection.get(); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* TreeScope::findAnchor(const String& name) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name.isEmpty()) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 33009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (Element* element = getElementById(AtomicString(name))) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return element; 332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (HTMLAnchorElement* anchor = Traversal<HTMLAnchorElement>::firstWithin(rootNode()); anchor; anchor = Traversal<HTMLAnchorElement>::next(*anchor)) { 333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (rootNode().document().inQuirksMode()) { 334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Quirks mode, case insensitive comparison of names. 335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (equalIgnoringCase(anchor->name(), name)) 336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return anchor; 337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else { 338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Strict mode, names need to match exactly. 339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (anchor->name() == name) 340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return anchor; 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 346f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void TreeScope::adoptIfNeeded(Node& node) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(this); 349f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!node.isDocumentNode()); 350323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 351f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(!node.m_deletionHasBegun); 352323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 353f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) TreeScopeAdopter adopter(node, *this); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (adopter.needsScopeChange()) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) adopter.execute(); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)static Element* focusedFrameOwnerElement(Frame* focusedFrame, Frame* currentFrame) 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 360f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) for (; focusedFrame; focusedFrame = focusedFrame->tree().parent()) { 361f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (focusedFrame->tree().parent() == currentFrame) { 362f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: This won't work for OOPI. 363f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return focusedFrame->deprecatedLocalOwner(); 364f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Element* TreeScope::adjustedFocusedElement() const 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Document& document = rootNode().document(); 3728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Element* element = document.focusedElement(); 3738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!element && document.page()) 3745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) element = focusedFrameOwnerElement(document.page()->focusController().focusedFrame(), document.frame()); 3757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (!element) 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 378bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) EventPath eventPath(element); 379bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) for (size_t i = 0; i < eventPath.size(); ++i) { 380bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (eventPath[i].node() == rootNode()) { 381bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // eventPath.at(i).target() is one of the followings: 3827757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // - InsertionPoint 3837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // - shadow host 3847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // - Document::focusedElement() 3857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // So, it's safe to do toElement(). 386bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return toElement(eventPath[i].target()->toNode()); 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)unsigned short TreeScope::comparePosition(const TreeScope& otherScope) const 3935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 3941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (otherScope == this) 3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Node::DOCUMENT_POSITION_EQUIVALENT; 3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Vector<const TreeScope*, 16> chain1; 3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Vector<const TreeScope*, 16> chain2; 3995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const TreeScope* current; 4005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (current = this; current; current = current->parentTreeScope()) 4015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) chain1.append(current); 4028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) for (current = &otherScope; current; current = current->parentTreeScope()) 4035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) chain2.append(current); 4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) unsigned index1 = chain1.size(); 4065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) unsigned index2 = chain2.size(); 4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (chain1[index1 - 1] != chain2[index2 - 1]) 4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Node::DOCUMENT_POSITION_DISCONNECTED | Node::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; 4095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (unsigned i = std::min(index1, index2); i; --i) { 4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const TreeScope* child1 = chain1[--index1]; 4125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const TreeScope* child2 = chain2[--index2]; 4135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (child1 != child2) { 41409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* shadowHost1 = child1->rootNode().parentOrShadowHostNode(); 41509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* shadowHost2 = child2->rootNode().parentOrShadowHostNode(); 4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (shadowHost1 != shadowHost2) 417c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return shadowHost1->compareDocumentPosition(shadowHost2, Node::TreatShadowTreesAsDisconnected); 4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 41909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (const ShadowRoot* child = toShadowRoot(child2->rootNode()).olderShadowRoot(); child; child = child->olderShadowRoot()) 4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (child == child1) 4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Node::DOCUMENT_POSITION_FOLLOWING; 4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Node::DOCUMENT_POSITION_PRECEDING; 4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 4255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 4265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // There was no difference between the two parent chains, i.e., one was a subset of the other. The shorter 4285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // chain is the ancestor. 4295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return index1 < index2 ? 4305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Node::DOCUMENT_POSITION_FOLLOWING | Node::DOCUMENT_POSITION_CONTAINED_BY : 4315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Node::DOCUMENT_POSITION_PRECEDING | Node::DOCUMENT_POSITION_CONTAINS; 4325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 4335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 43410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochconst TreeScope* TreeScope::commonAncestorTreeScope(const TreeScope& other) const 43510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 43610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch Vector<const TreeScope*, 16> thisChain; 43710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch for (const TreeScope* tree = this; tree; tree = tree->parentTreeScope()) 43810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch thisChain.append(tree); 43910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 44010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch Vector<const TreeScope*, 16> otherChain; 44110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch for (const TreeScope* tree = &other; tree; tree = tree->parentTreeScope()) 44210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch otherChain.append(tree); 44310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 44410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Keep popping out the last elements of these chains until a mismatched pair is found. If |this| and |other| 44510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // belong to different documents, null will be returned. 44610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch const TreeScope* lastAncestor = 0; 44710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch while (!thisChain.isEmpty() && !otherChain.isEmpty() && thisChain.last() == otherChain.last()) { 44810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch lastAncestor = thisChain.last(); 44910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch thisChain.removeLast(); 45010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch otherChain.removeLast(); 45110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 45210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return lastAncestor; 45310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 45410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 45510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochTreeScope* TreeScope::commonAncestorTreeScope(TreeScope& other) 45610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 45710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return const_cast<TreeScope*>(static_cast<const TreeScope&>(*this).commonAncestorTreeScope(other)); 45810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 45910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void listTreeScopes(Node* node, Vector<TreeScope*, 5>& treeScopes) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (true) { 4638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) treeScopes.append(&node->treeScope()); 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* ancestor = node->shadowHost(); 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ancestor) 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = ancestor; 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TreeScope* commonTreeScope(Node* nodeA, Node* nodeB) 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!nodeA || !nodeB) 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (nodeA->treeScope() == nodeB->treeScope()) 4778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return &nodeA->treeScope(); 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<TreeScope*, 5> treeScopesA; 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listTreeScopes(nodeA, treeScopesA); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<TreeScope*, 5> treeScopesB; 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listTreeScopes(nodeB, treeScopesB); 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t indexA = treeScopesA.size(); 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t indexB = treeScopesB.size(); 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; indexA > 0 && indexB > 0 && treeScopesA[indexA - 1] == treeScopesB[indexB - 1]; --indexA, --indexB) { } 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return treeScopesA[indexA] == treeScopesB[indexB] ? treeScopesA[indexA] : 0; 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 493197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(SECURITY_ASSERT) && !ENABLE(OILPAN) 494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool TreeScope::deletionHasBegun() 495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 49609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return rootNode().m_deletionHasBegun; 497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TreeScope::beginDeletion() 500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 50109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) rootNode().m_deletionHasBegun = true; 502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 505323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)int TreeScope::refCount() const 507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 50809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return rootNode().refCount(); 509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 510323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 511926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 5128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool TreeScope::isInclusiveAncestorOf(const TreeScope& scope) const 51381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 5148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) for (const TreeScope* current = &scope; current; current = current->parentTreeScope()) { 5158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (current == this) 51681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return true; 51781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 51881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return false; 51981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 52081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 521e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochElement* TreeScope::getElementByAccessKey(const String& key) const 522e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 523e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (key.isEmpty()) 524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return 0; 525e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch Element* result = 0; 52609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node& root = rootNode(); 52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (Element* element = ElementTraversal::firstWithin(root); element; element = ElementTraversal::next(*element, &root)) { 528f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (equalIgnoringCase(element->fastGetAttribute(accesskeyAttr), key)) 529e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch result = element; 530e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch for (ShadowRoot* shadowRoot = element->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) { 531e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (Element* shadowResult = shadowRoot->getElementByAccessKey(key)) 532e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch result = shadowResult; 533e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 534e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 535e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return result; 536e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 537e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 53809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TreeScope::setNeedsStyleRecalcForViewportUnits() 53909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 54009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (Element* element = ElementTraversal::firstWithin(rootNode()); element; element = ElementTraversal::nextIncludingPseudo(*element)) { 54109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (ShadowRoot* root = element->youngestShadowRoot(); root; root = root->olderShadowRoot()) 54209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) root->setNeedsStyleRecalcForViewportUnits(); 54309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RenderStyle* style = element->renderStyle(); 54409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (style && style->hasViewportUnits()) 54509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) element->setNeedsStyleRecalc(LocalStyleChange); 54609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 54709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 54809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 549f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid TreeScope::trace(Visitor* visitor) 550f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{ 551323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_rootNode); 552323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_document); 553f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu visitor->trace(m_parentTreeScope); 554f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles) visitor->trace(m_idTargetObserverRegistry); 555f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu visitor->trace(m_selection); 556197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_elementsById); 557197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_imageMapsByName); 558197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_labelsByForAttribute); 559c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_scopedStyleResolver); 560f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 561f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 562c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 563