Rewild Your Web
web
browser
dweb
1--- original
2+++ modified
3@@ -210,6 +210,10 @@
4
5 /// The collector for calculating Largest Contentful Paint
6 lcp_candidate_collector: RefCell<Option<LargestContentfulPaintCandidateCollector>>,
7+
8+ /// The current page zoom for rendering (used by embedded webviews).
9+ /// When this changes, we need to trigger a new stacking context tree build.
10+ page_zoom_for_rendering: Cell<Option<f32>>,
11 }
12
13 pub struct LayoutFactoryImpl();
14@@ -250,12 +254,25 @@
15 fn set_viewport_details(&mut self, viewport_details: ViewportDetails) -> bool {
16 let device = self.stylist.device_mut();
17 let device_pixel_ratio = Scale::new(viewport_details.hidpi_scale_factor.get());
18- if device.viewport_size() == viewport_details.size &&
19- device.device_pixel_ratio() == device_pixel_ratio
20- {
21- return false;
22+
23+ // Check if page_zoom_for_rendering changed (for embedded webviews)
24+ let zoom_changed =
25+ self.page_zoom_for_rendering.get() != viewport_details.page_zoom_for_rendering;
26+ if zoom_changed {
27+ self.page_zoom_for_rendering
28+ .set(viewport_details.page_zoom_for_rendering);
29+ // Need to rebuild stacking context tree to apply the new zoom transform
30+ self.need_new_stacking_context_tree.set(true);
31+ self.need_new_display_list.set(true);
32 }
33
34+ let size_changed = device.viewport_size() != viewport_details.size ||
35+ device.device_pixel_ratio() != device_pixel_ratio;
36+
37+ if !size_changed {
38+ return zoom_changed;
39+ }
40+
41 device.set_viewport_size(viewport_details.size);
42 device.set_device_pixel_ratio(device_pixel_ratio);
43 self.device_has_changed = true;
44@@ -766,6 +783,7 @@
45 previously_highlighted_dom_node: Cell::new(None),
46 lcp_candidate_collector: Default::default(),
47 user_stylesheets: config.user_stylesheets,
48+ page_zoom_for_rendering: Cell::new(config.viewport_details.page_zoom_for_rendering),
49 }
50 }
51