diff --git a/Cargo.lock b/Cargo.lock index af114829d..39a08db9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,7 +315,7 @@ dependencies = [ "anyrender", "image", "peniko", - "read-fonts", + "read-fonts 0.39.2", "serde", "serde_json", "sha2", @@ -855,7 +855,7 @@ dependencies = [ "percent-encoding", "rayon", "selectors", - "skrifa", + "skrifa 0.42.1", "slab", "smallvec", "stylo", @@ -2799,6 +2799,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "font-types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bf886368962a7d8456f136073ed33ed1b0770c690d2063731bb6a776e99f33" +dependencies = [ + "bytemuck", +] + [[package]] name = "fontconfig-parser" version = "0.5.8" @@ -2824,9 +2833,8 @@ dependencies = [ [[package]] name = "fontique" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274fa4f0f0a926ae182c7c076c078cce8a38471d15e61a102a02cac984be9813" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=f9388f3ddff7efc500ce6389ce9b096f8086b3f0#f9388f3ddff7efc500ce6389ce9b096f8086b3f0" dependencies = [ "hashbrown 0.17.1", "linebender_resource_handle", @@ -2836,7 +2844,7 @@ dependencies = [ "objc2-core-text", "objc2-foundation 0.3.2", "parlance", - "read-fonts", + "read-fonts 0.40.2", "roxmltree 0.21.1", "smallvec", "windows", @@ -3140,7 +3148,7 @@ dependencies = [ "hashbrown 0.17.1", "log", "peniko", - "skrifa", + "skrifa 0.42.1", "smallvec", "vello_common", ] @@ -3324,13 +3332,13 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.8.4" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d12c7c642d4ce8c2e784b4751a6634bd89583912265add4a679a8882d123fbcd" +checksum = "f0589ddd0d2935dd2845827ac606b4081c266225d613b268ed2910f832889cab" dependencies = [ "bitflags 2.13.0", "bytemuck", - "read-fonts", + "read-fonts 0.40.2", "smallvec", ] @@ -4769,7 +4777,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc8f19a1c361e5fb1a57e487b993ff8b3c44321b50ca86c9e2b235e57dc94008" dependencies = [ - "font-types", + "font-types 0.11.3", ] [[package]] @@ -5246,14 +5254,12 @@ dependencies = [ [[package]] name = "parlance" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6937eda350acc1a5d05872c3cbf99fe78619c269096e2be3d4a350058639d5" +source = "git+https://github.com/linebender/parley?rev=f9388f3ddff7efc500ce6389ce9b096f8086b3f0#f9388f3ddff7efc500ce6389ce9b096f8086b3f0" [[package]] name = "parley" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1cfcf399c774719fb1fa51bc6b91e86bdf003b03202a0902f1827ba6750746" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=f9388f3ddff7efc500ce6389ce9b096f8086b3f0#f9388f3ddff7efc500ce6389ce9b096f8086b3f0" dependencies = [ "fontique", "harfrust", @@ -5263,15 +5269,23 @@ dependencies = [ "icu_segmenter", "linebender_resource_handle", "parlance", + "parley_core", "parley_data", - "skrifa", + "skrifa 0.43.2", +] + +[[package]] +name = "parley_core" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=f9388f3ddff7efc500ce6389ce9b096f8086b3f0#f9388f3ddff7efc500ce6389ce9b096f8086b3f0" +dependencies = [ + "icu_properties", ] [[package]] name = "parley_data" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d3755e2cc12c0625b0cd2f2773c6a37dd11d1531940c945ade4aeb78f2b145" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=f9388f3ddff7efc500ce6389ce9b096f8086b3f0#f9388f3ddff7efc500ce6389ce9b096f8086b3f0" dependencies = [ "icu_properties", ] @@ -5903,7 +5917,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" dependencies = [ "bytemuck", - "font-types", + "font-types 0.11.3", +] + +[[package]] +name = "read-fonts" +version = "0.40.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487889119a5f19ff7c0a20637196bdc76b9f54ebec17e3588b5d75e4999f8773" +dependencies = [ + "bytemuck", + "font-types 0.12.0", + "once_cell", ] [[package]] @@ -6601,7 +6626,7 @@ checksum = "caad12d9a3f75948b725a643cd60aea6de9d20cb03d3e35221e7a8a31c549409" dependencies = [ "fnv", "hashbrown 0.17.1", - "skrifa", + "skrifa 0.42.1", "thiserror 2.0.18", "write-fonts", ] @@ -6640,7 +6665,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.39.2", +] + +[[package]] +name = "skrifa" +version = "0.43.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbe997d0f2480442d727488fbe2150779114cbe480ecdbadef58b33e0318ffb" +dependencies = [ + "bytemuck", + "read-fonts 0.40.2", ] [[package]] @@ -7973,7 +8008,7 @@ dependencies = [ "log", "peniko", "png 0.18.1", - "skrifa", + "skrifa 0.42.1", "static_assertions", "thiserror 2.0.18", "vello_encoding", @@ -8023,7 +8058,7 @@ dependencies = [ "bytemuck", "guillotiere", "peniko", - "skrifa", + "skrifa 0.42.1", "smallvec", ] @@ -9299,11 +9334,11 @@ version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb731d4c4d93eacc69a1ad2f270f905788a98e4a3438267bcafbe08d3431c8d8" dependencies = [ - "font-types", + "font-types 0.11.3", "indexmap", "kurbo", "log", - "read-fonts", + "read-fonts 0.39.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d4ea4db12..eba563cd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,7 +100,7 @@ taffy = { version = "=0.11.0-experimental-cache-fix.3", default-features = false "calc", "detailed_layout_info", ] } -parley = { version = "0.10", default-features = false, features = ["std"] } +parley = { git = "https://github.com/linebender/parley", rev = "f9388f3ddff7efc500ce6389ce9b096f8086b3f0", default-features = false, features = ["std"] } skrifa = { version = "0.42", default-features = false, features = [ "std", ] } # Should match parley and vello versions diff --git a/packages/blitz-dom/src/layout/construct.rs b/packages/blitz-dom/src/layout/construct.rs index 09f5ad786..d09ee8ef0 100644 --- a/packages/blitz-dom/src/layout/construct.rs +++ b/packages/blitz-dom/src/layout/construct.rs @@ -340,13 +340,18 @@ pub(crate) fn collect_layout_children( .downcast_element() .and_then(|el| el.attr(local_name!("type"))); if tag_name == "textarea" { - create_text_editor(doc, container_node_id, true); + create_text_editor(doc, container_node_id, true, false); return; } else if matches!( type_attr, None | Some("text" | "password" | "email" | "number" | "search" | "tel" | "url") ) { - create_text_editor(doc, container_node_id, false); + create_text_editor( + doc, + container_node_id, + false, + matches!(type_attr, Some("password")), + ); return; } else if matches!(type_attr, Some("checkbox" | "radio")) { create_checkbox_input(doc, container_node_id); @@ -701,7 +706,12 @@ fn collect_complex_layout_children( out.maybe_push_anon_block(doc); } -fn create_text_editor(doc: &mut BaseDocument, input_element_id: usize, is_multiline: bool) { +fn create_text_editor( + doc: &mut BaseDocument, + input_element_id: usize, + is_multiline: bool, + is_password: bool, +) { let node = &mut doc.nodes[input_element_id]; let parley_style = node .primary_styles() @@ -711,7 +721,7 @@ fn create_text_editor(doc: &mut BaseDocument, input_element_id: usize, is_multil let element = &mut node.data.downcast_element_mut().unwrap(); if !matches!(element.special_data, SpecialElementData::TextInput(_)) { - let mut text_input_data = TextInputData::new(is_multiline); + let mut text_input_data = TextInputData::new(is_multiline, is_password); let editor = &mut text_input_data.editor; editor.set_text(element.attr(local_name!("value")).unwrap_or(" ")); element.special_data = SpecialElementData::TextInput(text_input_data); diff --git a/packages/blitz-dom/src/node/element.rs b/packages/blitz-dom/src/node/element.rs index a322978c5..04d9e9040 100644 --- a/packages/blitz-dom/src/node/element.rs +++ b/packages/blitz-dom/src/node/element.rs @@ -546,13 +546,14 @@ pub struct TextInputData { // FIXME: Implement Clone for PlainEditor impl Clone for TextInputData { fn clone(&self) -> Self { - TextInputData::new(self.is_multiline) + TextInputData::new(self.is_multiline, self.editor.is_password()) } } impl TextInputData { - pub fn new(is_multiline: bool) -> Self { - let editor = Box::new(parley::PlainEditor::new(16.0)); + pub fn new(is_multiline: bool, is_password: bool) -> Self { + let mut editor = Box::new(parley::PlainEditor::new(16.0)); + editor.set_password(is_password); Self { editor, is_multiline, diff --git a/packages/blitz-dom/src/stylo_to_parley.rs b/packages/blitz-dom/src/stylo_to_parley.rs index 1db3847c2..929eccca2 100644 --- a/packages/blitz-dom/src/stylo_to_parley.rs +++ b/packages/blitz-dom/src/stylo_to_parley.rs @@ -218,5 +218,8 @@ pub(crate) fn style( strikethrough_offset: Default::default(), strikethrough_size: Default::default(), strikethrough_brush: Default::default(), + + // Used for password masking, which we don't need for regular text + grapheme_replacement: None, } }