Changeset 267699 in webkit
- Timestamp:
- Sep 28, 2020, 7:55:51 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
html/BaseDateAndTimeInputType.cpp (modified) (1 diff)
-
html/shadow/DateTimeEditElement.cpp (modified) (1 diff)
-
html/shadow/DateTimeEditElement.h (modified) (1 diff)
-
html/shadow/DateTimeFieldElement.cpp (modified) (2 diffs)
-
html/shadow/DateTimeFieldElement.h (modified) (3 diffs)
-
html/shadow/DateTimeNumericFieldElement.cpp (modified) (1 diff)
-
html/shadow/DateTimeNumericFieldElement.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r267697 r267699 1 2020-09-28 Aditya Keerthi <akeerthi@apple.com> 2 3 Crash under DateTimeEditElement::blurFromField 4 https://bugs.webkit.org/show_bug.cgi?id=216930 5 <rdar://problem/69308322> 6 7 Reviewed by Ryosuke Niwa. 8 9 DateTimeEditElement::blurFromField incorrectly invoked 10 HTMLElement::dispatchBlurEvent, as it was not the element being blurred. 11 Accessing member variables after this call is unsafe, as there is 12 nothing protecting the DateTimeEditElement. 13 14 To fix, the problematic methods were removed entirely, and replaced 15 with a new approach to responding to blur events within a DateTimeEditElement. 16 17 The blur event's relatedTarget is now compared to the fields within the 18 DateTimeEditElement, in order to determine when to close the calendar. 19 This approach is safe, since the relatedTarget is protected by 20 Document::setFocusedElement. 21 22 * html/BaseDateAndTimeInputType.cpp: 23 (WebCore::BaseDateAndTimeInputType::elementDidBlur): Remove unnecessary call. 24 25 If the input has editable fields, closing the calendar is handled by the 26 new codepath. Running this code unconditionally will result in a flash of the 27 calendar when clicking on a part of the input type that doesn't contain 28 an editable field. 29 30 * html/shadow/DateTimeEditElement.cpp: 31 (WebCore::DateTimeEditElement::didBlurFromField): 32 33 Check if the event's relatedTarget is another field within the same 34 DateTimeEditElement. If yes, the calendar should remain open. 35 36 * html/shadow/DateTimeEditElement.h: 37 * html/shadow/DateTimeFieldElement.cpp: 38 (WebCore::DateTimeFieldElement::defaultEventHandler): 39 40 Call handleBlurEvent() if a blur event occurs. This was previously done by 41 the now-removed dispatchBlurEvent override. 42 43 (WebCore::DateTimeFieldElement::handleBlurEvent): 44 * html/shadow/DateTimeFieldElement.h: 45 * html/shadow/DateTimeNumericFieldElement.cpp: 46 (WebCore::DateTimeNumericFieldElement::handleBlurEvent): 47 * html/shadow/DateTimeNumericFieldElement.h: 48 1 49 2020-09-28 Antti Koivisto <antti@apple.com> 2 50 -
trunk/Source/WebCore/html/BaseDateAndTimeInputType.cpp
r267003 r267699 395 395 void BaseDateAndTimeInputType::elementDidBlur() 396 396 { 397 closeDateTimeChooser(); 397 if (!m_dateTimeEditElement) 398 closeDateTimeChooser(); 398 399 } 399 400 -
trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp
r267074 r267699 272 272 } 273 273 274 void DateTimeEditElement::blurFromField(RefPtr<Element>&& newFocusedElement) 275 { 276 bool notifyOwner = notFound == m_fields.findMatching([&] (auto& field) { 277 return field.ptr() == newFocusedElement.get(); 278 }); 279 280 HTMLElement::dispatchBlurEvent(WTFMove(newFocusedElement)); 281 282 if (m_editControlOwner && notifyOwner) 283 m_editControlOwner->didBlurFromControl(); 274 void DateTimeEditElement::didBlurFromField(Event& event) 275 { 276 if (!m_editControlOwner) 277 return; 278 279 if (auto* newFocusedElement = event.relatedTarget()) { 280 bool didFocusSiblingField = notFound != m_fields.findMatching([&] (auto& field) { 281 return field.ptr() == newFocusedElement; 282 }); 283 284 if (didFocusSiblingField) 285 return; 286 } 287 288 m_editControlOwner->didBlurFromControl(); 284 289 } 285 290 -
trunk/Source/WebCore/html/shadow/DateTimeEditElement.h
r266779 r267699 97 97 98 98 // DateTimeFieldElement::FieldOwner functions: 99 void blurFromField(RefPtr<Element>&& newFocusedElement) final;99 void didBlurFromField(Event&) final; 100 100 void fieldValueChanged() final; 101 101 bool focusOnNextField(const DateTimeFieldElement&) final; -
trunk/Source/WebCore/html/shadow/DateTimeFieldElement.cpp
r267281 r267699 61 61 void DateTimeFieldElement::defaultEventHandler(Event& event) 62 62 { 63 if (event.type() == eventNames().blurEvent) 64 handleBlurEvent(event); 65 63 66 if (is<KeyboardEvent>(event)) { 64 67 auto& keyboardEvent = downcast<KeyboardEvent>(event); … … 139 142 } 140 143 141 void DateTimeFieldElement:: dispatchBlurEvent(RefPtr<Element>&& newFocusedElement)144 void DateTimeFieldElement::handleBlurEvent(Event& event) 142 145 { 143 146 if (m_fieldOwner) 144 m_fieldOwner->blurFromField(WTFMove(newFocusedElement)); 145 else 146 HTMLElement::dispatchBlurEvent(WTFMove(newFocusedElement)); 147 148 didBlur(); 149 } 150 151 void DateTimeFieldElement::didBlur() 152 { 147 m_fieldOwner->didBlurFromField(event); 153 148 } 154 149 -
trunk/Source/WebCore/html/shadow/DateTimeFieldElement.h
r266524 r267699 46 46 public: 47 47 virtual ~FieldOwner(); 48 virtual void blurFromField(RefPtr<Element>&& newFocusedElement) = 0;48 virtual void didBlurFromField(Event&) = 0; 49 49 virtual void fieldValueChanged() = 0; 50 50 virtual bool focusOnNextField(const DateTimeFieldElement&) = 0; … … 56 56 57 57 void defaultEventHandler(Event&) override; 58 void dispatchBlurEvent(RefPtr<Element>&& newFocusedElement) override;59 58 bool isFocusable() const final; 60 59 … … 77 76 virtual int valueAsInteger() const = 0; 78 77 virtual void handleKeyboardEvent(KeyboardEvent&) = 0; 79 80 virtual void didBlur(); 78 virtual void handleBlurEvent(Event&); 81 79 82 80 private: -
trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp
r266779 r267699 164 164 } 165 165 166 void DateTimeNumericFieldElement:: didBlur()166 void DateTimeNumericFieldElement::handleBlurEvent(Event& event) 167 167 { 168 168 m_typeAheadBuffer.clear(); 169 DateTimeFieldElement::handleBlurEvent(event); 169 170 } 170 171 -
trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.h
r266779 r267699 67 67 String value() const final; 68 68 void handleKeyboardEvent(KeyboardEvent&) final; 69 void didBlur() final;69 void handleBlurEvent(Event&) final; 70 70 71 71 String formatValue(int) const;
Note:
See TracChangeset
for help on using the changeset viewer.