@@ -9,7 +9,7 @@ import { browserStepRecord } from "./browser-interactions.js"
99import { browserPreviewNetworkPolicyIsActive , browserPreviewNetworkPolicySummary , browserPreviewNeedsContextRouting , browserPreviewOrigins , browserPreviewReadinessError , browserPreviewRouting , browserPreviewSecureContextError , browserPreviewTopology , resolveBrowserPreviewUrl , routeBrowserPreviewContextNetwork } from "./browser-preview-routing.js"
1010import { browserProbeReplayability , browserProbeViewport } from "./browser-probe.js"
1111import { argValue , commaListArg , durationArg , jsonArrayArg } from "./commands.js"
12- import { editorActionStepsFromArgs , editorOpenTargetFromArgs , editorValidateContentFromArgs , editorValidateProviderFromArgs , resolveEditorOpenTarget , type EditorActionStep } from "./editor-actions.js"
12+ import { DEFAULT_EDITOR_WAIT_SELECTOR , editorActionStepsFromArgs , editorOpenTargetFromArgs , editorValidateContentFromArgs , editorValidateProviderFromArgs , resolveEditorOpenTarget , type EditorActionStep } from "./editor-actions.js"
1313import type { PlaygroundRunResponse } from "./playground-command-errors.js"
1414import type { PlaygroundCliServer } from "./preview-server.js"
1515import { serializeBrowserError } from "./browser-metrics.js"
@@ -538,6 +538,7 @@ export async function runEditorOpenCommand({
538538 let editorState : EditorStateSnapshot | undefined
539539 let editorValidity : EditorValidityArtifact | undefined
540540 let editorCanvasReadiness : BrowserEditorCanvasProbeSummary | undefined
541+ let editorReadiness : BrowserEditorReadinessSummary | undefined
541542 let authSummary : BrowserProbeAuthSummary | undefined
542543 let pendingError : Error | undefined
543544 let artifact : BrowserArtifact | undefined
@@ -577,10 +578,12 @@ export async function runEditorOpenCommand({
577578 const waitStartedAt = now ( )
578579 const waitStartedAtMs = Date . now ( )
579580 try {
580- await waitForAnyVisibleSelector ( page , target . waitSelector , waitTimeoutMs )
581- editorCanvasReadiness = await waitForEditorOpenCanvasReadiness ( page , target . waitSelector , waitTimeoutMs )
581+ const readiness = await waitForEditorOpenReadiness ( page , target . waitSelector , waitTimeoutMs )
582+ editorReadiness = readiness . editorReadiness
583+ editorCanvasReadiness = readiness . editorCanvasReadiness
582584 finalUrl = page . url ( )
583- stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : target . waitSelector } , "ok" , waitStartedAt , waitStartedAtMs , finalUrl , {
585+ stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : target . waitSelector ?? "wp.data core/editor + core/block-editor + core/editor.savePost" } , "ok" , waitStartedAt , waitStartedAtMs , finalUrl , {
586+ editorReadiness,
584587 ...( editorCanvasReadiness ? { editorCanvas : editorCanvasReadiness } : { } ) ,
585588 } as never ) )
586589 } catch ( error ) {
@@ -606,7 +609,7 @@ export async function runEditorOpenCommand({
606609 }
607610 if ( capture . has ( "screenshot" ) ) {
608611 await artifactSession . writeGenerated ( "screenshot" , "editor-screenshot.png" , async ( path ) => {
609- if ( editorCanvasReadiness ?. ready ) {
612+ if ( editorCanvasReadiness ?. ready && target . waitSelector ) {
610613 const frame = await resolveEditorCanvasFrame ( page , target . waitSelector )
611614 if ( frame ) {
612615 await frame . locator ( EDITOR_CANVAS_DEFAULT_LAYOUT_SELECTOR ) . first ( ) . screenshot ( { path, timeout : waitTimeoutMs } )
@@ -653,6 +656,7 @@ export async function runEditorOpenCommand({
653656 screenshot : capture . has ( "screenshot" ) ,
654657 ...( editorSummary ? { editor : editorSummary } : { } ) ,
655658 ...( editorValidity ? { editorValidity : editorValidity . summary } : { } ) ,
659+ ...( editorReadiness ? { editorReadiness } : { } ) ,
656660 ...( editorCanvasReadiness ? { editorCanvas : editorCanvasReadiness } : { } ) ,
657661 viewport,
658662 } ,
@@ -682,7 +686,7 @@ export async function runEditorOpenCommand({
682686 }
683687
684688 if ( pendingError ) {
685- throw new Error ( `wordpress.editor-open failed after ${ stepRecords . length } step(s): ${ pendingError . message } ` )
689+ throw editorOpenArtifactError ( stepRecords . length , pendingError , artifact )
686690 }
687691
688692 return {
@@ -727,9 +731,15 @@ export function editorOpenArtifactFilesForCapture(capture: ReadonlySet<string>,
727731 }
728732}
729733
730- async function waitForEditorOpenCanvasReadiness ( page : import ( "playwright" ) . Page , waitSelector : string , timeoutMs : number ) : Promise < BrowserEditorCanvasProbeSummary | undefined > {
734+ export async function waitForEditorOpenReadiness ( page : import ( "playwright" ) . Page , waitSelector : string | undefined , timeoutMs : number ) : Promise < { editorReadiness : BrowserEditorReadinessSummary ; editorCanvasReadiness ?: BrowserEditorCanvasProbeSummary } > {
735+ const editorReadiness = await waitForEditorReadiness ( page , timeoutMs )
736+ if ( ! waitSelector ) {
737+ return { editorReadiness }
738+ }
739+
740+ await waitForAnyVisibleSelector ( page , waitSelector , timeoutMs )
731741 if ( ! waitSelector . includes ( "editor-canvas" ) ) {
732- return undefined
742+ return { editorReadiness }
733743 }
734744
735745 const probe = await waitForEditorCanvasProbe ( page , {
@@ -744,7 +754,11 @@ async function waitForEditorOpenCanvasReadiness(page: import("playwright").Page,
744754 throw new Error ( `Editor canvas was not ready: ${ probe . summary . diagnostics . map ( ( diagnostic ) => diagnostic . code ) . join ( ", " ) || "not-ready" } ` )
745755 }
746756
747- return probe . summary
757+ return { editorReadiness, editorCanvasReadiness : probe . summary }
758+ }
759+
760+ export function editorOpenArtifactError ( stepCount : number , error : Error , artifact : BrowserArtifact ) : BrowserCommandArtifactError {
761+ return new BrowserCommandArtifactError ( `wordpress.editor-open failed after ${ stepCount } step(s): ${ error . message } ` , artifact )
748762}
749763
750764export async function runEditorActionsCommand ( {
@@ -768,6 +782,7 @@ export async function runEditorActionsCommand({
768782 server,
769783 } )
770784 const actionSteps = await editorActionStepsFromArgs ( args )
785+ const editorWaitSelector = target . waitSelector ?? DEFAULT_EDITOR_WAIT_SELECTOR
771786 const capture = new Set ( commaListArg ( args , "capture" ) )
772787 if ( capture . size === 0 ) {
773788 capture . add ( "steps" )
@@ -845,13 +860,13 @@ export async function runEditorActionsCommand({
845860 const waitStartedAt = now ( )
846861 const waitStartedAtMs = Date . now ( )
847862 try {
848- await waitForAnyVisibleSelector ( page , target . waitSelector , waitTimeoutMs )
863+ await waitForAnyVisibleSelector ( page , editorWaitSelector , waitTimeoutMs )
849864 finalUrl = page . url ( )
850- stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : target . waitSelector } , "ok" , waitStartedAt , waitStartedAtMs , finalUrl , { } ) )
865+ stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : editorWaitSelector } , "ok" , waitStartedAt , waitStartedAtMs , finalUrl , { } ) )
851866 } catch ( error ) {
852867 const serialized = serializeBrowserError ( "probe-error" , error )
853868 errors . push ( serialized )
854- stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : target . waitSelector } , "failed" , waitStartedAt , waitStartedAtMs , page . url ( ) , { error : serialized } ) )
869+ stepRecords . push ( browserStepRecord ( 1 , { kind : "waitFor" , selector : editorWaitSelector } , "failed" , waitStartedAt , waitStartedAtMs , page . url ( ) , { error : serialized } ) )
855870 pendingError = error instanceof Error ? error : new Error ( String ( error ) )
856871 }
857872 }
@@ -1113,14 +1128,14 @@ async function waitForEditorReadiness(page: import("playwright").Page, timeoutMs
11131128 const editor = select ( "core/editor" )
11141129 const blockEditor = select ( "core/block-editor" )
11151130 const editorDispatch = dispatch ( "core/editor" )
1116- if ( ! editor || ! blockEditor || ! editorDispatch ) {
1131+ if ( ! editor || ! blockEditor || ! editorDispatch || typeof editorDispatch . savePost !== "function" ) {
11171132 return false
11181133 }
11191134 return {
11201135 schema : "wp-codebox/editor-readiness/v1" ,
11211136 status : "ready" ,
11221137 storesAvailable : true ,
1123- canSave : typeof editorDispatch . savePost === "function" ,
1138+ canSave : true ,
11241139 postId : typeof editor . getCurrentPostId === "function" ? editor . getCurrentPostId ( ) : undefined ,
11251140 postType : typeof editor . getCurrentPostType === "function" ? editor . getCurrentPostType ( ) : undefined ,
11261141 }
@@ -1601,6 +1616,7 @@ export async function runEditorValidateBlocksCommand({
16011616 runtimeSpec,
16021617 server,
16031618 } )
1619+ const editorWaitSelector = target . waitSelector ?? DEFAULT_EDITOR_WAIT_SELECTOR
16041620 const content = await editorValidateContentFromArgs ( args )
16051621 const provider = editorValidateProviderFromArgs ( args )
16061622 const waitTimeoutMs = durationArg ( args , "wait-timeout" , EDITOR_VALIDATE_BLOCKS_READY_TIMEOUT_MS )
@@ -1639,7 +1655,7 @@ export async function runEditorValidateBlocksCommand({
16391655
16401656 await page . goto ( targetUrl , { waitUntil : "domcontentloaded" , timeout : waitTimeoutMs } )
16411657 finalUrl = page . url ( )
1642- await waitForAnyVisibleSelector ( page , target . waitSelector , waitTimeoutMs )
1658+ await waitForAnyVisibleSelector ( page , editorWaitSelector , waitTimeoutMs )
16431659 await waitForEditorBlocksRuntime ( page , waitTimeoutMs )
16441660 finalUrl = page . url ( )
16451661 validation = await validateEditorBlocks ( page , { content, provider } )
0 commit comments