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