OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 20 matching lines...) Expand all Loading... |
31 #include "wtf/RefPtr.h" | 31 #include "wtf/RefPtr.h" |
32 #include "wtf/Vector.h" | 32 #include "wtf/Vector.h" |
33 | 33 |
34 namespace WebCore { | 34 namespace WebCore { |
35 | 35 |
36 class Element; | 36 class Element; |
37 | 37 |
38 // This may end up merged into HTMLElementStack. | 38 // This may end up merged into HTMLElementStack. |
39 class HTMLFormattingElementList { | 39 class HTMLFormattingElementList { |
40 WTF_MAKE_NONCOPYABLE(HTMLFormattingElementList); | 40 WTF_MAKE_NONCOPYABLE(HTMLFormattingElementList); |
| 41 DISALLOW_ALLOCATION(); |
41 public: | 42 public: |
42 HTMLFormattingElementList(); | 43 HTMLFormattingElementList(); |
43 ~HTMLFormattingElementList(); | 44 ~HTMLFormattingElementList(); |
44 | 45 |
45 // Ideally Entry would be private, but HTMLTreeBuilder has to coordinate | 46 // Ideally Entry would be private, but HTMLTreeBuilder has to coordinate |
46 // between the HTMLFormattingElementList and HTMLElementStack and needs | 47 // between the HTMLFormattingElementList and HTMLElementStack and needs |
47 // access to Entry::isMarker() and Entry::replaceElement() to do so. | 48 // access to Entry::isMarker() and Entry::replaceElement() to do so. |
48 class Entry { | 49 class Entry { |
| 50 ALLOW_ONLY_INLINE_ALLOCATION(); |
49 public: | 51 public: |
50 // Inline because they're hot and Vector<T> uses them. | 52 // Inline because they're hot and Vector<T> uses them. |
51 explicit Entry(PassRefPtr<HTMLStackItem> item) | 53 explicit Entry(PassRefPtrWillBeRawPtr<HTMLStackItem> item) |
52 : m_item(item) | 54 : m_item(item) |
53 { | 55 { |
54 } | 56 } |
55 enum MarkerEntryType { MarkerEntry }; | 57 enum MarkerEntryType { MarkerEntry }; |
56 explicit Entry(MarkerEntryType) | 58 explicit Entry(MarkerEntryType) |
57 : m_item(nullptr) | 59 : m_item(nullptr) |
58 { | 60 { |
59 } | 61 } |
60 ~Entry() {} | 62 ~Entry() {} |
61 | 63 |
62 bool isMarker() const { return !m_item; } | 64 bool isMarker() const { return !m_item; } |
63 | 65 |
64 PassRefPtr<HTMLStackItem> stackItem() const { return m_item; } | 66 PassRefPtrWillBeRawPtr<HTMLStackItem> stackItem() const { return m_item;
} |
65 Element* element() const | 67 Element* element() const |
66 { | 68 { |
67 // The fact that !m_item == isMarker() is an implementation detail | 69 // The fact that !m_item == isMarker() is an implementation detail |
68 // callers should check isMarker() before calling element(). | 70 // callers should check isMarker() before calling element(). |
69 ASSERT(m_item); | 71 ASSERT(m_item); |
70 return m_item->element(); | 72 return m_item->element(); |
71 } | 73 } |
72 void replaceElement(PassRefPtr<HTMLStackItem> item) { m_item = item; } | 74 void replaceElement(PassRefPtrWillBeRawPtr<HTMLStackItem> item) { m_item
= item; } |
73 | 75 |
74 // Needed for use with Vector. These are super-hot and must be inline. | 76 // Needed for use with Vector. These are super-hot and must be inline. |
75 bool operator==(Element* element) const { return !m_item ? !element : m_
item->element() == element; } | 77 bool operator==(Element* element) const { return !m_item ? !element : m_
item->element() == element; } |
76 bool operator!=(Element* element) const { return !m_item ? !!element : m
_item->element() != element; } | 78 bool operator!=(Element* element) const { return !m_item ? !!element : m
_item->element() != element; } |
77 | 79 |
| 80 void trace(Visitor* visitor) { visitor->trace(m_item); } |
| 81 |
78 private: | 82 private: |
79 RefPtr<HTMLStackItem> m_item; | 83 RefPtrWillBeMember<HTMLStackItem> m_item; |
80 }; | 84 }; |
81 | 85 |
82 class Bookmark { | 86 class Bookmark { |
83 public: | 87 public: |
84 explicit Bookmark(Entry* entry) | 88 explicit Bookmark(Entry* entry) |
85 : m_hasBeenMoved(false) | 89 : m_hasBeenMoved(false) |
86 , m_mark(entry) | 90 , m_mark(entry) |
87 { | 91 { |
88 } | 92 } |
89 | 93 |
(...skipping 11 matching lines...) Expand all Loading... |
101 Entry* m_mark; | 105 Entry* m_mark; |
102 }; | 106 }; |
103 | 107 |
104 bool isEmpty() const { return !size(); } | 108 bool isEmpty() const { return !size(); } |
105 size_t size() const { return m_entries.size(); } | 109 size_t size() const { return m_entries.size(); } |
106 | 110 |
107 Element* closestElementInScopeWithName(const AtomicString&); | 111 Element* closestElementInScopeWithName(const AtomicString&); |
108 | 112 |
109 Entry* find(Element*); | 113 Entry* find(Element*); |
110 bool contains(Element*); | 114 bool contains(Element*); |
111 void append(PassRefPtr<HTMLStackItem>); | 115 void append(PassRefPtrWillBeRawPtr<HTMLStackItem>); |
112 void remove(Element*); | 116 void remove(Element*); |
113 | 117 |
114 Bookmark bookmarkFor(Element*); | 118 Bookmark bookmarkFor(Element*); |
115 void swapTo(Element* oldElement, PassRefPtr<HTMLStackItem> newItem, const Bo
okmark&); | 119 void swapTo(Element* oldElement, PassRefPtrWillBeRawPtr<HTMLStackItem> newIt
em, const Bookmark&); |
116 | 120 |
117 void appendMarker(); | 121 void appendMarker(); |
118 // clearToLastMarker also clears the marker (per the HTML5 spec). | 122 // clearToLastMarker also clears the marker (per the HTML5 spec). |
119 void clearToLastMarker(); | 123 void clearToLastMarker(); |
120 | 124 |
121 const Entry& at(size_t i) const { return m_entries[i]; } | 125 const Entry& at(size_t i) const { return m_entries[i]; } |
122 Entry& at(size_t i) { return m_entries[i]; } | 126 Entry& at(size_t i) { return m_entries[i]; } |
123 | 127 |
| 128 void trace(Visitor* visitor) { visitor->trace(m_entries); } |
| 129 |
124 #ifndef NDEBUG | 130 #ifndef NDEBUG |
125 void show(); | 131 void show(); |
126 #endif | 132 #endif |
127 | 133 |
128 private: | 134 private: |
129 Entry* first() { return &at(0); } | 135 Entry* first() { return &at(0); } |
130 | 136 |
131 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#
list-of-active-formatting-elements | 137 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#
list-of-active-formatting-elements |
132 // These functions enforce the "Noah's Ark" condition, which removes redunda
nt mis-nested elements. | 138 // These functions enforce the "Noah's Ark" condition, which removes redunda
nt mis-nested elements. |
133 void tryToEnsureNoahsArkConditionQuickly(HTMLStackItem*, Vector<HTMLStackIte
m*>& remainingCandiates); | 139 void tryToEnsureNoahsArkConditionQuickly(HTMLStackItem*, WillBeHeapVector<Ra
wPtrWillBeMember<HTMLStackItem> >& remainingCandiates); |
134 void ensureNoahsArkCondition(HTMLStackItem*); | 140 void ensureNoahsArkCondition(HTMLStackItem*); |
135 | 141 |
136 Vector<Entry> m_entries; | 142 WillBeHeapVector<Entry> m_entries; |
137 }; | 143 }; |
138 | 144 |
139 } | 145 } // namespace WebCore |
| 146 |
| 147 WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(WebCore::HTMLFormattingElementList::E
ntry); |
140 | 148 |
141 #endif // HTMLFormattingElementList_h | 149 #endif // HTMLFormattingElementList_h |
OLD | NEW |