diff --git a/crates/browser/src/css_loader.rs b/crates/browser/src/css_loader.rs index 301adb9..37c87ba 100644 --- a/crates/browser/src/css_loader.rs +++ b/crates/browser/src/css_loader.rs @@ -208,6 +208,7 @@ fn fetch_stylesheet( } } } + Resource::Script { text, url } => (text, url), Resource::Image { .. } => { return Err(CssLoadError::NotCss { url: href.to_string(), diff --git a/crates/browser/src/img_loader.rs b/crates/browser/src/img_loader.rs index 4d0cb0b..4bcc56e 100644 --- a/crates/browser/src/img_loader.rs +++ b/crates/browser/src/img_loader.rs @@ -227,7 +227,9 @@ fn fetch_and_decode( Resource::Image { data, url, .. } => (data, url.to_string()), Resource::Other { data, url, .. } => (data, url.to_string()), Resource::Html { text, .. } => (text.into_bytes(), src.to_string()), - Resource::Css { text, .. } => (text.into_bytes(), src.to_string()), + Resource::Css { text, .. } | Resource::Script { text, .. } => { + (text.into_bytes(), src.to_string()) + } }; decode_image_data(&data, &url_str) diff --git a/crates/browser/src/lib.rs b/crates/browser/src/lib.rs index b5ba26a..2cbb3d4 100644 --- a/crates/browser/src/lib.rs +++ b/crates/browser/src/lib.rs @@ -3,3 +3,4 @@ pub mod css_loader; pub mod img_loader; pub mod loader; +pub mod script_loader; diff --git a/crates/browser/src/loader.rs b/crates/browser/src/loader.rs index f4c0097..2d95b10 100644 --- a/crates/browser/src/loader.rs +++ b/crates/browser/src/loader.rs @@ -70,6 +70,8 @@ pub enum Resource { mime_type: String, url: Url, }, + /// A JavaScript script. + Script { text: String, url: Url }, /// Any other resource type (binary). Other { data: Vec, @@ -147,6 +149,14 @@ impl ResourceLoader { url: url.clone(), }) } + MimeClass::Script => { + let (text, _encoding) = + decode_text_resource(&response.body, content_type.as_ref(), false); + Ok(Resource::Script { + text, + url: url.clone(), + }) + } MimeClass::Image => Ok(Resource::Image { data: response.body, mime_type: mime.to_string(), @@ -212,6 +222,7 @@ impl Default for ResourceLoader { enum MimeClass { Html, Css, + Script, Image, Other, } @@ -220,6 +231,9 @@ fn classify_mime(mime: &str) -> MimeClass { match mime { "text/html" | "application/xhtml+xml" => MimeClass::Html, "text/css" => MimeClass::Css, + "text/javascript" | "application/javascript" | "application/x-javascript" => { + MimeClass::Script + } "image/png" | "image/jpeg" | "image/gif" | "image/webp" | "image/svg+xml" => { MimeClass::Image } @@ -315,6 +329,11 @@ fn fetch_data_url(url_str: &str) -> Result { let text = we_encoding::decode(&parsed.data, encoding); Ok(Resource::Css { text, url }) } + MimeClass::Script => { + let encoding = charset_to_encoding(parsed.charset.as_deref()); + let text = we_encoding::decode(&parsed.data, encoding); + Ok(Resource::Script { text, url }) + } MimeClass::Image => Ok(Resource::Image { data: parsed.data, mime_type: mime.to_string(), diff --git a/crates/browser/src/main.rs b/crates/browser/src/main.rs index 114c22a..0c07899 100644 --- a/crates/browser/src/main.rs +++ b/crates/browser/src/main.rs @@ -4,6 +4,7 @@ use std::collections::HashMap; use we_browser::css_loader::collect_stylesheets; use we_browser::img_loader::{collect_images, ImageStore}; use we_browser::loader::{Resource, ResourceLoader, ABOUT_BLANK_HTML}; +use we_browser::script_loader::execute_page_scripts; use we_css::parser::Stylesheet; use we_dom::{Document, NodeId}; use we_html::parse_html; @@ -276,12 +277,16 @@ fn error_page(message: &str) -> LoadedHtml { } } -/// Load a page: fetch HTML, parse DOM, collect CSS and images. +/// Load a page: fetch HTML, parse DOM, execute scripts, collect CSS and images. fn load_page(loaded: LoadedHtml) -> PageState { let doc = parse_html(&loaded.text); - // Fetch external stylesheets and merge with inline