diff --git a/docs/designers-developers/developers/data/data-core-editor.md b/docs/designers-developers/developers/data/data-core-editor.md
index ffba8e67b9aa3..1cf2a7cf6e297 100644
--- a/docs/designers-developers/developers/data/data-core-editor.md
+++ b/docs/designers-developers/developers/data/data-core-editor.md
@@ -1068,7 +1068,10 @@ _Related_
# **autosave**
-Action generator used in signalling that the post should autosave.
+Action generator used in signalling that the post should autosave. This
+includes server-side autosaving (default) and client-side (a.k.a. local)
+autosaving (e.g. on the Web, the post might be committed to Session
+Storage).
_Parameters_
diff --git a/packages/e2e-tests/specs/editor/various/autosave.test.js b/packages/e2e-tests/specs/editor/various/autosave.test.js
index 34822f8c680aa..ef0522dc9d990 100644
--- a/packages/e2e-tests/specs/editor/various/autosave.test.js
+++ b/packages/e2e-tests/specs/editor/various/autosave.test.js
@@ -103,9 +103,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
// Reload without saving on the server
await page.reload();
@@ -207,9 +205,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -233,9 +229,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -260,9 +254,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -283,9 +275,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -314,9 +304,7 @@ describe( 'autosave', () => {
// Force conflicting local autosave
await page.evaluate( () =>
- window.wp.data
- .dispatch( 'core/editor' )
- .__experimentalLocalAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
diff --git a/packages/editor/src/components/local-autosave-monitor/index.js b/packages/editor/src/components/local-autosave-monitor/index.js
index e79fe0642b3af..aaf697bc70d94 100644
--- a/packages/editor/src/components/local-autosave-monitor/index.js
+++ b/packages/editor/src/components/local-autosave-monitor/index.js
@@ -169,9 +169,9 @@ function useAutosavePurge() {
}
function LocalAutosaveMonitor() {
- const { __experimentalLocalAutosave } = useDispatch( 'core/editor' );
- const autosave = useCallback( () => {
- requestIdleCallback( __experimentalLocalAutosave );
+ const { autosave } = useDispatch( 'core/editor' );
+ const deferedAutosave = useCallback( () => {
+ requestIdleCallback( () => autosave( { local: true } ) );
}, [] );
useAutosaveNotice();
useAutosavePurge();
@@ -187,7 +187,7 @@ function LocalAutosaveMonitor() {
return (
);
}
diff --git a/packages/editor/src/store/actions.js b/packages/editor/src/store/actions.js
index d58fbef47254a..388368d205b6f 100644
--- a/packages/editor/src/store/actions.js
+++ b/packages/editor/src/store/actions.js
@@ -342,36 +342,46 @@ export function* trashPost() {
}
/**
- * Action generator used in signalling that the post should autosave.
+ * Action generator used in signalling that the post should autosave. This
+ * includes server-side autosaving (default) and client-side (a.k.a. local)
+ * autosaving (e.g. on the Web, the post might be committed to Session
+ * Storage).
*
* @param {Object?} options Extra flags to identify the autosave.
*/
-export function* autosave( options ) {
- yield dispatch( STORE_KEY, 'savePost', { isAutosave: true, ...options } );
-}
-
-export function* __experimentalLocalAutosave() {
- const post = yield select( STORE_KEY, 'getCurrentPost' );
- const isPostNew = yield select( STORE_KEY, 'isEditedPostNew' );
- const title = yield select( STORE_KEY, 'getEditedPostAttribute', 'title' );
- const content = yield select(
- STORE_KEY,
- 'getEditedPostAttribute',
- 'content'
- );
- const excerpt = yield select(
- STORE_KEY,
- 'getEditedPostAttribute',
- 'excerpt'
- );
- yield {
- type: 'LOCAL_AUTOSAVE_SET',
- postId: post.id,
- isPostNew,
- title,
- content,
- excerpt,
- };
+export function* autosave( { local = false, ...options } = {} ) {
+ if ( local ) {
+ const post = yield select( STORE_KEY, 'getCurrentPost' );
+ const isPostNew = yield select( STORE_KEY, 'isEditedPostNew' );
+ const title = yield select(
+ STORE_KEY,
+ 'getEditedPostAttribute',
+ 'title'
+ );
+ const content = yield select(
+ STORE_KEY,
+ 'getEditedPostAttribute',
+ 'content'
+ );
+ const excerpt = yield select(
+ STORE_KEY,
+ 'getEditedPostAttribute',
+ 'excerpt'
+ );
+ yield {
+ type: 'LOCAL_AUTOSAVE_SET',
+ postId: post.id,
+ isPostNew,
+ title,
+ content,
+ excerpt,
+ };
+ } else {
+ yield dispatch( STORE_KEY, 'savePost', {
+ isAutosave: true,
+ ...options,
+ } );
+ }
}
/**