servo: Merge #2523 - Prevent child layers from overriding root background color (from mrobinson:background-color); r=pcwalton

The first layer implicitly provides the size of the page, but child
layer background colors can still improperly override the body
background color. This commit ensures that layer background colors only
apply to layers with the same id and pipeline id. Additionally the root
layer's unrendered color is defined by the first layer's background
color, just like for size.

Source-Repo: https://github.com/servo/servo
Source-Revision: 68e3fb26a701ae0224f579b66606118eab1eedaf
This commit is contained in:
Martin Robinson 2014-05-30 17:40:18 -04:00
Родитель d26a773708
Коммит 0abf027a0b
3 изменённых файлов: 26 добавлений и 10 удалений

Просмотреть файл

@ -267,9 +267,9 @@ impl IOCompositor {
chan.send(Some(azure_hl::current_graphics_metadata()));
}
(Ok(CreateRootCompositorLayerIfNecessary(pipeline_id, layer_id, size)),
(Ok(CreateRootCompositorLayerIfNecessary(pipeline_id, layer_id, size, color)),
false) => {
self.create_root_compositor_layer_if_necessary(pipeline_id, layer_id, size);
self.create_root_compositor_layer_if_necessary(pipeline_id, layer_id, size, color);
}
(Ok(CreateDescendantCompositorLayerIfNecessary(pipeline_id,
@ -322,12 +322,11 @@ impl IOCompositor {
}
}
// FIXME(#2004, pcwalton): Take the pipeline ID and layer ID into account.
fn set_unrendered_color(&mut self, _: PipelineId, _: LayerId, color: Color) {
fn set_unrendered_color(&mut self, pipeline_id: PipelineId, layer_id: LayerId, color: Color) {
match self.compositor_layer {
Some(ref mut layer) => layer.unrendered_color = color,
None => {}
}
Some(ref mut layer) => layer.set_unrendered_color(pipeline_id, layer_id, color),
None => false,
};
}
fn set_ids(&mut self,
@ -353,7 +352,8 @@ impl IOCompositor {
fn create_root_compositor_layer_if_necessary(&mut self,
id: PipelineId,
layer_id: LayerId,
size: Size2D<f32>) {
size: Size2D<f32>,
unrendered_color: Color) {
let (root_pipeline, root_layer_id) = match self.compositor_layer {
Some(ref compositor_layer) if compositor_layer.pipeline.id == id => {
(compositor_layer.pipeline.clone(), compositor_layer.id_of_first_child())
@ -372,6 +372,7 @@ impl IOCompositor {
size,
self.opts.tile_size,
self.opts.cpu_painting);
new_layer.unrendered_color = unrendered_color;
let first_child = self.root_layer.first_child.borrow().clone();
match first_child {

Просмотреть файл

@ -965,5 +965,19 @@ impl CompositorLayer {
pub fn id_of_first_child(&self) -> LayerId {
self.children.iter().next().expect("no first child!").child.id
}
pub fn set_unrendered_color(&mut self, pipeline_id: PipelineId, layer_id: LayerId, color: Color) -> bool {
if self.pipeline.id != pipeline_id || self.id != layer_id {
for child_layer in self.children.mut_iter() {
if child_layer.child.set_unrendered_color(pipeline_id, layer_id, color) {
return true;
}
}
return false;
}
self.unrendered_color = color;
return true;
}
}

Просмотреть файл

@ -96,7 +96,8 @@ impl RenderListener for CompositorChan {
if first {
self.chan.send(CreateRootCompositorLayerIfNecessary(pipeline_id,
metadata.id,
size));
size,
metadata.background_color));
first = false
} else {
self.chan
@ -166,7 +167,7 @@ pub enum Msg {
/// Tells the compositor to create the root layer for a pipeline if necessary (i.e. if no layer
/// with that ID exists).
CreateRootCompositorLayerIfNecessary(PipelineId, LayerId, Size2D<f32>),
CreateRootCompositorLayerIfNecessary(PipelineId, LayerId, Size2D<f32>, Color),
/// Tells the compositor to create a descendant layer for a pipeline if necessary (i.e. if no
/// layer with that ID exists).
CreateDescendantCompositorLayerIfNecessary(PipelineId, LayerId, Rect<f32>, ScrollPolicy),