Skip to content

Commit

Permalink
Issue #1356 - Remove -moz-user-input disabled to improve event handling.
Browse files Browse the repository at this point in the history
  • Loading branch information
athenian200 committed Jan 16, 2020
1 parent e4c4c20 commit 42e4816
Show file tree
Hide file tree
Showing 23 changed files with 43 additions and 78 deletions.
1 change: 0 additions & 1 deletion devtools/client/themes/webconsole.css
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

a {
-moz-user-focus: normal;
-moz-user-input: enabled;
cursor: pointer;
text-decoration: underline;
}
Expand Down
2 changes: 0 additions & 2 deletions devtools/shared/css/generated/properties-db.js
Original file line number Diff line number Diff line change
Expand Up @@ -1440,8 +1440,6 @@ exports.CSS_PROPERTIES = {
"supports": [],
"values": [
"auto",
"disabled",
"enabled",
"inherit",
"initial",
"none",
Expand Down
2 changes: 0 additions & 2 deletions dom/html/HTMLLabelElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,6 @@ class HTMLLabelElement final : public nsGenericHTMLElement,
using nsGenericHTMLElement::Focus;
virtual void Focus(mozilla::ErrorResult& aError) override;

virtual bool IsDisabled() const override { return false; }

// nsIContent
virtual nsresult PostHandleEvent(
EventChainPostVisitor& aVisitor) override;
Expand Down
2 changes: 0 additions & 2 deletions dom/html/HTMLObjectElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,6 @@ class HTMLObjectElement final : public nsGenericHTMLFormElement
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;

Expand Down
11 changes: 5 additions & 6 deletions dom/html/HTMLOptGroupElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
4 changes: 0 additions & 4 deletions dom/html/HTMLOptGroupElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,6 @@ class HTMLOptGroupElement final : public nsGenericHTMLElement,

virtual nsIDOMNode* AsDOMNode() override { return this; }

virtual bool IsDisabled() const override {
return HasAttr(kNameSpaceID_None, nsGkAtoms::disabled);
}

bool Disabled() const
{
return GetBoolAttr(nsGkAtoms::disabled);
Expand Down
4 changes: 0 additions & 4 deletions dom/html/HTMLOptionElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,6 @@ class HTMLOptionElement final : public nsGenericHTMLElement,

nsresult CopyInnerTo(mozilla::dom::Element* aDest);

virtual bool IsDisabled() const override {
return HasAttr(kNameSpaceID_None, nsGkAtoms::disabled);
}

bool Disabled() const
{
return GetBoolAttr(nsGkAtoms::disabled);
Expand Down
2 changes: 0 additions & 2 deletions dom/html/HTMLOutputElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ class HTMLOutputElement final : public nsGenericHTMLFormElement,
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,
Expand Down
21 changes: 6 additions & 15 deletions dom/html/nsGenericHTMLElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down
6 changes: 2 additions & 4 deletions dom/html/nsGenericHTMLElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -817,8 +817,8 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase,
/**
* 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
Expand Down Expand Up @@ -1222,8 +1222,6 @@ class nsGenericHTMLFormElement : public nsGenericHTMLElement,
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
Expand Down
2 changes: 1 addition & 1 deletion dom/interfaces/base/nsIDOMWindowUtils.idl
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
5 changes: 2 additions & 3 deletions layout/base/nsCaret.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand Down
4 changes: 1 addition & 3 deletions layout/forms/nsComboboxControlFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 2 additions & 4 deletions layout/forms/nsFormControlFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 1 addition & 4 deletions layout/forms/nsGfxButtonControlFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 1 addition & 7 deletions layout/forms/nsImageControlFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
11 changes: 3 additions & 8 deletions layout/forms/nsListControlFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
13 changes: 13 additions & 0 deletions layout/generic/nsFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
5 changes: 5 additions & 0 deletions layout/generic/nsIFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -2435,6 +2435,11 @@ class nsIFrame : public nsQueryFrame
*/
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.
*
Expand Down
2 changes: 0 additions & 2 deletions layout/style/nsCSSProps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
};
Expand Down
2 changes: 0 additions & 2 deletions layout/style/nsStyleConsts.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,6 @@ enum class StyleUserSelect : uint8_t {
// user-input
enum class StyleUserInput : uint8_t {
None,
Enabled,
Disabled,
Auto,
};

Expand Down
1 change: 0 additions & 1 deletion layout/style/res/forms.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion layout/style/test/property_database.js
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down

0 comments on commit 42e4816

Please sign in to comment.