servo: Merge #14200 - Deal with changes to the WebRender API (from mrobinson:display-list); r=<try>
authorMartin Robinson <mrobinson@igalia.com>
Wed, 16 Nov 2016 04:47:34 -0600
changeset 340159 8754a6f02bacdf57124ac54b1cba02027913c88c
parent 340158 0a5eae76e3c8a50f0d2b172fe63ffcdd52f3d1e5
child 340160 af131bf9d7582fa8988664cf02cb39ed19763d30
push id31307
push usergszorc@mozilla.com
push dateSat, 04 Feb 2017 00:59:06 +0000
treeherdermozilla-central@94079d43835f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
servo: Merge #14200 - Deal with changes to the WebRender API (from mrobinson:display-list); r=<try> <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [x] These changes do not require tests because they should not change behavior. <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> The WebRender display list is now similar to the Servo display list, which simplifies the conversion. Source-Repo: https://github.com/servo/servo Source-Revision: 3fdce3942915e2ef461280d4908641580473ad94
servo/components/layout/webrender_helpers.rs
servo/components/layout_thread/lib.rs
servo/components/servo/Cargo.lock
servo/ports/cef/Cargo.lock
--- a/servo/components/layout/webrender_helpers.rs
+++ b/servo/components/layout/webrender_helpers.rs
@@ -5,56 +5,30 @@
 // TODO(gw): This contains helper traits and implementations for converting Servo display lists
 //           into WebRender display lists. In the future, this step should be completely removed.
 //           This might be achieved by sharing types between WR and Servo display lists, or
 //           completely converting layout to directly generate WebRender display lists, for example.
 
 use app_units::Au;
 use euclid::{Matrix4D, Point2D, Rect, Size2D, TypedRect};
 use gfx::display_list::{BorderRadii, BoxShadowClipMode, ClippingRegion};
-use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal};
-use gfx::display_list::{StackingContext, StackingContextType};
+use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal, StackingContextType};
 use gfx_traits::{FragmentType, ScrollPolicy, StackingContextId, ScrollRootId};
 use style::computed_values::{image_rendering, mix_blend_mode};
 use style::computed_values::filter::{self, Filter};
 use style::values::computed::BorderStyle;
-use webrender_traits::{self, AuxiliaryListsBuilder, DisplayListId, PipelineId};
-
-trait WebRenderStackingContextConverter {
-    fn convert_to_webrender<'a>(&self,
-                                traversal: &mut DisplayListTraversal<'a>,
-                                api: &mut webrender_traits::RenderApi,
-                                pipeline_id: webrender_traits::PipelineId,
-                                epoch: webrender_traits::Epoch,
-                                frame_builder: &mut WebRenderFrameBuilder,
-                                scroll_layer_id: Option<webrender_traits::ScrollLayerId>)
-                                -> webrender_traits::StackingContextId;
-
-    fn convert_children_to_webrender<'a>(&self,
-                                         traversal: &mut DisplayListTraversal<'a>,
-                                         api: &mut webrender_traits::RenderApi,
-                                         pipeline_id: webrender_traits::PipelineId,
-                                         epoch: webrender_traits::Epoch,
-                                         builder: &mut webrender_traits::DisplayListBuilder,
-                                         frame_builder: &mut WebRenderFrameBuilder,
-                                         force_positioned_stacking_level: bool);
-}
+use webrender_traits::{self, AuxiliaryListsBuilder, BuiltDisplayList, DisplayListBuilder, PipelineId};
 
 pub trait WebRenderDisplayListConverter {
-    fn convert_to_webrender(&self,
-                            api: &mut webrender_traits::RenderApi,
-                            pipeline_id: webrender_traits::PipelineId,
-                            epoch: webrender_traits::Epoch,
-                            frame_builder: &mut WebRenderFrameBuilder)
-                            -> webrender_traits::StackingContextId;
+    fn convert_to_webrender(&self, frame_builder: &mut WebRenderFrameBuilder) -> BuiltDisplayList;
 }
 
 trait WebRenderDisplayItemConverter {
     fn convert_to_webrender(&self,
-                            builder: &mut webrender_traits::DisplayListBuilder,
+                            builder: &mut DisplayListBuilder,
                             frame_builder: &mut WebRenderFrameBuilder);
 }
 
 trait ToBorderStyle {
     fn to_border_style(&self) -> webrender_traits::BorderStyle;
 }
 
 impl ToBorderStyle for BorderStyle {
@@ -68,17 +42,16 @@ impl ToBorderStyle for BorderStyle {
             BorderStyle::hidden => webrender_traits::BorderStyle::Hidden,
             BorderStyle::groove => webrender_traits::BorderStyle::Groove,
             BorderStyle::ridge => webrender_traits::BorderStyle::Ridge,
             BorderStyle::inset => webrender_traits::BorderStyle::Inset,
             BorderStyle::outset => webrender_traits::BorderStyle::Outset,
         }
     }
 }
