fix(cdp): return descriptive error for Page.printToPDF instead of generic Unknown Page method (#53) (#112)
Playwright's `page.pdf()` issues a `Page.printToPDF` CDP request which
Obscura was not handling, so the dispatcher fell through to the generic
catch-all and clients saw:
Page.pdf: Protocol error (Page.printToPDF): Unknown Page method: printToPDF
This reads like an oversight rather than a deliberate limitation.
Obscura intentionally has no layout engine — option (2) from the issue —
so make the limitation explicit by handling the method and returning a
clear error that names the method, says why it isn't supported, and
points users at a working alternative (extract HTML via
Runtime.evaluate, then render to PDF in their client).
The behavior change is small but meaningful for DX: the JSON-RPC error
code stays -32601 (the dispatcher's mapping for `Err(_)`), but the
human-readable message becomes actionable instead of looking like a
forgotten method.
Adds a unit test that pins the regression: printToPDF must NOT fall
through to the "Unknown Page method" catch-all and must mention both
"not supported" and a workaround.
Generated by Ora Studio
Vibe coded by ousamabenyounes
Co-authored-by: Ora Studio <[email protected]>
This commit is contained in:
1 parent
7dfc2a9c01
commit
023caf9ce5
1 file changed
+39
@@ -273,6 +273,20 @@ pub async fn handle(
|
|||||||
}]
|
}]
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
"printToPDF" => {
|
||||||
|
// Obscura has no layout/rendering engine, so PDF generation is
|
||||||
|
// intentionally not implemented. Returning a distinct, descriptive
|
||||||
|
// error (rather than the generic "Unknown Page method" fallback)
|
||||||
|
// tells Playwright/Puppeteer/headless_chrome clients exactly why
|
||||||
|
// the call failed and what to do instead.
|
||||||
|
Err(
|
||||||
|
"Page.printToPDF is not supported by Obscura: no layout engine. \
|
||||||
|
Use Runtime.evaluate (e.g. page.evaluate) to extract the rendered \
|
||||||
|
HTML, then render to PDF in your client (wkhtmltopdf, weasyprint, \
|
||||||
|
a separate headless Chromium pipeline, etc.)."
|
||||||
|
.to_string(),
|
||||||
|
)
|
||||||
|
}
|
||||||
_ => Err(format!("Unknown Page method: {}", method)),
|
_ => Err(format!("Unknown Page method: {}", method)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -333,4 +347,29 @@ mod tests {
|
|||||||
.expect_err("unknown methods must surface as errors");
|
.expect_err("unknown methods must surface as errors");
|
||||||
assert!(err.contains("Unknown Page method"));
|
assert!(err.contains("Unknown Page method"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn print_to_pdf_returns_descriptive_unsupported_error() {
|
||||||
|
// Regression for #53: Page.printToPDF must be handled explicitly so
|
||||||
|
// Playwright clients receive a descriptive error rather than the
|
||||||
|
// generic "Unknown Page method" fallback.
|
||||||
|
let mut ctx = CdpContext::new();
|
||||||
|
let err = handle("printToPDF", &json!({}), &mut ctx, &None)
|
||||||
|
.await
|
||||||
|
.expect_err("printToPDF must error until a real renderer exists");
|
||||||
|
assert!(
|
||||||
|
!err.contains("Unknown Page method"),
|
||||||
|
"printToPDF must NOT fall through to the catch-all: {err}"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
err.contains("not supported by Obscura"),
|
||||||
|
"error must clearly state PDF is unsupported: {err}"
|
||||||
|
);
|
||||||
|
// Direct user to a workaround so the message is actionable.
|
||||||
|
assert!(
|
||||||
|
err.to_lowercase().contains("evaluate")
|
||||||
|
|| err.to_lowercase().contains("html"),
|
||||||
|
"error must point to a workaround: {err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user