aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2018-12-09 14:16:14 -0500
committerJosh Matthews <josh@joshmatthews.net>2018-12-14 13:12:46 -0500
commit231a37be24ee62cef69d69e0d1919b7b7f80cfed (patch)
tree5534da80c10e6c47cfb22687311a75cdcaf9fa33 /components/script
parent34e77f62afcd4a4f64bc28bb8c6fb45b4c0a983a (diff)
downloadservo-231a37be24ee62cef69d69e0d1919b7b7f80cfed.tar.gz
servo-231a37be24ee62cef69d69e0d1919b7b7f80cfed.zip
Initial window sizes are mandatory.
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs19
-rw-r--r--components/script/dom/htmliframeelement.rs4
-rw-r--r--components/script/dom/htmlimageelement.rs23
-rw-r--r--components/script/dom/mediaquerylist.rs6
-rw-r--r--components/script/dom/window.rs37
-rw-r--r--components/script/dom/windowproxy.rs2
-rw-r--r--components/script/script_thread.rs6
7 files changed, 34 insertions, 63 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 8fa7e33e784..5ee154658d7 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -2806,17 +2806,11 @@ impl Document {
///
/// FIXME(emilio): This really needs to be somehow more in sync with layout.
/// Feels like a hack.
- ///
- /// Also, shouldn't return an option, I'm quite sure.
- pub fn device(&self) -> Option<Device> {
- let window_size = self.window().window_size()?;
+ pub fn device(&self) -> Device {
+ let window_size = self.window().window_size();
let viewport_size = window_size.initial_viewport;
let device_pixel_ratio = window_size.device_pixel_ratio;
- Some(Device::new(
- MediaType::screen(),
- viewport_size,
- device_pixel_ratio,
- ))
+ Device::new(MediaType::screen(), viewport_size, device_pixel_ratio)
}
/// Remove a stylesheet owned by `owner` from the list of document sheets.
@@ -4183,7 +4177,7 @@ impl DocumentMethods for Document {
let y = *y as f32;
let point = &Point2D::new(x, y);
let window = window_from_node(self);
- let viewport = window.window_size()?.initial_viewport;
+ let viewport = window.window_size().initial_viewport;
if self.browsing_context().is_none() {
return None;
@@ -4218,10 +4212,7 @@ impl DocumentMethods for Document {
let y = *y as f32;
let point = &Point2D::new(x, y);
let window = window_from_node(self);
- let viewport = match window.window_size() {
- Some(size) => size.initial_viewport,
- None => return vec![],
- };
+ let viewport = window.window_size().initial_viewport;
if self.browsing_context().is_none() {
return vec![];
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index 93a14f16fee..ae87091e0a3 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -194,7 +194,7 @@ impl HTMLIFrameElement {
load_data: load_data.unwrap(),
pipeline_port: pipeline_receiver,
content_process_shutdown_chan: None,
- window_size: Some(WindowSizeData {
+ window_size: WindowSizeData {
initial_viewport: {
let rect = self.upcast::<Node>().bounding_content_box_or_zero();
TypedSize2D::new(
@@ -203,7 +203,7 @@ impl HTMLIFrameElement {
)
},
device_pixel_ratio: window.device_pixel_ratio(),
- }),
+ },
layout_threads: PREFS.get("layout.threads").as_u64().expect("count") as usize,
};
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index 9abb640f105..60e27304aae 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -634,21 +634,14 @@ impl HTMLImageElement {
) -> Au {
let document = document_from_node(self);
let device = document.device();
- if !device.is_some() {
- return Au(1);
- }
let quirks_mode = document.quirks_mode();
//FIXME https://github.com/whatwg/html/issues/3832
- source_size_list.evaluate(&device.unwrap(), quirks_mode)
+ source_size_list.evaluate(&device, quirks_mode)
}
/// https://html.spec.whatwg.org/multipage/#matches-the-environment
fn matches_environment(&self, media_query: String) -> bool {
let document = document_from_node(self);
- let device = match document.device() {
- Some(device) => device,
- None => return false,
- };
let quirks_mode = document.quirks_mode();
let document_url = &document.url();
// FIXME(emilio): This should do the same that we do for other media
@@ -668,7 +661,7 @@ impl HTMLImageElement {
let mut parserInput = ParserInput::new(&media_query);
let mut parser = Parser::new(&mut parserInput);
let media_list = MediaList::parse(&context, &mut parser);
- media_list.evaluate(&device, quirks_mode)
+ media_list.evaluate(&document.device(), quirks_mode)
}
/// <https://html.spec.whatwg.org/multipage/#normalise-the-source-densities>
@@ -740,13 +733,11 @@ impl HTMLImageElement {
// Step 5
let mut best_candidate = max;
let device = document_from_node(self).device();
- if let Some(device) = device {
- let device_den = device.device_pixel_ratio().get() as f64;
- for (index, image_source) in img_sources.iter().enumerate() {
- let current_den = image_source.descriptor.den.unwrap();
- if current_den < best_candidate.0 && current_den >= device_den {
- best_candidate = (current_den, index);
- }
+ let device_den = device.device_pixel_ratio().get() as f64;
+ for (index, image_source) in img_sources.iter().enumerate() {
+ let current_den = image_source.descriptor.den.unwrap();
+ if current_den < best_candidate.0 && current_den >= device_den {
+ best_candidate = (current_den, index);
}
}
let selected_source = img_sources.remove(best_candidate.1).clone();
diff --git a/components/script/dom/mediaquerylist.rs b/components/script/dom/mediaquerylist.rs
index 3e485466c64..1730845a4df 100644
--- a/components/script/dom/mediaquerylist.rs
+++ b/components/script/dom/mediaquerylist.rs
@@ -69,10 +69,8 @@ impl MediaQueryList {
}
pub fn evaluate(&self) -> bool {
- self.document.device().map_or(false, |device| {
- self.media_query_list
- .evaluate(&device, self.document.quirks_mode())
- })
+ self.media_query_list
+ .evaluate(&self.document.device(), self.document.quirks_mode())
}
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index d8353157cc1..785404454bd 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -216,7 +216,7 @@ pub struct Window {
layout_rpc: Box<LayoutRPC + Send + 'static>,
/// The current size of the window, in pixels.
- window_size: Cell<Option<WindowSizeData>>,
+ window_size: Cell<WindowSizeData>,
/// A handle for communicating messages to the bluetooth thread.
#[ignore_malloc_size_of = "channels are hard"]
@@ -958,7 +958,9 @@ impl WindowMethods for Window {
fn InnerHeight(&self) -> i32 {
self.window_size
.get()
- .and_then(|e| e.initial_viewport.height.to_i32())
+ .initial_viewport
+ .height
+ .to_i32()
.unwrap_or(0)
}
@@ -967,7 +969,9 @@ impl WindowMethods for Window {
fn InnerWidth(&self) -> i32 {
self.window_size
.get()
- .and_then(|e| e.initial_viewport.width.to_i32())
+ .initial_viewport
+ .width
+ .to_i32()
.unwrap_or(0)
}
@@ -1245,10 +1249,7 @@ impl Window {
let xfinite = if x_.is_finite() { x_ } else { 0.0f64 };
let yfinite = if y_.is_finite() { y_ } else { 0.0f64 };
- // Step 4
- if self.window_size.get().is_none() {
- return;
- }
+ // TODO Step 4 - determine if a window has a viewport
// Step 5
//TODO remove scrollbar width
@@ -1322,9 +1323,7 @@ impl Window {
}
pub fn device_pixel_ratio(&self) -> TypedScale<f32, CSSPixel, DevicePixel> {
- self.window_size
- .get()
- .map_or(TypedScale::new(1.0), |data| data.device_pixel_ratio)
+ self.window_size.get().device_pixel_ratio
}
fn client_window(&self) -> (TypedSize2D<u32, CSSPixel>, TypedPoint2D<i32, CSSPixel>) {
@@ -1369,12 +1368,6 @@ impl Window {
_ => (),
}
- // If there is no window size, we have nothing to do.
- let window_size = match self.window_size.get() {
- Some(window_size) => window_size,
- None => return false,
- };
-
let for_display = reflow_goal == ReflowGoal::Full;
if for_display && self.suppress_reflow.get() {
debug!(
@@ -1417,7 +1410,7 @@ impl Window {
},
document: self.Document().upcast::<Node>().to_trusted_node_address(),
stylesheets_changed,
- window_size,
+ window_size: self.window_size.get(),
reflow_goal,
script_join_chan: join_chan,
dom_count: self.Document().dom_count(),
@@ -1510,13 +1503,11 @@ impl Window {
if !for_display || self.Document().needs_reflow() {
issued_reflow = self.force_reflow(reflow_goal, reason);
- // If window_size is `None`, we don't reflow, so the document stays
- // dirty. Otherwise, we shouldn't need a reflow immediately after a
+ // We shouldn't need a reflow immediately after a
// reflow, except if we're waiting for a deferred paint.
assert!(
!self.Document().needs_reflow() ||
(!for_display && self.Document().needs_paint()) ||
- self.window_size.get().is_none() ||
self.suppress_reflow.get()
);
} else {
@@ -1801,10 +1792,10 @@ impl Window {
}
pub fn set_window_size(&self, size: WindowSizeData) {
- self.window_size.set(Some(size));
+ self.window_size.set(size);
}
- pub fn window_size(&self) -> Option<WindowSizeData> {
+ pub fn window_size(&self) -> WindowSizeData {
self.window_size.get()
}
@@ -2021,7 +2012,7 @@ impl Window {
layout_chan: Sender<Msg>,
pipelineid: PipelineId,
parent_info: Option<PipelineId>,
- window_size: Option<WindowSizeData>,
+ window_size: WindowSizeData,
origin: MutableOrigin,
navigation_start: u64,
navigation_start_precise: u64,
diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs
index 80850e804b5..65362ee0d17 100644
--- a/components/script/dom/windowproxy.rs
+++ b/components/script/dom/windowproxy.rs
@@ -289,7 +289,7 @@ impl WindowProxy {
load_data: load_data,
pipeline_port: pipeline_receiver,
content_process_shutdown_chan: None,
- window_size: None,
+ window_size: window.window_size(),
layout_threads: PREFS.get("layout.threads").as_u64().expect("count") as usize,
};
let constellation_msg = ScriptMsg::ScriptNewAuxiliary(load_info, pipeline_sender);
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index f7bc6b9b26c..134a6b47709 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -182,7 +182,7 @@ struct InProgressLoad {
/// The opener, if this is an auxiliary.
opener: Option<BrowsingContextId>,
/// The current window size associated with this pipeline.
- window_size: Option<WindowSizeData>,
+ window_size: WindowSizeData,
/// Channel to the layout thread associated with this pipeline.
layout_chan: Sender<message::Msg>,
/// The activity level of the document (inactive, active or fully active).
@@ -210,7 +210,7 @@ impl InProgressLoad {
parent_info: Option<PipelineId>,
opener: Option<BrowsingContextId>,
layout_chan: Sender<message::Msg>,
- window_size: Option<WindowSizeData>,
+ window_size: WindowSizeData,
url: ServoUrl,
origin: MutableOrigin,
) -> InProgressLoad {
@@ -1852,7 +1852,7 @@ impl ScriptThread {
}
let mut loads = self.incomplete_loads.borrow_mut();
if let Some(ref mut load) = loads.iter_mut().find(|load| load.pipeline_id == id) {
- load.window_size = Some(size);
+ load.window_size = size;
return;
}
warn!("resize sent to nonexistent pipeline");