-
 trait ToBoxShadowClipMode {
     fn to_clip_mode(&self) -> webrender_traits::BoxShadowClipMode;
 }
 
 impl ToBoxShadowClipMode for BoxShadowClipMode {
     fn to_clip_mode(&self) -> webrender_traits::BoxShadowClipMode {
         match *self {
             BoxShadowClipMode::None => webrender_traits::BoxShadowClipMode::None,
@@ -217,138 +190,30 @@ impl ToFilterOps for filter::T {
                 Filter::Saturate(amount) => result.push(webrender_traits::FilterOp::Saturate(amount)),
                 Filter::Sepia(amount) => result.push(webrender_traits::FilterOp::Sepia(amount)),
             }
         }
         result
     }
 }
 
-impl WebRenderStackingContextConverter for StackingContext {
-    fn convert_children_to_webrender<'a>(&self,
-                                         traversal: &mut DisplayListTraversal<'a>,
-                                         api: &mut webrender_traits::RenderApi,
-                                         pipeline_id: webrender_traits::PipelineId,
-                                         epoch: webrender_traits::Epoch,
-                                         builder: &mut webrender_traits::DisplayListBuilder,
-                                         frame_builder: &mut WebRenderFrameBuilder,
-                                         _force_positioned_stacking_level: bool) {
-        while let Some(item) = traversal.next() {
-            match item {
-                &DisplayItem::PushStackingContext(ref stacking_context_item) => {
-                    let stacking_context = &stacking_context_item.stacking_context;
-                    debug_assert!(stacking_context.context_type == StackingContextType::Real);
-                    builder.push_stacking_context(
-                        stacking_context.convert_to_webrender(traversal,
-                                                              api,
-                                                              pipeline_id,
-                                                              epoch,
-                                                              frame_builder,
-                                                              None));
-                }
-                &DisplayItem::PushScrollRoot(ref item) => {
-                    let stacking_context = StackingContext::new(
-                        StackingContextId::new(0),
-                        StackingContextType::Real,
-                        &item.scroll_root.clip,
-                        &TypedRect::new(Point2D::zero(), item.scroll_root.size),
-                        0,
-                        filter::T::new(Vec::new()),
-                        mix_blend_mode::T::normal,
-                        Matrix4D::identity(),
-                        Matrix4D::identity(),
-                        true,
-                        ScrollPolicy::Scrollable,
-                        ScrollRootId::root());
-                    let scroll_layer_id =
-                        Some(frame_builder.next_scroll_layer_id(item.scroll_root.id));
-                    builder.push_stacking_context(
-                        stacking_context.convert_to_webrender(traversal,
-                                                              api,
-                                                              pipeline_id,
-                                                              epoch,
-                                                              frame_builder,
-                                                              scroll_layer_id));
-                }
-                &DisplayItem::PopStackingContext(_) | &DisplayItem::PopScrollRoot(_) => return,
-                _ => item.convert_to_webrender(builder, frame_builder),
-            }
+impl WebRenderDisplayListConverter for DisplayList {
+    fn convert_to_webrender(&self, frame_builder: &mut WebRenderFrameBuilder) -> BuiltDisplayList {
+        let traversal = DisplayListTraversal::new(self);
+        let mut builder = DisplayListBuilder::new();
+        for item in traversal {
+            item.convert_to_webrender(&mut builder, frame_builder);
         }
-    }
-
-    fn convert_to_webrender<'a>(&self,
-                                traversal: &mut DisplayListTraversal<'a>,
-                                api: &mut webrender_traits::RenderApi,
-                                pipeline_id: webrender_traits::PipelineId,
-                                epoch: webrender_traits::Epoch,
-                                frame_builder: &mut WebRenderFrameBuilder,
-                                scroll_layer_id: Option<webrender_traits::ScrollLayerId>)
-                                -> webrender_traits::StackingContextId {
-        let webrender_scroll_policy = match self.scroll_policy {
-            ScrollPolicy::Scrollable => webrender_traits::ScrollPolicy::Scrollable,
-            ScrollPolicy::FixedPosition => webrender_traits::ScrollPolicy::Fixed,
-        };
-
-        let mut sc =
-            webrender_traits::StackingContext::new(scroll_layer_id,
-                                                   webrender_scroll_policy,
-                                                   self.bounds.to_rectf(),
-                                                   self.overflow.to_rectf(),
-                                                   self.z_index,
-                                                   &self.transform,
-                                                   &self.perspective,
-                                                   self.establishes_3d_context,
-                                                   self.blend_mode.to_blend_mode(),
-                                                   self.filters.to_filter_ops(),
-                                                   &mut frame_builder.auxiliary_lists_builder);
-
-        let mut builder = webrender_traits::DisplayListBuilder::new();
-        self.convert_children_to_webrender(traversal,
-                                           api,
-                                           pipeline_id,
-                                           epoch,
-                                           &mut builder,
-                                           frame_builder,
-                                           false);
-
-        frame_builder.add_display_list(api, builder.finalize(), &mut sc);
-        frame_builder.add_stacking_context(api, pipeline_id, sc)
-    }
-}
-
-impl WebRenderDisplayListConverter for DisplayList {
-    fn convert_to_webrender(&self,
-                            api: &mut webrender_traits::RenderApi,
-                            pipeline_id: webrender_traits::PipelineId,
-                            epoch: webrender_traits::Epoch,
-                            frame_builder: &mut WebRenderFrameBuilder)
-                            -> webrender_traits::StackingContextId {
-        let mut traversal = DisplayListTraversal::new(self);
-        let item = traversal.next();
-        match item {
-            Some(&DisplayItem::PushStackingContext(ref stacking_context_item)) => {
-                let stacking_context = &stacking_context_item.stacking_context;
-                let scroll_layer_id =
-                    Some(frame_builder.next_scroll_layer_id(ScrollRootId::root()));
-                stacking_context.convert_to_webrender(&mut traversal,
-                                                      api,
-                                                      pipeline_id,
-                                                      epoch,
-                                                      frame_builder,
-                                                      scroll_layer_id)
-            }
-            _ => unreachable!("DisplayList did not start with StackingContext."),
-
-        }
+        builder.finalize()
     }
 }
 
 impl WebRenderDisplayItemConverter for DisplayItem {
     fn convert_to_webrender(&self,
-                            builder: &mut webrender_traits::DisplayListBuilder,
+                            builder: &mut DisplayListBuilder,
                             frame_builder: &mut WebRenderFrameBuilder) {
         match *self {
             DisplayItem::SolidColor(ref item) => {
                 let color = item.color;
                 if color.a > 0.0 {
                     builder.push_rect(item.base.bounds.to_rectf(),
                                       item.base.clip.to_clip_region(frame_builder),
                                       color);
@@ -467,67 +332,84 @@ impl WebRenderDisplayItemConverter for D
             }
             DisplayItem::Iframe(ref item) => {
                 let rect = item.base.bounds.to_rectf();
                 let pipeline_id = item.iframe.to_webrender();
                 builder.push_iframe(rect,
                                     item.base.clip.to_clip_region(frame_builder),
                                     pipeline_id);
             }
-            DisplayItem::PushStackingContext(_) |
-            DisplayItem::PopStackingContext(_) |
-            DisplayItem::PushScrollRoot(_) |
-            DisplayItem::PopScrollRoot(_) =>
-                unreachable!("Tried to convert a scroll root or stacking context structure item."),
+            DisplayItem::PushStackingContext(ref item) => {
+                let stacking_context = &item.stacking_context;
+                debug_assert!(stacking_context.context_type == StackingContextType::Real);
+
+                let webrender_scroll_policy = match stacking_context.scroll_policy {
+                    ScrollPolicy::Scrollable => webrender_traits::ScrollPolicy::Scrollable,
+                    ScrollPolicy::FixedPosition => webrender_traits::ScrollPolicy::Fixed,
+                };
+
+                let scroll_layer_id = if stacking_context.id == StackingContextId::root() {
+                    Some(frame_builder.next_scroll_layer_id(ScrollRootId::root()))
+                } else {
+                    None
+                };
+
+                let context =
+                    webrender_traits::StackingContext::new(
+                        scroll_layer_id,
+                        webrender_scroll_policy,
+                        stacking_context.bounds.to_rectf(),
+                        stacking_context.overflow.to_rectf(),
+                        stacking_context.z_index,
+                        &stacking_context.transform,
+                        &stacking_context.perspective,
+                        stacking_context.establishes_3d_context,
+                        stacking_context.blend_mode.to_blend_mode(),
+                        stacking_context.filters.to_filter_ops(),
+                        &mut frame_builder.auxiliary_lists_builder);
+                builder.push_stacking_context(context);
+
+            }
+            DisplayItem::PopStackingContext(_) => builder.pop_stacking_context(),
+            DisplayItem::PushScrollRoot(ref item) => {
+                let overflow = TypedRect::new(Point2D::zero(), item.scroll_root.size);
+                let context = webrender_traits::StackingContext::new(
+                        Some(frame_builder.next_scroll_layer_id(item.scroll_root.id)),
+                        webrender_traits::ScrollPolicy::Scrollable,
+                        item.scroll_root.clip.to_rectf(),
+                        overflow.to_rectf(),
+                        0,
+                        &Matrix4D::identity(),
+                        &Matrix4D::identity(),
+                        true,
+                        mix_blend_mode::T::normal.to_blend_mode(),
+                        filter::T::new(Vec::new()).to_filter_ops(),
+                        &mut frame_builder.auxiliary_lists_builder);
+                builder.push_stacking_context(context);
+            }
+            DisplayItem::PopScrollRoot(_) => builder.pop_stacking_context(),
         }
     }
 }
 
 pub struct WebRenderFrameBuilder {
-    pub stacking_contexts: Vec<(webrender_traits::StackingContextId,
-                                webrender_traits::StackingContext)>,
-    pub display_lists: Vec<(DisplayListId, webrender_traits::BuiltDisplayList)>,
     pub auxiliary_lists_builder: AuxiliaryListsBuilder,
     pub root_pipeline_id: PipelineId,
     pub next_scroll_layer_id: usize,
 }
 
 impl WebRenderFrameBuilder {
     pub fn new(root_pipeline_id: PipelineId) -> WebRenderFrameBuilder {
         WebRenderFrameBuilder {
-            stacking_contexts: vec![],
-            display_lists: vec![],
             auxiliary_lists_builder: AuxiliaryListsBuilder::new(),
             root_pipeline_id: root_pipeline_id,
             next_scroll_layer_id: 0,
         }
     }
 
-    pub fn add_stacking_context(&mut self,
-                                api: &mut webrender_traits::RenderApi,
-                                pipeline_id: PipelineId,
-                                stacking_context: webrender_traits::StackingContext)
-                                -> webrender_traits::StackingContextId {
-        assert!(pipeline_id == self.root_pipeline_id);
-        let id = api.next_stacking_context_id();
-        self.stacking_contexts.push((id, stacking_context));
-        id
-    }
-
-    pub fn add_display_list(&mut self,
-                            api: &mut webrender_traits::RenderApi,
-                            display_list: webrender_traits::BuiltDisplayList,
-                            stacking_context: &mut webrender_traits::StackingContext)
-                            -> DisplayListId {
-        let id = api.next_display_list_id();
-        stacking_context.display_lists.push(id);
-        self.display_lists.push((id, display_list));
-        id
-    }
-
     pub fn next_scroll_layer_id(&mut self,
                                 scroll_root_id: ScrollRootId)
                                 -> webrender_traits::ScrollLayerId {
         let scroll_layer_id = self.next_scroll_layer_id;
         self.next_scroll_layer_id += 1;
         webrender_traits::ScrollLayerId::new(self.root_pipeline_id,
                                              scroll_layer_id,
                                              scroll_root_id.convert_to_webrender())
--- a/servo/components/layout_thread/lib.rs
+++ b/servo/components/layout_thread/lib.rs
@@ -934,43 +934,35 @@ impl LayoutThread {
                 display_list.print();
             }
             if opts::get().dump_display_list_json {
                 println!("{}", serde_json::to_string_pretty(&display_list).unwrap());
             }
 
             debug!("Layout done!");
 
-            self.epoch.next();
-
             // TODO: Avoid the temporary conversion and build webrender sc/dl directly!
-            let Epoch(epoch_number) = self.epoch;
-            let epoch = webrender_traits::Epoch(epoch_number);
             let pipeline_id = self.id.to_webrender();
-
-            // TODO(gw) For now only create a root scrolling layer!
             let mut frame_builder = WebRenderFrameBuilder::new(pipeline_id);
-            let sc_id = rw_data.display_list.as_ref().unwrap().convert_to_webrender(
-                &mut self.webrender_api,
-                pipeline_id,
-                epoch,
+            let built_display_list = rw_data.display_list.as_ref().unwrap().convert_to_webrender(
                 &mut frame_builder);
-            let root_background_color = get_root_flow_background_color(layout_root);
 
             let viewport_size = Size2D::new(self.viewport_size.width.to_f32_px(),
                                             self.viewport_size.height.to_f32_px());
 
-            self.webrender_api.set_root_stacking_context(sc_id,
-                                                         root_background_color,
-                                                         epoch,
-                                                         pipeline_id,
-                                                         viewport_size,
-                                                         frame_builder.stacking_contexts,
-                                                         frame_builder.display_lists,
-                                                         frame_builder.auxiliary_lists_builder.finalize());
+            self.epoch.next();
+            let Epoch(epoch_number) = self.epoch;
+
+            self.webrender_api.set_root_display_list(
+                get_root_flow_background_color(layout_root),
+                webrender_traits::Epoch(epoch_number),
+                pipeline_id,
+                viewport_size,
+                built_display_list,
+                frame_builder.auxiliary_lists_builder.finalize());
         });
     }
 
     /// The high-level routine that performs layout threads.
     fn handle_reflow<'a, 'b>(&mut self,
                              data: &ScriptReflow,
                              possibly_locked_rw_data: &mut RwData<'a, 'b>) {
         let document = unsafe { ServoLayoutNode::new(&data.document) };
--- a/servo/components/servo/Cargo.lock
+++ b/servo/components/servo/Cargo.lock
@@ -44,18 +44,18 @@ dependencies = [
  "script_traits 0.0.1",
  "sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_tests 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "util_tests 0.0.1",
  "webdriver_server 0.0.1",
- "webrender 0.8.1 (git+https://github.com/servo/webrender)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender 0.9.0 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "aho-corasick"
 version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -273,33 +273,33 @@ dependencies = [
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "canvas_traits"
 version = "0.0.1"
 dependencies = [
  "azure 0.9.1 (git+https://github.com/servo/rust-azure)",
  "cssparser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "caseless"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "regex 0.1.76 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -391,18 +391,18 @@ dependencies = [
  "profile_traits 0.0.1",
  "script_traits 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender 0.8.1 (git+https://github.com/servo/webrender)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender 0.9.0 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "constellation"
 version = "0.0.1"
 dependencies = [
  "backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bluetooth_traits 0.0.1",
@@ -425,17 +425,17 @@ dependencies = [
  "profile_traits 0.0.1",
  "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "script_traits 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_traits 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "content-blocker"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "regex 0.1.76 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -895,17 +895,17 @@ dependencies = [
  "simd 0.1.1 (git+https://github.com/huonw/simd)",
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "xi-unicode 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gfx_tests"
 version = "0.0.1"
 dependencies = [
  "gfx 0.0.1",
@@ -1275,17 +1275,17 @@ dependencies = [
  "servo_atoms 0.0.1",
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "layout_tests"
 version = "0.0.1"
 dependencies = [
  "layout 0.0.1",
 ]
@@ -1316,31 +1316,31 @@ dependencies = [
  "script_layout_interface 0.0.1",
  "script_traits 0.0.1",
  "selectors 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "layout_traits"
 version = "0.0.1"
 dependencies = [
  "gfx 0.0.1",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "profile_traits 0.0.1",
  "script_traits 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "lazy_static"
 version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1526,17 +1526,17 @@ version = "0.0.1"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "net"
 version = "0.0.1"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "brotli 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1564,17 +1564,17 @@ dependencies = [
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "tinyfiledialogs 0.1.0 (git+https://github.com/jdm/tinyfiledialogs)",
  "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "net2"
 version = "0.2.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1623,17 +1623,17 @@ dependencies = [
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "net_traits_tests"
 version = "0.0.1"
 dependencies = [
  "net_traits 0.0.1",
@@ -2157,17 +2157,17 @@ dependencies = [
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "tinyfiledialogs 0.1.0 (git+https://github.com/jdm/tinyfiledialogs)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "xml5ever 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "script_layout_interface"
 version = "0.0.1"
 dependencies = [
@@ -2950,18 +2950,18 @@ dependencies = [
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "webdriver 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender"
-version = "0.8.1"
-source = "git+https://github.com/servo/webrender#0f79d9dc449e324ca8bee0b8f82bc1459ba2dba6"
+version = "0.9.0"
+source = "git+https://github.com/servo/webrender#087516eab125a16ce150ade696b9de7fcef4980e"
 dependencies = [
  "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2972,23 +2972,23 @@ dependencies = [
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "webrender_traits"
-version = "0.8.1"
-source = "git+https://github.com/servo/webrender#0f79d9dc449e324ca8bee0b8f82bc1459ba2dba6"
+version = "0.9.0"
+source = "git+https://github.com/servo/webrender#087516eab125a16ce150ade696b9de7fcef4980e"
 dependencies = [
  "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.1.0 (git+https://github.com/vvuk/dwrote-rs)",
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3333,18 +3333,18 @@ dependencies = [
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d42144c31c9909882ce76e696b306b88a5b091721251137d5d522d1ef3da7cf9"
 "checksum wayland-client 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ced3094c157b5cc0a08d40530e1a627d9f88b9a436971338d2646439128a559e"
 "checksum wayland-kbd 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "73bc10e84c1da90777beffecd24742baea17564ffc2a9918af41871c748eb050"
 "checksum wayland-scanner 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "5a1869370d6bafcbabae8724511d803f4e209a70e94ad94a4249269534364f66"
 "checksum wayland-sys 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9633f7fe5de56544215f82eaf1b76bf1b584becf7f08b58cbef4c2c7d10e803a"
 "checksum wayland-window 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "309b69d3a863c9c21422d889fb7d98cf02f8a2ca054960a49243ce5b67ad884c"
 "checksum webdriver 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43d9121a4d0313abca5fb621f094791300176cac493ce74ad2cc188bddac29"
-"checksum webrender 0.8.1 (git+https://github.com/servo/webrender)" = "<none>"
-"checksum webrender_traits 0.8.1 (git+https://github.com/servo/webrender)" = "<none>"
+"checksum webrender 0.9.0 (git+https://github.com/servo/webrender)" = "<none>"
+"checksum webrender_traits 0.9.0 (git+https://github.com/servo/webrender)" = "<none>"
 "checksum websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a1a6ea5ed0367f32eb3d94dcc58859ef4294b5f75ba983dbf56ac314af45d"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c47e9ca2f5c47d27f731b1bb9bb50cc05f9886bb84fbd52afa0ff97f4f61b06"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum x11 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfc828b6baf54ccdde44e0b5f16e035ab9c54f60a0f0c218fb5ddbc6ab38a2a9"
 "checksum x11-dl 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6acc29bdc98d7565e18dc71b3e933aa94a195d0c2f4ec84f675679d9744b0d6b"
 "checksum xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77b831a5ba77110f438f0ac5583aafeb087f70432998ba6b7dcb1d32185db453"
--- a/servo/ports/cef/Cargo.lock
+++ b/servo/ports/cef/Cargo.lock
@@ -243,33 +243,33 @@ dependencies = [
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "canvas_traits"
 version = "0.0.1"
 dependencies = [
  "azure 0.9.1 (git+https://github.com/servo/rust-azure)",
  "cssparser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "caseless"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "regex 0.1.76 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -331,18 +331,18 @@ dependencies = [
  "profile_traits 0.0.1",
  "script_traits 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender 0.8.1 (git+https://github.com/servo/webrender)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender 0.9.0 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "constellation"
 version = "0.0.1"
 dependencies = [
  "backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bluetooth_traits 0.0.1",
@@ -365,17 +365,17 @@ dependencies = [
  "profile_traits 0.0.1",
  "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "script_traits 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_traits 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "content-blocker"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "regex 0.1.76 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -794,17 +794,17 @@ dependencies = [
  "simd 0.1.1 (git+https://github.com/huonw/simd)",
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "xi-unicode 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gfx_traits"
 version = "0.0.1"
 dependencies = [
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1165,17 +1165,17 @@ dependencies = [
  "servo_atoms 0.0.1",
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "layout_thread"
 version = "0.0.1"
 dependencies = [
  "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1199,31 +1199,31 @@ dependencies = [
  "script_layout_interface 0.0.1",
  "script_traits 0.0.1",
  "selectors 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "layout_traits"
 version = "0.0.1"
 dependencies = [
  "gfx 0.0.1",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "profile_traits 0.0.1",
  "script_traits 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "lazy_static"
 version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1409,17 +1409,17 @@ version = "0.0.1"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "plugins 0.0.1",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "net"
 version = "0.0.1"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "brotli 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1447,17 +1447,17 @@ dependencies = [
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "tinyfiledialogs 0.1.0 (git+https://github.com/jdm/tinyfiledialogs)",
  "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "net2"
 version = "0.2.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1484,17 +1484,17 @@ dependencies = [
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "nix"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1978,17 +1978,17 @@ dependencies = [
  "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "tinyfiledialogs 0.1.0 (git+https://github.com/jdm/tinyfiledialogs)",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
  "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "xml5ever 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "script_layout_interface"
 version = "0.0.1"
 dependencies = [
@@ -2143,18 +2143,18 @@ dependencies = [
  "script 0.0.1",
  "script_layout_interface 0.0.1",
  "script_traits 0.0.1",
  "sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "webdriver_server 0.0.1",
- "webrender 0.8.1 (git+https://github.com/servo/webrender)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender 0.9.0 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "servo-egl"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2764,18 +2764,18 @@ dependencies = [
  "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.0.1",
  "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "webdriver 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender"
-version = "0.8.1"
-source = "git+https://github.com/servo/webrender#0f79d9dc449e324ca8bee0b8f82bc1459ba2dba6"
+version = "0.9.0"
+source = "git+https://github.com/servo/webrender#087516eab125a16ce150ade696b9de7fcef4980e"
 dependencies = [
  "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2786,23 +2786,23 @@ dependencies = [
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
- "webrender_traits 0.8.1 (git+https://github.com/servo/webrender)",
+ "webrender_traits 0.9.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "webrender_traits"
-version = "0.8.1"
-source = "git+https://github.com/servo/webrender#0f79d9dc449e324ca8bee0b8f82bc1459ba2dba6"
+version = "0.9.0"
+source = "git+https://github.com/servo/webrender#087516eab125a16ce150ade696b9de7fcef4980e"
 dependencies = [
  "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.1.0 (git+https://github.com/vvuk/dwrote-rs)",
  "euclid 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3136,18 +3136,18 @@ dependencies = [
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d42144c31c9909882ce76e696b306b88a5b091721251137d5d522d1ef3da7cf9"
 "checksum wayland-client 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ced3094c157b5cc0a08d40530e1a627d9f88b9a436971338d2646439128a559e"
 "checksum wayland-kbd 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "73bc10e84c1da90777beffecd24742baea17564ffc2a9918af41871c748eb050"
 "checksum wayland-scanner 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "5a1869370d6bafcbabae8724511d803f4e209a70e94ad94a4249269534364f66"
 "checksum wayland-sys 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9633f7fe5de56544215f82eaf1b76bf1b584becf7f08b58cbef4c2c7d10e803a"
 "checksum wayland-window 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "309b69d3a863c9c21422d889fb7d98cf02f8a2ca054960a49243ce5b67ad884c"
 "checksum webdriver 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43d9121a4d0313abca5fb621f094791300176cac493ce74ad2cc188bddac29"
-"checksum webrender 0.8.1 (git+https://github.com/servo/webrender)" = "<none>"
-"checksum webrender_traits 0.8.1 (git+https://github.com/servo/webrender)" = "<none>"
+"checksum webrender 0.9.0 (git+https://github.com/servo/webrender)" = "<none>"
+"checksum webrender_traits 0.9.0 (git+https://github.com/servo/webrender)" = "<none>"
 "checksum websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a1a6ea5ed0367f32eb3d94dcc58859ef4294b5f75ba983dbf56ac314af45d"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c47e9ca2f5c47d27f731b1bb9bb50cc05f9886bb84fbd52afa0ff97f4f61b06"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum x11 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfc828b6baf54ccdde44e0b5f16e035ab9c54f60a0f0c218fb5ddbc6ab38a2a9"
 "checksum x11-dl 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6acc29bdc98d7565e18dc71b3e933aa94a195d0c2f4ec84f675679d9744b0d6b"
 "checksum xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77b831a5ba77110f438f0ac5583aafeb087f70432998ba6b7dcb1d32185db453"