Refactor (#1)
This commit is contained in:
17
.github/release.yml
vendored
Normal file
17
.github/release.yml
vendored
Normal 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
32
.github/workflows/book.yml
vendored
Normal 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
839
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
26
Cargo.toml
26
Cargo.toml
@@ -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]
|
||||
|
||||
5
build.rs
5
build.rs
@@ -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() {
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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]
|
||||
|
||||
@@ -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 }
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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())),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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())),
|
||||
));
|
||||
|
||||
@@ -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())),
|
||||
));
|
||||
|
||||
@@ -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()),
|
||||
|
||||
Reference in New Issue
Block a user