mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
compositing: In borderless mode, don't show the window until the page
has loaded. This avoids a flash of unstyled content, which looks especially bad in browser.html since unstyled content is white and browser.html has a transparent background. Closes #9996.
This commit is contained in:
parent
1a60e07ee8
commit
c2581d5cef
7 changed files with 23 additions and 13 deletions
|
@ -592,7 +592,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
||||||
self.window.load_start(back, forward);
|
self.window.load_start(back, forward);
|
||||||
}
|
}
|
||||||
|
|
||||||
(Msg::LoadComplete(back, forward), ShutdownState::NotShuttingDown) => {
|
(Msg::LoadComplete(back, forward, root), ShutdownState::NotShuttingDown) => {
|
||||||
self.got_load_complete_message = true;
|
self.got_load_complete_message = true;
|
||||||
|
|
||||||
// If we're painting in headless mode, schedule a recomposite.
|
// If we're painting in headless mode, schedule a recomposite.
|
||||||
|
@ -603,7 +603,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
||||||
// Inform the embedder that the load has finished.
|
// Inform the embedder that the load has finished.
|
||||||
//
|
//
|
||||||
// TODO(pcwalton): Specify which frame's load completed.
|
// TODO(pcwalton): Specify which frame's load completed.
|
||||||
self.window.load_end(back, forward);
|
self.window.load_end(back, forward, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
(Msg::DelayedCompositionTimeout(timestamp), ShutdownState::NotShuttingDown) => {
|
(Msg::DelayedCompositionTimeout(timestamp), ShutdownState::NotShuttingDown) => {
|
||||||
|
|
|
@ -195,8 +195,8 @@ pub enum Msg {
|
||||||
SetFrameTree(SendableFrameTree, IpcSender<()>, Sender<ConstellationMsg>),
|
SetFrameTree(SendableFrameTree, IpcSender<()>, Sender<ConstellationMsg>),
|
||||||
/// The load of a page has begun: (can go back, can go forward).
|
/// The load of a page has begun: (can go back, can go forward).
|
||||||
LoadStart(bool, bool),
|
LoadStart(bool, bool),
|
||||||
/// The load of a page has completed: (can go back, can go forward).
|
/// The load of a page has completed: (can go back, can go forward, is root frame).
|
||||||
LoadComplete(bool, bool),
|
LoadComplete(bool, bool, bool),
|
||||||
/// We hit the delayed composition timeout. (See `delayed_composition.rs`.)
|
/// We hit the delayed composition timeout. (See `delayed_composition.rs`.)
|
||||||
DelayedCompositionTimeout(u64),
|
DelayedCompositionTimeout(u64),
|
||||||
/// Composite.
|
/// Composite.
|
||||||
|
|
|
@ -1005,11 +1005,11 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF>
|
||||||
|
|
||||||
let forward = !self.frame(frame_id).next.is_empty();
|
let forward = !self.frame(frame_id).next.is_empty();
|
||||||
let back = !self.frame(frame_id).prev.is_empty();
|
let back = !self.frame(frame_id).prev.is_empty();
|
||||||
self.compositor_proxy.send(ToCompositorMsg::LoadComplete(back, forward));
|
let root = self.root_frame_id.is_none() || self.root_frame_id == Some(frame_id);
|
||||||
|
self.compositor_proxy.send(ToCompositorMsg::LoadComplete(back, forward, root));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_dom_load(&mut self,
|
fn handle_dom_load(&mut self, pipeline_id: PipelineId) {
|
||||||
pipeline_id: PipelineId) {
|
|
||||||
let mut webdriver_reset = false;
|
let mut webdriver_reset = false;
|
||||||
if let Some((expected_pipeline_id, ref reply_chan)) = self.webdriver.load_channel {
|
if let Some((expected_pipeline_id, ref reply_chan)) = self.webdriver.load_channel {
|
||||||
debug!("Sending load to WebDriver");
|
debug!("Sending load to WebDriver");
|
||||||
|
|
|
@ -125,7 +125,7 @@ pub trait WindowMethods {
|
||||||
/// Called when the browser has started loading a frame.
|
/// Called when the browser has started loading a frame.
|
||||||
fn load_start(&self, back: bool, forward: bool);
|
fn load_start(&self, back: bool, forward: bool);
|
||||||
/// Called when the browser is done loading a frame.
|
/// Called when the browser is done loading a frame.
|
||||||
fn load_end(&self, back: bool, forward: bool);
|
fn load_end(&self, back: bool, forward: bool, root: bool);
|
||||||
/// Called when the browser encounters an error while loading a URL
|
/// Called when the browser encounters an error while loading a URL
|
||||||
fn load_error(&self, code: NetError, url: String);
|
fn load_error(&self, code: NetError, url: String);
|
||||||
/// Called when the <head> tag has finished parsing
|
/// Called when the <head> tag has finished parsing
|
||||||
|
|
|
@ -374,7 +374,7 @@ impl WindowMethods for Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_end(&self, back: bool, forward: bool) {
|
fn load_end(&self, back: bool, forward: bool, _: bool) {
|
||||||
// FIXME(pcwalton): The status code 200 is a lie.
|
// FIXME(pcwalton): The status code 200 is a lie.
|
||||||
let browser = self.cef_browser.borrow();
|
let browser = self.cef_browser.borrow();
|
||||||
let browser = match *browser {
|
let browser = match *browser {
|
||||||
|
|
|
@ -93,13 +93,20 @@ impl Window {
|
||||||
parent: Option<glutin::WindowID>) -> Rc<Window> {
|
parent: Option<glutin::WindowID>) -> Rc<Window> {
|
||||||
let width = window_size.to_untyped().width;
|
let width = window_size.to_untyped().width;
|
||||||
let height = window_size.to_untyped().height;
|
let height = window_size.to_untyped().height;
|
||||||
|
|
||||||
|
// If there's no chrome, start off with the window invisible. It will be set to visible in
|
||||||
|
// `load_end()`. This avoids an ugly flash of unstyled content (especially important since
|
||||||
|
// unstyled content is white and chrome often has a transparent background). See issue
|
||||||
|
// #9996.
|
||||||
|
let visible = is_foreground && !opts::get().no_native_titlebar;
|
||||||
|
|
||||||
let mut builder =
|
let mut builder =
|
||||||
glutin::WindowBuilder::new().with_title("Servo".to_string())
|
glutin::WindowBuilder::new().with_title("Servo".to_string())
|
||||||
.with_decorations(!opts::get().no_native_titlebar)
|
.with_decorations(!opts::get().no_native_titlebar)
|
||||||
.with_transparency(opts::get().no_native_titlebar)
|
.with_transparency(opts::get().no_native_titlebar)
|
||||||
.with_dimensions(width, height)
|
.with_dimensions(width, height)
|
||||||
.with_gl(Window::gl_version())
|
.with_gl(Window::gl_version())
|
||||||
.with_visibility(is_foreground)
|
.with_visibility(visible)
|
||||||
.with_parent(parent)
|
.with_parent(parent)
|
||||||
.with_multitouch();
|
.with_multitouch();
|
||||||
|
|
||||||
|
@ -613,7 +620,10 @@ impl WindowMethods for Window {
|
||||||
fn load_start(&self, _: bool, _: bool) {
|
fn load_start(&self, _: bool, _: bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_end(&self, _: bool, _: bool) {
|
fn load_end(&self, _: bool, _: bool, root: bool) {
|
||||||
|
if root && opts::get().no_native_titlebar {
|
||||||
|
self.window.show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_error(&self, _: NetError, _: String) {
|
fn load_error(&self, _: NetError, _: String) {
|
||||||
|
@ -869,7 +879,7 @@ impl WindowMethods for Window {
|
||||||
|
|
||||||
fn load_start(&self, _: bool, _: bool) {
|
fn load_start(&self, _: bool, _: bool) {
|
||||||
}
|
}
|
||||||
fn load_end(&self, _: bool, _: bool) {
|
fn load_end(&self, _: bool, _: bool, _: bool) {
|
||||||
}
|
}
|
||||||
fn load_error(&self, _: NetError, _: String) {
|
fn load_error(&self, _: NetError, _: String) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -820,7 +820,7 @@ impl WindowMethods for Window {
|
||||||
fn load_start(&self, _: bool, _: bool) {
|
fn load_start(&self, _: bool, _: bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_end(&self, _: bool, _: bool) {
|
fn load_end(&self, _: bool, _: bool, _: bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_error(&self, _: NetError, _: String) {
|
fn load_error(&self, _: NetError, _: String) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue