mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Update rustc to 00b112c45a604fa6f4b59af2a40c9deeadfdb7c6/rustc-1.0.0-dev.
This commit is contained in:
parent
ff8cbff810
commit
95fc29fa0d
255 changed files with 3550 additions and 3362 deletions
|
@ -43,9 +43,6 @@ git = "https://github.com/servo/rust-layers"
|
|||
[dependencies.png]
|
||||
git = "https://github.com/servo/rust-png"
|
||||
|
||||
[dependencies.url]
|
||||
git = "https://github.com/servo/rust-url"
|
||||
|
||||
[dependencies.core_graphics]
|
||||
git = "https://github.com/servo/rust-core-graphics"
|
||||
|
||||
|
@ -55,5 +52,6 @@ git = "https://github.com/servo/rust-core-text"
|
|||
[dependencies.gleam]
|
||||
git = "https://github.com/servo/gleam"
|
||||
|
||||
[dependencies.time]
|
||||
git = "https://github.com/rust-lang/time"
|
||||
[dependencies]
|
||||
url = "*"
|
||||
time = "*"
|
|
@ -41,11 +41,12 @@ use servo_util::opts;
|
|||
use servo_util::time::{TimeProfilerCategory, profile, TimeProfilerChan};
|
||||
use servo_util::{memory, time};
|
||||
use std::collections::HashMap;
|
||||
use std::collections::hash_map::{Occupied, Vacant};
|
||||
use std::collections::hash_map::Entry::{Occupied, Vacant};
|
||||
use std::path::Path;
|
||||
use std::num::FloatMath;
|
||||
use std::num::Float;
|
||||
use std::rc::Rc;
|
||||
use std::slice::bytes::copy_memory;
|
||||
use std::sync::mpsc::Sender;
|
||||
use time::{precise_time_ns, precise_time_s};
|
||||
use url::Url;
|
||||
|
||||
|
@ -71,7 +72,7 @@ pub struct IOCompositor<Window: WindowMethods> {
|
|||
scene: Scene<CompositorData>,
|
||||
|
||||
/// The application window size.
|
||||
window_size: TypedSize2D<DevicePixel, uint>,
|
||||
window_size: TypedSize2D<DevicePixel, u32>,
|
||||
|
||||
/// "Mobile-style" zoom that does not reflow the page.
|
||||
viewport_zoom: ScaleFactor<PagePx, ViewportPx, f32>,
|
||||
|
@ -134,14 +135,14 @@ pub struct ScrollEvent {
|
|||
cursor: TypedPoint2D<DevicePixel,i32>,
|
||||
}
|
||||
|
||||
#[deriving(PartialEq)]
|
||||
#[derive(PartialEq)]
|
||||
enum CompositionRequest {
|
||||
NoCompositingNecessary,
|
||||
CompositeOnScrollTimeout(u64),
|
||||
CompositeNow,
|
||||
}
|
||||
|
||||
#[deriving(Copy, PartialEq, Show)]
|
||||
#[derive(Copy, PartialEq, Show)]
|
||||
enum ShutdownState {
|
||||
NotShuttingDown,
|
||||
ShuttingDown,
|
||||
|
@ -250,8 +251,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
(Msg::Exit(chan), _) => {
|
||||
debug!("shutting down the constellation");
|
||||
let ConstellationChan(ref con_chan) = self.constellation_chan;
|
||||
con_chan.send(ConstellationMsg::Exit);
|
||||
chan.send(());
|
||||
con_chan.send(ConstellationMsg::Exit).unwrap();
|
||||
chan.send(()).unwrap();
|
||||
self.shutdown_state = ShutdownState::ShuttingDown;
|
||||
}
|
||||
|
||||
|
@ -292,13 +293,13 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
(Msg::ChangeLayerPipelineAndRemoveChildren(old_pipeline, new_pipeline, response_channel),
|
||||
ShutdownState::NotShuttingDown) => {
|
||||
self.handle_change_layer_pipeline_and_remove_children(old_pipeline, new_pipeline);
|
||||
response_channel.send(());
|
||||
response_channel.send(()).unwrap();
|
||||
}
|
||||
|
||||
(Msg::CreateRootLayerForPipeline(parent_pipeline, pipeline, rect, response_channel),
|
||||
ShutdownState::NotShuttingDown) => {
|
||||
self.handle_create_root_layer_for_pipeline(parent_pipeline, pipeline, rect);
|
||||
response_channel.send(());
|
||||
response_channel.send(()).unwrap();
|
||||
}
|
||||
|
||||
(Msg::CreateOrUpdateBaseLayer(layer_properties), ShutdownState::NotShuttingDown) => {
|
||||
|
@ -311,7 +312,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
}
|
||||
|
||||
(Msg::GetGraphicsMetadata(chan), ShutdownState::NotShuttingDown) => {
|
||||
chan.send(Some(self.window.native_metadata()));
|
||||
chan.send(Some(self.window.native_metadata())).unwrap();
|
||||
}
|
||||
|
||||
(Msg::SetLayerOrigin(pipeline_id, layer_id, origin),
|
||||
|
@ -419,12 +420,12 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
Some(ref details) => {
|
||||
match details.pipeline {
|
||||
Some(ref pipeline) => pipeline,
|
||||
None => panic!("Compositor layer has an unitialized pipeline ({}).",
|
||||
None => panic!("Compositor layer has an unitialized pipeline ({:?}).",
|
||||
pipeline_id),
|
||||
|
||||
}
|
||||
}
|
||||
None => panic!("Compositor layer has an unknown pipeline ({}).", pipeline_id),
|
||||
None => panic!("Compositor layer has an unknown pipeline ({:?}).", pipeline_id),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -459,7 +460,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
if !self.has_paint_msg_tracking() {
|
||||
return;
|
||||
}
|
||||
debug!("add_outstanding_paint_msg {}", self.outstanding_paint_msgs);
|
||||
debug!("add_outstanding_paint_msg {:?}", self.outstanding_paint_msgs);
|
||||
self.outstanding_paint_msgs += count;
|
||||
}
|
||||
|
||||
|
@ -478,7 +479,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
frame_tree: &SendableFrameTree,
|
||||
response_chan: Sender<()>,
|
||||
new_constellation_chan: ConstellationChan) {
|
||||
response_chan.send(());
|
||||
response_chan.send(()).unwrap();
|
||||
|
||||
self.root_pipeline = Some(frame_tree.pipeline.clone());
|
||||
|
||||
|
@ -546,7 +547,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let root_layer = match self.find_pipeline_root_layer(old_pipeline.id) {
|
||||
Some(root_layer) => root_layer,
|
||||
None => {
|
||||
debug!("Ignoring ChangeLayerPipelineAndRemoveChildren message for pipeline ({}) shutting down.",
|
||||
debug!("Ignoring ChangeLayerPipelineAndRemoveChildren message \
|
||||
for pipeline ({:?}) shutting down.",
|
||||
old_pipeline.id);
|
||||
return;
|
||||
}
|
||||
|
@ -581,7 +583,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let parent_layer = match self.find_pipeline_root_layer(pipeline_id) {
|
||||
Some(root_layer) => root_layer,
|
||||
None => {
|
||||
debug!("Ignoring FrameTreeUpdate message for pipeline ({}) shutting down.",
|
||||
debug!("Ignoring FrameTreeUpdate message for pipeline ({:?}) \
|
||||
shutting down.",
|
||||
pipeline_id);
|
||||
return;
|
||||
}
|
||||
|
@ -611,7 +614,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let root_layer = match self.find_pipeline_root_layer(pipeline_id) {
|
||||
Some(root_layer) => root_layer,
|
||||
None => {
|
||||
debug!("Ignoring CreateOrUpdateBaseLayer message for pipeline ({}) shutting down.",
|
||||
debug!("Ignoring CreateOrUpdateBaseLayer message for pipeline \
|
||||
({:?}) shutting down.",
|
||||
pipeline_id);
|
||||
return;
|
||||
}
|
||||
|
@ -669,7 +673,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
device_pixel_ratio: dppx,
|
||||
initial_viewport: initial_viewport,
|
||||
visible_viewport: visible_viewport,
|
||||
}));
|
||||
})).unwrap()
|
||||
}
|
||||
|
||||
pub fn move_layer(&self,
|
||||
|
@ -723,7 +727,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
Some(ref layer) => {
|
||||
layer.bounds.borrow_mut().origin = Point2D::from_untyped(&new_origin)
|
||||
}
|
||||
None => panic!("Compositor received SetLayerOrigin for nonexistent layer: {}", pipeline_id),
|
||||
None => panic!("Compositor received SetLayerOrigin for nonexistent \
|
||||
layer: {:?}", pipeline_id),
|
||||
};
|
||||
|
||||
self.send_buffer_requests_for_all_layers();
|
||||
|
@ -744,14 +749,14 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
|
||||
let pipeline = self.get_pipeline(pipeline_id);
|
||||
let message = PaintMsg::UnusedBuffer(new_layer_buffer_set.buffers);
|
||||
let _ = pipeline.paint_chan.send_opt(message);
|
||||
let _ = pipeline.paint_chan.send(message);
|
||||
}
|
||||
|
||||
fn assign_painted_buffers_to_layer(&mut self,
|
||||
layer: Rc<Layer<CompositorData>>,
|
||||
new_layer_buffer_set: Box<LayerBufferSet>,
|
||||
epoch: Epoch) {
|
||||
debug!("compositor received new frame at size {}x{}",
|
||||
debug!("compositor received new frame at size {:?}x{:?}",
|
||||
self.window_size.width.get(),
|
||||
self.window_size.height.get());
|
||||
|
||||
|
@ -829,14 +834,14 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
WindowEvent::Quit => {
|
||||
debug!("shutting down the constellation for WindowEvent::Quit");
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(ConstellationMsg::Exit);
|
||||
chan.send(ConstellationMsg::Exit).unwrap();
|
||||
self.shutdown_state = ShutdownState::ShuttingDown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn on_resize_window_event(&mut self, new_size: TypedSize2D<DevicePixel, uint>) {
|
||||
debug!("compositor resizing to {}", new_size.to_untyped());
|
||||
fn on_resize_window_event(&mut self, new_size: TypedSize2D<DevicePixel, u32>) {
|
||||
debug!("compositor resizing to {:?}", new_size.to_untyped());
|
||||
|
||||
// A size change could also mean a resolution change.
|
||||
let new_hidpi_factor = self.window.hidpi_factor();
|
||||
|
@ -867,7 +872,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let msg = ConstellationMsg::LoadUrl(root_pipeline_id,
|
||||
LoadData::new(Url::parse(url_string.as_slice()).unwrap()));
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(msg);
|
||||
chan.send(msg).unwrap()
|
||||
}
|
||||
|
||||
fn on_mouse_window_event_class(&self, mouse_window_event: MouseWindowEvent) {
|
||||
|
@ -986,12 +991,12 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
windowing::WindowNavigateMsg::Back => NavigationDirection::Back,
|
||||
};
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(ConstellationMsg::Navigate(direction))
|
||||
chan.send(ConstellationMsg::Navigate(direction)).unwrap()
|
||||
}
|
||||
|
||||
fn on_key_event(&self, key: Key, state: KeyState, modifiers: KeyModifiers) {
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(ConstellationMsg::KeyEvent(key, state, modifiers))
|
||||
chan.send(ConstellationMsg::KeyEvent(key, state, modifiers)).unwrap()
|
||||
}
|
||||
|
||||
fn convert_buffer_requests_to_pipeline_requests_map(&self,
|
||||
|
@ -1008,7 +1013,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
entry.into_mut()
|
||||
}
|
||||
Vacant(entry) => {
|
||||
entry.set(Vec::new())
|
||||
entry.insert(Vec::new())
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1035,7 +1040,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let unused_buffers = self.scene.collect_unused_buffers();
|
||||
if unused_buffers.len() != 0 {
|
||||
let message = PaintMsg::UnusedBuffer(unused_buffers);
|
||||
let _ = pipeline.paint_chan.send_opt(message);
|
||||
let _ = pipeline.paint_chan.send(message);
|
||||
}
|
||||
},
|
||||
None => {}
|
||||
|
@ -1048,7 +1053,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
layer.bounds.borrow().size.to_untyped());
|
||||
let pipeline = self.get_pipeline(layer.get_pipeline_id());
|
||||
let ScriptControlChan(ref chan) = pipeline.script_chan;
|
||||
chan.send(ConstellationControlMsg::Viewport(pipeline.id.clone(), layer_rect));
|
||||
chan.send(ConstellationControlMsg::Viewport(pipeline.id.clone(), layer_rect)).unwrap();
|
||||
}
|
||||
|
||||
for kid in layer.children().iter() {
|
||||
|
@ -1084,7 +1089,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
let mut num_paint_msgs_sent = 0;
|
||||
for (pipeline_id, requests) in pipeline_requests.into_iter() {
|
||||
num_paint_msgs_sent += 1;
|
||||
let _ = self.get_pipeline(pipeline_id).paint_chan.send_opt(PaintMsg::Paint(requests));
|
||||
let _ = self.get_pipeline(pipeline_id).paint_chan.send(PaintMsg::Paint(requests));
|
||||
}
|
||||
|
||||
self.add_outstanding_paint_msg(num_paint_msgs_sent);
|
||||
|
@ -1125,7 +1130,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
|
||||
let mut framebuffer_ids = vec!();
|
||||
let mut texture_ids = vec!();
|
||||
let (width, height) = (self.window_size.width.get(), self.window_size.height.get());
|
||||
let (width, height) = (self.window_size.width.get() as usize, self.window_size.height.get() as usize);
|
||||
|
||||
if output_image {
|
||||
framebuffer_ids = gl::gen_framebuffers(1);
|
||||
|
@ -1169,8 +1174,8 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
});
|
||||
|
||||
if output_image {
|
||||
let path =
|
||||
from_str::<Path>(opts::get().output_file.as_ref().unwrap().as_slice()).unwrap();
|
||||
let path: Path =
|
||||
opts::get().output_file.as_ref().unwrap().as_slice().parse().unwrap();
|
||||
let mut pixels = gl::read_pixels(0, 0,
|
||||
width as gl::GLsizei,
|
||||
height as gl::GLsizei,
|
||||
|
@ -1201,7 +1206,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
|
||||
debug!("shutting down the constellation after generating an output file");
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(ConstellationMsg::Exit);
|
||||
chan.send(ConstellationMsg::Exit).unwrap();
|
||||
self.shutdown_state = ShutdownState::ShuttingDown;
|
||||
}
|
||||
|
||||
|
@ -1393,10 +1398,10 @@ impl<Window> CompositorEventListener for IOCompositor<Window> where Window: Wind
|
|||
|
||||
// Tell the profiler, memory profiler, and scrolling timer to shut down.
|
||||
let TimeProfilerChan(ref time_profiler_chan) = self.time_profiler_chan;
|
||||
time_profiler_chan.send(time::TimeProfilerMsg::Exit);
|
||||
time_profiler_chan.send(time::TimeProfilerMsg::Exit).unwrap();
|
||||
|
||||
let MemoryProfilerChan(ref memory_profiler_chan) = self.memory_profiler_chan;
|
||||
memory_profiler_chan.send(memory::MemoryProfilerMsg::Exit);
|
||||
memory_profiler_chan.send(memory::MemoryProfilerMsg::Exit).unwrap();
|
||||
|
||||
self.scrolling_timer.shutdown();
|
||||
}
|
||||
|
@ -1411,6 +1416,6 @@ impl<Window> CompositorEventListener for IOCompositor<Window> where Window: Wind
|
|||
Some(ref root_pipeline) => root_pipeline.id,
|
||||
};
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(ConstellationMsg::GetPipelineTitle(root_pipeline_id));
|
||||
chan.send(ConstellationMsg::GetPipelineTitle(root_pipeline_id)).unwrap();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,6 @@ use script_traits::{ScriptControlChan, ConstellationControlMsg};
|
|||
use servo_msg::compositor_msg::{Epoch, LayerId, ScrollPolicy};
|
||||
use servo_msg::constellation_msg::PipelineId;
|
||||
use std::num::Float;
|
||||
use std::num::FloatMath;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub struct CompositorData {
|
||||
|
@ -68,24 +67,25 @@ impl CompositorData {
|
|||
}
|
||||
}
|
||||
|
||||
pub trait CompositorLayer<Window: WindowMethods> {
|
||||
pub trait CompositorLayer {
|
||||
fn update_layer_except_bounds(&self, layer_properties: LayerProperties);
|
||||
|
||||
fn update_layer(&self, layer_properties: LayerProperties);
|
||||
|
||||
fn add_buffers(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
new_buffers: Box<LayerBufferSet>,
|
||||
epoch: Epoch)
|
||||
-> bool;
|
||||
fn add_buffers<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
new_buffers: Box<LayerBufferSet>,
|
||||
epoch: Epoch)
|
||||
-> bool
|
||||
where Window: WindowMethods;
|
||||
|
||||
/// Destroys all layer tiles, sending the buffers back to the painter to be destroyed or
|
||||
/// reused.
|
||||
fn clear(&self, compositor: &IOCompositor<Window>);
|
||||
fn clear<Window>(&self, compositor: &IOCompositor<Window>) where Window: WindowMethods;
|
||||
|
||||
/// Destroys tiles for this layer and all descendent layers, sending the buffers back to the
|
||||
/// painter to be destroyed or reused.
|
||||
fn clear_all_tiles(&self, compositor: &IOCompositor<Window>);
|
||||
fn clear_all_tiles<Window>(&self, compositor: &IOCompositor<Window>) where Window: WindowMethods;
|
||||
|
||||
/// Destroys all tiles of all layers, including children, *without* sending them back to the
|
||||
/// painter. You must call this only when the paint task is destined to be going down;
|
||||
|
@ -107,14 +107,16 @@ pub trait CompositorLayer<Window: WindowMethods> {
|
|||
// Takes in a MouseWindowEvent, determines if it should be passed to children, and
|
||||
// sends the event off to the appropriate pipeline. NB: the cursor position is in
|
||||
// page coordinates.
|
||||
fn send_mouse_event(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
event: MouseWindowEvent,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>);
|
||||
fn send_mouse_event<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
event: MouseWindowEvent,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>)
|
||||
where Window: WindowMethods;
|
||||
|
||||
fn send_mouse_move_event(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>);
|
||||
fn send_mouse_move_event<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>)
|
||||
where Window: WindowMethods;
|
||||
|
||||
fn clamp_scroll_offset_and_scroll_layer(&self,
|
||||
new_offset: TypedPoint2D<LayerPixel, f32>)
|
||||
|
@ -131,7 +133,7 @@ pub trait CompositorLayer<Window: WindowMethods> {
|
|||
fn get_pipeline_id(&self) -> PipelineId;
|
||||
}
|
||||
|
||||
#[deriving(Copy, PartialEq, Clone)]
|
||||
#[derive(Copy, PartialEq, Clone)]
|
||||
pub enum WantsScrollEventsFlag {
|
||||
WantsScrollEvents,
|
||||
DoesntWantScrollEvents,
|
||||
|
@ -167,14 +169,14 @@ fn calculate_content_size_for_layer(layer: &Layer<CompositorData>)
|
|||
}).size
|
||||
}
|
||||
|
||||
#[deriving(PartialEq)]
|
||||
#[derive(PartialEq)]
|
||||
pub enum ScrollEventResult {
|
||||
ScrollEventUnhandled,
|
||||
ScrollPositionChanged,
|
||||
ScrollPositionUnchanged,
|
||||
}
|
||||
|
||||
impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
||||
impl CompositorLayer for Layer<CompositorData> {
|
||||
fn update_layer_except_bounds(&self, layer_properties: LayerProperties) {
|
||||
self.extra_data.borrow_mut().epoch = layer_properties.epoch;
|
||||
self.extra_data.borrow_mut().scroll_policy = layer_properties.scroll_policy;
|
||||
|
@ -199,18 +201,19 @@ impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
|||
//
|
||||
// If the epoch of the message does not match the layer's epoch, the message is ignored, the
|
||||
// layer buffer set is consumed, and None is returned.
|
||||
fn add_buffers(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
new_buffers: Box<LayerBufferSet>,
|
||||
epoch: Epoch)
|
||||
-> bool {
|
||||
fn add_buffers<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
new_buffers: Box<LayerBufferSet>,
|
||||
epoch: Epoch)
|
||||
-> bool
|
||||
where Window: WindowMethods {
|
||||
if self.extra_data.borrow().epoch != epoch {
|
||||
debug!("add_buffers: compositor epoch mismatch: {} != {}, id: {}",
|
||||
debug!("add_buffers: compositor epoch mismatch: {:?} != {:?}, id: {:?}",
|
||||
self.extra_data.borrow().epoch,
|
||||
epoch,
|
||||
self.get_pipeline_id());
|
||||
let pipeline = compositor.get_pipeline(self.get_pipeline_id());
|
||||
let _ = pipeline.paint_chan.send_opt(PaintMsg::UnusedBuffer(new_buffers.buffers));
|
||||
let _ = pipeline.paint_chan.send(PaintMsg::UnusedBuffer(new_buffers.buffers));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -221,13 +224,13 @@ impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
|||
let unused_buffers = self.collect_unused_buffers();
|
||||
if !unused_buffers.is_empty() { // send back unused buffers
|
||||
let pipeline = compositor.get_pipeline(self.get_pipeline_id());
|
||||
let _ = pipeline.paint_chan.send_opt(PaintMsg::UnusedBuffer(unused_buffers));
|
||||
let _ = pipeline.paint_chan.send(PaintMsg::UnusedBuffer(unused_buffers));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
fn clear(&self, compositor: &IOCompositor<Window>) {
|
||||
fn clear<Window>(&self, compositor: &IOCompositor<Window>) where Window: WindowMethods {
|
||||
let mut buffers = self.collect_buffers();
|
||||
|
||||
if !buffers.is_empty() {
|
||||
|
@ -239,13 +242,15 @@ impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
|||
}
|
||||
|
||||
let pipeline = compositor.get_pipeline(self.get_pipeline_id());
|
||||
let _ = pipeline.paint_chan.send_opt(PaintMsg::UnusedBuffer(buffers));
|
||||
let _ = pipeline.paint_chan.send(PaintMsg::UnusedBuffer(buffers));
|
||||
}
|
||||
}
|
||||
|
||||
/// Destroys tiles for this layer and all descendent layers, sending the buffers back to the
|
||||
/// painter to be destroyed or reused.
|
||||
fn clear_all_tiles(&self, compositor: &IOCompositor<Window>) {
|
||||
fn clear_all_tiles<Window>(&self,
|
||||
compositor: &IOCompositor<Window>)
|
||||
where Window: WindowMethods {
|
||||
self.clear(compositor);
|
||||
for kid in self.children().iter() {
|
||||
kid.clear_all_tiles(compositor);
|
||||
|
@ -325,10 +330,11 @@ impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
|||
}
|
||||
}
|
||||
|
||||
fn send_mouse_event(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
event: MouseWindowEvent,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>) {
|
||||
fn send_mouse_event<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
event: MouseWindowEvent,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>)
|
||||
where Window: WindowMethods {
|
||||
let event_point = cursor.to_untyped();
|
||||
let message = match event {
|
||||
MouseWindowEvent::Click(button, _) =>
|
||||
|
@ -341,16 +347,17 @@ impl<Window: WindowMethods> CompositorLayer<Window> for Layer<CompositorData> {
|
|||
|
||||
let pipeline = compositor.get_pipeline(self.get_pipeline_id());
|
||||
let ScriptControlChan(ref chan) = pipeline.script_chan;
|
||||
let _ = chan.send_opt(ConstellationControlMsg::SendEvent(pipeline.id.clone(), message));
|
||||
let _ = chan.send(ConstellationControlMsg::SendEvent(pipeline.id.clone(), message));
|
||||
}
|
||||
|
||||
fn send_mouse_move_event(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>) {
|
||||
fn send_mouse_move_event<Window>(&self,
|
||||
compositor: &IOCompositor<Window>,
|
||||
cursor: TypedPoint2D<LayerPixel, f32>)
|
||||
where Window: WindowMethods {
|
||||
let message = MouseMoveEvent(cursor.to_untyped());
|
||||
let pipeline = compositor.get_pipeline(self.get_pipeline_id());
|
||||
let ScriptControlChan(ref chan) = pipeline.script_chan;
|
||||
let _ = chan.send_opt(ConstellationControlMsg::SendEvent(pipeline.id.clone(), message));
|
||||
let _ = chan.send(ConstellationControlMsg::SendEvent(pipeline.id.clone(), message));
|
||||
}
|
||||
|
||||
fn scroll_layer_and_all_child_layers(&self, new_offset: TypedPoint2D<LayerPixel, f32>)
|
||||
|
|
|
@ -26,7 +26,7 @@ use servo_util::cursor::Cursor;
|
|||
use servo_util::geometry::PagePx;
|
||||
use servo_util::memory::MemoryProfilerChan;
|
||||
use servo_util::time::TimeProfilerChan;
|
||||
use std::comm::{channel, Sender, Receiver};
|
||||
use std::sync::mpsc::{channel, Sender, Receiver};
|
||||
use std::fmt::{Error, Formatter, Show};
|
||||
use std::rc::Rc;
|
||||
|
||||
|
@ -42,7 +42,7 @@ pub trait CompositorProxy : 'static + Send {
|
|||
|
||||
/// The port that the compositor receives messages on. As above, this is a trait supplied by the
|
||||
/// Servo port.
|
||||
pub trait CompositorReceiver for Sized? : 'static {
|
||||
pub trait CompositorReceiver : 'static {
|
||||
/// Receives the next message inbound for the compositor. This must not block.
|
||||
fn try_recv_compositor_msg(&mut self) -> Option<Msg>;
|
||||
/// Synchronously waits for, and returns, the next message inbound for the compositor.
|
||||
|
@ -58,7 +58,7 @@ impl CompositorReceiver for Receiver<Msg> {
|
|||
}
|
||||
}
|
||||
fn recv_compositor_msg(&mut self) -> Msg {
|
||||
self.recv()
|
||||
self.recv().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ impl ScriptListener for Box<CompositorProxy+'static+Send> {
|
|||
fn close(&mut self) {
|
||||
let (chan, port) = channel();
|
||||
self.send(Msg::Exit(chan));
|
||||
port.recv();
|
||||
port.recv().unwrap();
|
||||
}
|
||||
|
||||
fn dup(&mut self) -> Box<ScriptListener+'static> {
|
||||
|
@ -98,7 +98,7 @@ impl ScriptListener for Box<CompositorProxy+'static+Send> {
|
|||
}
|
||||
|
||||
/// Information about each layer that the compositor keeps.
|
||||
#[deriving(Copy)]
|
||||
#[derive(Copy)]
|
||||
pub struct LayerProperties {
|
||||
pub pipeline_id: PipelineId,
|
||||
pub epoch: Epoch,
|
||||
|
@ -129,7 +129,7 @@ impl PaintListener for Box<CompositorProxy+'static+Send> {
|
|||
fn get_graphics_metadata(&mut self) -> Option<NativeGraphicsMetadata> {
|
||||
let (chan, port) = channel();
|
||||
self.send(Msg::GetGraphicsMetadata(chan));
|
||||
port.recv()
|
||||
port.recv().unwrap()
|
||||
}
|
||||
|
||||
fn assign_painted_buffers(&mut self,
|
||||
|
|
|
@ -17,7 +17,7 @@ use libc;
|
|||
use script_traits::{CompositorEvent, ConstellationControlMsg};
|
||||
use script_traits::{ScriptControlChan, ScriptTaskFactory};
|
||||
use servo_msg::compositor_msg::LayerId;
|
||||
use servo_msg::constellation_msg::{mod, ConstellationChan, Failure};
|
||||
use servo_msg::constellation_msg::{self, ConstellationChan, Failure};
|
||||
use servo_msg::constellation_msg::{IFrameSandboxState, NavigationDirection};
|
||||
use servo_msg::constellation_msg::{Key, KeyState, KeyModifiers};
|
||||
use servo_msg::constellation_msg::{LoadData, NavigationType};
|
||||
|
@ -39,6 +39,7 @@ use std::collections::{HashMap, HashSet};
|
|||
use std::io;
|
||||
use std::mem::replace;
|
||||
use std::rc::Rc;
|
||||
use std::sync::mpsc::{Receiver, channel};
|
||||
use url::Url;
|
||||
|
||||
/// Maintains the pipelines and navigation context and grants permission to composite.
|
||||
|
@ -91,7 +92,7 @@ pub struct Constellation<LTF, STF> {
|
|||
}
|
||||
|
||||
/// A unique ID used to identify a frame.
|
||||
#[deriving(Copy)]
|
||||
#[derive(Copy)]
|
||||
pub struct FrameId(u32);
|
||||
|
||||
/// One frame in the hierarchy.
|
||||
|
@ -125,7 +126,7 @@ impl FrameTree {
|
|||
}
|
||||
}
|
||||
|
||||
#[deriving(Clone)]
|
||||
#[derive(Clone)]
|
||||
struct ChildFrameTree {
|
||||
frame_tree: Rc<FrameTree>,
|
||||
/// Clipping rect representing the size and position, in page coordinates, of the visible
|
||||
|
@ -234,7 +235,8 @@ struct FrameTreeIterator {
|
|||
stack: Vec<Rc<FrameTree>>,
|
||||
}
|
||||
|
||||
impl Iterator<Rc<FrameTree>> for FrameTreeIterator {
|
||||
impl Iterator for FrameTreeIterator {
|
||||
type Item = Rc<FrameTree>;
|
||||
fn next(&mut self) -> Option<Rc<FrameTree>> {
|
||||
match self.stack.pop() {
|
||||
Some(next) => {
|
||||
|
@ -294,7 +296,7 @@ impl NavigationContext {
|
|||
/// Loads a new set of page frames, returning all evicted frame trees
|
||||
fn load(&mut self, frame_tree: Rc<FrameTree>, compositor_proxy: &mut CompositorProxy)
|
||||
-> Vec<Rc<FrameTree>> {
|
||||
debug!("navigating to {}", frame_tree.pipeline.borrow().id);
|
||||
debug!("navigating to {:?}", frame_tree.pipeline.borrow().id);
|
||||
let evicted = replace(&mut self.next, vec!());
|
||||
match self.current.take() {
|
||||
Some(current) => self.previous.push(current),
|
||||
|
@ -350,7 +352,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
-> ConstellationChan {
|
||||
let (constellation_port, constellation_chan) = ConstellationChan::new();
|
||||
let constellation_chan_clone = constellation_chan.clone();
|
||||
spawn_named("Constellation".to_owned(), proc() {
|
||||
spawn_named("Constellation".to_owned(), move || {
|
||||
let mut constellation: Constellation<LTF, STF> = Constellation {
|
||||
chan: constellation_chan_clone,
|
||||
request_port: constellation_port,
|
||||
|
@ -380,7 +382,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
|
||||
fn run(&mut self) {
|
||||
loop {
|
||||
let request = self.request_port.recv();
|
||||
let request = self.request_port.recv().unwrap();
|
||||
if !self.handle_request(request) {
|
||||
break;
|
||||
}
|
||||
|
@ -517,17 +519,17 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
pipeline.exit(PipelineExitType::Complete);
|
||||
}
|
||||
self.image_cache_task.exit();
|
||||
self.resource_task.send(resource_task::ControlMsg::Exit);
|
||||
self.resource_task.send(resource_task::ControlMsg::Exit).unwrap();
|
||||
self.devtools_chan.as_ref().map(|chan| {
|
||||
chan.send(devtools_traits::ServerExitMsg);
|
||||
chan.send(devtools_traits::ServerExitMsg).unwrap();
|
||||
});
|
||||
self.storage_task.send(StorageTaskMsg::Exit);
|
||||
self.storage_task.send(StorageTaskMsg::Exit).unwrap();
|
||||
self.font_cache_task.exit();
|
||||
self.compositor_proxy.send(CompositorMsg::ShutdownComplete);
|
||||
}
|
||||
|
||||
fn handle_failure_msg(&mut self, pipeline_id: PipelineId, subpage_id: Option<SubpageId>) {
|
||||
debug!("handling failure message from pipeline {}, {}", pipeline_id, subpage_id);
|
||||
debug!("handling failure message from pipeline {:?}, {:?}", pipeline_id, subpage_id);
|
||||
|
||||
if opts::get().hard_fail {
|
||||
// It's quite difficult to make Servo exit cleanly if some tasks have failed.
|
||||
|
@ -604,11 +606,11 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
|
||||
fn handle_frame_rect_msg(&mut self, pipeline_id: PipelineId, subpage_id: SubpageId,
|
||||
rect: TypedRect<PagePx, f32>) {
|
||||
debug!("Received frame rect {} from {}, {}", rect, pipeline_id, subpage_id);
|
||||
debug!("Received frame rect {:?} from {:?}, {:?}", rect, pipeline_id, subpage_id);
|
||||
let mut already_sent = HashSet::new();
|
||||
|
||||
// Returns true if a child frame tree's subpage id matches the given subpage id
|
||||
let subpage_eq = |child_frame_tree: & &mut ChildFrameTree| {
|
||||
let subpage_eq = |&:child_frame_tree: & &mut ChildFrameTree| {
|
||||
child_frame_tree.frame_tree.pipeline.borrow().
|
||||
subpage_id.expect("Constellation:
|
||||
child frame does not have a subpage id. This should not be possible.")
|
||||
|
@ -679,7 +681,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
visible_viewport: rect.size,
|
||||
initial_viewport: rect.size * ScaleFactor(1.0),
|
||||
device_pixel_ratio: device_pixel_ratio,
|
||||
}));
|
||||
})).unwrap();
|
||||
compositor_proxy.send(CompositorMsg::SetLayerOrigin(
|
||||
pipeline.id,
|
||||
LayerId::null(),
|
||||
|
@ -697,7 +699,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
old_subpage_id: SubpageId) {
|
||||
let existing_tree = match frame_tree.find_with_subpage_id(Some(old_subpage_id)) {
|
||||
Some(existing_tree) => existing_tree.clone(),
|
||||
None => panic!("Tried to update non-existing frame tree with pipeline={} subpage={}",
|
||||
None => panic!("Tried to update non-existing frame tree with pipeline={:?} subpage={:?}",
|
||||
new_pipeline.id,
|
||||
old_subpage_id),
|
||||
};
|
||||
|
@ -716,7 +718,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
old_pipeline.to_sendable(),
|
||||
new_pipeline.to_sendable(),
|
||||
chan));
|
||||
let _ = port.recv_opt();
|
||||
let _ = port.recv();
|
||||
}
|
||||
|
||||
fn create_or_update_child_pipeline(&mut self,
|
||||
|
@ -770,10 +772,10 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
// FIXME(tkuehn): Need to follow the standardized spec for checking same-origin
|
||||
// Reuse the script task if the URL is same-origin
|
||||
let script_pipeline = if same_script {
|
||||
debug!("Constellation: loading same-origin iframe at {}", url);
|
||||
debug!("Constellation: loading same-origin iframe at {:?}", url);
|
||||
Some(source_pipeline.clone())
|
||||
} else {
|
||||
debug!("Constellation: loading cross-origin iframe at {}", url);
|
||||
debug!("Constellation: loading cross-origin iframe at {:?}", url);
|
||||
None
|
||||
};
|
||||
|
||||
|
@ -801,7 +803,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
|
||||
fn handle_load_url_msg(&mut self, source_id: PipelineId, load_data: LoadData) {
|
||||
let url = load_data.url.to_string();
|
||||
debug!("Constellation: received message to load {}", url);
|
||||
debug!("Constellation: received message to load {:?}", url);
|
||||
// Make sure no pending page would be overridden.
|
||||
let source_frame = self.current_frame().as_ref().unwrap().find(source_id).expect(
|
||||
"Constellation: received a LoadUrl message from a pipeline_id associated
|
||||
|
@ -837,7 +839,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
}
|
||||
|
||||
fn handle_navigate_msg(&mut self, direction: constellation_msg::NavigationDirection) {
|
||||
debug!("received message to navigate {}", direction);
|
||||
debug!("received message to navigate {:?}", direction);
|
||||
|
||||
// TODO(tkuehn): what is the "critical point" beyond which pending frames
|
||||
// should not be cleared? Currently, the behavior is that forward/back
|
||||
|
@ -886,7 +888,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
self.current_frame().as_ref().map(|frame| {
|
||||
let ScriptControlChan(ref chan) = frame.pipeline.borrow().script_chan;
|
||||
chan.send(ConstellationControlMsg::SendEvent(
|
||||
frame.pipeline.borrow().id, CompositorEvent::KeyEvent(key, state, mods)));
|
||||
frame.pipeline.borrow().id, CompositorEvent::KeyEvent(key, state, mods))).unwrap();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -895,13 +897,13 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
None => self.compositor_proxy.send(CompositorMsg::ChangePageTitle(pipeline_id, None)),
|
||||
Some(pipeline) => {
|
||||
let ScriptControlChan(ref script_channel) = pipeline.script_chan;
|
||||
script_channel.send(ConstellationControlMsg::GetTitle(pipeline_id));
|
||||
script_channel.send(ConstellationControlMsg::GetTitle(pipeline_id)).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_painter_ready_msg(&mut self, pipeline_id: PipelineId) {
|
||||
debug!("Painter {} ready to send paint msg", pipeline_id);
|
||||
debug!("Painter {:?} ready to send paint msg", pipeline_id);
|
||||
// This message could originate from a pipeline in the navigation context or
|
||||
// from a pending frame. The only time that we will grant paint permission is
|
||||
// when the message originates from a pending frame or the current frame.
|
||||
|
@ -921,7 +923,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
});
|
||||
match pending_index {
|
||||
Some(pending_index) => {
|
||||
let frame_change = self.pending_frames.swap_remove(pending_index).unwrap();
|
||||
let frame_change = self.pending_frames.swap_remove(pending_index);
|
||||
let to_add = frame_change.after.clone();
|
||||
|
||||
// Create the next frame tree that will be given to the compositor
|
||||
|
@ -935,7 +937,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
// If there are frames to revoke permission from, do so now.
|
||||
match frame_change.before {
|
||||
Some(revoke_id) if self.current_frame().is_some() => {
|
||||
debug!("Constellation: revoking permission from {}", revoke_id);
|
||||
debug!("Constellation: revoking permission from {:?}", revoke_id);
|
||||
let current_frame = self.current_frame().as_ref().unwrap();
|
||||
|
||||
let to_revoke = current_frame.find(revoke_id).expect(
|
||||
|
@ -952,7 +954,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
let mut flag = false;
|
||||
{
|
||||
if to_add.parent.borrow().is_some() {
|
||||
debug!("Constellation: replacing {} with {} in {}",
|
||||
debug!("Constellation: replacing {:?} with {:?} in {:?}",
|
||||
revoke_id, to_add.pipeline.borrow().id,
|
||||
next_frame_tree.pipeline.borrow().id);
|
||||
flag = true;
|
||||
|
@ -994,7 +996,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
debug!("constellation sending resize message to active frame");
|
||||
let pipeline = &*frame_tree.pipeline.borrow();;
|
||||
let ScriptControlChan(ref chan) = pipeline.script_chan;
|
||||
let _ = chan.send_opt(ConstellationControlMsg::Resize(pipeline.id, new_size));
|
||||
let _ = chan.send(ConstellationControlMsg::Resize(pipeline.id, new_size));
|
||||
already_seen.insert(pipeline.id);
|
||||
}
|
||||
for frame_tree in self.navigation_context.previous.iter()
|
||||
|
@ -1003,7 +1005,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
if !already_seen.contains(&pipeline.id) {
|
||||
debug!("constellation sending resize message to inactive frame");
|
||||
let ScriptControlChan(ref chan) = pipeline.script_chan;
|
||||
let _ = chan.send_opt(ConstellationControlMsg::ResizeInactive(pipeline.id, new_size));
|
||||
let _ = chan.send(ConstellationControlMsg::ResizeInactive(pipeline.id, new_size));
|
||||
already_seen.insert(pipeline.id);
|
||||
}
|
||||
}
|
||||
|
@ -1013,10 +1015,10 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
for change in self.pending_frames.iter() {
|
||||
let frame_tree = &change.after;
|
||||
if frame_tree.parent.borrow().is_none() {
|
||||
debug!("constellation sending resize message to pending outer frame ({})",
|
||||
debug!("constellation sending resize message to pending outer frame ({:?})",
|
||||
frame_tree.pipeline.borrow().id);
|
||||
let ScriptControlChan(ref chan) = frame_tree.pipeline.borrow().script_chan;
|
||||
let _ = chan.send_opt(ConstellationControlMsg::Resize(
|
||||
let _ = chan.send(ConstellationControlMsg::Resize(
|
||||
frame_tree.pipeline.borrow().id, new_size));
|
||||
}
|
||||
}
|
||||
|
@ -1071,7 +1073,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
self.compositor_proxy.send(CompositorMsg::SetFrameTree(frame_tree.to_sendable(),
|
||||
chan,
|
||||
self.chan.clone()));
|
||||
if port.recv_opt().is_err() {
|
||||
if port.recv().is_err() {
|
||||
debug!("Compositor has discarded SetFrameTree");
|
||||
return; // Our message has been discarded, probably shutting down.
|
||||
}
|
||||
|
@ -1126,12 +1128,12 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
|
|||
child.frame_tree.pipeline.borrow().to_sendable(),
|
||||
child.rect,
|
||||
chan));
|
||||
match port.recv_opt() {
|
||||
match port.recv() {
|
||||
Ok(()) => {
|
||||
child.frame_tree.has_compositor_layer.set(true);
|
||||
child.frame_tree.pipeline.borrow().grant_paint_permission();
|
||||
}
|
||||
Err(()) => {} // The message has been discarded, we are probably shutting down.
|
||||
Err(_) => {} // The message has been discarded, we are probably shutting down.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ impl NullCompositor {
|
|||
initial_viewport: TypedSize2D(640_f32, 480_f32),
|
||||
visible_viewport: TypedSize2D(640_f32, 480_f32),
|
||||
device_pixel_ratio: ScaleFactor(1.0),
|
||||
}));
|
||||
})).unwrap();
|
||||
}
|
||||
|
||||
compositor
|
||||
|
@ -73,8 +73,8 @@ impl CompositorEventListener for NullCompositor {
|
|||
Msg::Exit(chan) => {
|
||||
debug!("shutting down the constellation");
|
||||
let ConstellationChan(ref con_chan) = self.constellation_chan;
|
||||
con_chan.send(ConstellationMsg::Exit);
|
||||
chan.send(());
|
||||
con_chan.send(ConstellationMsg::Exit).unwrap();
|
||||
chan.send(()).unwrap();
|
||||
}
|
||||
|
||||
Msg::ShutdownComplete => {
|
||||
|
@ -83,19 +83,19 @@ impl CompositorEventListener for NullCompositor {
|
|||
}
|
||||
|
||||
Msg::GetGraphicsMetadata(chan) => {
|
||||
chan.send(None);
|
||||
chan.send(None).unwrap();
|
||||
}
|
||||
|
||||
Msg::SetFrameTree(_, response_chan, _) => {
|
||||
response_chan.send(());
|
||||
response_chan.send(()).unwrap();
|
||||
}
|
||||
|
||||
Msg::ChangeLayerPipelineAndRemoveChildren(_, _, response_channel) => {
|
||||
response_channel.send(());
|
||||
response_channel.send(()).unwrap();
|
||||
}
|
||||
|
||||
Msg::CreateRootLayerForPipeline(_, _, _, response_channel) => {
|
||||
response_channel.send(());
|
||||
response_channel.send(()).unwrap();
|
||||
}
|
||||
|
||||
// Explicitly list ignored messages so that when we add a new one,
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#![feature(globs, phase, macro_rules)]
|
||||
#![feature(box_syntax, plugin)]
|
||||
#![feature(int_uint)]
|
||||
|
||||
#![deny(unused_imports)]
|
||||
#![deny(unused_variables)]
|
||||
#![allow(missing_copy_implementations)]
|
||||
#![allow(unstable)]
|
||||
|
||||
#[phase(plugin, link)]
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
|
||||
extern crate azure;
|
||||
|
@ -21,7 +23,7 @@ extern crate png;
|
|||
extern crate script_traits;
|
||||
extern crate "msg" as servo_msg;
|
||||
extern crate "net" as servo_net;
|
||||
#[phase(plugin, link)]
|
||||
#[macro_use]
|
||||
extern crate "util" as servo_util;
|
||||
extern crate gleam;
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ use servo_net::resource_task::ResourceTask;
|
|||
use servo_net::storage_task::StorageTask;
|
||||
use servo_util::time::TimeProfilerChan;
|
||||
use std::rc::Rc;
|
||||
use std::sync::mpsc::{Receiver, channel};
|
||||
|
||||
/// A uniquely-identifiable pipeline of script task, layout task, and paint task.
|
||||
pub struct Pipeline {
|
||||
|
@ -35,7 +36,7 @@ pub struct Pipeline {
|
|||
}
|
||||
|
||||
/// The subset of the pipeline that is needed for layer composition.
|
||||
#[deriving(Clone)]
|
||||
#[derive(Clone)]
|
||||
pub struct CompositionPipeline {
|
||||
pub id: PipelineId,
|
||||
pub script_chan: ScriptControlChan,
|
||||
|
@ -99,7 +100,7 @@ impl Pipeline {
|
|||
};
|
||||
|
||||
let ScriptControlChan(ref chan) = spipe.script_chan;
|
||||
chan.send(ConstellationControlMsg::AttachLayout(new_layout_info));
|
||||
chan.send(ConstellationControlMsg::AttachLayout(new_layout_info)).unwrap();
|
||||
spipe.script_chan.clone()
|
||||
}
|
||||
};
|
||||
|
@ -161,41 +162,42 @@ impl Pipeline {
|
|||
|
||||
pub fn load(&self) {
|
||||
let ScriptControlChan(ref chan) = self.script_chan;
|
||||
chan.send(ConstellationControlMsg::Load(self.id, self.load_data.clone()));
|
||||
chan.send(ConstellationControlMsg::Load(self.id, self.load_data.clone())).unwrap();
|
||||
}
|
||||
|
||||
pub fn grant_paint_permission(&self) {
|
||||
let _ = self.paint_chan.send_opt(PaintMsg::PaintPermissionGranted);
|
||||
let _ = self.paint_chan.send(PaintMsg::PaintPermissionGranted);
|
||||
}
|
||||
|
||||
pub fn revoke_paint_permission(&self) {
|
||||
debug!("pipeline revoking paint channel paint permission");
|
||||
let _ = self.paint_chan.send_opt(PaintMsg::PaintPermissionRevoked);
|
||||
let _ = self.paint_chan.send(PaintMsg::PaintPermissionRevoked);
|
||||
}
|
||||
|
||||
pub fn exit(&self, exit_type: PipelineExitType) {
|
||||
debug!("pipeline {} exiting", self.id);
|
||||
debug!("pipeline {:?} exiting", self.id);
|
||||
|
||||
// Script task handles shutting down layout, and layout handles shutting down the painter.
|
||||
// For now, if the script task has failed, we give up on clean shutdown.
|
||||
let ScriptControlChan(ref chan) = self.script_chan;
|
||||
if chan.send_opt(ConstellationControlMsg::ExitPipeline(self.id, exit_type)).is_ok() {
|
||||
if chan.send(ConstellationControlMsg::ExitPipeline(self.id, exit_type)).is_ok() {
|
||||
// Wait until all slave tasks have terminated and run destructors
|
||||
// NOTE: We don't wait for script task as we don't always own it
|
||||
let _ = self.paint_shutdown_port.recv_opt();
|
||||
let _ = self.layout_shutdown_port.recv_opt();
|
||||
let _ = self.paint_shutdown_port.recv();
|
||||
let _ = self.layout_shutdown_port.recv();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn force_exit(&self) {
|
||||
let ScriptControlChan(ref script_channel) = self.script_chan;
|
||||
let _ = script_channel.send_opt(
|
||||
let _ = script_channel.send(
|
||||
ConstellationControlMsg::ExitPipeline(self.id,
|
||||
PipelineExitType::PipelineOnly));
|
||||
let _ = self.paint_chan.send_opt(PaintMsg::Exit(None, PipelineExitType::PipelineOnly));
|
||||
PipelineExitType::PipelineOnly)).unwrap();
|
||||
let _ = self.paint_chan.send(PaintMsg::Exit(None, PipelineExitType::PipelineOnly));
|
||||
let LayoutControlChan(ref layout_channel) = self.layout_chan;
|
||||
let _ = layout_channel.send_opt(LayoutControlMsg::ExitNowMsg(PipelineExitType::PipelineOnly));
|
||||
let _ = layout_channel.send(
|
||||
LayoutControlMsg::ExitNowMsg(PipelineExitType::PipelineOnly)).unwrap();
|
||||
}
|
||||
|
||||
pub fn to_sendable(&self) -> CompositionPipeline {
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
use compositor_task::{CompositorProxy, Msg};
|
||||
|
||||
use std::io::timer;
|
||||
use std::task::TaskBuilder;
|
||||
use std::sync::mpsc::{Receiver, Sender, channel};
|
||||
use std::thread::Builder;
|
||||
use std::time::duration::Duration;
|
||||
use time;
|
||||
|
||||
|
@ -33,7 +34,7 @@ enum ToScrollingTimerMsg {
|
|||
impl ScrollingTimerProxy {
|
||||
pub fn new(compositor_proxy: Box<CompositorProxy+Send>) -> ScrollingTimerProxy {
|
||||
let (to_scrolling_timer_sender, to_scrolling_timer_receiver) = channel();
|
||||
TaskBuilder::new().spawn(proc() {
|
||||
Builder::new().spawn(move || {
|
||||
let mut scrolling_timer = ScrollingTimer {
|
||||
compositor_proxy: compositor_proxy,
|
||||
receiver: to_scrolling_timer_receiver,
|
||||
|
@ -46,18 +47,18 @@ impl ScrollingTimerProxy {
|
|||
}
|
||||
|
||||
pub fn scroll_event_processed(&mut self, timestamp: u64) {
|
||||
self.sender.send(ToScrollingTimerMsg::ScrollEventProcessedMsg(timestamp))
|
||||
self.sender.send(ToScrollingTimerMsg::ScrollEventProcessedMsg(timestamp)).unwrap()
|
||||
}
|
||||
|
||||
pub fn shutdown(&mut self) {
|
||||
self.sender.send(ToScrollingTimerMsg::ExitMsg);
|
||||
self.sender.send(ToScrollingTimerMsg::ExitMsg).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
impl ScrollingTimer {
|
||||
pub fn run(&mut self) {
|
||||
loop {
|
||||
match self.receiver.recv_opt() {
|
||||
match self.receiver.recv() {
|
||||
Ok(ToScrollingTimerMsg::ScrollEventProcessedMsg(timestamp)) => {
|
||||
let target = timestamp as i64 + TIMEOUT;
|
||||
let delta = target - (time::precise_time_ns() as i64);
|
||||
|
|
|
@ -18,21 +18,21 @@ use servo_util::geometry::ScreenPx;
|
|||
use std::fmt::{Error, Formatter, Show};
|
||||
use std::rc::Rc;
|
||||
|
||||
#[deriving(Clone)]
|
||||
#[derive(Clone)]
|
||||
pub enum MouseWindowEvent {
|
||||
Click(uint, TypedPoint2D<DevicePixel, f32>),
|
||||
MouseDown(uint, TypedPoint2D<DevicePixel, f32>),
|
||||
MouseUp(uint, TypedPoint2D<DevicePixel, f32>),
|
||||
}
|
||||
|
||||
#[deriving(Clone)]
|
||||
#[derive(Clone)]
|
||||
pub enum WindowNavigateMsg {
|
||||
Forward,
|
||||
Back,
|
||||
}
|
||||
|
||||
/// Events that the windowing system sends to Servo.
|
||||
#[deriving(Clone)]
|
||||
#[derive(Clone)]
|
||||
pub enum WindowEvent {
|
||||
/// Sent when no message has arrived, but the event loop was kicked for some reason (perhaps
|
||||
/// by another Servo subsystem).
|
||||
|
@ -48,7 +48,7 @@ pub enum WindowEvent {
|
|||
/// context when this message is sent.
|
||||
InitializeCompositing,
|
||||
/// Sent when the window is resized.
|
||||
Resize(TypedSize2D<DevicePixel, uint>),
|
||||
Resize(TypedSize2D<DevicePixel, u32>),
|
||||
/// Sent when a new URL is to be loaded.
|
||||
LoadUrl(String),
|
||||
/// Sent when a mouse hit test is to be performed.
|
||||
|
@ -92,7 +92,7 @@ impl Show for WindowEvent {
|
|||
|
||||
pub trait WindowMethods {
|
||||
/// Returns the size of the window in hardware pixels.
|
||||
fn framebuffer_size(&self) -> TypedSize2D<DevicePixel, uint>;
|
||||
fn framebuffer_size(&self) -> TypedSize2D<DevicePixel, u32>;
|
||||
/// Returns the size of the window in density-independent "px" units.
|
||||
fn size(&self) -> TypedSize2D<ScreenPx, f32>;
|
||||
/// Presents the window to the screen (perhaps by page flipping).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue