Allow event dispatch on disabled form controls.
parent
e2b2bd0a7c
commit
2f4f7d8270
|
@ -3577,7 +3577,8 @@ nsDOMWindowUtils::IsNodeDisabledForEvents(nsIDOMNode* aNode, bool* aRetVal)
|
||||||
while (node) {
|
while (node) {
|
||||||
if (node->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) {
|
if (node->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) {
|
||||||
nsCOMPtr<nsIFormControl> fc = do_QueryInterface(node);
|
nsCOMPtr<nsIFormControl> fc = do_QueryInterface(node);
|
||||||
if (fc && fc->IsDisabledForEvents(eVoidEvent)) {
|
WidgetEvent event(true, eVoidEvent);
|
||||||
|
if (fc && fc->IsDisabledForEvents(&event)) {
|
||||||
*aRetVal = true;
|
*aRetVal = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,18 +199,18 @@ HTMLButtonElement::ParseAttribute(int32_t aNamespaceID,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLButtonElement::IsDisabledForEvents(EventMessage aMessage)
|
HTMLButtonElement::IsDisabledForEvents(WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
||||||
nsIFrame* formFrame = do_QueryFrame(formControlFrame);
|
nsIFrame* formFrame = do_QueryFrame(formControlFrame);
|
||||||
return IsElementDisabledForEvents(aMessage, formFrame);
|
return IsElementDisabledForEvents(aEvent, formFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
HTMLButtonElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
HTMLButtonElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
if (IsDisabledForEvents(aVisitor.mEvent->mMessage)) {
|
if (IsDisabledForEvents(aVisitor.mEvent)) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ public:
|
||||||
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
||||||
NS_IMETHOD SaveState() override;
|
NS_IMETHOD SaveState() override;
|
||||||
bool RestoreState(nsPresState* aState) override;
|
bool RestoreState(nsPresState* aState) override;
|
||||||
virtual bool IsDisabledForEvents(EventMessage aMessage) override;
|
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
|
||||||
|
|
||||||
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,9 @@ NS_IMPL_STRING_ATTR(HTMLFieldSetElement, Name, name)
|
||||||
NS_IMPL_NSICONSTRAINTVALIDATION(HTMLFieldSetElement)
|
NS_IMPL_NSICONSTRAINTVALIDATION(HTMLFieldSetElement)
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLFieldSetElement::IsDisabledForEvents(EventMessage aMessage)
|
HTMLFieldSetElement::IsDisabledForEvents(WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
return IsElementDisabledForEvents(aMessage, nullptr);
|
return IsElementDisabledForEvents(aEvent, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// nsIContent
|
// nsIContent
|
||||||
|
@ -74,7 +74,7 @@ HTMLFieldSetElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
// Do not process any DOM events if the element is disabled.
|
// Do not process any DOM events if the element is disabled.
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
if (IsDisabledForEvents(aVisitor.mEvent->mMessage)) {
|
if (IsDisabledForEvents(aVisitor.mEvent)) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
NS_IMETHOD_(uint32_t) GetType() const override { return NS_FORM_FIELDSET; }
|
NS_IMETHOD_(uint32_t) GetType() const override { return NS_FORM_FIELDSET; }
|
||||||
NS_IMETHOD Reset() override;
|
NS_IMETHOD Reset() override;
|
||||||
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
||||||
virtual bool IsDisabledForEvents(EventMessage aMessage) override;
|
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
|
||||||
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;
|
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;
|
||||||
|
|
||||||
const nsIContent* GetFirstLegend() const { return mFirstLegend; }
|
const nsIContent* GetFirstLegend() const { return mFirstLegend; }
|
||||||
|
|
|
@ -3712,9 +3712,9 @@ HTMLInputElement::NeedToInitializeEditorForEvent(
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLInputElement::IsDisabledForEvents(EventMessage aMessage)
|
HTMLInputElement::IsDisabledForEvents(WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
return IsElementDisabledForEvents(aMessage, GetPrimaryFrame());
|
return IsElementDisabledForEvents(aEvent, GetPrimaryFrame());
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -3722,7 +3722,7 @@ HTMLInputElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
// Do not process any DOM events if the element is disabled
|
// Do not process any DOM events if the element is disabled
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
if (IsDisabledForEvents(aVisitor.mEvent->mMessage)) {
|
if (IsDisabledForEvents(aVisitor.mEvent)) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,7 @@ public:
|
||||||
NS_IMETHOD SaveState() override;
|
NS_IMETHOD SaveState() override;
|
||||||
virtual bool RestoreState(nsPresState* aState) override;
|
virtual bool RestoreState(nsPresState* aState) override;
|
||||||
virtual bool AllowDrop() override;
|
virtual bool AllowDrop() override;
|
||||||
virtual bool IsDisabledForEvents(EventMessage aMessage) override;
|
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
|
||||||
|
|
||||||
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
||||||
|
|
||||||
|
|
|
@ -1419,21 +1419,21 @@ HTMLSelectElement::GetAttributeMappingFunction() const
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLSelectElement::IsDisabledForEvents(EventMessage aMessage)
|
HTMLSelectElement::IsDisabledForEvents(WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
||||||
nsIFrame* formFrame = nullptr;
|
nsIFrame* formFrame = nullptr;
|
||||||
if (formControlFrame) {
|
if (formControlFrame) {
|
||||||
formFrame = do_QueryFrame(formControlFrame);
|
formFrame = do_QueryFrame(formControlFrame);
|
||||||
}
|
}
|
||||||
return IsElementDisabledForEvents(aMessage, formFrame);
|
return IsElementDisabledForEvents(aEvent, formFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
HTMLSelectElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
HTMLSelectElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
if (IsDisabledForEvents(aVisitor.mEvent->mMessage)) {
|
if (IsDisabledForEvents(aVisitor.mEvent)) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -294,7 +294,7 @@ public:
|
||||||
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
||||||
NS_IMETHOD SaveState() override;
|
NS_IMETHOD SaveState() override;
|
||||||
virtual bool RestoreState(nsPresState* aState) override;
|
virtual bool RestoreState(nsPresState* aState) override;
|
||||||
virtual bool IsDisabledForEvents(EventMessage aMessage) override;
|
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
|
||||||
|
|
||||||
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
||||||
|
|
||||||
|
|
|
@ -498,18 +498,18 @@ HTMLTextAreaElement::GetAttributeMappingFunction() const
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLTextAreaElement::IsDisabledForEvents(EventMessage aMessage)
|
HTMLTextAreaElement::IsDisabledForEvents(WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
|
||||||
nsIFrame* formFrame = do_QueryFrame(formControlFrame);
|
nsIFrame* formFrame = do_QueryFrame(formControlFrame);
|
||||||
return IsElementDisabledForEvents(aMessage, formFrame);
|
return IsElementDisabledForEvents(aEvent, formFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
HTMLTextAreaElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
HTMLTextAreaElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
if (IsDisabledForEvents(aVisitor.mEvent->mMessage)) {
|
if (IsDisabledForEvents(aVisitor.mEvent)) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ public:
|
||||||
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
||||||
NS_IMETHOD SaveState() override;
|
NS_IMETHOD SaveState() override;
|
||||||
virtual bool RestoreState(nsPresState* aState) override;
|
virtual bool RestoreState(nsPresState* aState) override;
|
||||||
virtual bool IsDisabledForEvents(EventMessage aMessage) override;
|
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
|
||||||
|
|
||||||
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
virtual void FieldSetDisabledChanged(bool aNotify) override;
|
||||||
|
|
||||||
|
|
|
@ -2285,10 +2285,17 @@ nsGenericHTMLFormElement::FormIdUpdated(Element* aOldElement,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nsGenericHTMLFormElement::IsElementDisabledForEvents(EventMessage aMessage,
|
nsGenericHTMLFormElement::IsElementDisabledForEvents(WidgetEvent* aEvent,
|
||||||
nsIFrame* aFrame)
|
nsIFrame* aFrame)
|
||||||
{
|
{
|
||||||
switch (aMessage) {
|
MOZ_ASSERT(aEvent);
|
||||||
|
|
||||||
|
// Allow dispatch of CustomEvent and untrusted Events.
|
||||||
|
if (!aEvent->IsTrusted()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (aEvent->mMessage) {
|
||||||
case eMouseMove:
|
case eMouseMove:
|
||||||
case eMouseOver:
|
case eMouseOver:
|
||||||
case eMouseOut:
|
case eMouseOut:
|
||||||
|
@ -2454,8 +2461,9 @@ nsGenericHTMLFormElement::IsLabelable() const
|
||||||
void
|
void
|
||||||
nsGenericHTMLElement::Click()
|
nsGenericHTMLElement::Click()
|
||||||
{
|
{
|
||||||
if (HandlingClick())
|
if (IsDisabled() || HandlingClick()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Strong in case the event kills it
|
// Strong in case the event kills it
|
||||||
nsCOMPtr<nsIDocument> doc = GetComposedDoc();
|
nsCOMPtr<nsIDocument> doc = GetComposedDoc();
|
||||||
|
|
|
@ -1307,7 +1307,7 @@ protected:
|
||||||
void* aData);
|
void* aData);
|
||||||
|
|
||||||
// Returns true if the event should not be handled from GetEventTargetParent
|
// Returns true if the event should not be handled from GetEventTargetParent
|
||||||
bool IsElementDisabledForEvents(mozilla::EventMessage aMessage,
|
bool IsElementDisabledForEvents(mozilla::WidgetEvent* aEvent,
|
||||||
nsIFrame* aFrame);
|
nsIFrame* aFrame);
|
||||||
|
|
||||||
// The focusability state of this form control. eUnfocusable means that it
|
// The focusability state of this form control. eUnfocusable means that it
|
||||||
|
|
|
@ -207,7 +207,7 @@ public:
|
||||||
*/
|
*/
|
||||||
inline bool AllowDraggableChildren() const;
|
inline bool AllowDraggableChildren() const;
|
||||||
|
|
||||||
virtual bool IsDisabledForEvents(mozilla::EventMessage aMessage)
|
virtual bool IsDisabledForEvents(mozilla::WidgetEvent* aEvent)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue