-
-
Notifications
You must be signed in to change notification settings - Fork 455
Expand file tree
/
Copy pathscreenshot_smoke.rs
More file actions
150 lines (140 loc) · 4.09 KB
/
screenshot_smoke.rs
File metadata and controls
150 lines (140 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Copyright 2020-2023 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
use std::sync::{
atomic::{AtomicBool, Ordering},
Arc,
};
use std::time::Duration;
use tao::{
event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoopBuilder},
window::WindowBuilder,
};
use wry::{PageLoadEvent, WebViewBuilder};
#[derive(Debug, Clone, Copy)]
enum UserEvent {
Capture,
Exit,
}
fn main() -> wry::Result<()> {
let event_loop = EventLoopBuilder::<UserEvent>::with_user_event().build();
let proxy = event_loop.create_proxy();
let window = WindowBuilder::new()
.with_title("wry screenshot smoke")
.build(&event_loop)
.unwrap();
let already_requested = Arc::new(AtomicBool::new(false));
let already_requested_ = already_requested.clone();
let proxy_for_load = proxy.clone();
let builder = WebViewBuilder::new()
.with_html(
r#"<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>WRY Screenshot Smoke</title>
<style>
html, body {
margin: 0;
width: 100%;
height: 100%;
font-family: sans-serif;
}
body {
display: grid;
place-items: center;
background: #1f2937;
color: white;
}
.card {
padding: 24px 28px;
border-radius: 16px;
background: rgba(255,255,255,0.12);
border: 1px solid rgba(255,255,255,0.18);
box-shadow: 0 20px 50px rgba(0,0,0,0.35);
backdrop-filter: blur(8px);
}
h1 { margin: 0 0 8px; font-size: 28px; }
p { margin: 0; opacity: 0.9; }
</style>
</head>
<body>
<div class="card">
<h1>Screenshot Smoke Test</h1>
<p>If you can read this in screenshot.png, capture worked.</p>
</div>
</body>
</html>"#,
)
.with_on_page_load_handler(move |event, _url| {
if matches!(event, PageLoadEvent::Finished)
&& !already_requested_.swap(true, Ordering::SeqCst)
{
let proxy = proxy_for_load.clone();
std::thread::spawn(move || {
std::thread::sleep(Duration::from_millis(1000));
let _ = proxy.send_event(UserEvent::Capture);
});
}
});
#[cfg(any(
target_os = "windows",
target_os = "macos",
target_os = "ios",
target_os = "android"
))]
let webview = builder.build(&window)?;
#[cfg(not(any(
target_os = "windows",
target_os = "macos",
target_os = "ios",
target_os = "android"
)))]
let webview = {
use tao::platform::unix::WindowExtUnix;
use wry::WebViewBuilderExtUnix;
let vbox = window.default_vbox().unwrap();
builder.build_gtk(vbox)?
};
event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Wait;
match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => *control_flow = ControlFlow::Exit,
Event::UserEvent(UserEvent::Capture) => {
// screenshot is not supported on Android or iOS; the handler would
// never be called, so we exit immediately on those platforms.
#[cfg(any(target_os = "android", target_os = "ios"))]
{
let _ = proxy.send_event(UserEvent::Exit);
return;
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
let proxy = proxy.clone();
webview
.screenshot(move |result| {
match result {
Ok(bytes) => {
if let Err(err) = std::fs::write("screenshot.png", bytes) {
eprintln!("failed to write screenshot.png: {err}");
} else {
println!("wrote screenshot.png");
}
}
Err(err) => eprintln!("screenshot failed: {err}"),
}
let _ = proxy.send_event(UserEvent::Exit);
})
.expect("failed to request screenshot");
}
}
Event::UserEvent(UserEvent::Exit) => *control_flow = ControlFlow::Exit,
_ => {}
}
});
}