Refactor (#1)

This commit is contained in:
elm
2025-08-10 23:07:13 +09:00
committed by GitHub
parent a4030eeaf3
commit dd6854b176
16 changed files with 133 additions and 963 deletions

17
.github/release.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
changelog:
categories:
- title: Breaking Changes 🛠
labels:
- breaking-change
- title: Exciting New Features 🎉
labels:
- enhancement
- title: Improvements to existing features
labels:
- improvement
- title: Bug Fixes
labels:
- bug
- title: Other Changes
labels:
- "*"

32
.github/workflows/book.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: book
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Setup mdBook
uses: peaceiris/actions-mdbook@v2
with:
mdbook-version: 'latest'
- name: Build docs
run: |
cd docs
mdbook build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs/book

839
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,14 @@
[package]
name = "bevy_cef"
description = "Bevy CEF integration for web rendering"
version.workspace = true
edition.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
readme.workspace = true
keywords.workspace = true
categories.workspace = true
[workspace]
resolver = "2"
@@ -19,13 +23,25 @@ edition = "2024"
license = "Apache-2.0 OR MIT"
authors = ["notelm"]
repository = "https://github.com/not-elm/bevy_cef"
readme = "README.md"
keywords = ["bevy", "cef", "web", "rendering"]
categories = ["game-development", "web-programming", "graphics"]
[workspace.dependencies]
bevy = { version = "0.16" }
bevy = { version = "0.16", default-features = false, features = [
"bevy_log",
"bevy_window",
"bevy_asset",
"bevy_sprite",
"bevy_pbr",
"bevy_winit",
"bevy_picking",
"bevy_mesh_picking_backend",
"bevy_sprite_picking_backend",
] }
bevy_remote = "0.16"
cef = { version = "138" }
cef-dll-sys = { version = "138", features = ["sandbox"] }
download-cef = { version = "2" }
cef = { version = "139" }
cef-dll-sys = { version = "139.0", features = ["sandbox"] }
bevy_cef = { path = "." }
bevy_cef_core = { path = "crates/bevy_cef_core" }
async-channel = { version = "2.5" }
@@ -44,7 +60,7 @@ serde_json = { workspace = true }
raw-window-handle = "0.6"
[dev-dependencies]
bevy = { workspace = true, features = ["file_watcher"]}
bevy = { workspace = true, features = ["tonemapping_luts", "multi_threaded", "file_watcher"]}
bevy_cef = { workspace = true, features = ["debug"] }
[target.'cfg(target_os = "macos")'.dependencies]

View File

@@ -1,4 +1,6 @@
#[cfg(all(target_os = "macos", feature = "debug"))]
use std::env::home_dir;
#[cfg(all(target_os = "macos", feature = "debug"))]
use std::process::Command;
fn main() -> std::io::Result<()> {
@@ -12,6 +14,7 @@ fn main() -> std::io::Result<()> {
Ok(())
}
#[cfg(all(target_os = "macos", feature = "debug"))]
fn install_bevy_cef_debug_render_process() -> std::io::Result<()> {
let bevy_cef_render_process_path = home_dir()
.unwrap()
@@ -26,6 +29,7 @@ fn install_bevy_cef_debug_render_process() -> std::io::Result<()> {
Ok(())
}
#[cfg(all(target_os = "macos", feature = "debug"))]
fn install_export_cef_dir() -> std::io::Result<()> {
let export_cef_dir_path = home_dir()
.unwrap()
@@ -40,6 +44,7 @@ fn install_export_cef_dir() -> std::io::Result<()> {
Ok(())
}
#[cfg(all(target_os = "macos", feature = "debug"))]
fn export_cef_dir() -> std::io::Result<()> {
let cef_dir = home_dir().unwrap().join(".local").join("share").join("cef");
if cef_dir.exists() {

View File

@@ -5,6 +5,9 @@ edition.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
readme.workspace = true
keywords.workspace = true
categories.workspace = true
[dependencies]
bevy = { workspace = true }

View File

@@ -15,7 +15,7 @@ impl DataResponser {
pub fn prepare(&mut self, data: Vec<u8>, range: &Option<(usize, Option<usize>)>) {
if let Some((start, end)) = range {
self.offset = *start;
self.end_offset = end.unwrap_or(data.len() - 1) + 1;
self.end_offset = end.unwrap_or(data.len()-1);
self.data = data;
} else {
self.offset = 0;
@@ -40,7 +40,7 @@ impl DataResponser {
return None;
}
let slice = &self.data[start..end.min(self.data.len())];
let slice = &self.data[start..=end.min(self.data.len()-1)];
self.offset += slice.len();
Some(slice)
}
@@ -114,123 +114,4 @@ mod tests {
assert_eq!(responser.offset, 2);
assert_eq!(responser.end_offset, 7);
}
#[test]
fn data_responser_new_with_start_only() {
let data = vec![1, 2, 3, 4, 5];
let mut responser = DataResponser::default();
responser.prepare(data.clone(), &Some((3, None)));
assert_eq!(responser.data, data);
assert_eq!(responser.offset, 3);
assert_eq!(responser.end_offset, 5);
}
#[test]
fn data_responser_new_with_zero_start() {
let data = vec![1, 2, 3];
let mut responser = DataResponser::default();
responser.prepare(data.clone(), &Some((0, None)));
assert_eq!(responser.data, data);
assert_eq!(responser.offset, 0);
assert_eq!(responser.end_offset, 2);
}
#[test]
fn data_responser_new_with_empty_data() {
let data = vec![];
let mut responser = DataResponser::default();
responser.prepare(data.clone(), &Some((0, None)));
assert_eq!(responser.data, data);
assert_eq!(responser.offset, 0);
assert_eq!(responser.end_offset, 0);
}
#[test]
fn data_responser_new_with_start_beyond_data_length() {
let data = vec![1, 2, 3];
let mut responser = DataResponser::default();
responser.prepare(data.clone(), &Some((5, None)));
assert_eq!(responser.data, data);
assert_eq!(responser.offset, 5);
assert_eq!(responser.end_offset, 3);
}
#[test]
fn data_responser_new_with_end_beyond_data_length() {
let data = vec![1, 2, 3];
let mut responser = DataResponser::default();
responser.prepare(data.clone(), &Some((1, Some(10))));
assert_eq!(responser.data, data);
assert_eq!(responser.offset, 1);
assert_eq!(responser.end_offset, 10);
}
#[test]
fn data_responser_read_no_end_data_smaller_than_bytes_to_read() {
let data = vec![1, 2, 3, 4, 5];
let mut responser = DataResponser::default();
responser.prepare(data, &Some((2, None)));
let result = responser.read(10);
assert_eq!(result, Some(&[3, 4, 5][..]));
}
#[test]
fn data_responser_read_no_end_data_larger_than_bytes_to_read() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut responser = DataResponser::default();
responser.prepare(data, &Some((2, None)));
let result1 = responser.read(3);
assert_eq!(result1, Some(&[3, 4, 5][..]));
let result2 = responser.read(3);
assert_eq!(result2, Some(&[6, 7, 8][..]));
}
#[test]
fn data_responser_read_with_end_data_smaller_than_bytes_to_read() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut responser = DataResponser::default();
responser.prepare(data, &Some((2, Some(6))));
let result = responser.read(10);
assert_eq!(result, Some(&[3, 4, 5, 6][..]));
}
#[test]
fn data_responser_read_with_end_data_larger_than_bytes_to_read() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut responser = DataResponser::default();
responser.prepare(data, &Some((1, Some(7))));
let result1 = responser.read(3);
assert_eq!(result1, Some(&[2, 3, 4][..]));
let result2 = responser.read(3);
assert_eq!(result2, Some(&[5, 6, 7][..]));
}
#[test]
fn data_responser_read_consecutive_calls_until_end() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
let mut responser = DataResponser::default();
responser.prepare(data, &Some((1, Some(6))));
let result1 = responser.read(2);
assert_eq!(result1, Some(&[2, 3][..]));
let result2 = responser.read(2);
assert_eq!(result2, Some(&[4, 5][..]));
let result3 = responser.read(2);
assert_eq!(result3, Some(&[6][..]));
let result4 = responser.read(2);
assert_eq!(result4, None);
}
}
}

View File

@@ -42,14 +42,14 @@ fn content_range_header_value(
Some(format!(
"bytes {}-{}/{}",
start,
end.unwrap_or(data.len() - 1),
end.unwrap_or(data.len()),
data.len()
))
}
fn obtain_response_length(data: &[u8], range: &Option<(usize, Option<usize>)>) -> usize {
match range {
Some((start, end)) => end.unwrap_or(data.len() - 1) - start + 1,
Some((start, end)) => end.unwrap_or(data.len()) - start,
None => data.len(),
}
}
@@ -147,77 +147,77 @@ mod tests {
fn test_content_range_header_value_range_with_end() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((0, Some(5))));
assert_eq!(result, Some("bytes 0-4/13".to_string()));
assert_eq!(result, Some("bytes 0-5/13".to_string()));
}
#[test]
fn test_content_range_header_value_range_without_end() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((7, None)));
assert_eq!(result, Some("bytes 7-12/13".to_string()));
assert_eq!(result, Some("bytes 7-13/13".to_string()));
}
#[test]
fn test_content_range_header_value_range_from_start() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((0, None)));
assert_eq!(result, Some("bytes 0-12/13".to_string()));
assert_eq!(result, Some("bytes 0-13/13".to_string()));
}
#[test]
fn test_content_range_header_value_range_partial() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((7, Some(12))));
assert_eq!(result, Some("bytes 7-11/13".to_string()));
assert_eq!(result, Some("bytes 7-12/13".to_string()));
}
#[test]
fn test_content_range_header_value_range_single_byte() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((5, Some(6))));
assert_eq!(result, Some("bytes 5-5/13".to_string()));
assert_eq!(result, Some("bytes 5-6/13".to_string()));
}
#[test]
fn test_content_range_header_value_range_last_byte() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((12, Some(13))));
assert_eq!(result, Some("bytes 12-12/13".to_string()));
assert_eq!(result, Some("bytes 12-13/13".to_string()));
}
#[test]
fn test_content_range_header_value_single_byte_data() {
let data = b"a";
let result = content_range_header_value(data, &Some((0, None)));
assert_eq!(result, Some("bytes 0-0/1".to_string()));
assert_eq!(result, Some("bytes 0-1/1".to_string()));
}
#[test]
fn test_content_range_header_value_large_data() {
let data = vec![0u8; 1024];
let result = content_range_header_value(&data, &Some((100, Some(200))));
assert_eq!(result, Some("bytes 100-199/1024".to_string()));
assert_eq!(result, Some("bytes 100-200/1024".to_string()));
}
#[test]
fn test_content_range_header_value_large_data_no_end() {
let data = vec![0u8; 1024];
let result = content_range_header_value(&data, &Some((500, None)));
assert_eq!(result, Some("bytes 500-1023/1024".to_string()));
assert_eq!(result, Some("bytes 500-1024/1024".to_string()));
}
#[test]
fn test_content_range_header_value_zero_start() {
let data = b"test";
let result = content_range_header_value(data, &Some((0, Some(2))));
assert_eq!(result, Some("bytes 0-1/4".to_string()));
assert_eq!(result, Some("bytes 0-2/4".to_string()));
}
#[test]
fn test_content_range_header_value_range_end_equals_data_len() {
let data = b"Hello, World!";
let result = content_range_header_value(data, &Some((0, Some(13))));
assert_eq!(result, Some("bytes 0-12/13".to_string()));
assert_eq!(result, Some("bytes 0-13/13".to_string()));
}
#[test]

View File

@@ -5,8 +5,10 @@ edition.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
readme.workspace = true
keywords.workspace = true
categories.workspace = true
[dependencies]
cef = { workspace = true }
bevy_cef_core = { workspace = true }
libloading = { version = "0.8"}
bevy_cef_core = { workspace = true }

View File

@@ -4,11 +4,8 @@
use bevy::prelude::*;
use bevy::time::common_conditions::on_timer;
use bevy::window::PrimaryWindow;
use bevy_cef::prelude::*;
use bevy_remote::{BrpResult, RemotePlugin};
use cef::Window;
use serde::Deserialize;
use std::time::Duration;
fn main() {

View File

@@ -32,7 +32,7 @@ fn spawn_webview(
asset_server: Res<AssetServer>,
) {
commands.spawn((
CefWebviewUri("https://bevy.org/".to_string()),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
MeshMaterial3d(materials.add(WebviewExtendedMaterial {
extension: CustomExtension {

View File

@@ -56,7 +56,7 @@ fn spawn_github_webview(
mut materials: ResMut<Assets<WebviewExtendStandardMaterial>>,
) {
commands.spawn((
CefWebviewUri("https://github.com/not-elm".to_string()),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
WebviewSize(Vec2::splat(800.0)),
MeshMaterial3d(materials.add(WebviewExtendStandardMaterial::default())),
@@ -70,7 +70,7 @@ fn spawn_google_search_webview(
mut materials: ResMut<Assets<WebviewExtendStandardMaterial>>,
) {
commands.spawn((
CefWebviewUri("https://www.youtube.com/".to_string()),
CefWebviewUri::new("https://not-elm.github.io/bevy_cef/"),
WebviewSize(Vec2::splat(800.0)),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
MeshMaterial3d(materials.add(WebviewExtendStandardMaterial::default())),

View File

@@ -49,7 +49,7 @@ fn spawn_webview(
) {
commands.spawn((
DebugWebview,
CefWebviewUri("https://bevy.org/".to_string()),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
MeshMaterial3d(materials.add(WebviewExtendStandardMaterial {
base: StandardMaterial {

View File

@@ -50,7 +50,7 @@ fn spawn_webview(
) {
commands.spawn((
DebugWebview,
CefWebviewUri("https://bevy.org/".to_string()),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
MeshMaterial3d(materials.add(WebviewExtendStandardMaterial::default())),
));

View File

@@ -33,7 +33,7 @@ fn spawn_webview(
mut materials: ResMut<Assets<WebviewExtendStandardMaterial>>,
) {
commands.spawn((
CefWebviewUri("https://bevy.org/".to_string()),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Mesh3d(meshes.add(Plane3d::new(Vec3::Z, Vec2::ONE))),
MeshMaterial3d(materials.add(WebviewExtendStandardMaterial::default())),
));

View File

@@ -16,7 +16,7 @@ fn spawn_camera_2d(mut commands: Commands) {
fn spawn_sprite_webview(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
commands.spawn((
CefWebviewUri::new("https://bevyengine.org/"),
CefWebviewUri::new("https://github.com/not-elm/bevy_cef"),
Pickable::default(),
Sprite {
image: images.add(Image::default()),