/*
* Copyright (C) 2011 Google Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef TreeScope_h
#define TreeScope_h
#include "ContainerNode.h"
#include "DocumentOrderedMap.h"
namespace WebCore {
class Element;
class HTMLMapElement;
class TreeScope : public ContainerNode {
friend class Document;
public:
TreeScope* parentTreeScope() const { return m_parentTreeScope; }
Element* getElementById(const AtomicString&) const;
bool hasElementWithId(AtomicStringImpl* id) const;
bool containsMultipleElementsWithId(const AtomicString& id) const;
void addElementById(const AtomicString& elementId, Element*);
void removeElementById(const AtomicString& elementId, Element*);
void addImageMap(HTMLMapElement*);
void removeImageMap(HTMLMapElement*);
HTMLMapElement* getImageMap(const String& url) const;
Element* getElementByAccessKey(const String& key) const;
void invalidateAccessKeyMap();
void addNodeListCache() { ++m_numNodeListCaches; }
void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeListCaches; }
bool hasNodeListCaches() const { return m_numNodeListCaches; }
// Find first anchor with the given name.
// First searches for an element with the given ID, but if that fails, then looks
// for an anchor with the given name. ID matching is always case sensitive, but
// Anchor name matching is case sensitive in strict mode and not case sensitive in
// quirks mode for historical compatibility reasons.
Element* findAnchor(const String& name);
protected:
TreeScope(Document*, ConstructionType = CreateContainer);
virtual ~TreeScope();
void destroyTreeScopeData();
void setParentTreeScope(TreeScope*);
private:
TreeScope* m_parentTreeScope;
DocumentOrderedMap m_elementsById;
DocumentOrderedMap m_imageMapsByName;
mutable HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
mutable bool m_accessKeyMapValid;
unsigned m_numNodeListCaches;
};
inline bool TreeScope::hasElementWithId(AtomicStringImpl* id) const
{
ASSERT(id);
return m_elementsById.contains(id);
}
inline bool TreeScope::containsMultipleElementsWithId(const AtomicString& id) const
{
return m_elementsById.containsMultiple(id.impl());
}
} // namespace WebCore
#endif // TreeScope_h