If protocol is defined and it is associated with an executable, browser shows an alert in order to accept or deny the execution.
I think that alert causes the timeout to occur so the failure callback is called, instead of the success callback.
Have you checked this?
I am in Google Chrome.
Thanks
Jaime