@@ -3,7 +3,9 @@ import 'package:butterfly/api/open.dart';
33import 'package:butterfly/bloc/document_bloc.dart' ;
44import 'package:butterfly/cubits/editor_controller.dart' ;
55import 'package:butterfly/cubits/settings.dart' ;
6+ import 'package:butterfly/embed/embedding.dart' ;
67import 'package:butterfly/models/defaults.dart' ;
8+ import 'package:butterfly/models/persisted_document_state.dart' ;
79import 'package:butterfly/services/font.dart' ;
810import 'package:butterfly/src/generated/i18n/app_localizations.dart' ;
911import 'package:butterfly/views/main.dart' ;
@@ -95,11 +97,13 @@ void main() {
9597 );
9698 }
9799
98- Widget buildApp () {
99- final document = DocumentDefaults .createDocument (
100- name: 'Lifecycle test' ,
101- page: const DocumentPage (backgrounds: []),
102- );
100+ Widget buildApp ({NoteData ? embedDocument}) {
101+ final document =
102+ embedDocument ??
103+ DocumentDefaults .createDocument (
104+ name: 'Lifecycle test' ,
105+ page: const DocumentPage (backgrounds: []),
106+ );
103107 fileSystem.buildTemplateSystem ().updateFile ('default' , document);
104108 router = GoRouter (
105109 initialLocation: '/' ,
@@ -136,6 +140,13 @@ void main() {
136140 path: 'import' ,
137141 builder: (context, state) => ProjectPage (data: document),
138142 ),
143+ GoRoute (
144+ path: 'embed' ,
145+ builder: (context, state) => ProjectPage (
146+ data: document.toFile (),
147+ embedding: Embedding (internal: true ),
148+ ),
149+ ),
139150 ],
140151 ),
141152 ],
@@ -222,13 +233,59 @@ void main() {
222233 'imported document close' ,
223234 );
224235 });
236+
237+ testWidgets ('embed does not load or save persistent document state' , (
238+ tester,
239+ ) async {
240+ final document = DocumentDefaults .createDocument (
241+ name: 'Embed lifecycle test' ,
242+ page: const DocumentPage (backgrounds: []),
243+ );
244+ final contentKey = documentStateContentKey (
245+ documentStateContentHash (document.exportAsBytes ()),
246+ );
247+ final documentStateSystem = fileSystem.buildDocumentStateSystem ();
248+ await documentStateSystem.initialize ();
249+ await documentStateSystem.createFile (
250+ contentKey,
251+ const PersistedDocumentState (
252+ camera: PersistedCameraState (positionX: 100 , positionY: 200 , zoom: 3 ),
253+ ),
254+ );
255+ await tester.pumpWidget (buildApp (embedDocument: document));
256+
257+ router.go ('/embed' );
258+ await pumpUntil (
259+ tester,
260+ () => observer.lastDocumentBloc? .state is DocumentLoadSuccess ,
261+ 'embedded document open' ,
262+ );
263+
264+ final editorController = observer.lastDocumentBloc! .editorController;
265+ expect (editorController.transformCubit.state.position, Offset .zero);
266+ expect (editorController.transformCubit.state.size, 1 );
267+ editorController.transformCubit.teleport (const Offset (10 , 20 ), 2 );
268+
269+ router.go ('/' );
270+ await pumpUntil (
271+ tester,
272+ () => observer.documentBlocCloses == 1 ,
273+ 'embedded document close' ,
274+ );
275+
276+ final stored = await documentStateSystem.getFile (contentKey);
277+ expect (stored? .camera.positionX, 100 );
278+ expect (stored? .camera.positionY, 200 );
279+ expect (stored? .camera.zoom, 3 );
280+ });
225281}
226282
227283class _LifecycleObserver extends BlocObserver {
228284 int documentBlocCreates = 0 ;
229285 int documentBlocCloses = 0 ;
230286 int saveCubitCreates = 0 ;
231287 int saveCubitCloses = 0 ;
288+ DocumentBloc ? lastDocumentBloc;
232289 DocumentSaveCubit ? lastSaveCubit;
233290 final events = < String > [];
234291
@@ -237,6 +294,7 @@ class _LifecycleObserver extends BlocObserver {
237294 super .onCreate (bloc);
238295 if (bloc is DocumentBloc ) {
239296 documentBlocCreates++ ;
297+ lastDocumentBloc = bloc;
240298 } else if (bloc is DocumentSaveCubit ) {
241299 saveCubitCreates++ ;
242300 lastSaveCubit = bloc;
0 commit comments