git.lucas.co / cce-mail
mail client (IMAP/SMTP)
git clone https://git.lucas.co/cce-mail.git

examples/wpe_select.rs (2.6K)

 1 //! Headless check that a press-drag-release over a message selects text.
 2 //!
 3 //! WebKit decides whether a pointer move is a drag from the button bits in
 4 //! the move event's own modifiers; a move reporting no held button is a
 5 //! hover, and nothing is selected. The page paints its selection pure green,
 6 //! so the readback answers without any script: green pixels on the text line
 7 //! mean something is selected. A double-click (which needs no drag) runs
 8 //! first as the control that the probe can see a selection at all.
 9 //!
10 //! `cargo run --release -p cce-mail --example wpe_select`
11 
12 #[path = "../src/wpe/mod.rs"]
13 mod wpe;
14 
15 use cce_ui::widget::MouseButton;
16 
17 fn main() {
18     let html = r##"<!doctype html>
19 <html><head><style>
20   body { margin:0; background:#ffffff; color:#000000; font:80px/120px monospace }
21   ::selection { background:#00ff00; color:#000000 }
22 </style></head>
23 <body><p style="margin:0">alpha bravo charlie</p></body></html>"##;
24 
25     let mut view = wpe::MailWebView::new((1200, 600));
26     view.load_html(html);
27     let mut settle = |view: &mut wpe::MailWebView, n: u32| {
28         for _ in 0..n {
29             view.pump();
30             std::thread::sleep(std::time::Duration::from_millis(50));
31         }
32     };
33     settle(&mut view, 40);
34 
35     let green = |view: &wpe::MailWebView| {
36         (0..120).step_by(4).flat_map(|y| (0..900).step_by(10).map(move |x| (x, y)))
37             .filter(|&(x, y)| view.sample_pixel(x, y).is_some_and(|(r, g, b)| g > 200 && r < 80 && b < 80))
38             .count()
39     };
40     println!("before: green={}", green(&view));
41     // Control: a double-click selects a word without any drag.
42     view.mouse_button_ui(MouseButton::Left, true, 100.0, 60.0);
43     view.mouse_button_ui(MouseButton::Left, false, 100.0, 60.0);
44     view.mouse_button_ui(MouseButton::Left, true, 100.0, 60.0);
45     view.mouse_button_ui(MouseButton::Left, false, 100.0, 60.0);
46     settle(&mut view, 10);
47     println!("dblclick: green={}", green(&view));
48     view.mouse_button_ui(MouseButton::Left, true, 1100.0, 400.0);
49     view.mouse_button_ui(MouseButton::Left, false, 1100.0, 400.0);
50     settle(&mut view, 10);
51     println!("cleared: green={}", green(&view));
52 
53     view.mouse_move(2.0, 60.0);
54     view.mouse_button_ui(MouseButton::Left, true, 2.0, 60.0);
55     settle(&mut view, 2);
56     for x in (40..=700).step_by(60) {
57         view.mouse_move(x as f32, 60.0);
58         settle(&mut view, 1);
59     }
60     view.mouse_button_ui(MouseButton::Left, false, 700.0, 60.0);
61     settle(&mut view, 10);
62 
63     let after = green(&view);
64     println!("after drag: green={after}");
65     assert!(after > 0, "drag selected nothing");
66     println!("OK: drag selected text");
67 }