diff --git a/cypress/e2e/directediting.spec.js b/cypress/e2e/directediting.spec.js index 35e2333641..c59a7a8abe 100644 --- a/cypress/e2e/directediting.spec.js +++ b/cypress/e2e/directediting.spec.js @@ -61,16 +61,11 @@ describe('direct editing', function() { }) const closeRequestAlias = 'closeRequest' cy.intercept({ method: 'POST', url: '**/session/close' }).as(closeRequestAlias) - cy.intercept({ method: 'POST', url: '**/apps/text/session/sync' }).as('sync') cy.getContent().type('# This is a headline') cy.getContent().type('{enter}') cy.getContent().type('Some text') cy.getContent().type('{enter}') - // ensure we have received our own steps - cy.wait('@sync', { timeout: 7000 }) - cy.wait('@sync', { timeout: 7000 }) - cy.get('button.icon-close').click() cy.wait(`@${closeRequestAlias}`).then(() => { cy.getFileContent('empty.md').then((content) => { @@ -87,17 +82,12 @@ describe('direct editing', function() { }) const closeRequestAlias = 'closeRequest' cy.intercept({ method: 'POST', url: '**/session/close' }).as(closeRequestAlias) - cy.intercept({ method: 'POST', url: '**/apps/text/session/sync' }).as('sync') cy.getContent().type('# This is a headline') cy.getContent().type('{enter}') cy.getContent().type('Some text') cy.getContent().type('{enter}') - // ensure we have received our own steps - cy.wait('@sync', { timeout: 7000 }) - cy.wait('@sync', { timeout: 7000 }) - cy.get('button.icon-close').click() cy.wait(`@${closeRequestAlias}`).then(() => { cy.getFileContent('newfile.md').then((content) => { @@ -114,17 +104,12 @@ describe('direct editing', function() { }) const closeRequestAlias = 'closeRequest' cy.intercept({ method: 'POST', url: '**/session/close' }).as(closeRequestAlias) - cy.intercept({ method: 'POST', url: '**/apps/text/session/sync' }).as('sync') cy.getContent().type('# This is a headline') cy.getContent().type('{enter}') cy.getContent().type('Some text') cy.getContent().type('{enter}') - // ensure we have received our own steps - cy.wait('@sync', { timeout: 7000 }) - cy.wait('@sync', { timeout: 7000 }) - cy.get('button.icon-close').click() cy.wait(`@${closeRequestAlias}`).then(() => { cy.getFileContent('empty.txt').then((content) => { diff --git a/lib/Service/DocumentService.php b/lib/Service/DocumentService.php index 1bf5f8b1fe..aadfc825c6 100644 --- a/lib/Service/DocumentService.php +++ b/lib/Service/DocumentService.php @@ -339,9 +339,13 @@ public function autosave(?File $file, int $documentId, int $version, ?string $au if ($autoSaveDocument === null) { return $document; } - // Do not save if version already saved + // Do not save if newer version already saved + // Note that $version is the version of the steps the client has fetched. + // It may have added steps on top of that - so if the versions match we still save. $stepsVersion = $this->stepMapper->getLatestVersion($documentId); - if (!$force && ($version <= (string)$document->getLastSavedVersion() || $version > (string)$stepsVersion)) { + $savedVersion = $document->getLastSavedVersion(); + $outdated = $savedVersion > 0 && $savedVersion > $version; + if (!$force && ($outdated || $version > (string)$stepsVersion)) { return $document; }