mirror of
https://github.com/servo/servo.git
synced 2025-06-25 01:24:37 +01:00
auto merge of #552 : metajack/servo/detect-page-loaded, r=pcwalton
This doesn't do anything, but adds the stuff to detect the page load. This will be needed to write out the composited texture to PNGs for reftests. r? @sfowler
This commit is contained in:
commit
17fcf806ce
7 changed files with 56 additions and 12 deletions
|
@ -12,12 +12,14 @@ use std::float;
|
||||||
use std::result;
|
use std::result;
|
||||||
use std::uint;
|
use std::uint;
|
||||||
|
|
||||||
|
#[deriving(Clone)]
|
||||||
pub struct Opts {
|
pub struct Opts {
|
||||||
urls: ~[~str],
|
urls: ~[~str],
|
||||||
render_backend: BackendType,
|
render_backend: BackendType,
|
||||||
n_render_threads: uint,
|
n_render_threads: uint,
|
||||||
tile_size: uint,
|
tile_size: uint,
|
||||||
profiler_period: Option<float>,
|
profiler_period: Option<float>,
|
||||||
|
exit_after_load: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_implicitly_copyable_typarams)]
|
#[allow(non_implicitly_copyable_typarams)]
|
||||||
|
@ -32,6 +34,7 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
getopts::optopt("s"), // size of tiles
|
getopts::optopt("s"), // size of tiles
|
||||||
getopts::optopt("t"), // threads to render with
|
getopts::optopt("t"), // threads to render with
|
||||||
getopts::optflagopt("p"), // profiler flag and output interval
|
getopts::optflagopt("p"), // profiler flag and output interval
|
||||||
|
getopts::optflag("x"), // exit after load flag
|
||||||
];
|
];
|
||||||
|
|
||||||
let opt_match = match getopts::getopts(args, opts) {
|
let opt_match = match getopts::getopts(args, opts) {
|
||||||
|
@ -85,11 +88,14 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let exit_after_load = getopts::opt_present(&opt_match, "x");
|
||||||
|
|
||||||
Opts {
|
Opts {
|
||||||
urls: urls,
|
urls: urls,
|
||||||
render_backend: render_backend,
|
render_backend: render_backend,
|
||||||
n_render_threads: n_render_threads,
|
n_render_threads: n_render_threads,
|
||||||
tile_size: tile_size,
|
tile_size: tile_size,
|
||||||
profiler_period: profiler_period,
|
profiler_period: profiler_period,
|
||||||
|
exit_after_load: exit_after_load,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ use servo_msg::compositor_msg::{ReadyState, ScriptListener};
|
||||||
use servo_msg::constellation_msg::{CompositorAck, ConstellationChan};
|
use servo_msg::constellation_msg::{CompositorAck, ConstellationChan};
|
||||||
use servo_msg::constellation_msg;
|
use servo_msg::constellation_msg;
|
||||||
use gfx::render_task::{RenderChan, ReRenderMsg};
|
use gfx::render_task::{RenderChan, ReRenderMsg};
|
||||||
|
use gfx::opts::Opts;
|
||||||
|
|
||||||
use azure::azure_hl::{DataSourceSurface, DrawTarget, SourceSurfaceMethods, current_gl_context};
|
use azure::azure_hl::{DataSourceSurface, DrawTarget, SourceSurfaceMethods, current_gl_context};
|
||||||
use azure::azure::AzGLContext;
|
use azure::azure::AzGLContext;
|
||||||
|
@ -162,17 +163,20 @@ impl ImageData for AzureDrawTargetImageData {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CompositorTask {
|
pub struct CompositorTask {
|
||||||
|
opts: Opts,
|
||||||
port: Port<Msg>,
|
port: Port<Msg>,
|
||||||
profiler_chan: ProfilerChan,
|
profiler_chan: ProfilerChan,
|
||||||
shutdown_chan: SharedChan<()>,
|
shutdown_chan: SharedChan<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CompositorTask {
|
impl CompositorTask {
|
||||||
pub fn new(port: Port<Msg>,
|
pub fn new(opts: Opts,
|
||||||
|
port: Port<Msg>,
|
||||||
profiler_chan: ProfilerChan,
|
profiler_chan: ProfilerChan,
|
||||||
shutdown_chan: Chan<()>)
|
shutdown_chan: Chan<()>)
|
||||||
-> CompositorTask {
|
-> CompositorTask {
|
||||||
CompositorTask {
|
CompositorTask {
|
||||||
|
opts: opts,
|
||||||
port: port,
|
port: port,
|
||||||
profiler_chan: profiler_chan,
|
profiler_chan: profiler_chan,
|
||||||
shutdown_chan: SharedChan::new(shutdown_chan),
|
shutdown_chan: SharedChan::new(shutdown_chan),
|
||||||
|
@ -180,13 +184,16 @@ impl CompositorTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Starts the compositor, which listens for messages on the specified port.
|
/// Starts the compositor, which listens for messages on the specified port.
|
||||||
pub fn create(port: Port<Msg>,
|
pub fn create(opts: Opts,
|
||||||
profiler_chan: ProfilerChan,
|
port: Port<Msg>,
|
||||||
shutdown_chan: Chan<()>) {
|
profiler_chan: ProfilerChan,
|
||||||
|
shutdown_chan: Chan<()>) {
|
||||||
let port = Cell::new(port);
|
let port = Cell::new(port);
|
||||||
let shutdown_chan = Cell::new(shutdown_chan);
|
let shutdown_chan = Cell::new(shutdown_chan);
|
||||||
|
let opts = Cell::new(opts);
|
||||||
do on_osmain {
|
do on_osmain {
|
||||||
let compositor_task = CompositorTask::new(port.take(),
|
let compositor_task = CompositorTask::new(opts.take(),
|
||||||
|
port.take(),
|
||||||
profiler_chan.clone(),
|
profiler_chan.clone(),
|
||||||
shutdown_chan.take());
|
shutdown_chan.take());
|
||||||
debug!("preparing to enter main loop");
|
debug!("preparing to enter main loop");
|
||||||
|
@ -499,8 +506,6 @@ impl CompositorTask {
|
||||||
*recomposite = true;
|
*recomposite = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// When the user pinch-zooms, scale the layer
|
// When the user pinch-zooms, scale the layer
|
||||||
do window.set_zoom_callback |magnification| {
|
do window.set_zoom_callback |magnification| {
|
||||||
*zoom_action = true;
|
*zoom_action = true;
|
||||||
|
@ -540,6 +545,12 @@ impl CompositorTask {
|
||||||
*recomposite = true;
|
*recomposite = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.opts.exit_after_load {
|
||||||
|
do window.set_finished_callback || {
|
||||||
|
*done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Enter the main event loop.
|
// Enter the main event loop.
|
||||||
while !*done {
|
while !*done {
|
||||||
// Check for new messages coming from the rendering task.
|
// Check for new messages coming from the rendering task.
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
//! A windowing implementation using GLFW.
|
//! A windowing implementation using GLFW.
|
||||||
|
|
||||||
use windowing::{ApplicationMethods, LoadUrlCallback, MouseCallback};
|
use windowing::{ApplicationMethods, LoadUrlCallback, MouseCallback, FinishedCallback};
|
||||||
use windowing::{ResizeCallback, ScrollCallback, WindowMethods, WindowMouseEvent, WindowClickEvent};
|
use windowing::{ResizeCallback, ScrollCallback, WindowMethods, WindowMouseEvent, WindowClickEvent};
|
||||||
use windowing::{WindowMouseDownEvent, WindowMouseUpEvent, ZoomCallback, Forward, Back, NavigationCallback};
|
use windowing::{WindowMouseDownEvent, WindowMouseUpEvent, ZoomCallback, Forward, Back, NavigationCallback};
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ use std::libc::c_int;
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
use geom::size::Size2D;
|
use geom::size::Size2D;
|
||||||
use servo_msg::compositor_msg::{IdleRenderState, RenderState, RenderingRenderState};
|
use servo_msg::compositor_msg::{IdleRenderState, RenderState, RenderingRenderState};
|
||||||
use servo_msg::compositor_msg::{FinishedLoading, Loading, PerformingLayout, ReadyState};
|
use servo_msg::compositor_msg::{FinishedLoading, Blank, Loading, PerformingLayout, ReadyState};
|
||||||
|
|
||||||
use glfw;
|
use glfw;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ pub struct Window {
|
||||||
scroll_callback: Option<ScrollCallback>,
|
scroll_callback: Option<ScrollCallback>,
|
||||||
zoom_callback: Option<ZoomCallback>,
|
zoom_callback: Option<ZoomCallback>,
|
||||||
navigation_callback: Option<NavigationCallback>,
|
navigation_callback: Option<NavigationCallback>,
|
||||||
|
finished_callback: Option<FinishedCallback>,
|
||||||
|
|
||||||
drag_origin: Point2D<c_int>,
|
drag_origin: Point2D<c_int>,
|
||||||
|
|
||||||
|
@ -73,13 +74,14 @@ impl WindowMethods<Application> for Window {
|
||||||
scroll_callback: None,
|
scroll_callback: None,
|
||||||
zoom_callback: None,
|
zoom_callback: None,
|
||||||
navigation_callback: None,
|
navigation_callback: None,
|
||||||
|
finished_callback: None,
|
||||||
|
|
||||||
drag_origin: Point2D(0 as c_int, 0),
|
drag_origin: Point2D(0 as c_int, 0),
|
||||||
|
|
||||||
mouse_down_button: @mut 0,
|
mouse_down_button: @mut 0,
|
||||||
mouse_down_point: @mut Point2D(0 as c_int, 0),
|
mouse_down_point: @mut Point2D(0 as c_int, 0),
|
||||||
|
|
||||||
ready_state: FinishedLoading,
|
ready_state: Blank,
|
||||||
render_state: IdleRenderState,
|
render_state: IdleRenderState,
|
||||||
throbber_frame: 0,
|
throbber_frame: 0,
|
||||||
};
|
};
|
||||||
|
@ -153,6 +155,10 @@ impl WindowMethods<Application> for Window {
|
||||||
self.navigation_callback = Some(new_navigation_callback)
|
self.navigation_callback = Some(new_navigation_callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_finished_callback(&mut self, new_finished_callback: FinishedCallback) {
|
||||||
|
self.finished_callback = Some(new_finished_callback)
|
||||||
|
}
|
||||||
|
|
||||||
/// Spins the event loop.
|
/// Spins the event loop.
|
||||||
pub fn check_loop(@mut self) -> bool {
|
pub fn check_loop(@mut self) -> bool {
|
||||||
glfw::poll_events();
|
glfw::poll_events();
|
||||||
|
@ -169,6 +175,16 @@ impl WindowMethods<Application> for Window {
|
||||||
|
|
||||||
/// Sets the render state.
|
/// Sets the render state.
|
||||||
pub fn set_render_state(@mut self, render_state: RenderState) {
|
pub fn set_render_state(@mut self, render_state: RenderState) {
|
||||||
|
if self.ready_state == FinishedLoading &&
|
||||||
|
self.render_state == RenderingRenderState &&
|
||||||
|
render_state == IdleRenderState {
|
||||||
|
|
||||||
|
// page loaded
|
||||||
|
for self.finished_callback.iter().advance |&callback| {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.render_state = render_state;
|
self.render_state = render_state;
|
||||||
self.update_window_title()
|
self.update_window_title()
|
||||||
}
|
}
|
||||||
|
@ -179,6 +195,9 @@ impl Window {
|
||||||
fn update_window_title(&self) {
|
fn update_window_title(&self) {
|
||||||
let throbber = THROBBER[self.throbber_frame];
|
let throbber = THROBBER[self.throbber_frame];
|
||||||
match self.ready_state {
|
match self.ready_state {
|
||||||
|
Blank => {
|
||||||
|
self.glfw_window.set_title(fmt!("blank — Servo"));
|
||||||
|
}
|
||||||
Loading => {
|
Loading => {
|
||||||
self.glfw_window.set_title(fmt!("%c Loading — Servo", throbber))
|
self.glfw_window.set_title(fmt!("%c Loading — Servo", throbber))
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ fn run(opts: &Opts) {
|
||||||
// Create the compositor.
|
// Create the compositor.
|
||||||
let (compositor_port, compositor_chan) = comm::stream();
|
let (compositor_port, compositor_chan) = comm::stream();
|
||||||
let compositor_chan = CompositorChan::new(compositor_chan);
|
let compositor_chan = CompositorChan::new(compositor_chan);
|
||||||
CompositorTask::create(compositor_port, profiler_chan.clone(), shutdown_chan);
|
CompositorTask::create(opts.clone(), compositor_port, profiler_chan.clone(), shutdown_chan);
|
||||||
|
|
||||||
// Create a Servo instance.
|
// Create a Servo instance.
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,9 @@ pub type ZoomCallback = @fn(f32);
|
||||||
/// Type of the function that is called when the user clicks backspace or shift-backspace
|
/// Type of the function that is called when the user clicks backspace or shift-backspace
|
||||||
pub type NavigationCallback = @fn(WindowNavigateMsg);
|
pub type NavigationCallback = @fn(WindowNavigateMsg);
|
||||||
|
|
||||||
|
/// Type of the function that is called when the rendering is finished
|
||||||
|
pub type FinishedCallback = @fn();
|
||||||
|
|
||||||
/// Methods for an abstract Application.
|
/// Methods for an abstract Application.
|
||||||
pub trait ApplicationMethods {
|
pub trait ApplicationMethods {
|
||||||
fn new() -> Self;
|
fn new() -> Self;
|
||||||
|
@ -62,6 +65,8 @@ pub trait WindowMethods<A> {
|
||||||
pub fn set_zoom_callback(&mut self, new_zoom_callback: ZoomCallback);
|
pub fn set_zoom_callback(&mut self, new_zoom_callback: ZoomCallback);
|
||||||
/// Registers a callback to run when the user presses backspace or shift-backspace.
|
/// Registers a callback to run when the user presses backspace or shift-backspace.
|
||||||
pub fn set_navigation_callback(&mut self, new_navigation_callback: NavigationCallback);
|
pub fn set_navigation_callback(&mut self, new_navigation_callback: NavigationCallback);
|
||||||
|
/// Registers a callback to run when rendering is finished.
|
||||||
|
pub fn set_finished_callback(&mut self, new_finish_callback: FinishedCallback);
|
||||||
|
|
||||||
/// Spins the event loop. Returns whether the window should close.
|
/// Spins the event loop. Returns whether the window should close.
|
||||||
pub fn check_loop(@mut self) -> bool;
|
pub fn check_loop(@mut self) -> bool;
|
||||||
|
|
|
@ -40,7 +40,10 @@ pub enum RenderState {
|
||||||
RenderingRenderState,
|
RenderingRenderState,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[deriving(Eq)]
|
||||||
pub enum ReadyState {
|
pub enum ReadyState {
|
||||||
|
/// Informs the compositor that nothing has been done yet. Used for setting status
|
||||||
|
Blank,
|
||||||
/// Informs the compositor that a page is loading. Used for setting status
|
/// Informs the compositor that a page is loading. Used for setting status
|
||||||
Loading,
|
Loading,
|
||||||
/// Informs the compositor that a page is performing layout. Used for setting status
|
/// Informs the compositor that a page is performing layout. Used for setting status
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit ba24db51b38c9875e1356f7bc08c13a683071710
|
Subproject commit ae7c99be106e5767b0384f16887579d55e222e71
|
Loading…
Add table
Add a link
Reference in a new issue