Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(331)

Unified Diff: third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp

Issue 2586143004: Blur immediately if an attribute change made an element unfocasable. (Closed)
Patch Set: Update comments and a function name Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..678a82166325c28d36375e53b7bc8ef6ec226238 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,47 @@ bool HTMLFieldSetElement::isSubmittableElement() {
return false;
}
-void HTMLFieldSetElement::invalidateDisabledStateUnder(Element& base) {
- for (HTMLFormControlElement& element :
- Traversal<HTMLFormControlElement>::descendantsOf(base))
- element.ancestorDisabledStateWasChanged();
+// Returns a disabled focused element if it's in descendants of |base|.
+Element*
+HTMLFieldSetElement::invalidateDescendantDisabledStateAndFindFocusedOne(
+ Element& base) {
+ 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 =
+ invalidateDescendantDisabledStateAndFindFocusedOne(*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 =
+ invalidateDescendantDisabledStateAndFindFocusedOne(legend))
+ focusedElement = element;
+ }
+ }
+ if (focusedElement)
+ focusedElement->blur();
}
bool HTMLFieldSetElement::supportsFocus() const {

Powered by Google App Engine
This is Rietveld 408576698