/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
void HTMLButtonElement::FieldSetDisabledChanged(bool aNotify) { // FieldSetDisabledChanged *has* to be called *before* // UpdateBarredFromConstraintValidation, because the latter depends on our // disabled state.
nsGenericHTMLFormControlElementWithState::FieldSetDisabledChanged(aNotify);
if (IsDisabledForEvents(aVisitor.mEvent)) { return;
}
// Track whether we're in the outermost Dispatch invocation that will // cause activation of the input. That is, if we're a click event, or a // DOMActivate that was dispatched directly, this will be set, but if we're // a DOMActivate dispatched from click handling, it will not be set.
WidgetMouseEvent* mouseEvent = aVisitor.mEvent->AsMouseEvent(); bool outerActivateEvent =
((mouseEvent && mouseEvent->IsLeftClickEvent()) ||
(aVisitor.mEvent->mMessage == eLegacyDOMActivate &&
!mInInternalActivate && aVisitor.mEvent->mOriginalTarget == this));
if (outerActivateEvent) {
aVisitor.mItemFlags |= NS_OUTER_ACTIVATE_EVENT;
aVisitor.mWantsActivationBehavior = true;
}
void HTMLButtonElement::LegacyPreActivationBehavior(
EventChainVisitor& aVisitor) { // out-of-spec legacy pre-activation behavior needed because of bug 1803805 if (mType == FormControlType::ButtonSubmit && mForm) {
aVisitor.mItemFlags |= NS_IN_SUBMIT_CLICK;
aVisitor.mItemData = static_cast<Element*>(mForm); // tell the form that we are about to enter a click handler. // that means that if there are scripted submissions, the // latest one will be deferred until after the exit point of the handler.
mForm->OnSubmitClickBegin(this);
}
}
if (aVisitor.mEventStatus != nsEventStatus_eConsumeNoDefault) {
WidgetMouseEvent* mouseEvent = aVisitor.mEvent->AsMouseEvent(); if (mouseEvent && mouseEvent->IsLeftClickEvent() &&
OwnerDoc()->MayHaveDOMActivateListeners()) { // DOMActive event should be trusted since the activation is actually // occurred even if the cause is an untrusted click event.
InternalUIEvent actEvent(true, eLegacyDOMActivate, mouseEvent);
actEvent.mDetail = 1;
if (RefPtr<PresShell> presShell = aVisitor.mPresContext->GetPresShell()) {
nsEventStatus status = nsEventStatus_eIgnore;
mInInternalActivate = true;
presShell->HandleDOMEventWithTarget(this, &actEvent, &status);
mInInternalActivate = false;
// If activate is cancelled, we must do the same as when click is // cancelled (revert the checkbox to its original value). if (status == nsEventStatus_eConsumeNoDefault) {
aVisitor.mEventStatus = status;
}
}
}
}
if (nsEventStatus_eIgnore == aVisitor.mEventStatus) {
WidgetKeyboardEvent* keyEvent = aVisitor.mEvent->AsKeyboardEvent(); if (keyEvent && keyEvent->IsTrusted()) {
HandleKeyboardActivation(aVisitor);
}
// Bug 1459231: Temporarily needed till links respect activation target // Then also remove NS_OUTER_ACTIVATE_EVENT if ((aVisitor.mItemFlags & NS_OUTER_ACTIVATE_EVENT) && mForm &&
(mType == FormControlType::ButtonReset ||
mType == FormControlType::ButtonSubmit)) {
aVisitor.mEvent->mFlags.mMultipleActionsPrevented = true;
}
}
return rv;
}
void EndSubmitClick(EventChainVisitor& aVisitor) { if ((aVisitor.mItemFlags & NS_IN_SUBMIT_CLICK)) {
nsCOMPtr<nsIContent> content(do_QueryInterface(aVisitor.mItemData));
RefPtr<HTMLFormElement> form = HTMLFormElement::FromNodeOrNull(content);
MOZ_ASSERT(form); // Tell the form that we are about to exit a click handler, // so the form knows not to defer subsequent submissions. // The pending ones that were created during the handler // will be flushed or forgotten.
form->OnSubmitClickEnd(); // Tell the form to flush a possible pending submission. // the reason is that the script returned false (the event was // not ignored) so if there is a stored submission, it needs to // be submitted immediatelly. // Note, NS_IN_SUBMIT_CLICK is set only when we're in outer activate event.
form->FlushPendingSubmission();
}
}
void HTMLButtonElement::ActivationBehavior(EventChainPostVisitor& aVisitor) { if (!aVisitor.mPresContext) { // Should check whether EndSubmitClick is needed here. return;
}
if (!IsDisabled()) { if (mForm) { // Hold a strong ref while dispatching
RefPtr<mozilla::dom::HTMLFormElement> form(mForm); if (mType == FormControlType::ButtonReset) {
form->MaybeReset(this);
aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault;
} elseif (mType == FormControlType::ButtonSubmit) {
form->MaybeSubmit(this);
aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault;
} // https://html.spec.whatwg.org/multipage/form-elements.html#attr-button-type-button-state // NS_FORM_BUTTON_BUTTON do nothing.
} if (!GetInvokeTargetElement()) {
HandlePopoverTargetAction();
} else {
HandleInvokeTargetAction();
}
}
EndSubmitClick(aVisitor);
}
void HTMLButtonElement::LegacyCanceledActivationBehavior(
EventChainPostVisitor& aVisitor) { // still need to end submission, see bug 1803805 // e.g. when parent element of button has event handler preventing default // legacy canceled instead of activation behavior will be run
EndSubmitClick(aVisitor);
}
NS_IMETHODIMP
HTMLButtonElement::SubmitNamesValues(FormData* aFormData) { // // We only submit if we were the button pressed // if (aFormData->GetSubmitterElement() != this) { return NS_OK;
}
// // Get the name (if no name, no submit) //
nsAutoString name;
GetHTMLAttr(nsGkAtoms::name, name); if (name.IsEmpty()) { return NS_OK;
}
// // Get the value //
nsAutoString value;
GetHTMLAttr(nsGkAtoms::value, value);
if (aName == nsGkAtoms::type || aName == nsGkAtoms::disabled) { if (aName == nsGkAtoms::disabled) { // This *has* to be called *before* validity state check because // UpdateBarredFromConstraintValidation depends on our disabled state.
UpdateDisabledState(aNotify);
}
void HTMLButtonElement::SaveState() { if (!mDisabledChanged) { return;
}
PresState* state = GetPrimaryPresState(); if (state) { // We do not want to save the real disabled state but the disabled // attribute.
state->disabled() = HasAttr(nsGkAtoms::disabled);
state->disabledSet() = true;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.