Rewild Your Web

chore: update to Servo 217d76c83dc63f5ff91afcb80479ed638b6dce6e

+225 -212
+42 -41
Cargo.lock
··· 284 284 "clipboard-win", 285 285 "image", 286 286 "log", 287 - "objc2 0.6.3", 287 + "objc2 0.6.4", 288 288 "objc2-app-kit 0.3.2", 289 289 "objc2-core-foundation", 290 290 "objc2-core-graphics", ··· 805 805 source = "registry+https://github.com/rust-lang/crates.io-index" 806 806 checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 807 807 dependencies = [ 808 - "objc2 0.6.3", 808 + "objc2 0.6.4", 809 809 ] 810 810 811 811 [[package]] ··· 2013 2013 2014 2014 [[package]] 2015 2015 name = "dispatch2" 2016 - version = "0.3.0" 2016 + version = "0.3.1" 2017 2017 source = "registry+https://github.com/rust-lang/crates.io-index" 2018 - checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 2018 + checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" 2019 2019 dependencies = [ 2020 2020 "bitflags 2.11.0", 2021 - "objc2 0.6.3", 2021 + "objc2 0.6.4", 2022 2022 ] 2023 2023 2024 2024 [[package]] ··· 2530 2530 "memmap2", 2531 2531 "net_traits", 2532 2532 "num-traits", 2533 - "objc2 0.6.3", 2533 + "objc2 0.6.4", 2534 2534 "objc2-core-foundation", 2535 2535 "objc2-core-graphics", 2536 2536 "objc2-core-text", ··· 3168 3168 dependencies = [ 3169 3169 "crossbeam-channel", 3170 3170 "keyboard-types 0.7.0", 3171 - "objc2 0.6.3", 3171 + "objc2 0.6.4", 3172 3172 "objc2-app-kit 0.3.2", 3173 3173 "once_cell", 3174 3174 "thiserror 2.0.18", ··· 5602 5602 5603 5603 [[package]] 5604 5604 name = "mozjs" 5605 - version = "0.15.0" 5605 + version = "0.15.1" 5606 5606 source = "registry+https://github.com/rust-lang/crates.io-index" 5607 - checksum = "af2c1ff3ebff6f4276c66c82af601ad97a2fe9a2e9e0b5b43a38843c929046af" 5607 + checksum = "074cf37bcac620b5c7e56ed0830a4a5288e08a266cbe7e9737d29035e3ab4e64" 5608 5608 dependencies = [ 5609 5609 "bindgen", 5610 5610 "cc", ··· 5617 5617 5618 5618 [[package]] 5619 5619 name = "mozjs_sys" 5620 - version = "0.140.5-10" 5620 + version = "0.140.5-11" 5621 5621 source = "registry+https://github.com/rust-lang/crates.io-index" 5622 - checksum = "7047586e1b71e6405d42e4dfcefdcea209fea39adf2f60122bf72f192e19fbd1" 5622 + checksum = "e57169b7c9e59053c26d76ecb499f5227fbcadbd1eadbb60009f3f745d21fce1" 5623 5623 dependencies = [ 5624 5624 "bindgen", 5625 5625 "cc", ··· 5644 5644 "gtk", 5645 5645 "keyboard-types 0.7.0", 5646 5646 "libxdo", 5647 - "objc2 0.6.3", 5647 + "objc2 0.6.4", 5648 5648 "objc2-app-kit 0.3.2", 5649 5649 "objc2-core-foundation", 5650 5650 "objc2-foundation 0.3.2", ··· 6069 6069 6070 6070 [[package]] 6071 6071 name = "objc2" 6072 - version = "0.6.3" 6072 + version = "0.6.4" 6073 6073 source = "registry+https://github.com/rust-lang/crates.io-index" 6074 - checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 6074 + checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" 6075 6075 dependencies = [ 6076 6076 "objc2-encode", 6077 6077 ] ··· 6099 6099 checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 6100 6100 dependencies = [ 6101 6101 "bitflags 2.11.0", 6102 - "objc2 0.6.3", 6102 + "objc2 0.6.4", 6103 6103 "objc2-core-foundation", 6104 6104 "objc2-core-graphics", 6105 6105 "objc2-foundation 0.3.2", ··· 6152 6152 "block2 0.6.2", 6153 6153 "dispatch2", 6154 6154 "libc", 6155 - "objc2 0.6.3", 6155 + "objc2 0.6.4", 6156 6156 ] 6157 6157 6158 6158 [[package]] ··· 6165 6165 "block2 0.6.2", 6166 6166 "dispatch2", 6167 6167 "libc", 6168 - "objc2 0.6.3", 6168 + "objc2 0.6.4", 6169 6169 "objc2-core-foundation", 6170 6170 "objc2-io-surface", 6171 6171 "objc2-metal 0.3.2", ··· 6204 6204 "bitflags 2.11.0", 6205 6205 "block2 0.6.2", 6206 6206 "libc", 6207 - "objc2 0.6.3", 6207 + "objc2 0.6.4", 6208 6208 "objc2-core-foundation", 6209 6209 "objc2-core-graphics", 6210 6210 ] ··· 6247 6247 dependencies = [ 6248 6248 "bitflags 2.11.0", 6249 6249 "block2 0.6.2", 6250 - "objc2 0.6.3", 6250 + "objc2 0.6.4", 6251 6251 "objc2-core-foundation", 6252 6252 ] 6253 6253 ··· 6259 6259 dependencies = [ 6260 6260 "bitflags 2.11.0", 6261 6261 "libc", 6262 - "objc2 0.6.3", 6262 + "objc2 0.6.4", 6263 6263 "objc2-core-foundation", 6264 6264 ] 6265 6265 ··· 6294 6294 checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" 6295 6295 dependencies = [ 6296 6296 "bitflags 2.11.0", 6297 - "objc2 0.6.3", 6297 + "objc2 0.6.4", 6298 6298 "objc2-foundation 0.3.2", 6299 6299 ] 6300 6300 ··· 6318 6318 checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 6319 6319 dependencies = [ 6320 6320 "bitflags 2.11.0", 6321 - "objc2 0.6.3", 6321 + "objc2 0.6.4", 6322 6322 "objc2-core-foundation", 6323 6323 "objc2-foundation 0.3.2", 6324 6324 ] ··· 7593 7593 7594 7594 [[package]] 7595 7595 name = "rgb" 7596 - version = "0.8.52" 7596 + version = "0.8.53" 7597 7597 source = "registry+https://github.com/rust-lang/crates.io-index" 7598 - checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" 7598 + checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" 7599 7599 dependencies = [ 7600 7600 "bytemuck", 7601 7601 ] ··· 8022 8022 "phf", 8023 8023 "phf_codegen", 8024 8024 "phf_shared", 8025 + "profile_traits", 8025 8026 "regex", 8026 8027 "serde_json", 8027 8028 "servo_arc", ··· 8162 8163 [[package]] 8163 8164 name = "selectors" 8164 8165 version = "0.35.0" 8165 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8166 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8166 8167 dependencies = [ 8167 8168 "bitflags 2.11.0", 8168 8169 "cssparser", ··· 8479 8480 [[package]] 8480 8481 name = "servo_arc" 8481 8482 version = "0.4.3" 8482 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8483 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8483 8484 dependencies = [ 8484 8485 "serde", 8485 8486 "stable_deref_trait", ··· 8918 8919 [[package]] 8919 8920 name = "stylo" 8920 8921 version = "0.12.0" 8921 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8922 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8922 8923 dependencies = [ 8923 8924 "app_units", 8924 8925 "arrayvec", ··· 8974 8975 [[package]] 8975 8976 name = "stylo_atoms" 8976 8977 version = "0.12.0" 8977 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8978 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8978 8979 dependencies = [ 8979 8980 "string_cache", 8980 8981 "string_cache_codegen", ··· 8983 8984 [[package]] 8984 8985 name = "stylo_derive" 8985 8986 version = "0.12.0" 8986 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8987 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8987 8988 dependencies = [ 8988 8989 "darling", 8989 8990 "proc-macro2", ··· 8995 8996 [[package]] 8996 8997 name = "stylo_dom" 8997 8998 version = "0.12.0" 8998 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 8999 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 8999 9000 dependencies = [ 9000 9001 "bitflags 2.11.0", 9001 9002 "stylo_malloc_size_of", ··· 9004 9005 [[package]] 9005 9006 name = "stylo_malloc_size_of" 9006 9007 version = "0.12.0" 9007 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 9008 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 9008 9009 dependencies = [ 9009 9010 "app_units", 9010 9011 "cssparser", ··· 9021 9022 [[package]] 9022 9023 name = "stylo_static_prefs" 9023 9024 version = "0.12.0" 9024 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 9025 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 9025 9026 9026 9027 [[package]] 9027 9028 name = "stylo_traits" 9028 9029 version = "0.12.0" 9029 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 9030 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 9030 9031 dependencies = [ 9031 9032 "app_units", 9032 9033 "bitflags 2.11.0", ··· 9065 9066 "glow", 9066 9067 "libc", 9067 9068 "log", 9068 - "objc2 0.6.3", 9069 + "objc2 0.6.4", 9069 9070 "objc2-app-kit 0.3.2", 9070 9071 "objc2-core-foundation", 9071 9072 "objc2-core-video", ··· 9468 9469 [[package]] 9469 9470 name = "to_shmem" 9470 9471 version = "0.3.0" 9471 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 9472 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 9472 9473 dependencies = [ 9473 9474 "cssparser", 9474 9475 "servo_arc", ··· 9481 9482 [[package]] 9482 9483 name = "to_shmem_derive" 9483 9484 version = "0.1.0" 9484 - source = "git+https://github.com/servo/stylo?rev=9a413b4d05d899c3baedd7b648dbf2c23dc9b879#9a413b4d05d899c3baedd7b648dbf2c23dc9b879" 9485 + source = "git+https://github.com/servo/stylo?rev=2f131eb1909c6193a7cfae22e49f288fe9df4fbb#2f131eb1909c6193a7cfae22e49f288fe9df4fbb" 9485 9486 dependencies = [ 9486 9487 "darling", 9487 9488 "proc-macro2", ··· 9801 9802 "dirs", 9802 9803 "libappindicator", 9803 9804 "muda", 9804 - "objc2 0.6.3", 9805 + "objc2 0.6.4", 9805 9806 "objc2-app-kit 0.3.2", 9806 9807 "objc2-core-foundation", 9807 9808 "objc2-core-graphics", ··· 11729 11730 11730 11731 [[package]] 11731 11732 name = "zerocopy" 11732 - version = "0.8.39" 11733 + version = "0.8.40" 11733 11734 source = "registry+https://github.com/rust-lang/crates.io-index" 11734 - checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" 11735 + checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" 11735 11736 dependencies = [ 11736 11737 "zerocopy-derive", 11737 11738 ] 11738 11739 11739 11740 [[package]] 11740 11741 name = "zerocopy-derive" 11741 - version = "0.8.39" 11742 + version = "0.8.40" 11742 11743 source = "registry+https://github.com/rust-lang/crates.io-index" 11743 - checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" 11744 + checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" 11744 11745 dependencies = [ 11745 11746 "proc-macro2", 11746 11747 "quote",
+10 -10
Cargo.toml
··· 108 108 indexmap = { version = "2.11.4", features = ["std"] } 109 109 ipc-channel = "0.21" 110 110 itertools = "0.14" 111 - js = { package = "mozjs", version = "=0.15.0", default-features = false, features = ["libz-sys", "intl"] } 111 + js = { package = "mozjs", version = "=0.15.1", default-features = false, features = ["libz-sys", "intl"] } 112 112 keyboard-types = { version = "0.8.3", features = ["serde", "webdriver"] } 113 113 kurbo = { version = "0.12", features = ["euclid"] } 114 114 layout_api = { path = "source/components/shared/layout" } ··· 166 166 sea-query = { version = "1.0.0-rc.30", default-features = false, features = ["backend-sqlite", "derive"] } 167 167 sea-query-rusqlite = { version = "0.8.0-rc.15" } 168 168 sec1 = "0.7" 169 - selectors = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 169 + selectors = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 170 170 serde = "1.0.228" 171 171 serde_bytes = "0.11" 172 172 serde_core = "1.0.226" ··· 175 175 servo-media-dummy = { path = "source/components/media/backends/dummy" } 176 176 servo-media-gstreamer = { path = "source/components/media/backends/gstreamer" } 177 177 servo-tracing = { path = "source/components/servo_tracing" } 178 - servo_arc = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 178 + servo_arc = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 179 179 sha1 = "0.10" 180 180 sha2 = "0.10" 181 181 sha3 = "0.10" ··· 184 184 storage_traits = { path = "source/components/shared/storage" } 185 185 string_cache = "0.9" 186 186 strum = { version = "0.27", features = ["derive"] } 187 - stylo = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 188 - stylo_atoms = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 189 - stylo_config = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 190 - stylo_dom = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 191 - stylo_malloc_size_of = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 192 - stylo_static_prefs = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 193 - stylo_traits = { git = "https://github.com/servo/stylo", rev = "9a413b4d05d899c3baedd7b648dbf2c23dc9b879" } 187 + stylo = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 188 + stylo_atoms = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 189 + stylo_config = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 190 + stylo_dom = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 191 + stylo_malloc_size_of = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 192 + stylo_static_prefs = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 193 + stylo_traits = { git = "https://github.com/servo/stylo", rev = "2f131eb1909c6193a7cfae22e49f288fe9df4fbb" } 194 194 surfman = { version = "0.11.0", features = ["chains"] } 195 195 syn = { version = "2", default-features = false, features = ["clone-impls", "derive", "parsing"] } 196 196 synstructure = "0.13"
+1 -1
forkme.lock
··· 1 - 811059cdd33e44cee5b41ebb537a72461598443d 1 + 217d76c83dc63f5ff91afcb80479ed638b6dce6e
+16 -16
patches/components/constellation/constellation.rs.patch
··· 27 27 }; 28 28 use euclid::Size2D; 29 29 use euclid::default::Size2D as UntypedSize2D; 30 - @@ -512,6 +513,19 @@ 30 + @@ -510,6 +511,19 @@ 31 31 32 32 /// Whether accessibility trees are being built and sent to the underlying platform. 33 33 pub(crate) accessibility_active: bool, ··· 47 47 } 48 48 49 49 /// State needed to construct a constellation. 50 - @@ -731,6 +745,9 @@ 50 + @@ -729,6 +743,9 @@ 51 51 screenshot_readiness_requests: Vec::new(), 52 52 user_contents_for_manager_id: Default::default(), 53 53 accessibility_active: false, ··· 57 57 }; 58 58 59 59 constellation.run(); 60 - @@ -756,6 +773,18 @@ 60 + @@ -754,6 +771,18 @@ 61 61 fn clean_up_finished_script_event_loops(&mut self) { 62 62 self.event_loop_join_handles 63 63 .retain(|join_handle| !join_handle.is_finished()); ··· 76 76 self.event_loops 77 77 .retain(|event_loop| event_loop.upgrade().is_some()); 78 78 } 79 - @@ -1047,6 +1076,11 @@ 79 + @@ -1045,6 +1074,11 @@ 80 80 .get(&webview_id) 81 81 .and_then(|webview| webview.user_content_manager_id); 82 82 ··· 88 88 let new_pipeline_info = NewPipelineInfo { 89 89 parent_info: parent_pipeline_id, 90 90 new_pipeline_id, 91 - @@ -1057,6 +1091,13 @@ 91 + @@ -1055,6 +1089,13 @@ 92 92 viewport_details: initial_viewport_details, 93 93 user_content_manager_id, 94 94 theme, ··· 102 102 }; 103 103 let pipeline = match Pipeline::spawn(new_pipeline_info, event_loop, self, throttled) { 104 104 Ok(pipeline) => pipeline, 105 - @@ -1536,11 +1577,7 @@ 105 + @@ -1534,11 +1575,7 @@ 106 106 } 107 107 }, 108 108 EmbedderToConstellationMessage::PreferencesUpdated(updates) => { ··· 115 115 let _ = event_loop.send(ScriptThreadMessage::PreferencesUpdated( 116 116 updates 117 117 .iter() 118 - @@ -1567,6 +1604,18 @@ 118 + @@ -1565,6 +1602,18 @@ 119 119 EmbedderToConstellationMessage::SetAccessibilityActive(active) => { 120 120 self.set_accessibility_active(active); 121 121 }, ··· 134 134 } 135 135 } 136 136 137 - @@ -1790,6 +1839,12 @@ 137 + @@ -1788,6 +1837,12 @@ 138 138 self.broadcast_channels 139 139 .remove_broadcast_channel_router(router_id); 140 140 }, ··· 147 147 ScriptToConstellationMessage::ScheduleBroadcast(router_id, message) => { 148 148 if self 149 149 .check_origin_against_pipeline(&source_pipeline_id, &message.origin) 150 - @@ -1820,6 +1875,12 @@ 150 + @@ -1818,6 +1873,12 @@ 151 151 ScriptToConstellationMessage::CreateAuxiliaryWebView(load_info) => { 152 152 self.handle_script_new_auxiliary(load_info); 153 153 }, ··· 160 160 ScriptToConstellationMessage::ChangeRunningAnimationsState(animation_state) => { 161 161 self.handle_change_running_animations_state(source_pipeline_id, animation_state) 162 162 }, 163 - @@ -1986,6 +2047,23 @@ 163 + @@ -1984,6 +2045,23 @@ 164 164 new_value, 165 165 ); 166 166 }, ··· 184 184 ScriptToConstellationMessage::MediaSessionEvent(pipeline_id, event) => { 185 185 // Unlikely at this point, but we may receive events coming from 186 186 // different media sessions, so we set the active media session based 187 - @@ -2054,6 +2132,129 @@ 187 + @@ -2052,6 +2130,129 @@ 188 188 ScriptToConstellationMessage::RespondToScreenshotReadinessRequest(response) => { 189 189 self.handle_screenshot_readiness_response(source_pipeline_id, response); 190 190 }, ··· 314 314 } 315 315 } 316 316 317 - @@ -3166,6 +3367,13 @@ 317 + @@ -3164,6 +3365,13 @@ 318 318 /// <https://html.spec.whatwg.org/multipage/#destroy-a-top-level-traversable> 319 319 fn handle_close_top_level_browsing_context(&mut self, webview_id: WebViewId) { 320 320 debug!("{webview_id}: Closing"); ··· 328 328 let browsing_context_id = BrowsingContextId::from(webview_id); 329 329 // Step 5. Remove traversable from the user agent's top-level traversable set. 330 330 let browsing_context = 331 - @@ -3442,8 +3650,27 @@ 331 + @@ -3440,8 +3648,27 @@ 332 332 opener_webview_id, 333 333 opener_pipeline_id, 334 334 response_sender, ··· 356 356 let Some((webview_id_sender, webview_id_receiver)) = generic_channel::channel() else { 357 357 warn!("Failed to create channel"); 358 358 let _ = response_sender.send(None); 359 - @@ -3541,6 +3768,359 @@ 359 + @@ -3539,6 +3766,359 @@ 360 360 }); 361 361 } 362 362 ··· 716 716 #[servo_tracing::instrument(skip_all)] 717 717 fn handle_refresh_cursor(&self, pipeline_id: PipelineId) { 718 718 let Some(pipeline) = self.pipelines.get(&pipeline_id) else { 719 - @@ -4667,7 +5247,7 @@ 719 + @@ -4665,7 +5245,7 @@ 720 720 } 721 721 722 722 #[servo_tracing::instrument(skip_all)] ··· 725 725 // Send a flat projection of the history to embedder. 726 726 // The final vector is a concatenation of the URLs of the past 727 727 // entries, the current entry and the future entries. 728 - @@ -4770,9 +5350,23 @@ 728 + @@ -4768,9 +5348,23 @@ 729 729 ); 730 730 self.embedder_proxy.send(EmbedderMsg::HistoryChanged( 731 731 webview_id,
+4 -4
patches/components/constellation/tracing.rs.patch
··· 8 8 } 9 9 } 10 10 } 11 - @@ -135,6 +136,10 @@ 11 + @@ -134,6 +135,10 @@ 12 12 Self::DisentanglePorts(..) => target!("DisentanglePorts"), 13 13 Self::NewBroadcastChannelRouter(..) => target!("NewBroadcastChannelRouter"), 14 14 Self::RemoveBroadcastChannelRouter(..) => target!("RemoveBroadcastChannelRouter"), ··· 19 19 Self::NewBroadcastChannelNameInRouter(..) => { 20 20 target!("NewBroadcastChannelNameInRouter") 21 21 }, 22 - @@ -143,6 +148,7 @@ 22 + @@ -142,6 +147,7 @@ 23 23 }, 24 24 Self::ScheduleBroadcast(..) => target!("ScheduleBroadcast"), 25 25 Self::BroadcastStorageEvent(..) => target!("BroadcastStorageEvent"), ··· 27 27 Self::ChangeRunningAnimationsState(..) => target!("ChangeRunningAnimationsState"), 28 28 Self::CreateCanvasPaintThread(..) => target!("CreateCanvasPaintThread"), 29 29 Self::Focus(..) => target!("Focus"), 30 - @@ -164,6 +170,8 @@ 30 + @@ -163,6 +169,8 @@ 31 31 Self::ScriptLoadedURLInIFrame(..) => target!("ScriptLoadedURLInIFrame"), 32 32 Self::ScriptNewIFrame(..) => target!("ScriptNewIFrame"), 33 33 Self::CreateAuxiliaryWebView(..) => target!("ScriptNewAuxiliary"), ··· 36 36 Self::ActivateDocument => target!("ActivateDocument"), 37 37 Self::SetDocumentState(..) => target!("SetDocumentState"), 38 38 Self::SetFinalUrl(..) => target!("SetFinalUrl"), 39 - @@ -186,6 +194,35 @@ 39 + @@ -185,6 +193,35 @@ 40 40 Self::RespondToScreenshotReadinessRequest(..) => { 41 41 target!("RespondToScreenshotReadinessRequest") 42 42 },
+10 -11
patches/components/layout/display_list/mod.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -37,13 +37,14 @@ 3 + @@ -38,13 +38,14 @@ 4 4 use style::values::specified::text::TextDecorationLine; 5 5 use style_traits::{CSSPixel as StyloCSSPixel, DevicePixel as StyloDevicePixel}; 6 6 use webrender_api::units::{ ··· 19 19 }; 20 20 use wr::units::LayoutVector2D; 21 21 22 - @@ -123,6 +124,10 @@ 22 + @@ -127,6 +128,9 @@ 23 23 24 - /// Handler for all Paint Timings 25 - paint_timing_handler: &'a mut PaintTimingHandler, 26 - + 24 + /// Statistics collected about the reflow, in order to write tests for incremental layout. 25 + reflow_statistics: &'a mut ReflowStatistics, 27 26 + /// For embedded webviews with page zoom, this is the SpatialId of the zoom reference frame. 28 27 + /// When present, this is used as the root spatial ID instead of root_reference_frame. 29 28 + zoom_reference_frame_spatial_id: Option<SpatialId>, 30 29 } 31 30 32 31 struct InspectorHighlight { 33 - @@ -188,6 +193,36 @@ 32 + @@ -194,6 +198,36 @@ 34 33 webrender_display_list_builder.dump_serialized_display_list(); 35 34 } 36 35 ··· 67 66 let _span = profile_traits::trace_span!("DisplayListBuilder::build").entered(); 68 67 let mut builder = DisplayListBuilder { 69 68 current_scroll_node_id: paint_info.root_reference_frame_id, 70 - @@ -201,6 +236,7 @@ 71 - image_resolver, 69 + @@ -208,6 +242,7 @@ 72 70 device_pixel_ratio, 73 71 paint_timing_handler, 72 + reflow_statistics, 74 73 + zoom_reference_frame_spatial_id, 75 74 }; 76 75 77 76 builder.add_all_spatial_nodes(); 78 - @@ -214,15 +250,20 @@ 77 + @@ -221,15 +256,20 @@ 79 78 let pipeline_id = builder.paint_info.pipeline_id; 80 79 let viewport_size = builder.paint_info.viewport_details.size; 81 80 let viewport_rect = LayoutRect::from_size(viewport_size.cast_unit()); ··· 98 97 stacking_context_tree 99 98 .root_stacking_context 100 99 .build_canvas_background_display_list(&mut builder, fragment_tree); 101 - @@ -231,6 +272,11 @@ 100 + @@ -238,6 +278,11 @@ 102 101 .build_display_list(&mut builder); 103 102 builder.paint_dom_inspector_highlight(); 104 103 ··· 110 109 webrender_display_list_builder.end().1 111 110 } 112 111 113 - @@ -268,12 +314,42 @@ 112 + @@ -275,12 +320,42 @@ 114 113 let mut scroll_tree = std::mem::take(&mut self.paint_info.scroll_tree); 115 114 let mut mapping = Vec::with_capacity(scroll_tree.nodes.len()); 116 115
+1 -1
patches/components/layout/replaced.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -520,6 +520,7 @@ 3 + @@ -544,6 +544,7 @@ 4 4 viewport_details: ViewportDetails { 5 5 size, 6 6 hidpi_scale_factor: Scale::new(hidpi_scale_factor.0),
+17 -18
patches/components/paint/webview_renderer.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -37,7 +37,7 @@ 3 + @@ -36,7 +36,7 @@ 4 4 use crate::refresh_driver::BaseRefreshDriver; 5 5 use crate::touch::{PendingTouchInputEvent, TouchHandler, TouchMoveAllowed, TouchSequenceState}; 6 6 ··· 9 9 pub(crate) struct ScrollEvent { 10 10 /// Scroll by this offset, or to Start or End 11 11 pub scroll: Scroll, 12 - @@ -74,6 +74,18 @@ 12 + @@ -73,6 +73,18 @@ 13 13 DidNotPinchZoom, 14 14 } 15 15 ··· 28 28 /// A renderer for a libservo `WebView`. This is essentially the [`ServoRenderer`]'s interface to a 29 29 /// libservo `WebView`, but the code here cannot depend on libservo in order to prevent circular 30 30 /// dependencies, which is why we store a `dyn WebViewTrait` here instead of the `WebView` itself. 31 - @@ -115,6 +127,10 @@ 31 + @@ -114,6 +126,10 @@ 32 32 /// and initial values for zoom derived from the `viewport` meta tag in web content. 33 33 viewport_description: Option<ViewportDescription>, 34 34 ··· 39 39 // 40 40 // Data that is shared with the parent renderer. 41 41 // 42 - @@ -153,6 +169,7 @@ 42 + @@ -152,6 +168,7 @@ 43 43 hidden: false, 44 44 animating: false, 45 45 viewport_description: None, ··· 47 47 embedder_to_constellation_sender, 48 48 refresh_driver, 49 49 webrender_document, 50 - @@ -188,6 +205,16 @@ 50 + @@ -187,6 +204,16 @@ 51 51 new_value != old_value 52 52 } 53 53 ··· 64 64 /// Returns the [`PipelineDetails`] for the given [`PipelineId`], creating it if needed. 65 65 pub(crate) fn ensure_pipeline_details( 66 66 &mut self, 67 - @@ -353,10 +380,9 @@ 67 + @@ -362,10 +389,9 @@ 68 68 _ => None, 69 69 } 70 70 .or_else(|| self.hit_test(render_api, point).into_iter().nth(0)); ··· 78 78 hit_test_result 79 79 }, 80 80 None => None, 81 - @@ -680,6 +706,89 @@ 81 + @@ -689,6 +715,88 @@ 82 82 self.on_scroll_window_event(scroll, point); 83 83 } 84 84 ··· 155 155 + external_scroll_id, 156 156 + }; 157 157 + 158 - + self.send_scroll_positions_to_layout_for_pipeline(root_pipeline_id); 159 - + self.dispatch_scroll_event(external_scroll_id, hit_test_result.clone()); 158 + + self.send_scroll_positions_to_layout_for_pipeline(root_pipeline_id, external_scroll_id); 160 159 + 161 160 + Some(ScrollResult { 162 161 + hit_test_result, ··· 168 167 fn on_scroll_window_event(&mut self, scroll: Scroll, cursor: DevicePoint) { 169 168 self.pending_scroll_zoom_events 170 169 .push(ScrollZoomEvent::Scroll(ScrollEvent { 171 - @@ -689,18 +798,25 @@ 170 + @@ -698,18 +806,25 @@ 172 171 })); 173 172 } 174 173 ··· 199 198 } 200 199 201 200 // Batch up all scroll events and changes to pinch zoom into a single change, or 202 - @@ -754,15 +870,24 @@ 201 + @@ -763,15 +878,24 @@ 203 202 } 204 203 } 205 204 ··· 230 229 231 230 let scroll_result = combined_scroll_event.and_then(|combined_event| { 232 231 self.scroll_node_at_device_point( 233 - @@ -771,6 +896,21 @@ 232 + @@ -780,6 +904,21 @@ 234 233 combined_event.scroll, 235 234 ) 236 235 }); ··· 252 251 if let Some(ref scroll_result) = scroll_result { 253 252 self.send_scroll_positions_to_layout_for_pipeline( 254 253 scroll_result.hit_test_result.pipeline_id, 255 - @@ -789,7 +929,11 @@ 254 + @@ -795,7 +934,11 @@ 256 255 self.send_pinch_zoom_infos_to_script(); 257 256 } 258 257 ··· 265 264 } 266 265 267 266 /// Perform a hit test at the given [`DevicePoint`] and apply the [`Scroll`] 268 - @@ -796,7 +940,7 @@ 267 + @@ -802,7 +945,7 @@ 269 268 /// scrolling to the applicable scroll node under that point. If a scroll was 270 269 /// performed, returns the hit test result contains [`PipelineId`] of the node 271 270 /// scrolled, the id, and the final scroll delta. ··· 274 273 &mut self, 275 274 render_api: &RenderApi, 276 275 cursor: DevicePoint, 277 - @@ -824,7 +968,10 @@ 276 + @@ -830,7 +973,10 @@ 278 277 // its ancestor pipelines. 279 278 let mut previous_pipeline_id = None; 280 279 for hit_test_result in hit_test_results { ··· 286 285 if previous_pipeline_id.replace(hit_test_result.pipeline_id) != 287 286 Some(hit_test_result.pipeline_id) 288 287 { 289 - @@ -851,7 +998,11 @@ 288 + @@ -857,7 +1003,11 @@ 290 289 } 291 290 } 292 291 } ··· 299 298 } 300 299 301 300 /// Scroll the viewport (root pipeline, root scroll node) of this WebView, but first 302 - @@ -1007,20 +1158,45 @@ 301 + @@ -996,20 +1146,45 @@ 303 302 } 304 303 305 304 fn send_window_size_message(&self) { ··· 357 356 } 358 357 359 358 /// Set the `hidpi_scale_factor` for this renderer, returning `true` if the value actually changed. 360 - @@ -1086,8 +1262,21 @@ 359 + @@ -1075,8 +1250,21 @@ 361 360 if let Some(wheel_event) = self.pending_wheel_events.remove(&id) { 362 361 if !result.contains(InputEventResult::DefaultPrevented) { 363 362 // A scroll delta for a wheel event is the inverse of the wheel delta.
+1 -1
patches/components/script/dom/dissimilaroriginwindow.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -69,7 +69,9 @@ 3 + @@ -67,7 +67,9 @@ 4 4 #[cfg(feature = "webgpu")] 5 5 global_to_clone_from.wgpu_id_hub(), 6 6 Some(global_to_clone_from.is_secure_context()),
+6 -6
patches/components/script/dom/document.rs.patch
··· 54 54 self.notify_embedder_favicon(); 55 55 + self.notify_embedder_theme_color(); 56 56 self.dirty_all_nodes(); 57 - self.window().resume(can_gc); 57 + self.window().resume(CanGc::from_cx(cx)); 58 58 media.resume(&client_context_id); 59 59 @@ -1269,6 +1282,9 @@ 60 60 LoadStatus::Started, ··· 110 110 pub(crate) fn dirty_all_nodes(&self) { 111 111 let root = match self.GetDocumentElement() { 112 112 Some(root) => root, 113 - @@ -3184,9 +3221,59 @@ 113 + @@ -3185,9 +3222,59 @@ 114 114 current_rendering_epoch, 115 115 ); 116 116 117 117 + // After reflow, update embedded webview rects for input event routing 118 118 + self.update_embedded_webview_rects(); 119 119 + 120 - results 120 + (phases, statistics) 121 121 } 122 122 123 123 + /// Update the rects of embedded webviews for input event routing. ··· 170 170 pub(crate) fn handle_no_longer_waiting_on_asynchronous_image_updates(&self) { 171 171 self.waiting_on_canvas_image_updates.set(false); 172 172 } 173 - @@ -3921,6 +4008,7 @@ 173 + @@ -3922,6 +4009,7 @@ 174 174 active_sandboxing_flag_set: Cell::new(SandboxingFlagSet::empty()), 175 175 creation_sandboxing_flag_set: Cell::new(creation_sandboxing_flag_set), 176 176 favicon: RefCell::new(None), ··· 178 178 websockets: DOMTracker::new(), 179 179 details_name_groups: Default::default(), 180 180 protocol_handler_automation_mode: Default::default(), 181 - @@ -5022,6 +5110,36 @@ 181 + @@ -5024,6 +5112,36 @@ 182 182 183 183 pub(crate) fn notify_embedder_favicon(&self) { 184 184 if let Some(ref image) = *self.favicon.borrow() { ··· 215 215 self.send_to_embedder(EmbedderMsg::NewFavicon(self.webview_id(), image.clone())); 216 216 } 217 217 } 218 - @@ -5044,6 +5162,20 @@ 218 + @@ -5046,6 +5164,20 @@ 219 219 pub(crate) fn value_override(&self) -> Option<DOMString> { 220 220 self.value_override.borrow().clone() 221 221 }
+23 -23
patches/components/script/dom/document_event_handler.rs.patch
··· 12 12 use embedder_traits::{ 13 13 Cursor, EditingActionEvent, EmbedderMsg, ImeEvent, InputEvent, InputEventAndId, 14 14 InputEventResult, KeyboardEvent as EmbedderKeyboardEvent, MouseButton, MouseButtonAction, 15 - MouseButtonEvent, MouseLeftViewportEvent, ScrollEvent, TouchEvent as EmbedderTouchEvent, 16 - - TouchEventType, TouchId, UntrustedNodeAddress, WheelEvent as EmbedderWheelEvent, 17 - + TouchEventType, TouchId, UntrustedNodeAddress, WebViewPoint, WheelEvent as EmbedderWheelEvent, 15 + MouseButtonEvent, MouseLeftViewportEvent, TouchEvent as EmbedderTouchEvent, TouchEventType, 16 + - TouchId, UntrustedNodeAddress, WheelEvent as EmbedderWheelEvent, 17 + + TouchId, UntrustedNodeAddress, WebViewPoint, WheelEvent as EmbedderWheelEvent, 18 18 }; 19 19 #[cfg(feature = "gamepad")] 20 20 use embedder_traits::{ ··· 29 29 use script_bindings::codegen::GenericBindings::PerformanceBinding::PerformanceMethods; 30 30 use script_bindings::codegen::GenericBindings::TouchBinding::TouchMethods; 31 31 use script_bindings::codegen::GenericBindings::WindowBinding::{ScrollBehavior, WindowMethods}; 32 - @@ -48,12 +53,13 @@ 32 + @@ -49,12 +54,13 @@ 33 33 use crate::dom::bindings::refcounted::Trusted; 34 34 use crate::dom::bindings::root::MutNullableDom; 35 35 use crate::dom::clipboardevent::ClipboardEventType; ··· 44 44 use crate::dom::inputevent::HitTestResult; 45 45 use crate::dom::node::{self, Node, NodeTraits, ShadowIncluding}; 46 46 use crate::dom::pointerevent::{PointerEvent, PointerId}; 47 - @@ -64,6 +70,7 @@ 47 + @@ -65,6 +71,7 @@ 48 48 }; 49 49 use crate::drag_data_store::{DragDataStore, Kind, Mode}; 50 50 use crate::realms::enter_realm; ··· 52 52 53 53 /// A data structure used for tracking the current click count. This can be 54 54 /// reset to 0 if a mouse button event happens at a sufficient distance or time 55 - @@ -127,6 +134,56 @@ 55 + @@ -128,6 +135,56 @@ 56 56 } 57 57 } 58 58 ··· 109 109 /// The [`DocumentEventHandler`] is a structure responsible for handling input events for 110 110 /// the [`crate::Document`] and storing data related to event handling. It exists to 111 111 /// decrease the size of the [`crate::Document`] structure. 112 - @@ -168,6 +225,20 @@ 112 + @@ -169,6 +226,20 @@ 113 113 active_pointer_ids: DomRefCell<FxHashMap<i32, i32>>, 114 114 /// Counter for generating unique pointer IDs for touch inputs 115 115 next_touch_pointer_id: Cell<i32>, ··· 130 130 } 131 131 132 132 impl DocumentEventHandler { 133 - @@ -187,6 +258,9 @@ 133 + @@ -188,6 +259,9 @@ 134 134 active_keyboard_modifiers: Default::default(), 135 135 active_pointer_ids: Default::default(), 136 136 next_touch_pointer_id: Cell::new(1), ··· 140 140 } 141 141 } 142 142 143 - @@ -431,6 +505,198 @@ 143 + @@ -428,6 +502,198 @@ 144 144 } 145 145 } 146 146 ··· 339 339 /// <https://w3c.github.io/uievents/#handle-native-mouse-move> 340 340 fn handle_native_mouse_move_event(&self, input_event: &ConstellationInputEvent, can_gc: CanGc) { 341 341 // Ignore all incoming events without a hit test. 342 - @@ -445,6 +711,57 @@ 342 + @@ -442,6 +708,57 @@ 343 343 return; 344 344 } 345 345 ··· 397 397 // Update the cursor when the mouse moves, if it has changed. 398 398 self.set_cursor(Some(hit_test_result.cursor)); 399 399 400 - @@ -635,6 +952,12 @@ 400 + @@ -632,6 +949,12 @@ 401 401 return; 402 402 }; 403 403 ··· 410 410 debug!( 411 411 "{:?}: at {:?}", 412 412 event.action, hit_test_result.point_in_frame 413 - @@ -720,11 +1043,18 @@ 413 + @@ -717,11 +1040,18 @@ 414 414 let target_el = element.find_focusable_shadow_host_if_necessary(); 415 415 416 416 let document = self.window.Document(); ··· 433 433 434 434 // Step 7. Let result = dispatch event at target 435 435 let result = dom_event.dispatch(node.upcast(), false, can_gc); 436 - @@ -731,7 +1061,7 @@ 436 + @@ -728,7 +1058,7 @@ 437 437 438 438 // Step 8. If result is true and target is a focusable area 439 439 // that is click focusable, then Run the focusing steps at target. ··· 442 442 document.commit_focus_transaction(FocusInitiator::Local, can_gc); 443 443 } 444 444 445 - @@ -741,7 +1071,7 @@ 445 + @@ -738,7 +1068,7 @@ 446 446 self.maybe_show_context_menu( 447 447 node.upcast(), 448 448 &hit_test_result, ··· 451 451 can_gc, 452 452 ); 453 453 } 454 - @@ -869,9 +1199,30 @@ 454 + @@ -866,9 +1196,30 @@ 455 455 &self, 456 456 target: &EventTarget, 457 457 hit_test_result: &HitTestResult, ··· 483 483 // <https://w3c.github.io/uievents/#contextmenu> 484 484 let menu_event = PointerEvent::new( 485 485 &self.window, // window 486 - @@ -885,25 +1236,25 @@ 486 + @@ -882,25 +1233,25 @@ 487 487 hit_test_result 488 488 .point_relative_to_initial_containing_block 489 489 .to_i32(), ··· 528 528 can_gc, 529 529 ); 530 530 531 - @@ -919,6 +1270,89 @@ 531 + @@ -916,6 +1267,89 @@ 532 532 }; 533 533 } 534 534 ··· 618 618 fn handle_touch_event( 619 619 &self, 620 620 event: EmbedderTouchEvent, 621 - @@ -925,6 +1359,29 @@ 621 + @@ -922,6 +1356,29 @@ 622 622 input_event: &ConstellationInputEvent, 623 623 can_gc: CanGc, 624 624 ) -> InputEventResult { ··· 648 648 // Ignore all incoming events without a hit test. 649 649 let Some(hit_test_result) = self.window.hit_test_from_input_event(input_event) else { 650 650 self.update_active_touch_points_when_early_return(event); 651 - @@ -931,6 +1388,16 @@ 651 + @@ -928,6 +1385,16 @@ 652 652 return Default::default(); 653 653 }; 654 654 ··· 665 665 let TouchId(identifier) = event.touch_id; 666 666 667 667 let Some(element) = hit_test_result 668 - @@ -998,6 +1465,10 @@ 668 + @@ -995,6 +1462,10 @@ 669 669 self.active_touch_points 670 670 .borrow_mut() 671 671 .push(Dom::from_ref(&*pointer_touch)); ··· 676 676 (current_target, pointer_touch) 677 677 }, 678 678 _ => { 679 - @@ -1030,14 +1501,45 @@ 679 + @@ -1027,14 +1498,45 @@ 680 680 can_gc, 681 681 ); 682 682 ··· 723 723 }, 724 724 TouchEventType::Down => unreachable!("Should have been handled above"), 725 725 } 726 - @@ -1081,6 +1583,19 @@ 726 + @@ -1078,6 +1580,19 @@ 727 727 ); 728 728 let event = touch_event.upcast::<Event>(); 729 729 event.fire(&touch_dispatch_target, can_gc); ··· 743 743 event.flags().into() 744 744 } 745 745 746 - @@ -1267,6 +1782,16 @@ 746 + @@ -1264,6 +1779,16 @@ 747 747 return Default::default(); 748 748 }; 749 749
+4 -4
patches/components/script/dom/globalscope.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -367,6 +367,16 @@ 3 + @@ -369,6 +369,16 @@ 4 4 /// Is considered in a secure context 5 5 inherited_secure_context: Option<bool>, 6 6 ··· 17 17 /// Directory to store unminified scripts for this window if unminify-js 18 18 /// opt is enabled. 19 19 unminified_js_dir: Option<String>, 20 - @@ -767,6 +777,8 @@ 20 + @@ -769,6 +779,8 @@ 21 21 #[cfg(feature = "webgpu")] gpu_id_hub: Arc<IdentityHub>, 22 22 inherited_secure_context: Option<bool>, 23 23 unminify_js: bool, ··· 26 26 font_context: Option<Arc<FontContext>>, 27 27 ) -> Self { 28 28 Self { 29 - @@ -811,6 +823,8 @@ 29 + @@ -813,6 +825,8 @@ 30 30 console_group_stack: DomRefCell::new(Vec::new()), 31 31 console_count_map: Default::default(), 32 32 inherited_secure_context, ··· 35 35 unminified_js_dir: unminify_js.then(|| unminified_path("unminified-js")), 36 36 byte_length_queuing_strategy_size_function: OnceCell::new(), 37 37 count_queuing_strategy_size_function: OnceCell::new(), 38 - @@ -3092,6 +3106,16 @@ 38 + @@ -3101,6 +3115,16 @@ 39 39 self.inherited_secure_context 40 40 } 41 41
+1 -1
patches/components/script/dom/html/htmlformelement.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -868,7 +868,7 @@ 3 + @@ -869,7 +869,7 @@ 4 4 // form's node navigable, and noopener. 5 5 let source = doc.browsing_context().unwrap(); 6 6 let (maybe_chosen, _new) =
+38 -30
patches/components/script/dom/html/htmliframeelement.rs.patch
··· 19 19 use js::context::JSContext; 20 20 use js::rust::HandleObject; 21 21 use net_traits::ReferrerPolicy; 22 - @@ -23,30 +24,35 @@ 23 - use profile_traits::ipc as ProfiledIpc; 22 + @@ -24,30 +25,35 @@ 23 + use script_bindings::script_runtime::temp_cx; 24 24 use script_traits::{NewPipelineInfo, UpdatePipelineIdReason}; 25 25 use servo_url::ServoUrl; 26 26 +use style::Atom; ··· 56 56 use crate::dom::trustedhtml::TrustedHTML; 57 57 use crate::dom::virtualmethods::VirtualMethods; 58 58 use crate::dom::windowproxy::WindowProxy; 59 - @@ -67,6 +73,12 @@ 60 - NotFirstTime, 59 + @@ -76,6 +82,12 @@ 60 + SrcDoc, 61 61 } 62 62 63 63 +// Re-export PendingDialogSender from the embedded webview module ··· 69 69 #[dom_struct] 70 70 pub(crate) struct HTMLIFrameElement { 71 71 htmlelement: HTMLElement, 72 - @@ -98,6 +110,30 @@ 72 + @@ -112,6 +124,30 @@ 73 73 /// an empty iframe is attached. In that case, we shouldn't fire a 74 74 /// subsequent asynchronous load event. 75 75 already_fired_synchronous_load_event: Cell<bool>, ··· 100 100 } 101 101 102 102 impl HTMLIFrameElement { 103 - @@ -256,6 +292,8 @@ 103 + @@ -265,6 +301,8 @@ 104 104 viewport_details, 105 105 user_content_manager_id: None, 106 106 theme: window.theme(), ··· 109 109 }; 110 110 111 111 self.pipeline_id.set(Some(new_pipeline_id)); 112 - @@ -485,6 +523,147 @@ 112 + @@ -560,6 +598,147 @@ 113 113 ); 114 114 } 115 115 ··· 257 257 fn destroy_nested_browsing_context(&self) { 258 258 self.pipeline_id.set(None); 259 259 self.pending_pipeline_id.set(None); 260 - @@ -545,6 +724,13 @@ 261 - script_window_proxies: ScriptThread::window_proxies(), 260 + @@ -622,6 +801,13 @@ 261 + lazy_load_resumption_steps: Default::default(), 262 262 pending_navigation: Default::default(), 263 263 already_fired_synchronous_load_event: Default::default(), 264 264 + is_embedded_webview: Cell::new(false), ··· 271 271 } 272 272 } 273 273 274 - @@ -580,6 +766,157 @@ 274 + @@ -657,7 +843,158 @@ 275 275 self.webview_id.get() 276 276 } 277 277 ··· 376 376 + 377 377 + /// Returns true if this iframe is hosting an embedded webview (created with "embed" attribute). 378 378 + /// Embedded webviews have their own top-level WebViewId and window.parent === window.self. 379 - + #[inline] 379 + #[inline] 380 380 + pub(crate) fn is_embedded_webview(&self) -> bool { 381 381 + self.is_embedded_webview.get() 382 382 + } ··· 426 426 + self.page_zoom.set(zoom); 427 427 + } 428 428 + 429 - #[inline] 429 + + #[inline] 430 430 pub(crate) fn sandboxing_flag_set(&self) -> SandboxingFlagSet { 431 431 self.sandboxing_flag_set 432 - @@ -918,6 +1255,85 @@ 433 - // This is specified as reflecting the name content attribute of the 434 - // element, not the name of the child browsing context. 435 - make_getter!(Name, "name"); 432 + .get() 433 + @@ -1014,6 +1351,85 @@ 434 + 435 + // https://html.spec.whatwg.org/multipage/#attr-iframe-loading 436 + make_setter!(SetLoading, "loading"); 436 437 + 437 438 + // Servo extension: Embedded WebView methods 438 439 + // These delegate to helper methods in htmlembeddedwebview.rs ··· 515 516 } 516 517 517 518 impl VirtualMethods for HTMLIFrameElement { 518 - @@ -969,8 +1385,36 @@ 519 + @@ -1069,10 +1485,38 @@ 519 520 // is in a document tree and has a browsing context, which is what causes 520 521 // the child browsing context to be created. 521 522 if self.upcast::<Node>().is_connected_with_browsing_context() { 522 523 - debug!("iframe src set while in browsing context."); 523 - - self.process_the_iframe_attributes(ProcessingMode::NotFirstTime, can_gc); 524 + - self.process_the_iframe_attributes(ProcessingMode::NotFirstTime, cx); 524 525 + // For embedded webviews, navigate using the load() method instead of 525 526 + // processing iframe attributes (which is for regular nested iframes). 526 527 + if self.is_embedded_webview.get() { ··· 539 540 + } 540 541 + } else { 541 542 + debug!("iframe src set while in browsing context."); 542 - + self.process_the_iframe_attributes(ProcessingMode::NotFirstTime, can_gc); 543 + + self.process_the_iframe_attributes(ProcessingMode::NotFirstTime, cx); 543 544 + } 544 - + } 545 - + }, 545 + } 546 + }, 546 547 + local_name!("embed") => { 547 548 + // The embed attribute determines whether this iframe hosts an embedded webview. 548 549 + // Warn if it's changed after the iframe is already connected, as this is not supported. ··· 551 552 + "The 'embed' attribute on iframe should not be changed after insertion. \ 552 553 + The iframe mode (nested vs embedded webview) is determined at insertion time." 553 554 + ); 554 - } 555 - }, 556 - _ => {}, 557 - @@ -1014,6 +1458,23 @@ 555 + + } 556 + + }, 557 + local_name!("loading") => { 558 + // https://html.spec.whatwg.org/multipage/#attr-iframe-loading 559 + // > When the loading attribute's state is changed to the Eager state, the user agent must run these steps: 560 + @@ -1135,6 +1579,23 @@ 558 561 559 562 debug!("<iframe> running post connection steps"); 560 563 ··· 576 579 + } 577 580 + 578 581 // Step 1. Create a new child navigable for insertedNode. 579 - self.create_nested_browsing_context(CanGc::from_cx(cx)); 582 + self.create_nested_browsing_context(cx); 580 583 581 - @@ -1036,8 +1497,22 @@ 584 + @@ -1158,11 +1619,25 @@ 582 585 fn unbind_from_tree(&self, context: &UnbindContext, can_gc: CanGc) { 583 586 self.super_type().unwrap().unbind_from_tree(context, can_gc); 584 587 585 - - // The iframe HTML element removing steps, given removedNode, are to destroy a child navigable given removedNode 586 - - self.destroy_child_navigable(can_gc); 588 + - // TODO: https://github.com/servo/servo/issues/42837 589 + - let mut cx = unsafe { temp_cx() }; 587 590 + // If this is an embedded webview, notify the compositor to stop tracking its rect 588 591 + if self.is_embedded_webview.get() { 589 592 + if let Some(embedded_webview_id) = self.embedded_webview_id.get() { ··· 597 600 + .remove_embedded_webview(embedded_webview_id); 598 601 + } 599 602 + } else { 603 + + // TODO: https://github.com/servo/servo/issues/42837 604 + + let mut cx = unsafe { temp_cx() }; 605 + 606 + - // The iframe HTML element removing steps, given removedNode, are to destroy a child navigable given removedNode 607 + - self.destroy_child_navigable(&mut cx); 600 608 + // The iframe HTML element removing steps, given removedNode, are to destroy a child navigable given removedNode 601 - + self.destroy_child_navigable(can_gc); 609 + + self.destroy_child_navigable(&mut cx); 602 610 + } 603 611 604 612 self.owner_document().invalidate_iframes_collection();
+8 -8
patches/components/script/dom/window.rs.patch
··· 9 9 }; 10 10 use euclid::default::Rect as UntypedRect; 11 11 use euclid::{Point2D, Rect, Scale, Size2D, Vector2D}; 12 - @@ -1144,12 +1144,22 @@ 12 + @@ -1148,12 +1148,22 @@ 13 13 14 14 let (sender, receiver) = 15 15 ProfiledGenericChannel::channel(self.global().time_profiler_chan().clone()).unwrap(); ··· 33 33 receiver.recv().unwrap_or_else(|_| { 34 34 // If the receiver is closed, we assume the dialog was cancelled. 35 35 debug!("Alert dialog was cancelled or failed to show."); 36 - @@ -1177,13 +1187,22 @@ 36 + @@ -1181,13 +1191,22 @@ 37 37 // the user to respond with a positive or negative response. 38 38 let (sender, receiver) = 39 39 ProfiledGenericChannel::channel(self.global().time_profiler_chan().clone()).unwrap(); ··· 57 57 // Step 5: Let userPromptHandler be WebDriver BiDi user prompt opened with this, 58 58 // "confirm", and message. 59 59 // 60 - @@ -1228,6 +1247,7 @@ 60 + @@ -1232,6 +1251,7 @@ 61 61 // defaulted to the value given by default. 62 62 let (sender, receiver) = 63 63 ProfiledGenericChannel::channel(self.global().time_profiler_chan().clone()).unwrap(); ··· 65 65 let dialog = SimpleDialogRequest::Prompt { 66 66 id: self.Document().embedder_controls().next_control_id(), 67 67 message: message.to_string(), 68 - @@ -1234,8 +1254,16 @@ 68 + @@ -1238,8 +1258,16 @@ 69 69 default: default.to_string(), 70 70 response_sender: sender, 71 71 }; ··· 83 83 // Step 6: Let userPromptHandler be WebDriver BiDi user prompt opened with this, 84 84 // "prompt", and message. 85 85 // TODO: Add support for WebDriver BiDi. 86 - @@ -3028,9 +3056,33 @@ 86 + @@ -3030,9 +3058,33 @@ 87 87 &self, 88 88 input_event: &ConstellationInputEvent, 89 89 ) -> Option<HitTestResult> { ··· 120 120 } 121 121 122 122 #[expect(unsafe_code)] 123 - @@ -3049,8 +3101,25 @@ 123 + @@ -3051,8 +3103,25 @@ 124 124 // SAFETY: This is safe because `Window::query_elements_from_point` has ensured that 125 125 // layout has run and any OpaqueNodes that no longer refer to real nodes are gone. 126 126 let address = UntrustedNodeAddress(result.node.0 as *const c_void); ··· 147 147 cursor: result.cursor, 148 148 point_in_node: result.point_in_target, 149 149 point_in_frame, 150 - @@ -3731,6 +3800,8 @@ 150 + @@ -3733,6 +3802,8 @@ 151 151 player_context: WindowGLContext, 152 152 #[cfg(feature = "webgpu")] gpu_id_hub: Arc<IdentityHub>, 153 153 inherited_secure_context: Option<bool>, ··· 156 156 theme: Theme, 157 157 weak_script_thread: Weak<ScriptThread>, 158 158 ) -> DomRoot<Self> { 159 - @@ -3758,6 +3829,8 @@ 159 + @@ -3759,6 +3830,8 @@ 160 160 gpu_id_hub, 161 161 inherited_secure_context, 162 162 unminify_js,
+8 -8
patches/components/script/dom/windowproxy.rs.patch
··· 9 9 use base::id::{BrowsingContextId, PipelineId, WebViewId}; 10 10 use constellation_traits::{ 11 11 AuxiliaryWebViewCreationRequest, LoadData, LoadOrigin, NavigationHistoryBehavior, 12 - @@ -298,8 +298,9 @@ 12 + @@ -299,8 +299,9 @@ 13 13 &self, 14 14 name: DOMString, 15 15 noopener: bool, ··· 20 20 let window = self 21 21 .currently_active 22 22 .get() 23 - @@ -333,6 +334,7 @@ 23 + @@ -334,6 +335,7 @@ 24 24 opener_webview_id: window.webview_id(), 25 25 opener_pipeline_id: self.currently_active.get().unwrap(), 26 26 response_sender, ··· 28 28 }; 29 29 let constellation_msg = ScriptToConstellationMessage::CreateAuxiliaryWebView(load_info); 30 30 window.send_to_constellation(constellation_msg); 31 - @@ -351,6 +353,8 @@ 31 + @@ -352,6 +354,8 @@ 32 32 // Use the current `WebView`'s theme initially, but the embedder may 33 33 // change this later. 34 34 theme: window.theme(), ··· 37 37 }; 38 38 39 39 with_script_thread(|script_thread| { 40 - @@ -509,14 +513,32 @@ 40 + @@ -504,14 +508,32 @@ 41 41 // (TODO) Step 11. Let referrerPolicy be the empty string. 42 42 // (TODO) Step 12. If noreferrer is true, then set referrerPolicy to "no-referrer". 43 43 ··· 74 74 // TODO Step 15.2, Set up browsing context features for targetNavigable's 75 75 // active browsing context given tokenizedFeatures. 76 76 let target_document = match chosen.document() { 77 - @@ -531,16 +553,12 @@ 77 + @@ -526,16 +548,12 @@ 78 78 let target_window = target_document.window(); 79 79 // Step 15.3 and 15.4 will have happened elsewhere, 80 80 // since we've created a new browsing context and loaded it with about:blank. ··· 92 92 let referrer = if noreferrer { 93 93 Referrer::NoReferrer 94 94 } else { 95 - @@ -604,6 +622,7 @@ 95 + @@ -599,6 +617,7 @@ 96 96 &self, 97 97 name: DOMString, 98 98 noopener: bool, ··· 100 100 ) -> (Option<DomRoot<WindowProxy>>, bool) { 101 101 match name.to_lowercase().as_ref() { 102 102 "" | "_self" => { 103 - @@ -621,7 +640,10 @@ 103 + @@ -616,7 +635,10 @@ 104 104 // Step 5 105 105 (Some(DomRoot::from_ref(self.top())), false) 106 106 }, ··· 112 112 _ => { 113 113 // Step 6. 114 114 // TODO: expand the search to all 'familiar' bc, 115 - @@ -629,7 +651,10 @@ 115 + @@ -624,7 +646,10 @@ 116 116 // See https://html.spec.whatwg.org/multipage/#familiar-with 117 117 match ScriptThread::find_window_proxy_by_name(&name) { 118 118 Some(proxy) => (Some(proxy), false),
+14 -14
patches/components/script/script_thread.rs.patch
··· 5 5 use chrono::{DateTime, Local}; 6 6 use constellation_traits::{ 7 7 - JsEvalResult, LoadData, LoadOrigin, NavigationHistoryBehavior, ScreenshotReadinessResponse, 8 - - ScriptToConstellationChan, ScriptToConstellationMessage, StructuredSerializedData, 9 - - WindowSizeType, 8 + - ScriptToConstellationChan, ScriptToConstellationMessage, ScrollStateUpdate, 9 + - StructuredSerializedData, WindowSizeType, 10 10 + EmbeddedWebViewEventType, JsEvalResult, LoadData, LoadOrigin, NavigationHistoryBehavior, 11 11 + ScreenshotReadinessResponse, ScriptToConstellationChan, ScriptToConstellationMessage, 12 - + StructuredSerializedData, WindowSizeType, 12 + + ScrollStateUpdate, StructuredSerializedData, WindowSizeType, 13 13 }; 14 14 use crossbeam_channel::unbounded; 15 15 use data_url::mime::Mime; ··· 24 24 }; 25 25 use encoding_rs::Encoding; 26 26 use fonts::{FontContext, SystemFontServiceProxy}; 27 - @@ -92,6 +92,7 @@ 27 + @@ -93,6 +93,7 @@ 28 28 UpdatePipelineIdReason, 29 29 }; 30 30 use servo_arc::Arc as ServoArc; ··· 32 32 use servo_config::{opts, pref, prefs}; 33 33 use servo_url::{ImmutableOrigin, MutableOrigin, OriginSnapshot, ServoUrl}; 34 34 use storage_traits::StorageThreads; 35 - @@ -1932,11 +1933,22 @@ 35 + @@ -1928,11 +1929,22 @@ 36 36 self.handle_refresh_cursor(pipeline_id); 37 37 }, 38 38 ScriptThreadMessage::PreferencesUpdated(updates) => { ··· 59 59 }, 60 60 ScriptThreadMessage::ForwardKeyboardScroll(pipeline_id, scroll) => { 61 61 if let Some(document) = self.documents.borrow().find_document(pipeline_id) { 62 - @@ -1974,6 +1986,16 @@ 62 + @@ -1970,6 +1982,16 @@ 63 63 ScriptThreadMessage::SetAccessibilityActive(active) => { 64 64 self.set_accessibility_active(active); 65 65 }, ··· 76 76 } 77 77 } 78 78 79 - @@ -2965,6 +2987,9 @@ 79 + @@ -3012,6 +3034,9 @@ 80 80 .documents 81 81 .borrow() 82 82 .find_iframe(parent_pipeline_id, browsing_context_id); ··· 84 84 + .as_ref() 85 85 + .is_some_and(|iframe| iframe.is_embedded_webview()); 86 86 if let Some(frame_element) = frame_element { 87 - frame_element.update_pipeline_id(new_pipeline_id, reason, can_gc); 87 + frame_element.update_pipeline_id(new_pipeline_id, reason, cx); 88 88 } 89 - @@ -2983,6 +3008,7 @@ 89 + @@ -3031,6 +3056,7 @@ 90 90 // is no need to pass along existing opener information that 91 91 // will be discarded. 92 92 None, ··· 94 94 ); 95 95 } 96 96 } 97 - @@ -3262,6 +3288,44 @@ 97 + @@ -3307,6 +3333,44 @@ 98 98 } 99 99 } 100 100 ··· 139 139 fn ask_constellation_for_top_level_info( 140 140 &self, 141 141 sender_webview_id: WebViewId, 142 - @@ -3375,7 +3439,13 @@ 142 + @@ -3421,7 +3485,13 @@ 143 143 self.senders.pipeline_to_embedder_sender.clone(), 144 144 self.senders.constellation_sender.clone(), 145 145 incomplete.pipeline_id, ··· 154 154 incomplete.viewport_details, 155 155 origin.clone(), 156 156 final_url.clone(), 157 - @@ -3397,6 +3467,8 @@ 157 + @@ -3443,6 +3513,8 @@ 158 158 #[cfg(feature = "webgpu")] 159 159 self.gpu_id_hub.clone(), 160 160 incomplete.load_data.inherited_secure_context, ··· 163 163 incomplete.theme, 164 164 self.this.clone(), 165 165 ); 166 - @@ -3418,6 +3490,7 @@ 166 + @@ -3466,6 +3538,7 @@ 167 167 incomplete.webview_id, 168 168 incomplete.parent_info, 169 169 incomplete.opener, ··· 171 171 ); 172 172 if window_proxy.parent().is_some() { 173 173 // https://html.spec.whatwg.org/multipage/#navigating-across-documents:delaying-load-events-mode-2 174 - @@ -4150,6 +4223,24 @@ 174 + @@ -4197,6 +4270,24 @@ 175 175 document.event_handler().handle_refresh_cursor(); 176 176 } 177 177
+12 -6
patches/components/script/script_window_proxies.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -119,6 +119,7 @@ 3 + @@ -122,6 +122,7 @@ 4 4 webview_id: WebViewId, 5 5 parent_info: Option<PipelineId>, 6 6 opener: Option<BrowsingContextId>, ··· 8 8 ) -> DomRoot<WindowProxy> { 9 9 if let Some(window_proxy) = self.get(browsing_context_id) { 10 10 // Note: we do not set the window to be the currently-active one, 11 - @@ -130,12 +131,29 @@ 11 + @@ -133,17 +134,30 @@ 12 12 .borrow() 13 13 .find_iframe(parent_id, browsing_context_id) 14 14 }); 15 15 - let parent_browsing_context = match (parent_info, iframe.as_ref()) { 16 16 - (_, Some(iframe)) => Some(iframe.owner_window().window_proxy()), 17 - - (Some(parent_id), _) => { 18 - - self.remote_window_proxy(senders, window.upcast(), webview_id, parent_id, opener) 19 - - }, 17 + - (Some(parent_id), _) => self.remote_window_proxy( 18 + - cx, 19 + - senders, 20 + - window.upcast(), 21 + - webview_id, 22 + - parent_id, 23 + - opener, 24 + - ), 20 25 - _ => None, 21 26 + 22 27 + // For embedded webview iframes, treat them as having no parent so that ··· 33 38 + match (parent_info, iframe.as_ref()) { 34 39 + (_, Some(iframe)) => Some(iframe.owner_window().window_proxy()), 35 40 + (Some(parent_id), _) => self.remote_window_proxy( 41 + + cx, 36 42 + senders, 37 43 + window.upcast(), 38 44 + webview_id, ··· 44 50 }; 45 51 46 52 let opener_browsing_context = opener.and_then(|id| self.find_window_proxy(id)); 47 - @@ -145,11 +163,19 @@ 53 + @@ -153,11 +167,19 @@ 48 54 opener_browsing_context.as_deref(), 49 55 ); 50 56
+2 -2
patches/components/script_bindings/codegen/Bindings.conf.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -263,6 +263,10 @@ 4 - 'canGc': ['CheckValidity', 'GetLabels', 'GetValidity', 'SetValidity', 'ReportValidity', 'States'], 3 + @@ -264,6 +264,10 @@ 4 + 'cx': ['CheckValidity', 'ReportValidity'], 5 5 }, 6 6 7 7 +'Embedder': {
+1 -1
patches/components/script_bindings/webidls/HTMLIFrameElement.webidl.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -47,3 +47,5 @@ 3 + @@ -40,3 +40,5 @@ 4 4 // [CEReactions, LegacyNullToEmptyString] 5 5 // attribute DOMString marginWidth; 6 6 };
+4 -4
patches/components/shared/embedder/input_events.rs.patch
··· 1 1 --- original 2 2 +++ modified 3 - @@ -59,6 +59,17 @@ 3 + @@ -57,6 +57,17 @@ 4 4 pub id: InputEventId, 5 5 } 6 6 ··· 18 18 impl From<InputEvent> for InputEventAndId { 19 19 fn from(event: InputEvent) -> Self { 20 20 Self { 21 - @@ -92,6 +103,31 @@ 22 - InputEvent::Scroll(..) => None, 21 + @@ -89,6 +100,31 @@ 22 + InputEvent::Wheel(event) => Some(event.point), 23 23 } 24 24 } 25 25 + ··· 50 50 } 51 51 52 52 #[derive(Clone, Debug, Default, Deserialize, Serialize)] 53 - @@ -226,7 +262,7 @@ 53 + @@ -223,7 +259,7 @@ 54 54 } 55 55 56 56 /// The type of input represented by a multi-touch event.
+2 -2
patches/components/shared/script/lib.rs.patch
··· 5 5 use canvas_traits::webgl::WebGLPipeline; 6 6 use constellation_traits::{ 7 7 - KeyboardScroll, LoadData, NavigationHistoryBehavior, ScriptToConstellationSender, 8 - - StructuredSerializedData, WindowSizeType, 8 + - ScrollStateUpdate, StructuredSerializedData, WindowSizeType, 9 9 + EmbeddedWebViewEventType, KeyboardScroll, LoadData, NavigationHistoryBehavior, 10 - + ScriptToConstellationSender, StructuredSerializedData, WindowSizeType, 10 + + ScriptToConstellationSender, ScrollStateUpdate, StructuredSerializedData, WindowSizeType, 11 11 }; 12 12 use crossbeam_channel::RecvTimeoutError; 13 13 use devtools_traits::ScriptToDevtoolsControlMsg;