In application with heavy use of webkit after an hour one of the user single shot timer never be called. Without WebKit this single shot timer works as it supposed. Investigation of problem lead me exactly to the ShadowBuffer::schedulePurge which is responsible for killing not already owned timer.
ShadowBuffer::timerEvent does not clean up timerId after call killTimer. And next call to ShadowBuffer::schedulePurge can lead to killing wrong timer. In worst case, any QTimer can acquire the same timerId and be killed suddenly by ShadowBuffer::schedulePurge.
See attachment for the patch.