slicc-cdp-client 1.41.21

Shared CDP connection for slicc-cdp CLIs
Documentation
struct NavigationEchoTransport { inbox: VecDeque<String> }
impl Transport for NavigationEchoTransport {
    fn send_text(&mut self, text: &str) -> Result<(), String> {
        let message: Value = serde_json::from_str(text).unwrap();
        if message["method"] == "Page.navigate" {
            self.inbox.push_back(json!({"method":"Network.requestWillBeSent","sessionId":message["sessionId"],"params":{"requestId":"LOADER","type":"Document","request":{"url":message["params"]["url"],"headers":{}}}}).to_string());
        }
        self.inbox.push_back(json!({"id":message["id"],"result":{"frameId":"FRAME","loaderId":"LOADER"}}).to_string());
        Ok(())
    }
    fn recv_text(&mut self, _: Instant) -> Result<Option<String>, String> { Ok(self.inbox.pop_front()) }
}

#[test]
fn accepted_ordinary_navigation_echo_is_byte_exact_but_unowned_urls_are_redacted() {
    let url="https://ordinary.invalid/page?to=https%3A%2F%2Fseven.sliccy.ai%2Fcanary%2Fowned";
    for queued in [false,true] {
        let mut cdp=Cdp::from_transport(Box::new(NavigationEchoTransport{inbox:VecDeque::new()}));
        if queued {
            let id=cdp.start_navigation(json!({"url":url}),Some("S")).unwrap();
            while cdp.poll_navigation(id).is_none() { assert!(cdp.pump(Instant::now()+Duration::from_secs(1)).unwrap()); }
        } else { cdp.call("Page.navigate",json!({"url":url}),Some("S")).unwrap(); }
        assert_eq!(cdp.events().iter().find(|event|event["method"]=="Network.requestWillBeSent").unwrap()["params"]["request"]["url"],url);
    }
    let mut cdp=url_backend("about:blank");
    cdp.absorb(json!({"method":"Network.requestWillBeSent","sessionId":"S","params":{"requestId":"UNKNOWN","type":"Document","request":{"url":url,"headers":{}}}}));
    assert_ne!(cdp.events().last().unwrap()["params"]["request"]["url"],url);
    cdp.blocked.insert("S".into());let before=cdp.events.len();
    cdp.absorb(json!({"method":"Network.requestWillBeSent","sessionId":"S","params":{"requestId":"PRIVATE","type":"Document","request":{"url":url,"headers":{}}}}));
    assert_eq!(cdp.events.len(),before);
}