Changeset 266714 in webkit
- Timestamp:
- Sep 7, 2020 9:30:14 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r266712 r266714 1 2020-09-07 Ryosuke Niwa <rniwa@webkit.org> 2 3 Move all remaining flags from ElementRareData to Node to reduce the frequency 4 https://bugs.webkit.org/show_bug.cgi?id=216208 5 6 Reviewed by Darin Adler. 7 8 This patch moves all remaining bit flags from ElementRareData to Node::m_nodeFlags. It also stores 9 tabIndex of 0 and -1 in Node::m_nodeFlags to avoid creating ElementRareData for these common values. 10 11 No new tests since there should be no behavioral change. 12 13 * dom/Element.cpp: 14 (WebCore::Element::clearTabIndexExplicitlyIfNeeded): Deleted. Merged into setTabIndexExplicitly. 15 (WebCore::Element::setTabIndexExplicitly): Now takes Optional<int>. Stores 0 and -1 as node flags. 16 (WebCore::Element::tabIndexSetExplicitly const): Added the special casing for 0 and -1. 17 (WebCore::Element::removedFromAncestor): 18 (WebCore::Element::containsFullScreenElement const): Deleted. 19 (WebCore::Element::setContainsFullScreenElement): 20 (WebCore::Element::hasPendingResources const): Deleted. 21 (WebCore::Element::setHasPendingResources): Deleted. 22 (WebCore::Element::clearHasPendingResources): Deleted. 23 (WebCore::Element::hasCSSAnimation const): Deleted. 24 (WebCore::Element::setHasCSSAnimation): Deleted. 25 (WebCore::Element::clearHasCSSAnimation): Deleted. 26 (WebCore::Element::createElementIdentifier): 27 * dom/Element.h: 28 (WebCore::Element::hasPendingResources const): Moved here from Element.cpp. 29 (WebCore::Element::setHasPendingResources): Ditto. 30 (WebCore::Element::clearHasPendingResources): Ditto. 31 (WebCore::Element::hasCSSAnimation const): Ditto. 32 (WebCore::Element::setHasCSSAnimation): Ditto. 33 (WebCore::Element::clearHasCSSAnimation): Ditto. 34 (WebCore::Element::containsFullScreenElement const): Ditto. 35 * dom/ElementRareData.cpp: 36 * dom/ElementRareData.h: 37 (WebCore::ElementRareData::tabIndex const): Deleted. 38 (WebCore::ElementRareData::setTabIndexExplicitly): Deleted. 39 (WebCore::ElementRareData::tabIndexSetExplicitly const): Deleted. 40 (WebCore::ElementRareData::clearTabIndexExplicitly): Deleted. 41 (WebCore::ElementRareData::containsFullScreenElement): Deleted. 42 (WebCore::ElementRareData::setContainsFullScreenElement): Deleted. 43 (WebCore::ElementRareData::hasPendingResources const): Deleted. 44 (WebCore::ElementRareData::setHasPendingResources): Deleted. 45 (WebCore::ElementRareData::hasCSSAnimation const): Deleted. 46 (WebCore::ElementRareData::setHasCSSAnimation): Deleted. 47 (WebCore::ElementRareData::hasElementIdentifier const): Deleted. 48 (WebCore::ElementRareData::setHasElementIdentifier): Deleted. 49 (WebCore::ElementRareData::useTypes const): Added the missing use types for style maps, part list, 50 and part names. 51 (WebCore::ElementRareData::ElementRareData): 52 (WebCore::ElementRareData::unusualTabIndex const): Renamed from tabIndex. 53 (WebCore::ElementRareData::setUnusualTabIndex): Ditto from setTabIndexExplicitly. 54 * dom/Node.cpp: 55 (WebCore::stringForRareDataUseType): Added the missing strings. 56 * dom/Node.h: 57 (WebCore::Node::NodeFlags): Moved bit flags from ElementRareData and reserved the two highest bits 58 to store TabIndexState. 59 (WebCore::Node::s_tabIndexStateBitOffset): Added. 60 (WebCore::Node::s_tabIndexStateBitMask): Added. 61 (WebCore::Node::TabIndexState): Added. 62 (WebCore::Node::tabIndexState const): Added. 63 (WebCore::Node::setTabIndexState): Added. 64 * dom/NodeRareData.h: 65 (WebCore::NodeRareData::UseType): Added the missing use types: style maps, part list, and part names. 66 * html/HTMLElement.cpp: 67 (WebCore::HTMLElement::parseAttribute): 68 * mathml/MathMLElement.cpp: 69 (WebCore::MathMLElement::parseAttribute): 70 * svg/SVGElement.cpp: 71 (WebCore::SVGElement::parseAttribute): 72 1 73 2020-09-07 Chris Dumez <cdumez@apple.com> 2 74 -
trunk/Source/WebCore/dom/Element.cpp
r266691 r266714 242 242 } 243 243 244 void Element::clearTabIndexExplicitlyIfNeeded() 245 { 246 if (hasRareData()) 247 elementRareData()->clearTabIndexExplicitly(); 248 } 249 250 void Element::setTabIndexExplicitly(int tabIndex) 251 { 252 ensureElementRareData().setTabIndexExplicitly(tabIndex); 244 void Element::setTabIndexExplicitly(Optional<int> tabIndex) 245 { 246 if (!tabIndex) { 247 setTabIndexState(TabIndexState::NotSet); 248 return; 249 } 250 setTabIndexState([this, value = tabIndex.value()]() { 251 switch (value) { 252 case 0: 253 return TabIndexState::Zero; 254 case -1: 255 return TabIndexState::NegativeOne; 256 default: 257 ensureElementRareData().setUnusualTabIndex(value); 258 return TabIndexState::InRareData; 259 } 260 }()); 253 261 } 254 262 255 263 Optional<int> Element::tabIndexSetExplicitly() const 256 264 { 257 if (!hasRareData()) 265 switch (tabIndexState()) { 266 case TabIndexState::NotSet: 258 267 return WTF::nullopt; 259 return elementRareData()->tabIndex(); 268 case TabIndexState::Zero: 269 return 0; 270 case TabIndexState::NegativeOne: 271 return -1; 272 case TabIndexState::InRareData: 273 ASSERT(hasRareData()); 274 return elementRareData()->unusualTabIndex(); 275 } 276 ASSERT_NOT_REACHED(); 277 return WTF::nullopt; 260 278 } 261 279 … … 2267 2285 #endif 2268 2286 2269 if ( hasRareData() && elementRareData()->hasElementIdentifier()) {2287 if (getFlag(HasElementIdentifierFlag)) { 2270 2288 document().identifiedElementWasRemovedFromDocument(*this); 2271 elementRareData()->setHasElementIdentifier(false);2289 clearFlag(HasElementIdentifierFlag); 2272 2290 } 2273 2291 } … … 3717 3735 } 3718 3736 3719 bool Element::containsFullScreenElement() const3720 {3721 return hasRareData() && elementRareData()->containsFullScreenElement();3722 }3723 3724 3737 void Element::setContainsFullScreenElement(bool flag) 3725 3738 { 3726 ensureElementRareData().setContainsFullScreenElement(flag); 3739 if (flag) 3740 setFlag(ContainsFullScreenElementFlag); 3741 else 3742 clearFlag(ContainsFullScreenElementFlag); 3727 3743 invalidateStyleAndLayerComposition(); 3728 3744 } … … 4365 4381 else 4366 4382 m_elementData = downcast<ShareableElementData>(*m_elementData).makeUniqueCopy(); 4367 }4368 4369 bool Element::hasPendingResources() const4370 {4371 return hasRareData() && elementRareData()->hasPendingResources();4372 }4373 4374 void Element::setHasPendingResources()4375 {4376 ensureElementRareData().setHasPendingResources(true);4377 }4378 4379 void Element::clearHasPendingResources()4380 {4381 if (!hasRareData())4382 return;4383 elementRareData()->setHasPendingResources(false);4384 }4385 4386 bool Element::hasCSSAnimation() const4387 {4388 return hasRareData() && elementRareData()->hasCSSAnimation();4389 }4390 4391 void Element::setHasCSSAnimation()4392 {4393 ensureElementRareData().setHasCSSAnimation(true);4394 }4395 4396 void Element::clearHasCSSAnimation()4397 {4398 if (!hasRareData())4399 return;4400 elementRareData()->setHasCSSAnimation(false);4401 4383 } 4402 4384 … … 4612 4594 ElementIdentifier Element::createElementIdentifier() 4613 4595 { 4614 auto& rareData = ensureElementRareData(); 4615 ASSERT(!rareData.hasElementIdentifier()); 4616 4617 rareData.setHasElementIdentifier(true); 4596 ASSERT(!getFlag(HasElementIdentifierFlag)); 4597 setFlag(HasElementIdentifierFlag); 4618 4598 return ElementIdentifier::generate(); 4619 4599 } -
trunk/Source/WebCore/dom/Element.h
r266578 r266714 36 36 #include <JavaScriptCore/Strong.h> 37 37 38 #define DUMP_NODE_STATISTICS 0 39 38 40 namespace WebCore { 39 41 … … 480 482 virtual bool childShouldCreateRenderer(const Node&) const; 481 483 482 bool hasPendingResources() const ;483 void setHasPendingResources() ;484 void clearHasPendingResources() ;484 bool hasPendingResources() const { return getFlag(HasPendingResourcesFlag); } 485 void setHasPendingResources() { setFlag(HasPendingResourcesFlag); } 486 void clearHasPendingResources() { clearFlag(HasPendingResourcesFlag); } 485 487 virtual void buildPendingResource() { }; 486 488 487 bool hasCSSAnimation() const ;488 void setHasCSSAnimation() ;489 void clearHasCSSAnimation() ;489 bool hasCSSAnimation() const { return getFlag(HasCSSAnimationFlag); } 490 void setHasCSSAnimation() { setFlag(HasCSSAnimationFlag); } 491 void clearHasCSSAnimation() { clearFlag(HasCSSAnimationFlag); } 490 492 491 493 KeyframeEffectStack* keyframeEffectStack() const; … … 512 514 513 515 #if ENABLE(FULLSCREEN_API) 514 WEBCORE_EXPORT bool containsFullScreenElement() const;516 bool containsFullScreenElement() const { return getFlag(ContainsFullScreenElementFlag); } 515 517 void setContainsFullScreenElement(bool); 516 518 void setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(bool); … … 636 638 virtual void parserDidSetAttributes(); 637 639 638 void clearTabIndexExplicitlyIfNeeded(); 639 void setTabIndexExplicitly(int); 640 void setTabIndexExplicitly(Optional<int>); 640 641 641 642 void classAttributeChanged(const AtomString& newClassString); -
trunk/Source/WebCore/dom/ElementRareData.cpp
r252253 r266714 37 37 int tabIndex; 38 38 unsigned short childIndex; 39 #if ENABLE(FULLSCREEN_API)40 unsigned bitfields : 12;41 #else42 unsigned bitfields : 11;43 #endif44 39 LayoutSize sizeForResizing; 45 40 IntPoint savedLayerScrollPosition; -
trunk/Source/WebCore/dom/ElementRareData.h
r258316 r266714 57 57 void resetComputedStyle(); 58 58 void resetStyleRelations(); 59 60 Optional<int> tabIndex() const { return m_tabIndexWasSetExplicitly ? Optional<int> { m_tabIndex } : WTF::nullopt; } 61 void setTabIndexExplicitly(int index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; } 62 bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; } 63 void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; } 64 65 #if ENABLE(FULLSCREEN_API) 66 bool containsFullScreenElement() { return m_containsFullScreenElement; } 67 void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; } 68 #endif 59 60 int unusualTabIndex() const; 61 void setUnusualTabIndex(int); 69 62 70 63 unsigned childIndex() const { return m_childIndex; } … … 97 90 void setSavedLayerScrollPosition(IntPoint position) { m_savedLayerScrollPosition = position; } 98 91 99 bool hasPendingResources() const { return m_hasPendingResources; }100 void setHasPendingResources(bool has) { m_hasPendingResources = has; }101 102 bool hasCSSAnimation() const { return m_hasCSSAnimation; }103 void setHasCSSAnimation(bool value) { m_hasCSSAnimation = value; }104 105 92 ElementAnimationRareData* elementAnimationRareData() { return m_animationRareData.get(); } 106 93 ElementAnimationRareData& ensureAnimationRareData(); 107 108 bool hasElementIdentifier() const { return m_hasElementIdentifier; }109 void setHasElementIdentifier(bool value) { m_hasElementIdentifier = value; }110 94 111 95 DOMTokenList* partList() const { return m_partList.get(); } … … 134 118 { 135 119 auto result = NodeRareData::useTypes(); 136 if (m_ tabIndexWasSetExplicitly)120 if (m_unusualTabIndex) 137 121 result.add(UseType::TabIndex); 138 122 if (m_minimumSizeForResizing != defaultMinimumSizeForResizing()) … … 158 142 result.add(UseType::ResizeObserver); 159 143 #endif 144 if (m_animationRareData) 145 result.add(UseType::Animations); 160 146 if (m_beforePseudoElement || m_afterPseudoElement) 161 147 result.add(UseType::PseudoElements); 162 if (m_animationRareData) 163 result.add(UseType::Animations); 148 #if ENABLE(CSS_TYPED_OM) 149 if (m_attributeStyleMap) 150 result.add(UseType::StyleMap); 151 #endif 152 if (m_partList) 153 result.add(UseType::PartList); 154 if (!m_partNames.isEmpty()) 155 result.add(UseType::PartNames); 164 156 return result; 165 157 } … … 167 159 168 160 private: 169 int m_tabIndex; 170 unsigned short m_childIndex; 171 unsigned m_tabIndexWasSetExplicitly : 1; 172 #if ENABLE(FULLSCREEN_API) 173 unsigned m_containsFullScreenElement : 1; 174 #endif 175 unsigned m_hasPendingResources : 1; 176 unsigned m_hasCSSAnimation : 1; 177 unsigned m_hasElementIdentifier : 1; 161 int m_unusualTabIndex { 0 }; 162 unsigned short m_childIndex { 0 }; 178 163 179 164 LayoutSize m_minimumSizeForResizing; … … 211 196 inline ElementRareData::ElementRareData() 212 197 : NodeRareData(Type::Element) 213 , m_tabIndex(0)214 , m_childIndex(0)215 , m_tabIndexWasSetExplicitly(false)216 #if ENABLE(FULLSCREEN_API)217 , m_containsFullScreenElement(false)218 #endif219 , m_hasPendingResources(false)220 , m_hasCSSAnimation(false)221 , m_hasElementIdentifier(false)222 198 , m_minimumSizeForResizing(defaultMinimumSizeForResizing()) 223 199 { … … 253 229 } 254 230 231 inline int ElementRareData::unusualTabIndex() const 232 { 233 ASSERT(m_unusualTabIndex); // setUnusualTabIndex must have been called before this. 234 return m_unusualTabIndex; 235 } 236 237 inline void ElementRareData::setUnusualTabIndex(int tabIndex) 238 { 239 ASSERT(tabIndex && tabIndex != -1); // Common values of 0 and -1 are stored as TabIndexState in Node. 240 m_unusualTabIndex = tabIndex; 241 } 242 255 243 inline ElementAnimationRareData& ElementRareData::ensureAnimationRareData() 256 244 { -
trunk/Source/WebCore/dom/Node.cpp
r266618 r266714 131 131 case NodeRareData::UseType::InteractionObserver: 132 132 return "InteractionObserver"; 133 case NodeRareData::UseType::ResizeObserver: 134 return "ResizeObserver"; 135 case NodeRareData::UseType::Animations: 136 return "Animations"; 133 137 case NodeRareData::UseType::PseudoElements: 134 138 return "PseudoElements"; 135 case NodeRareData::UseType::Animations: 136 return "Animations"; 139 case NodeRareData::UseType::StyleMap: 140 return "StyleMap"; 141 case NodeRareData::UseType::PartList: 142 return "PartList"; 143 case NodeRareData::UseType::PartNames: 144 return "PartNames"; 137 145 } 138 146 return nullptr; -
trunk/Source/WebCore/dom/Node.h
r266578 r266714 40 40 #include <wtf/URLHash.h> 41 41 #include <wtf/WeakPtr.h> 42 43 // This needs to be here because Document.h also depends on it.44 #define DUMP_NODE_STATISTICS 045 42 46 43 namespace WTF { … … 544 541 HasCustomStyleResolveCallbacksFlag = 1 << 22, 545 542 546 // Bits 23-31 are free. 543 HasPendingResourcesFlag = 1 << 23, 544 HasCSSAnimationFlag = 1 << 24, 545 HasElementIdentifierFlag = 1 << 25, 546 #if ENABLE(FULLSCREEN_API) 547 ContainsFullScreenElementFlag = 1 << 26, 548 #endif 549 550 // Bits 27-29 are free. 551 // Bits 30-31: TabIndexState 547 552 548 553 DefaultNodeFlags = IsParsingChildrenFinishedFlag 554 }; 555 556 static constexpr unsigned s_tabIndexStateBitOffset = 30; 557 static constexpr uint32_t s_tabIndexStateBitMask = 3U << s_tabIndexStateBitOffset; 558 enum class TabIndexState : uint8_t { 559 NotSet = 0, 560 Zero = 1, 561 NegativeOne = 2, 562 InRareData = 3, 549 563 }; 550 564 … … 553 567 void setFlag(NodeFlags mask) const { m_nodeFlags |= mask; } 554 568 void clearFlag(NodeFlags mask) const { m_nodeFlags &= ~mask; } 569 570 TabIndexState tabIndexState() const { return static_cast<TabIndexState>((m_nodeFlags & s_tabIndexStateBitMask) >> s_tabIndexStateBitOffset); } 571 void setTabIndexState(TabIndexState state) { m_nodeFlags = (m_nodeFlags & ~s_tabIndexStateBitMask) | (static_cast<uint32_t>(state) << s_tabIndexStateBitOffset); } 555 572 556 573 bool isParsingChildrenFinished() const { return getFlag(IsParsingChildrenFinishedFlag); } -
trunk/Source/WebCore/dom/NodeRareData.h
r264488 r266714 245 245 public: 246 246 #if defined(DUMP_NODE_STATISTICS) && DUMP_NODE_STATISTICS 247 enum class UseType : uint 16_t {247 enum class UseType : uint32_t { 248 248 ConnectedFrameCount = 1 << 0, 249 249 NodeList = 1 << 1, … … 259 259 AttributeMap = 1 << 11, 260 260 InteractionObserver = 1 << 12, 261 PseudoElements= 1 << 13,261 ResizeObserver = 1 << 13, 262 262 Animations = 1 << 14, 263 PseudoElements = 1 << 15, 264 StyleMap = 1 << 16, 265 PartList = 1 << 17, 266 PartNames = 1 << 18, 263 267 }; 264 268 #endif -
trunk/Source/WebCore/html/HTMLElement.cpp
r266618 r266714 453 453 if (name == tabindexAttr) { 454 454 if (value.isEmpty()) 455 clearTabIndexExplicitlyIfNeeded();455 setTabIndexExplicitly(WTF::nullopt); 456 456 else if (auto optionalTabIndex = parseHTMLInteger(value)) 457 457 setTabIndexExplicitly(optionalTabIndex.value()); -
trunk/Source/WebCore/mathml/MathMLElement.cpp
r258140 r266714 93 93 } else if (name == HTMLNames::tabindexAttr) { 94 94 if (value.isEmpty()) 95 clearTabIndexExplicitlyIfNeeded();95 setTabIndexExplicitly(WTF::nullopt); 96 96 else if (auto optionalTabIndex = parseHTMLInteger(value)) 97 97 setTabIndexExplicitly(optionalTabIndex.value()); -
trunk/Source/WebCore/svg/SVGElement.cpp
r259687 r266714 340 340 if (name == HTMLNames::tabindexAttr) { 341 341 if (value.isEmpty()) 342 clearTabIndexExplicitlyIfNeeded();342 setTabIndexExplicitly(WTF::nullopt); 343 343 else if (auto optionalTabIndex = parseHTMLInteger(value)) 344 344 setTabIndexExplicitly(optionalTabIndex.value());
Note: See TracChangeset
for help on using the changeset viewer.