aboutsummaryrefslogtreecommitdiffstats
path: root/components/compositing/compositor_layer.rs
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2015-10-20 08:32:17 +1000
committerGlenn Watson <gw@intuitionlibrary.com>2015-10-20 08:32:17 +1000
commit596193f975f9093d0104d095864462b7afaa081b (patch)
tree68e5d58d1766c25a79752f0e1e2241be1d39f1a4 /components/compositing/compositor_layer.rs
parente0c8a88410277843714a20d5fced73a392fad861 (diff)
downloadservo-596193f975f9093d0104d095864462b7afaa081b.tar.gz
servo-596193f975f9093d0104d095864462b7afaa081b.zip
Fix iframes flickering on mouse move.
Fixes #7867 (and probably several other iframe bugs). When collecting layers for children of a pipeline, pass through the current subpage pipeline recursively. This prevents descendany layers (such as scroll layers) from being collected and re-created on the subsequent paint.
Diffstat (limited to 'components/compositing/compositor_layer.rs')
-rw-r--r--components/compositing/compositor_layer.rs14
1 files changed, 10 insertions, 4 deletions
diff --git a/components/compositing/compositor_layer.rs b/components/compositing/compositor_layer.rs
index 0bcb35bd28d..525135fd208 100644
--- a/components/compositing/compositor_layer.rs
+++ b/components/compositing/compositor_layer.rs
@@ -449,17 +449,22 @@ impl RcCompositorLayer for Rc<Layer<CompositorData>> {
compositor: &mut IOCompositor<Window>,
pipeline_id: PipelineId,
new_layers: &[LayerProperties],
- pipelines_removed: &mut Vec<PipelineId>)
+ pipelines_removed: &mut Vec<PipelineId>,
+ layer_pipeline_id: Option<PipelineId>)
where Window: WindowMethods {
// Traverse children first so that layers are removed
// bottom up - allowing each layer being removed to properly
// clean up any tiles it owns.
for kid in &*layer.children() {
+ let extra_data = kid.extra_data.borrow();
+ let layer_pipeline_id = extra_data.subpage_info.or(layer_pipeline_id);
+
collect_old_layers_for_pipeline(kid,
compositor,
pipeline_id,
new_layers,
- pipelines_removed);
+ pipelines_removed,
+ layer_pipeline_id);
}
// Retain child layers that also exist in the new layer list.
@@ -477,7 +482,7 @@ impl RcCompositorLayer for Rc<Layer<CompositorData>> {
}
}
- if let Some(layer_pipeline_id) = extra_data.subpage_info {
+ if let Some(layer_pipeline_id) = layer_pipeline_id {
for layer_properties in new_layers.iter() {
// Keep this layer if a reference to it exists.
if let Some(ref subpage_layer_info) = layer_properties.subpage_layer_info {
@@ -507,7 +512,8 @@ impl RcCompositorLayer for Rc<Layer<CompositorData>> {
compositor,
pipeline_id,
new_layers,
- pipelines_removed);
+ pipelines_removed,
+ None);
}
}