use super::error::BridgeError;
pub const E_CLASS_DOMAINS: &[&str] = &[
"HeapProfiler",
"Profiler",
"DOMStorage",
"IndexedDB",
"ServiceWorker",
"Tracing",
];
pub const E_CLASS_METHODS: &[&str] = &[
"Page.printToPDF",
"Page.startJSCoverage",
"Page.stopJSCoverage",
"Page.startCSSCoverage",
"Page.stopCSSCoverage",
"Page.startScreencast", "Page.stopScreencast",
"Page.screencastFrameAck",
"Page.handleJavaScriptDialog", "Page.printToPDFAndDownload",
"Performance.enable",
"Performance.disable",
"Performance.getMetrics",
];
pub fn is_e_class(domain: &str, method: &str) -> bool {
if E_CLASS_DOMAINS.contains(&domain) {
return true;
}
let full = format!("{domain}.{method}");
E_CLASS_METHODS.contains(&full.as_str())
}
pub fn not_supported(domain: &str, method: &str) -> BridgeError {
BridgeError::NotSupported(format!("{domain}.{method}"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn heap_profiler_domain_always_e_class() {
assert!(is_e_class("HeapProfiler", "takeHeapSnapshot"));
assert!(is_e_class("HeapProfiler", "enable"));
assert!(is_e_class("HeapProfiler", "getObjectByHeapObjectId"));
assert!(is_e_class("HeapProfiler", "anythingElse"));
}
#[test]
fn profiler_domain_always_e_class() {
assert!(is_e_class("Profiler", "enable"));
assert!(is_e_class("Profiler", "start"));
assert!(is_e_class("Profiler", "stop"));
}
#[test]
fn dom_storage_domain_always_e_class() {
assert!(is_e_class("DOMStorage", "getDOMStorageItems"));
assert!(is_e_class("DOMStorage", "setDOMStorageItem"));
}
#[test]
fn indexed_db_domain_always_e_class() {
assert!(is_e_class("IndexedDB", "requestDatabaseNames"));
}
#[test]
fn service_worker_domain_always_e_class() {
assert!(is_e_class("ServiceWorker", "enable"));
assert!(is_e_class("ServiceWorker", "unregister"));
}
#[test]
fn tracing_domain_always_e_class() {
assert!(is_e_class("Tracing", "start"));
assert!(is_e_class("Tracing", "end"));
assert!(is_e_class("Tracing", "getCategories"));
}
#[test]
fn page_pdf_is_e_class() {
assert!(is_e_class("Page", "printToPDF"));
}
#[test]
fn page_coverage_is_e_class() {
assert!(is_e_class("Page", "startJSCoverage"));
assert!(is_e_class("Page", "stopJSCoverage"));
assert!(is_e_class("Page", "startCSSCoverage"));
assert!(is_e_class("Page", "stopCSSCoverage"));
}
#[test]
fn debugger_breakpoint_no_longer_e_class_after_bug_cdp_006() {
assert!(!is_e_class("Debugger", "setBreakpoint"));
assert!(!is_e_class("Debugger", "setBreakpointByUrl"));
assert!(!is_e_class("Debugger", "removeBreakpoint"));
assert!(!is_e_class("Debugger", "pause"));
assert!(!is_e_class("Debugger", "resume"));
assert!(!is_e_class("Debugger", "stepOver"));
assert!(!is_e_class("Debugger", "stepInto"));
assert!(!is_e_class("Debugger", "stepOut"));
assert!(!is_e_class("Debugger", "evaluateOnCallFrame"));
assert!(!is_e_class("Debugger", "setBreakpointsActive"));
}
#[test]
fn performance_metrics_e_class() {
assert!(is_e_class("Performance", "enable"));
assert!(is_e_class("Performance", "getMetrics"));
}
#[test]
fn page_navigate_not_e_class() {
assert!(!is_e_class("Page", "navigate"));
assert!(!is_e_class("Page", "reload"));
}
#[test]
fn runtime_evaluate_not_e_class() {
assert!(!is_e_class("Runtime", "evaluate"));
}
#[test]
fn not_supported_returns_correct_error_type() {
let e = not_supported("HeapProfiler", "takeHeapSnapshot");
match e {
BridgeError::NotSupported(m) => {
assert_eq!(m, "HeapProfiler.takeHeapSnapshot");
}
_ => panic!("expected NotSupported"),
}
}
#[test]
fn e_class_methods_count_at_least_10() {
assert!(
E_CLASS_METHODS.len() >= 10,
"E_CLASS_METHODS too small: {}",
E_CLASS_METHODS.len()
);
assert!(E_CLASS_DOMAINS.len() >= 6);
}
}