Skip to content

Commit 166b9f4

Browse files
authored
Guard editor state capture stores (#1741)
1 parent 29e4a3d commit 166b9f4

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

packages/runtime-playground/src/editor-command-runners.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,11 +1070,14 @@ async function executeEditorActionStep(page: import("playwright").Page, step: Ed
10701070
return { state: await page.evaluate(() => {
10711071
const wpData = (window as unknown as { wp?: { data?: { select?: (store: string) => Record<string, unknown> } } }).wp?.data
10721072
const select = wpData?.select
1073-
if (!select) {
1073+
if (typeof select !== "function") {
10741074
return { storesAvailable: false }
10751075
}
10761076
const editor = select("core/editor")
10771077
const blockEditor = select("core/block-editor")
1078+
if (!editor || !blockEditor) {
1079+
return { storesAvailable: false }
1080+
}
10781081
const currentPost = typeof editor.getCurrentPost === "function" ? editor.getCurrentPost() as Record<string, unknown> | null : null
10791082
const blocks = typeof blockEditor.getBlocks === "function" ? blockEditor.getBlocks() as Array<Record<string, unknown>> : []
10801083
return {
@@ -1147,6 +1150,9 @@ async function saveEditorPost(page: import("playwright").Page, step: Extract<Edi
11471150
const editor = select("core/editor")
11481151
const blockEditor = dispatch("core/block-editor")
11491152
const editorDispatch = dispatch("core/editor")
1153+
if (!editor) {
1154+
throw new Error("wp-codebox-editor-readiness-unavailable: core/editor store is unavailable")
1155+
}
11501156
if (typeof editorDispatch?.savePost !== "function") {
11511157
throw new Error("wp-codebox-editor-save-unsupported: core/editor savePost is unavailable")
11521158
}
@@ -1265,15 +1271,18 @@ interface EditorValidityArtifact {
12651271
summary: BrowserEditorValiditySummary
12661272
}
12671273

1268-
async function captureEditorState(page: import("playwright").Page, target: ReturnType<typeof editorOpenTargetFromArgs>): Promise<EditorStateSnapshot> {
1274+
export async function captureEditorState(page: import("playwright").Page, target: ReturnType<typeof editorOpenTargetFromArgs>): Promise<EditorStateSnapshot> {
12691275
const state = await page.evaluate(() => {
12701276
const wpData = (window as unknown as { wp?: { data?: { select?: (store: string) => Record<string, unknown> } } }).wp?.data
12711277
const select = wpData?.select
1272-
if (!select) {
1278+
if (typeof select !== "function") {
12731279
return { storesAvailable: false }
12741280
}
12751281
const editor = select("core/editor")
12761282
const blockEditor = select("core/block-editor")
1283+
if (!editor || !blockEditor) {
1284+
return { storesAvailable: false }
1285+
}
12771286
const currentPost = typeof editor.getCurrentPost === "function" ? editor.getCurrentPost() as Record<string, unknown> | null : null
12781287
const blocks = typeof blockEditor.getBlocks === "function" ? blockEditor.getBlocks() as Array<Record<string, unknown>> : []
12791288
return {

tests/editor-actions.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import assert from "node:assert/strict"
2-
import { captureEditorValidity, editorOpenArtifactFilesForCapture, editorOpenArtifactPathPrefixFromArgs } from "../packages/runtime-playground/src/editor-command-runners.js"
2+
import { captureEditorState, captureEditorValidity, editorOpenArtifactFilesForCapture, editorOpenArtifactPathPrefixFromArgs } from "../packages/runtime-playground/src/editor-command-runners.js"
33
import { editorActionStepsFromArgs, editorOpenTargetFromArgs, resolveEditorOpenTarget } from "../packages/runtime-playground/src/editor-actions.js"
44

55
const steps = await editorActionStepsFromArgs([
@@ -24,6 +24,25 @@ await assert.rejects(
2424
)
2525

2626
const target = editorOpenTargetFromArgs(["target=post-new"])
27+
const unavailableEditorState = await captureEditorState({
28+
evaluate: async (callback: () => unknown) => {
29+
const globals = globalThis as typeof globalThis & { window?: unknown }
30+
const previousWindow = globals.window
31+
globals.window = {
32+
data: {
33+
select: (store: string) => store === "core/block-editor" ? { getBlocks: () => [] } : undefined,
34+
},
35+
}
36+
globals.window = { wp: globals.window }
37+
try {
38+
return callback()
39+
} finally {
40+
globals.window = previousWindow
41+
}
42+
},
43+
} as never, target)
44+
assert.equal(unavailableEditorState.storesAvailable, false)
45+
2746
const validity = await captureEditorValidity({
2847
evaluate: async (_callback: unknown, selectors: string[]) => ([{
2948
source: "dom",

0 commit comments

Comments
 (0)