Merge pull request #28367 from ptoomey3/ignore-disabled-buttons

Prevent ujs event propagation if element disabled when event chain begins
This commit is contained in:
Aaron Patterson 2017-03-27 09:12:15 -07:00 committed by GitHub
commit 88bae252ff
3 changed files with 38 additions and 1 deletions

View File

@ -2,6 +2,10 @@
{ matches, getData, setData, stopEverything, formElements } = Rails { matches, getData, setData, stopEverything, formElements } = Rails
Rails.handleDisabledElement = (e) ->
element = this
stopEverything(e) if element.disabled
# Unified function to enable an element (link, button and form) # Unified function to enable an element (link, button and form)
Rails.enableElement = (e) -> Rails.enableElement = (e) ->
element = if e instanceof Event then e.target else e element = if e instanceof Event then e.target else e

View File

@ -12,7 +12,7 @@
fire, delegate fire, delegate
getData, $ getData, $
refreshCSRFTokens, CSRFProtection refreshCSRFTokens, CSRFProtection
enableElement, disableElement enableElement, disableElement, handleDisabledElement
handleConfirm handleConfirm
handleRemote, formSubmitButtonClick, handleMetaClick handleRemote, formSubmitButtonClick, handleMetaClick
handleMethod handleMethod
@ -44,19 +44,23 @@ Rails.start = ->
delegate document, Rails.buttonDisableSelector, 'ajax:complete', enableElement delegate document, Rails.buttonDisableSelector, 'ajax:complete', enableElement
delegate document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement delegate document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement
delegate document, Rails.linkClickSelector, 'click', handleDisabledElement
delegate document, Rails.linkClickSelector, 'click', handleConfirm delegate document, Rails.linkClickSelector, 'click', handleConfirm
delegate document, Rails.linkClickSelector, 'click', handleMetaClick delegate document, Rails.linkClickSelector, 'click', handleMetaClick
delegate document, Rails.linkClickSelector, 'click', disableElement delegate document, Rails.linkClickSelector, 'click', disableElement
delegate document, Rails.linkClickSelector, 'click', handleRemote delegate document, Rails.linkClickSelector, 'click', handleRemote
delegate document, Rails.linkClickSelector, 'click', handleMethod delegate document, Rails.linkClickSelector, 'click', handleMethod
delegate document, Rails.buttonClickSelector, 'click', handleDisabledElement
delegate document, Rails.buttonClickSelector, 'click', handleConfirm delegate document, Rails.buttonClickSelector, 'click', handleConfirm
delegate document, Rails.buttonClickSelector, 'click', disableElement delegate document, Rails.buttonClickSelector, 'click', disableElement
delegate document, Rails.buttonClickSelector, 'click', handleRemote delegate document, Rails.buttonClickSelector, 'click', handleRemote
delegate document, Rails.inputChangeSelector, 'change', handleDisabledElement
delegate document, Rails.inputChangeSelector, 'change', handleConfirm delegate document, Rails.inputChangeSelector, 'change', handleConfirm
delegate document, Rails.inputChangeSelector, 'change', handleRemote delegate document, Rails.inputChangeSelector, 'change', handleRemote
delegate document, Rails.formSubmitSelector, 'submit', handleDisabledElement
delegate document, Rails.formSubmitSelector, 'submit', handleConfirm delegate document, Rails.formSubmitSelector, 'submit', handleConfirm
delegate document, Rails.formSubmitSelector, 'submit', handleRemote delegate document, Rails.formSubmitSelector, 'submit', handleRemote
# Normal mode submit # Normal mode submit
@ -65,6 +69,7 @@ Rails.start = ->
delegate document, Rails.formSubmitSelector, 'ajax:send', disableElement delegate document, Rails.formSubmitSelector, 'ajax:send', disableElement
delegate document, Rails.formSubmitSelector, 'ajax:complete', enableElement delegate document, Rails.formSubmitSelector, 'ajax:complete', enableElement
delegate document, Rails.formInputClickSelector, 'click', handleDisabledElement
delegate document, Rails.formInputClickSelector, 'click', handleConfirm delegate document, Rails.formInputClickSelector, 'click', handleConfirm
delegate document, Rails.formInputClickSelector, 'click', formSubmitButtonClick delegate document, Rails.formInputClickSelector, 'click', formSubmitButtonClick

View File

@ -26,6 +26,13 @@ module('data-confirm', {
'data-confirm': 'Are you absolutely sure?' 'data-confirm': 'Are you absolutely sure?'
})) }))
$('#qunit-fixture').append($('<button />', {
type: 'submit',
form: 'confirm',
disabled: 'disabled',
'data-confirm': 'Are you absolutely sure?'
}))
this.windowConfirm = window.confirm this.windowConfirm = window.confirm
}, },
teardown: function() { teardown: function() {
@ -286,3 +293,24 @@ asyncTest('clicking on the children of a link should also trigger a confirm', 6,
.find('strong') .find('strong')
.triggerNative('click') .triggerNative('click')
}) })
asyncTest('clicking on the children of a disabled button should not trigger a confirm.', 1, function() {
var message
// auto-decline:
window.confirm = function(msg) { message = msg; return false }
$('button[data-confirm][disabled]')
.html("<strong>Click me</strong>")
.bindNative('confirm', function() {
App.assertCallbackNotInvoked('confirm')
})
.find('strong')
.bindNative('click', function() {
App.assertCallbackInvoked('click')
})
.triggerNative('click')
setTimeout(function() {
start()
}, 50)
})