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 }