Chromium Code Reviews| Index: third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp |
| diff --git a/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp b/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp |
| index 5d2bbba302e9ec8ebdefb0caea82d0d511f485d1..c22dfb5dd82366b0d14c1278977764241fb65db9 100644 |
| --- a/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp |
| +++ b/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp |
| @@ -30,6 +30,7 @@ |
| #include "core/html/HTMLCollection.h" |
| #include "core/html/HTMLLegendElement.h" |
| #include "core/layout/LayoutFieldset.h" |
| +#include "platform/EventDispatchForbiddenScope.h" |
| #include "wtf/StdLibExtras.h" |
| namespace blink { |
| @@ -62,24 +63,43 @@ bool HTMLFieldSetElement::isSubmittableElement() { |
| return false; |
| } |
| -void HTMLFieldSetElement::invalidateDisabledStateUnder(Element& base) { |
| - for (HTMLFormControlElement& element : |
| - Traversal<HTMLFormControlElement>::descendantsOf(base)) |
| - element.ancestorDisabledStateWasChanged(); |
| +// Returns a focused element if it's in descendants of |base|. |
| +Element* HTMLFieldSetElement::invalidateDisabledStateUnder(Element& base) { |
|
kochi
2016/12/21 05:58:09
The name of the function and return value seem irr
tkent
2016/12/21 06:51:15
invalidateDescendantDisabledStateAndFindFocusedOne
kochi
2016/12/21 08:05:19
Yeah, long but readable.
As the function only call
|
| + Element* focusedElement = adjustedFocusedElementInTreeScope(); |
| + bool shouldBlur = false; |
| + { |
| + EventDispatchForbiddenScope eventForbidden; |
| + for (HTMLFormControlElement& element : |
| + Traversal<HTMLFormControlElement>::descendantsOf(base)) { |
| + element.ancestorDisabledStateWasChanged(); |
| + if (focusedElement == &element && element.isDisabledFormControl()) |
| + shouldBlur = true; |
| + } |
| + } |
| + return shouldBlur ? focusedElement : nullptr; |
| } |
| void HTMLFieldSetElement::disabledAttributeChanged() { |
| // This element must be updated before the style of nodes in its subtree gets |
| // recalculated. |
| HTMLFormControlElement::disabledAttributeChanged(); |
| - invalidateDisabledStateUnder(*this); |
| + if (Element* focusedElement = invalidateDisabledStateUnder(*this)) |
| + focusedElement->blur(); |
| } |
| void HTMLFieldSetElement::childrenChanged(const ChildrenChange& change) { |
| HTMLFormControlElement::childrenChanged(change); |
| - for (HTMLLegendElement& legend : |
| - Traversal<HTMLLegendElement>::childrenOf(*this)) |
| - invalidateDisabledStateUnder(legend); |
| + Element* focusedElement = nullptr; |
| + { |
| + EventDispatchForbiddenScope eventForbidden; |
| + for (HTMLLegendElement& legend : |
| + Traversal<HTMLLegendElement>::childrenOf(*this)) { |
| + if (Element* element = invalidateDisabledStateUnder(legend)) |
| + focusedElement = element; |
| + } |
| + } |
| + if (focusedElement) |
| + focusedElement->blur(); |
| } |
| bool HTMLFieldSetElement::supportsFocus() const { |