Changeset 225855 in webkit
- Timestamp:
- Dec 13, 2017 10:43:05 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r225854 r225855 1 2017-12-13 Zalan Bujtas <zalan@apple.com> 2 3 ASSERT(LayoutDisallowedScope::isLayoutAllowed()) whenever hitting Enter in Web Inspector console 4 https://bugs.webkit.org/show_bug.cgi?id=180690 5 6 Reviewed by Simon Fraser. 7 8 Defer text replacement notification until after layout is done to avoid unexpected forced layouts. 9 10 Covered by existing tests. 11 12 * accessibility/AXObjectCache.cpp: 13 (WebCore::AXObjectCache::disableAccessibility): 14 (WebCore::AXObjectCache::remove): 15 (WebCore::filterMapForRemoval): 16 (WebCore::filterListForRemoval): 17 (WebCore::AXObjectCache::prepareForDocumentDestruction): 18 (WebCore::AXObjectCache::performDeferredCacheUpdate): 19 (WebCore::AXObjectCache::deferTextReplacementNotificationForTextControl): 20 (WebCore::filterForRemoval): Deleted. 21 * accessibility/AXObjectCache.h: Need to use the base (Element) class since 22 we can't call is<HTMLTextFormControlElement> in Node d'tor. 23 (WebCore::AXObjectCache::deferTextReplacementNotificationForTextControl): 24 * html/HTMLTextFormControlElement.cpp: 25 (WebCore::HTMLTextFormControlElement::setInnerTextValue): 26 1 27 2017-12-13 Ryan Haddad <ryanhaddad@apple.com> 2 28 -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r225613 r225855 722 722 m_deferredRecomputeIsIgnoredList.remove(downcast<Element>(&node)); 723 723 m_deferredSelectedChildredChangedList.remove(downcast<Element>(&node)); 724 m_deferredTextFormControlValue.remove(downcast<Element>(&node)); 724 725 } 725 726 m_deferredTextChangedList.remove(&node); … … 2726 2727 } 2727 2728 2729 template<typename T, typename U> 2730 static void filterMapForRemoval(const HashMap<T, U>& list, const Document& document, HashSet<Node*>& nodesToRemove) 2731 { 2732 for (auto& entry : list) { 2733 auto* node = entry.key; 2734 if (node->isConnected() && &node->document() != &document) 2735 continue; 2736 nodesToRemove.add(node); 2737 } 2738 } 2739 2728 2740 template<typename T> 2729 static void filter ForRemoval(const ListHashSet<T>& list, const Document& document, HashSet<Node*>& nodesToRemove)2741 static void filterListForRemoval(const ListHashSet<T>& list, const Document& document, HashSet<Node*>& nodesToRemove) 2730 2742 { 2731 2743 for (auto* node : list) { … … 2739 2751 { 2740 2752 HashSet<Node*> nodesToRemove; 2741 filterForRemoval(m_textMarkerNodes, document, nodesToRemove); 2742 filterForRemoval(m_modalNodesSet, document, nodesToRemove); 2743 filterForRemoval(m_deferredRecomputeIsIgnoredList, document, nodesToRemove); 2744 filterForRemoval(m_deferredTextChangedList, document, nodesToRemove); 2745 filterForRemoval(m_deferredSelectedChildredChangedList, document, nodesToRemove); 2753 filterListForRemoval(m_textMarkerNodes, document, nodesToRemove); 2754 filterListForRemoval(m_modalNodesSet, document, nodesToRemove); 2755 filterListForRemoval(m_deferredRecomputeIsIgnoredList, document, nodesToRemove); 2756 filterListForRemoval(m_deferredTextChangedList, document, nodesToRemove); 2757 filterListForRemoval(m_deferredSelectedChildredChangedList, document, nodesToRemove); 2758 filterMapForRemoval(m_deferredTextFormControlValue, document, nodesToRemove); 2746 2759 2747 2760 for (auto* node : nodesToRemove) … … 2777 2790 selectedChildrenChanged(selectElement); 2778 2791 m_deferredSelectedChildredChangedList.clear(); 2792 2793 for (auto& deferredFormControlContext : m_deferredTextFormControlValue) { 2794 auto& textFormControlElement = downcast<HTMLTextFormControlElement>(*deferredFormControlContext.key); 2795 postTextReplacementNotificationForTextControl(textFormControlElement, deferredFormControlContext.value, textFormControlElement.innerTextValue()); 2796 } 2797 m_deferredTextFormControlValue.clear(); 2779 2798 } 2780 2799 … … 2840 2859 } 2841 2860 selectedChildrenChanged(&selectElement); 2861 } 2862 2863 void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement& formControlElement, const String& previousValue) 2864 { 2865 auto* renderer = formControlElement.renderer(); 2866 if (!renderer) 2867 return; 2868 m_deferredTextFormControlValue.add(&formControlElement, previousValue); 2842 2869 } 2843 2870 -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r225613 r225855 338 338 void deferSelectedChildrenChangedIfNeeded(Element&); 339 339 void performDeferredCacheUpdate(); 340 340 void deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement&, const String& previousValue); 341 341 342 RefPtr<Range> rangeMatchesTextNearRange(RefPtr<Range>, const String&); 342 343 … … 445 446 ListHashSet<Node*> m_deferredTextChangedList; 446 447 ListHashSet<Element*> m_deferredSelectedChildredChangedList; 448 HashMap<Element*, String> m_deferredTextFormControlValue; 447 449 bool m_isSynchronizingSelection { false }; 448 450 bool m_performingDeferredCacheUpdate { false }; … … 497 499 inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { } 498 500 inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { } 501 inline void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement&, const String&) { } 499 502 inline void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType) { } 500 503 inline void AXObjectCache::focusModalNodeTimerFired() { } -
trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp
r225837 r225855 577 577 if (textIsChanged && renderer()) { 578 578 if (AXObjectCache* cache = document().existingAXObjectCache()) 579 cache-> postTextReplacementNotificationForTextControl(*this, previousValue, value);579 cache->deferTextReplacementNotificationForTextControl(*this, previousValue); 580 580 } 581 581 #endif
Note: See TracChangeset
for help on using the changeset viewer.