diff options
author | athenian200 <athenian200@outlook.com> | 2020-01-16 14:07:04 -0600 |
---|---|---|
committer | athenian200 <athenian200@outlook.com> | 2020-01-16 14:07:04 -0600 |
commit | 42e48167713abfa3c1f11274179b489bb6369b57 (patch) | |
tree | 31ceba32e850ac856b09838c89e61e27df1538f0 | |
parent | e4c4c20e7e539d891c3f10b6ef5608c08699c077 (diff) | |
download | uxp-42e48167713abfa3c1f11274179b489bb6369b57.tar.gz |
Issue #1356 - Remove -moz-user-input disabled to improve event handling.
23 files changed, 43 insertions, 78 deletions
diff --git a/devtools/client/themes/webconsole.css b/devtools/client/themes/webconsole.css index 89bb386283..85c73264cc 100644 --- a/devtools/client/themes/webconsole.css +++ b/devtools/client/themes/webconsole.css @@ -14,7 +14,6 @@ a { -moz-user-focus: normal; - -moz-user-input: enabled; cursor: pointer; text-decoration: underline; } diff --git a/devtools/shared/css/generated/properties-db.js b/devtools/shared/css/generated/properties-db.js index 25d9e2d334..eda2c7148f 100644 --- a/devtools/shared/css/generated/properties-db.js +++ b/devtools/shared/css/generated/properties-db.js @@ -1440,8 +1440,6 @@ exports.CSS_PROPERTIES = { "supports": [], "values": [ "auto", - "disabled", - "enabled", "inherit", "initial", "none", diff --git a/dom/html/HTMLLabelElement.h b/dom/html/HTMLLabelElement.h index c8385fc53d..4057ffef65 100644 --- a/dom/html/HTMLLabelElement.h +++ b/dom/html/HTMLLabelElement.h @@ -59,8 +59,6 @@ public: using nsGenericHTMLElement::Focus; virtual void Focus(mozilla::ErrorResult& aError) override; - virtual bool IsDisabled() const override { return false; } - // nsIContent virtual nsresult PostHandleEvent( EventChainPostVisitor& aVisitor) override; diff --git a/dom/html/HTMLObjectElement.h b/dom/html/HTMLObjectElement.h index 4041b78a31..5226154da9 100644 --- a/dom/html/HTMLObjectElement.h +++ b/dom/html/HTMLObjectElement.h @@ -77,8 +77,6 @@ public: NS_IMETHOD Reset() override; NS_IMETHOD SubmitNamesValues(HTMLFormSubmission *aFormSubmission) override; - virtual bool IsDisabled() const override { return false; } - virtual void DoneAddingChildren(bool aHaveNotified) override; virtual bool IsDoneAddingChildren() override; diff --git a/dom/html/HTMLOptGroupElement.cpp b/dom/html/HTMLOptGroupElement.cpp index 8a044fbf37..9e738961d8 100644 --- a/dom/html/HTMLOptGroupElement.cpp +++ b/dom/html/HTMLOptGroupElement.cpp @@ -53,15 +53,14 @@ HTMLOptGroupElement::PreHandleEvent(EventChainPreVisitor& aVisitor) aVisitor.mCanHandle = false; // Do not process any DOM events if the element is disabled // XXXsmaug This is not the right thing to do. But what is? - if (HasAttr(kNameSpaceID_None, nsGkAtoms::disabled)) { + if (IsDisabled()) { return NS_OK; } - nsIFrame* frame = GetPrimaryFrame(); - if (frame) { - const nsStyleUserInterface* uiStyle = frame->StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + if (nsIFrame* frame = GetPrimaryFrame()) { + // FIXME(emilio): This poking at the style of the frame is broken unless we + // flush before every event handling, which we don't really want to. + if (frame->StyleUserInterface()->mUserInput == StyleUserInput::None) { return NS_OK; } } diff --git a/dom/html/HTMLOptGroupElement.h b/dom/html/HTMLOptGroupElement.h index d53a2e32b1..e46a6a953f 100644 --- a/dom/html/HTMLOptGroupElement.h +++ b/dom/html/HTMLOptGroupElement.h @@ -46,10 +46,6 @@ public: virtual nsIDOMNode* AsDOMNode() override { return this; } - virtual bool IsDisabled() const override { - return HasAttr(kNameSpaceID_None, nsGkAtoms::disabled); - } - bool Disabled() const { return GetBoolAttr(nsGkAtoms::disabled); diff --git a/dom/html/HTMLOptionElement.h b/dom/html/HTMLOptionElement.h index e220b84df3..4b5e192ff5 100644 --- a/dom/html/HTMLOptionElement.h +++ b/dom/html/HTMLOptionElement.h @@ -67,10 +67,6 @@ public: nsresult CopyInnerTo(mozilla::dom::Element* aDest); - virtual bool IsDisabled() const override { - return HasAttr(kNameSpaceID_None, nsGkAtoms::disabled); - } - bool Disabled() const { return GetBoolAttr(nsGkAtoms::disabled); diff --git a/dom/html/HTMLOutputElement.h b/dom/html/HTMLOutputElement.h index 5882624806..6b6c3f66c4 100644 --- a/dom/html/HTMLOutputElement.h +++ b/dom/html/HTMLOutputElement.h @@ -35,8 +35,6 @@ public: NS_IMETHOD Reset() override; NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override; - virtual bool IsDisabled() const override { return false; } - nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult) const override; bool ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute, diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index 2f890325ad..0c8bcc9c82 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -2109,14 +2109,6 @@ nsGenericHTMLFormElement::PreHandleEvent(EventChainPreVisitor& aVisitor) return nsGenericHTMLElement::PreHandleEvent(aVisitor); } -/* virtual */ -bool -nsGenericHTMLFormElement::IsDisabled() const -{ - return HasAttr(kNameSpaceID_None, nsGkAtoms::disabled) || - (mFieldSet && mFieldSet->IsDisabled()); -} - void nsGenericHTMLFormElement::ForgetFieldSet(nsIContent* aFieldset) { @@ -2308,14 +2300,13 @@ nsGenericHTMLFormElement::IsElementDisabledForEvents(EventMessage aMessage, break; } - bool disabled = IsDisabled(); - if (!disabled && aFrame) { - const nsStyleUserInterface* uiStyle = aFrame->StyleUserInterface(); - disabled = uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled; - + // FIXME(emilio): This poking at the style of the frame is slightly bogus + // unless we flush before every event, which we don't really want to do. + if (aFrame && + aFrame->StyleUserInterface()->mUserInput == StyleUserInput::None) { + return true; } - return disabled; + return IsDisabled(); } void diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h index 72039f2661..940404f93c 100644 --- a/dom/html/nsGenericHTMLElement.h +++ b/dom/html/nsGenericHTMLElement.h @@ -817,8 +817,8 @@ public: /** * Returns the current disabled state of the element. */ - virtual bool IsDisabled() const { - return false; + bool IsDisabled() const { + return State().HasState(NS_EVENT_STATE_DISABLED); } bool IsHidden() const @@ -1222,8 +1222,6 @@ public: virtual nsresult PreHandleEvent( mozilla::EventChainPreVisitor& aVisitor) override; - virtual bool IsDisabled() const override; - /** * This callback is called by a fieldest on all its elements whenever its * disabled attribute is changed so the element knows its disabled state diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl index 70ec7e0ae6..fcfe407e84 100644 --- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -1786,7 +1786,7 @@ interface nsIDOMWindowUtils : nsISupports { /** * In certain cases the event handling of nodes, form controls in practice, * may be disabled. Such cases are for example the existence of disabled - * attribute or -moz-user-input: none/disabled. + * attribute or -moz-user-input: none. */ boolean isNodeDisabledForEvents(in nsIDOMNode aNode); diff --git a/layout/base/nsCaret.cpp b/layout/base/nsCaret.cpp index eca22f3ba5..8396726c63 100644 --- a/layout/base/nsCaret.cpp +++ b/layout/base/nsCaret.cpp @@ -511,7 +511,7 @@ nsCaret::GetPaintGeometry(nsRect* aRect) CheckSelectionLanguageChange(); int32_t frameOffset; - nsIFrame *frame = GetFrameAndOffset(GetSelectionInternal(), + nsIFrame* frame = GetFrameAndOffset(GetSelectionInternal(), mOverrideContent, mOverrideOffset, &frameOffset); if (!frame) { return nullptr; @@ -521,8 +521,7 @@ nsCaret::GetPaintGeometry(nsRect* aRect) const nsStyleUserInterface* userinterface = frame->StyleUserInterface(); if ((!mIgnoreUserModify && userinterface->mUserModify == StyleUserModify::ReadOnly) || - userinterface->mUserInput == StyleUserInput::None || - userinterface->mUserInput == StyleUserInput::Disabled) { + frame->IsContentDisabled()){ return nullptr; } diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp index 5a94389395..78185616ff 100644 --- a/layout/forms/nsComboboxControlFrame.cpp +++ b/layout/forms/nsComboboxControlFrame.cpp @@ -1165,9 +1165,7 @@ nsComboboxControlFrame::HandleEvent(nsPresContext* aPresContext, // If we have style that affects how we are selected, feed event down to // nsFrame::HandleEvent so that selection takes place when appropriate. - const nsStyleUserInterface* uiStyle = StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + if (IsContentDisabled()) { return nsBlockFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } return NS_OK; diff --git a/layout/forms/nsFormControlFrame.cpp b/layout/forms/nsFormControlFrame.cpp index 4ee62acbf8..8dbe564ddf 100644 --- a/layout/forms/nsFormControlFrame.cpp +++ b/layout/forms/nsFormControlFrame.cpp @@ -183,10 +183,8 @@ nsFormControlFrame::HandleEvent(nsPresContext* aPresContext, WidgetGUIEvent* aEvent, nsEventStatus* aEventStatus) { - // Check for user-input:none style - const nsStyleUserInterface* uiStyle = StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + // Check for disabled content so that selection works properly (?). + if (IsContentDisabled()) { return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } return NS_OK; diff --git a/layout/forms/nsGfxButtonControlFrame.cpp b/layout/forms/nsGfxButtonControlFrame.cpp index 90da437f7f..393145e0b0 100644 --- a/layout/forms/nsGfxButtonControlFrame.cpp +++ b/layout/forms/nsGfxButtonControlFrame.cpp @@ -227,10 +227,7 @@ nsGfxButtonControlFrame::HandleEvent(nsPresContext* aPresContext, // from being called. The nsFrame::HandleEvent causes the button label // to be selected (Drawn with an XOR rectangle over the label) - // do we have user-input style? - const nsStyleUserInterface* uiStyle = StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + if (IsContentDisabled()) { return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } return NS_OK; diff --git a/layout/forms/nsImageControlFrame.cpp b/layout/forms/nsImageControlFrame.cpp index 212fa93567..8aef415381 100644 --- a/layout/forms/nsImageControlFrame.cpp +++ b/layout/forms/nsImageControlFrame.cpp @@ -150,15 +150,9 @@ nsImageControlFrame::HandleEvent(nsPresContext* aPresContext, return NS_OK; } - // do we have user-input style? - const nsStyleUserInterface* uiStyle = StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + if (IsContentDisabled()) { return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } - if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::disabled)) { // XXX cache disabled - return NS_OK; - } *aEventStatus = nsEventStatus_eIgnore; diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index cc5f37f9a5..58e81039f8 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -920,16 +920,11 @@ nsListControlFrame::HandleEvent(nsPresContext* aPresContext, if (nsEventStatus_eConsumeNoDefault == *aEventStatus) return NS_OK; - // do we have style that affects how we are selected? - // do we have user-input style? - const nsStyleUserInterface* uiStyle = StyleUserInterface(); - if (uiStyle->mUserInput == StyleUserInput::None || - uiStyle->mUserInput == StyleUserInput::Disabled) { + // disabled state affects how we're selected, but we don't want to go through + // nsHTMLScrollFrame if we're disabled. + if (IsContentDisabled()) { return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } - EventStates eventStates = mContent->AsElement()->State(); - if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) - return NS_OK; return nsHTMLScrollFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index bbbb5c3320..8d4ea87540 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -5557,6 +5557,19 @@ nsFrame::Reflow(nsPresContext* aPresContext, NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize); } +bool +nsIFrame::IsContentDisabled() const +{ + // FIXME(emilio): Doing this via CSS means callers must ensure the style is up + // to date, and they don't! + if (StyleUserInterface()->mUserInput == StyleUserInput::None) { + return true; + } + + auto* element = nsGenericHTMLElement::FromContentOrNull(GetContent()); + return element && element->IsDisabled(); +} + nsresult nsFrame::CharacterDataChanged(CharacterDataChangeInfo* aInfo) { diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 57f5c460c2..93eb95099a 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -2436,6 +2436,11 @@ public: nsIWidget* GetNearestWidget(nsPoint& aOffset) const; /** + * Whether the content for this frame is disabled, used for event handling. + */ + bool IsContentDisabled() const; + + /** * Get the "type" of the frame. May return nullptr. * * @see nsGkAtoms diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index ac2978c277..289a16ecd0 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -2189,8 +2189,6 @@ const KTableEntry nsCSSProps::kUserFocusKTable[] = { const KTableEntry nsCSSProps::kUserInputKTable[] = { { eCSSKeyword_none, StyleUserInput::None }, - { eCSSKeyword_enabled, StyleUserInput::Enabled }, - { eCSSKeyword_disabled, StyleUserInput::Disabled }, { eCSSKeyword_auto, StyleUserInput::Auto }, { eCSSKeyword_UNKNOWN, -1 } }; diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 6d207aec9b..5412eed269 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -241,8 +241,6 @@ enum class StyleUserSelect : uint8_t { // user-input enum class StyleUserInput : uint8_t { None, - Enabled, - Disabled, Auto, }; diff --git a/layout/style/res/forms.css b/layout/style/res/forms.css index e7566e183f..95025221d1 100644 --- a/layout/style/res/forms.css +++ b/layout/style/res/forms.css @@ -425,7 +425,6 @@ optgroup:disabled, select:disabled:disabled /* Need the pseudo-class twice to have the specificity be at least the same as select[size][multiple] above */ { - -moz-user-input: disabled; color: GrayText; background-color: ThreeDLightShadow; cursor: inherit; diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index c75f7b498f..3486d15d07 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -2203,7 +2203,7 @@ var gCSSProperties = { inherited: true, type: CSS_TYPE_LONGHAND, initial_values: [ "auto" ], - other_values: [ "none", "enabled", "disabled" ], + other_values: [ "none" ], invalid_values: [] }, "-moz-user-modify": { |