Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.
      3  * Copyright (C) 2008 David Smith <catfish.man (at) gmail.com>
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  *
     20  */
     21 
     22 #ifndef ElementRareData_h
     23 #define ElementRareData_h
     24 
     25 #include "core/animation/ActiveAnimations.h"
     26 #include "core/dom/Attr.h"
     27 #include "core/dom/DatasetDOMStringMap.h"
     28 #include "core/dom/NamedNodeMap.h"
     29 #include "core/dom/NodeRareData.h"
     30 #include "core/dom/PseudoElement.h"
     31 #include "core/dom/custom/CustomElementDefinition.h"
     32 #include "core/dom/shadow/ElementShadow.h"
     33 #include "core/html/ClassList.h"
     34 #include "core/html/ime/InputMethodContext.h"
     35 #include "core/rendering/style/StyleInheritedData.h"
     36 #include "platform/heap/Handle.h"
     37 #include "wtf/OwnPtr.h"
     38 
     39 namespace blink {
     40 
     41 class HTMLElement;
     42 
     43 class ElementRareData : public NodeRareData {
     44 public:
     45     static ElementRareData* create(RenderObject* renderer)
     46     {
     47         return new ElementRareData(renderer);
     48     }
     49 
     50     ~ElementRareData();
     51 
     52     void setPseudoElement(PseudoId, PassRefPtrWillBeRawPtr<PseudoElement>);
     53     PseudoElement* pseudoElement(PseudoId) const;
     54 
     55     short tabIndex() const { return m_tabindex; }
     56 
     57     void setTabIndexExplicitly(short index)
     58     {
     59         m_tabindex = index;
     60         setElementFlag(TabIndexWasSetExplicitly, true);
     61     }
     62 
     63     void clearTabIndexExplicitly()
     64     {
     65         m_tabindex = 0;
     66         clearElementFlag(TabIndexWasSetExplicitly);
     67     }
     68 
     69     CSSStyleDeclaration& ensureInlineCSSStyleDeclaration(Element* ownerElement);
     70 
     71     void clearShadow() { m_shadow = nullptr; }
     72     ElementShadow* shadow() const { return m_shadow.get(); }
     73     ElementShadow& ensureShadow()
     74     {
     75         if (!m_shadow)
     76             m_shadow = ElementShadow::create();
     77         return *m_shadow;
     78     }
     79 
     80     NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
     81     void setAttributeMap(PassOwnPtrWillBeRawPtr<NamedNodeMap> attributeMap) { m_attributeMap = attributeMap; }
     82 
     83     RenderStyle* computedStyle() const { return m_computedStyle.get(); }
     84     void setComputedStyle(PassRefPtr<RenderStyle> computedStyle) { m_computedStyle = computedStyle; }
     85     void clearComputedStyle() { m_computedStyle = nullptr; }
     86 
     87     ClassList* classList() const { return m_classList.get(); }
     88     void setClassList(PassOwnPtrWillBeRawPtr<ClassList> classList) { m_classList = classList; }
     89     void clearClassListValueForQuirksMode()
     90     {
     91         if (!m_classList)
     92             return;
     93         m_classList->clearValueForQuirksMode();
     94     }
     95 
     96     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
     97     void setDataset(PassOwnPtrWillBeRawPtr<DatasetDOMStringMap> dataset) { m_dataset = dataset; }
     98 
     99     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
    100     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
    101 
    102     IntSize savedLayerScrollOffset() const { return m_savedLayerScrollOffset; }
    103     void setSavedLayerScrollOffset(IntSize size) { m_savedLayerScrollOffset = size; }
    104 
    105     ActiveAnimations* activeAnimations() { return m_activeAnimations.get(); }
    106     void setActiveAnimations(PassOwnPtrWillBeRawPtr<ActiveAnimations> activeAnimations)
    107     {
    108         m_activeAnimations = activeAnimations;
    109     }
    110 
    111     bool hasInputMethodContext() const { return m_inputMethodContext; }
    112     InputMethodContext& ensureInputMethodContext(HTMLElement* element)
    113     {
    114         if (!m_inputMethodContext)
    115             m_inputMethodContext = InputMethodContext::create(element);
    116         return *m_inputMethodContext;
    117     }
    118 
    119     bool hasPseudoElements() const;
    120     void clearPseudoElements();
    121 
    122     void setCustomElementDefinition(PassRefPtr<CustomElementDefinition> definition) { m_customElementDefinition = definition; }
    123     CustomElementDefinition* customElementDefinition() const { return m_customElementDefinition.get(); }
    124 
    125     WillBeHeapVector<RefPtrWillBeMember<Attr> >& ensureAttrNodeList();
    126     WillBeHeapVector<RefPtrWillBeMember<Attr> >* attrNodeList() { return m_attrNodeList.get(); }
    127     void removeAttrNodeList() { m_attrNodeList.clear(); }
    128 
    129     void traceAfterDispatch(Visitor*);
    130 
    131 private:
    132     short m_tabindex;
    133 
    134     LayoutSize m_minimumSizeForResizing;
    135     IntSize m_savedLayerScrollOffset;
    136 
    137     OwnPtrWillBeMember<DatasetDOMStringMap> m_dataset;
    138     OwnPtrWillBeMember<ClassList> m_classList;
    139     OwnPtrWillBeMember<ElementShadow> m_shadow;
    140     OwnPtrWillBeMember<NamedNodeMap> m_attributeMap;
    141     OwnPtrWillBeMember<WillBeHeapVector<RefPtrWillBeMember<Attr> > > m_attrNodeList;
    142     OwnPtrWillBeMember<InputMethodContext> m_inputMethodContext;
    143     OwnPtrWillBeMember<ActiveAnimations> m_activeAnimations;
    144     OwnPtrWillBeMember<InlineCSSStyleDeclaration> m_cssomWrapper;
    145 
    146     RefPtr<RenderStyle> m_computedStyle;
    147     RefPtr<CustomElementDefinition> m_customElementDefinition;
    148 
    149     RefPtrWillBeMember<PseudoElement> m_generatedBefore;
    150     RefPtrWillBeMember<PseudoElement> m_generatedAfter;
    151     RefPtrWillBeMember<PseudoElement> m_backdrop;
    152 
    153     explicit ElementRareData(RenderObject*);
    154 };
    155 
    156 inline IntSize defaultMinimumSizeForResizing()
    157 {
    158     return IntSize(LayoutUnit::max(), LayoutUnit::max());
    159 }
    160 
    161 inline ElementRareData::ElementRareData(RenderObject* renderer)
    162     : NodeRareData(renderer)
    163     , m_tabindex(0)
    164     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
    165 {
    166     m_isElementRareData = true;
    167 }
    168 
    169 inline ElementRareData::~ElementRareData()
    170 {
    171 #if !ENABLE(OILPAN)
    172     ASSERT(!m_shadow);
    173 #endif
    174     ASSERT(!m_generatedBefore);
    175     ASSERT(!m_generatedAfter);
    176     ASSERT(!m_backdrop);
    177 }
    178 
    179 inline bool ElementRareData::hasPseudoElements() const
    180 {
    181     return m_generatedBefore || m_generatedAfter || m_backdrop;
    182 }
    183 
    184 inline void ElementRareData::clearPseudoElements()
    185 {
    186     setPseudoElement(BEFORE, nullptr);
    187     setPseudoElement(AFTER, nullptr);
    188     setPseudoElement(BACKDROP, nullptr);
    189 }
    190 
    191 inline void ElementRareData::setPseudoElement(PseudoId pseudoId, PassRefPtrWillBeRawPtr<PseudoElement> element)
    192 {
    193     switch (pseudoId) {
    194     case BEFORE:
    195         if (m_generatedBefore)
    196             m_generatedBefore->dispose();
    197         m_generatedBefore = element;
    198         break;
    199     case AFTER:
    200         if (m_generatedAfter)
    201             m_generatedAfter->dispose();
    202         m_generatedAfter = element;
    203         break;
    204     case BACKDROP:
    205         if (m_backdrop)
    206             m_backdrop->dispose();
    207         m_backdrop = element;
    208         break;
    209     default:
    210         ASSERT_NOT_REACHED();
    211     }
    212 }
    213 
    214 inline PseudoElement* ElementRareData::pseudoElement(PseudoId pseudoId) const
    215 {
    216     switch (pseudoId) {
    217     case BEFORE:
    218         return m_generatedBefore.get();
    219     case AFTER:
    220         return m_generatedAfter.get();
    221     case BACKDROP:
    222         return m_backdrop.get();
    223     default:
    224         return 0;
    225     }
    226 }
    227 
    228 } // namespace
    229 
    230 #endif // ElementRareData_h
    231