From 6deb5a86567901eb064c1121856ee1bcb2fbcdd0 Mon Sep 17 00:00:00 2001 From: Thibaud Colas Date: Sun, 28 Jul 2019 02:42:44 -0400 Subject: [PATCH] Delay dirty form check data snapshot to avoid race conditions. Fix #4978 (#5469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User interaction with the form within the 10s delay also won’t trigger the confirmation message. There will still be race condition issues if form widgets like rich text take 10+ seconds to initialise – but that doesn’t seem likely. --- wagtail/admin/static_src/wagtailadmin/js/core.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/wagtail/admin/static_src/wagtailadmin/js/core.js b/wagtail/admin/static_src/wagtailadmin/js/core.js index 79eedd60c..816beafff 100644 --- a/wagtail/admin/static_src/wagtailadmin/js/core.js +++ b/wagtail/admin/static_src/wagtailadmin/js/core.js @@ -57,16 +57,23 @@ function enableDirtyFormCheck(formSelector, options) { var $form = $(formSelector); var confirmationMessage = options.confirmationMessage || ' '; var alwaysDirty = options.alwaysDirty || false; - var initialData = $form.serialize(); + var initialData = null; var formSubmitted = false; $form.on('submit', function() { formSubmitted = true; }); + // Delay snapshotting the form’s data to avoid race conditions with form widgets that might process the values. + // User interaction with the form within that delay also won’t trigger the confirmation message. + setTimeout(function() { + initialData = $form.serialize(); + }, 1000 * 10); + window.addEventListener('beforeunload', function(event) { + var isDirty = initialData && $form.serialize() != initialData; var displayConfirmation = ( - !formSubmitted && (alwaysDirty || $form.serialize() != initialData) + !formSubmitted && (alwaysDirty || isDirty) ); if (displayConfirmation) {