diff options
author | Glenn Watson <gw@intuitionlibrary.com> | 2015-10-20 08:32:17 +1000 |
---|---|---|
committer | Glenn Watson <gw@intuitionlibrary.com> | 2015-10-20 08:32:17 +1000 |
commit | 596193f975f9093d0104d095864462b7afaa081b (patch) | |
tree | 68e5d58d1766c25a79752f0e1e2241be1d39f1a4 /components/compositing/compositor_layer.rs | |
parent | e0c8a88410277843714a20d5fced73a392fad861 (diff) | |
download | servo-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.rs | 14 |
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); } } |