diff options
195 files changed, 1747 insertions, 1046 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 3482d730be4..de02b59d67a 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -35,8 +35,9 @@ use msg::constellation_msg::{NavigationDirection, PipelineId, WindowSizeData}; use pipeline::CompositionPipeline; use profile_traits::mem::{self, ReportKind, Reporter, ReporterRequest}; use profile_traits::time::{self, ProfilerCategory, profile}; -use script_traits::CompositorEvent::{TouchDownEvent, TouchMoveEvent, TouchUpEvent}; +use script_traits::CompositorEvent::TouchEvent; use script_traits::{ConstellationControlMsg, LayoutControlMsg, MouseButton}; +use script_traits::{TouchEventType, TouchId}; use scrolling::ScrollingTimerProxy; use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::collections::{HashMap, HashSet}; @@ -72,23 +73,6 @@ enum ReadyState { ReadyToSaveImage, } -/// The states of the touch input state machine. -/// -/// TODO: Currently Add support for "flinging" (scrolling inertia), pinch zooming, better -/// support for multiple touch points. -enum TouchState { - /// Not tracking any touch point - Nothing, - /// A touchstart event was dispatched to the page, but the response wasn't received yet. - WaitingForScript, - /// Script is consuming the current touch point; don't perform default actions. - DefaultPrevented, - /// A single touch point is active and may perform click or pan default actions. - Touching, - /// A single touch point is active and has started panning. - Panning, -} - /// NB: Never block on the constellation, because sometimes the constellation blocks on us. pub struct IOCompositor<Window: WindowMethods> { /// The application window. @@ -201,6 +185,27 @@ pub struct IOCompositor<Window: WindowMethods> { pending_subpages: HashSet<PipelineId>, } +/// The states of the touch input state machine. +/// +/// TODO: Currently Add support for "flinging" (scrolling inertia), pinch zooming. +enum TouchState { + /// Not tracking any touch point + Nothing, + /// A touchstart event was dispatched to the page, but the response wasn't received yet. + /// Contains the number of active touch points. + WaitingForScript(u32), + /// Script is consuming the current touch sequence; don't perform default actions. + /// Contains the number of active touch points. + DefaultPrevented(u32), + /// A single touch point is active and may perform click or pan default actions. + Touching, + /// A single touch point is active and has started panning. + Panning, + /// A multi-touch gesture is in progress. Contains the number of active touch points. + MultiTouch(u32), +} + + pub struct ScrollEvent { delta: TypedPoint2D<DevicePixel, f32>, cursor: TypedPoint2D<DevicePixel, i32>, @@ -537,10 +542,14 @@ impl<Window: WindowMethods> IOCompositor<Window> { (Msg::TouchEventProcessed(result), ShutdownState::NotShuttingDown) => { match self.touch_gesture_state { - TouchState::WaitingForScript => { + TouchState::WaitingForScript(n) => { self.touch_gesture_state = match result { - EventResult::DefaultAllowed => TouchState::Touching, - EventResult::DefaultPrevented => TouchState::DefaultPrevented, + EventResult::DefaultPrevented => TouchState::DefaultPrevented(n), + EventResult::DefaultAllowed => if n > 1 { + TouchState::MultiTouch(n) + } else { + TouchState::Touching + } }; } _ => {} @@ -1056,6 +1065,15 @@ impl<Window: WindowMethods> IOCompositor<Window> { self.on_mouse_window_move_event_class(cursor); } + WindowEvent::Touch(event_type, identifier, location) => { + match event_type { + TouchEventType::Down => self.on_touch_down(identifier, location), + TouchEventType::Move => self.on_touch_move(identifier, location), + TouchEventType::Up => self.on_touch_up(identifier, location), + TouchEventType::Cancel => self.on_touch_cancel(identifier, location), + } + } + WindowEvent::Scroll(delta, cursor) => { self.on_scroll_window_event(delta, cursor); } @@ -1127,8 +1145,8 @@ impl<Window: WindowMethods> IOCompositor<Window> { if opts::get().convert_mouse_to_touch { match mouse_window_event { MouseWindowEvent::Click(_, _) => {} - MouseWindowEvent::MouseDown(_, p) => self.on_touch_down(0, p), - MouseWindowEvent::MouseUp(_, p) => self.on_touch_up(0, p), + MouseWindowEvent::MouseDown(_, p) => self.on_touch_down(TouchId(0), p), + MouseWindowEvent::MouseUp(_, p) => self.on_touch_up(TouchId(0), p), } return } @@ -1146,7 +1164,7 @@ impl<Window: WindowMethods> IOCompositor<Window> { fn on_mouse_window_move_event_class(&mut self, cursor: TypedPoint2D<DevicePixel, f32>) { if opts::get().convert_mouse_to_touch { - self.on_touch_move(0, cursor); + self.on_touch_move(TouchId(0), cursor); return } @@ -1156,31 +1174,40 @@ impl<Window: WindowMethods> IOCompositor<Window> { } } - fn on_touch_down(&mut self, identifier: i32, point: TypedPoint2D<DevicePixel, f32>) { - match self.touch_gesture_state { + fn on_touch_down(&mut self, identifier: TouchId, point: TypedPoint2D<DevicePixel, f32>) { + self.touch_gesture_state = match self.touch_gesture_state { TouchState::Nothing => { // TODO: Don't wait for script if we know the page has no touch event listeners. self.first_touch_point = Some(point); self.last_touch_point = Some(point); - self.touch_gesture_state = TouchState::WaitingForScript; + TouchState::WaitingForScript(1) } - TouchState::WaitingForScript => { - // TODO: Queue events while waiting for script? + TouchState::Touching | + TouchState::Panning => { + // Was a single-touch sequence; now a multi-touch sequence: + TouchState::MultiTouch(2) } - TouchState::DefaultPrevented => {} - TouchState::Touching => {} - TouchState::Panning => {} - } + TouchState::WaitingForScript(n) => { + TouchState::WaitingForScript(n + 1) + } + TouchState::DefaultPrevented(n) => { + TouchState::DefaultPrevented(n + 1) + } + TouchState::MultiTouch(n) => { + TouchState::MultiTouch(n + 1) + } + }; if let Some(result) = self.find_topmost_layer_at_point(point / self.scene.scale) { - result.layer.send_event(self, TouchDownEvent(identifier, result.point.to_untyped())); + result.layer.send_event(self, TouchEvent(TouchEventType::Down, identifier, + result.point.to_untyped())); } } - fn on_touch_move(&mut self, identifier: i32, point: TypedPoint2D<DevicePixel, f32>) { + fn on_touch_move(&mut self, identifier: TouchId, point: TypedPoint2D<DevicePixel, f32>) { match self.touch_gesture_state { TouchState::Nothing => warn!("Got unexpected touch move event"), - TouchState::WaitingForScript => { + TouchState::WaitingForScript(_) => { // TODO: Queue events while waiting for script? } TouchState::Touching => { @@ -1209,40 +1236,67 @@ impl<Window: WindowMethods> IOCompositor<Window> { None => warn!("last_touch_point not set") } } - TouchState::DefaultPrevented => { + TouchState::DefaultPrevented(_) => { // Send the event to script. if let Some(result) = self.find_topmost_layer_at_point(point / self.scene.scale) { - result.layer.send_event(self, - TouchMoveEvent(identifier, result.point.to_untyped())); + result.layer.send_event(self, TouchEvent(TouchEventType::Move, identifier, + result.point.to_untyped())); } } + TouchState::MultiTouch(_) => { + // TODO: Pinch zooming. + } } self.last_touch_point = Some(point); } - fn on_touch_up(&mut self, identifier: i32, point: TypedPoint2D<DevicePixel, f32>) { - // TODO: Track the number of active touch points, and don't reset stuff until it is zero. - self.first_touch_point = None; - self.last_touch_point = None; - + fn on_touch_up(&mut self, identifier: TouchId, point: TypedPoint2D<DevicePixel, f32>) { // Send the event to script. if let Some(result) = self.find_topmost_layer_at_point(point / self.scene.scale) { - result.layer.send_event(self, TouchUpEvent(identifier, result.point.to_untyped())); + result.layer.send_event(self, TouchEvent(TouchEventType::Up, identifier, + result.point.to_untyped())); } - match self.touch_gesture_state { - TouchState::Nothing => warn!("Got unexpected touch up event"), - - TouchState::WaitingForScript => {} + self.touch_gesture_state = match self.touch_gesture_state { TouchState::Touching => { // TODO: If the duration exceeds some threshold, send a contextmenu event instead. // TODO: Don't send a click if preventDefault is called on the touchend event. self.simulate_mouse_click(point); - } - TouchState::Panning => {} - TouchState::DefaultPrevented => {} - } - self.touch_gesture_state = TouchState::Nothing; + TouchState::Nothing + } + TouchState::Nothing | + TouchState::Panning | + TouchState::WaitingForScript(1) | + TouchState::DefaultPrevented(1) | + TouchState::MultiTouch(1) => { + TouchState::Nothing + } + TouchState::WaitingForScript(n) => TouchState::WaitingForScript(n - 1), + TouchState::DefaultPrevented(n) => TouchState::DefaultPrevented(n - 1), + TouchState::MultiTouch(n) => TouchState::MultiTouch(n - 1), + }; + } + + fn on_touch_cancel(&mut self, identifier: TouchId, point: TypedPoint2D<DevicePixel, f32>) { + // Send the event to script. + if let Some(result) = self.find_topmost_layer_at_point(point / self.scene.scale) { + result.layer.send_event(self, TouchEvent(TouchEventType::Cancel, identifier, + result.point.to_untyped())); + } + + self.touch_gesture_state = match self.touch_gesture_state { + TouchState::Nothing | + TouchState::Touching | + TouchState::Panning | + TouchState::WaitingForScript(1) | + TouchState::DefaultPrevented(1) | + TouchState::MultiTouch(1) => { + TouchState::Nothing + } + TouchState::WaitingForScript(n) => TouchState::WaitingForScript(n - 1), + TouchState::DefaultPrevented(n) => TouchState::DefaultPrevented(n - 1), + TouchState::MultiTouch(n) => TouchState::MultiTouch(n - 1), + }; } /// http://w3c.github.io/touch-events/#mouse-events diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index d335038c70a..d129a6deb5b 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -13,7 +13,7 @@ use layers::geometry::DevicePixel; use layers::platform::surface::NativeDisplay; use msg::constellation_msg::{Key, KeyModifiers, KeyState}; use net_traits::net_error_list::NetError; -use script_traits::MouseButton; +use script_traits::{MouseButton, TouchEventType, TouchId}; use std::fmt::{Debug, Error, Formatter}; use std::rc::Rc; use url::Url; @@ -27,6 +27,7 @@ pub enum MouseWindowEvent { MouseUp(MouseButton, TypedPoint2D<DevicePixel, f32>), } + #[derive(Clone)] pub enum WindowNavigateMsg { Forward, @@ -59,6 +60,8 @@ pub enum WindowEvent { MouseWindowEventClass(MouseWindowEvent), /// Sent when a mouse move. MouseWindowMoveEventClass(TypedPoint2D<DevicePixel, f32>), + /// Touch event: type, identifier, point + Touch(TouchEventType, TouchId, TypedPoint2D<DevicePixel, f32>), /// Sent when the user scrolls. The first point is the delta and the second point is the /// origin. Scroll(TypedPoint2D<DevicePixel, f32>, TypedPoint2D<DevicePixel, i32>), @@ -88,6 +91,7 @@ impl Debug for WindowEvent { WindowEvent::LoadUrl(..) => write!(f, "LoadUrl"), WindowEvent::MouseWindowEventClass(..) => write!(f, "Mouse"), WindowEvent::MouseWindowMoveEventClass(..) => write!(f, "MouseMove"), + WindowEvent::Touch(..) => write!(f, "Touch"), WindowEvent::Scroll(..) => write!(f, "Scroll"), WindowEvent::Zoom(..) => write!(f, "Zoom"), WindowEvent::PinchZoom(..) => write!(f, "PinchZoom"), diff --git a/components/gfx/display_list/mod.rs b/components/gfx/display_list/mod.rs index 5fb8b99d990..d69353e1f72 100644 --- a/components/gfx/display_list/mod.rs +++ b/components/gfx/display_list/mod.rs @@ -31,6 +31,7 @@ use paint_task::{PaintLayerContents, PaintLayer}; use self::DisplayItem::*; use self::DisplayItemIterator::*; use smallvec::SmallVec; +use std::cmp::Ordering; use std::collections::linked_list::{self, LinkedList}; use std::fmt; use std::mem; @@ -141,8 +142,6 @@ pub struct DisplayList { pub positioned_content: LinkedList<DisplayItem>, /// Outlines: step 10. pub outlines: LinkedList<DisplayItem>, - /// Child stacking contexts. - pub children: LinkedList<Arc<StackingContext>>, /// Child PaintLayers that will be rendered on top of everything else. pub layered_children: LinkedList<Arc<PaintLayer>>, /// Information about child layers. @@ -160,7 +159,6 @@ impl DisplayList { content: LinkedList::new(), positioned_content: LinkedList::new(), outlines: LinkedList::new(), - children: LinkedList::new(), layered_children: LinkedList::new(), layer_info: LinkedList::new(), } @@ -176,16 +174,16 @@ impl DisplayList { self.content.append(&mut other.content); self.positioned_content.append(&mut other.positioned_content); self.outlines.append(&mut other.outlines); - self.children.append(&mut other.children); self.layered_children.append(&mut other.layered_children); self.layer_info.append(&mut other.layer_info); } /// Merges all display items from all non-float stacking levels to the `float` stacking level. + /// From E.2.5 at http://www.w3.org/TR/CSS21/zindex.html. We do not include positioned content + /// and stacking contexts in the pseudo-stacking-context. #[inline] pub fn form_float_pseudo_stacking_context(&mut self) { prepend_from(&mut self.floats, &mut self.outlines); - prepend_from(&mut self.floats, &mut self.positioned_content); prepend_from(&mut self.floats, &mut self.content); prepend_from(&mut self.floats, &mut self.block_backgrounds_and_borders); prepend_from(&mut self.floats, &mut self.background_and_borders); @@ -204,25 +202,33 @@ impl DisplayList { /// Returns a list of all items in this display list concatenated together. This is extremely /// inefficient and should only be used for debugging. - pub fn all_display_items(&self) -> Vec<DisplayItem> { + pub fn flatten(&self) -> Vec<DisplayItem> { let mut result = Vec::new(); + fn flatten_item(result: &mut Vec<DisplayItem>, item: &DisplayItem) { + match item { + &DisplayItem::StackingContextClass(ref stacking_context) => + result.extend(stacking_context.display_list.flatten().into_iter()), + _ => result.push((*item).clone()), + } + } + for display_item in &self.background_and_borders { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } for display_item in &self.block_backgrounds_and_borders { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } for display_item in &self.floats { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } for display_item in &self.content { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } for display_item in &self.positioned_content { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } for display_item in &self.outlines { - result.push((*display_item).clone()) + flatten_item(&mut result, display_item); } result } @@ -242,7 +248,11 @@ impl DisplayList { print_tree.new_level(title.to_owned()); for item in items { - print_tree.add_item(format!("{:?}", item)); + match item { + &DisplayItem::StackingContextClass(ref stacking_context) => + stacking_context.print_with_tree(print_tree), + _ => print_tree.add_item(format!("{:?}", item)), + } } print_tree.end_level(); } @@ -258,15 +268,6 @@ impl DisplayList { print_display_list_section(print_tree, &self.positioned_content, "Positioned Content"); print_display_list_section(print_tree, &self.outlines, "Outlines"); - - if !self.children.is_empty() { - print_tree.new_level("Stacking Contexts".to_owned()); - for stacking_context in &self.children { - stacking_context.print_with_tree(print_tree); - } - print_tree.end_level(); - } - if !self.layered_children.is_empty() { print_tree.new_level("Layers".to_owned()); for paint_layer in &self.layered_children { @@ -301,8 +302,6 @@ impl DisplayList { layer_kind: paint_context.layer_kind, }; - let pixels_per_px = paint_subcontext.screen_pixels_per_px(); - if opts::get().dump_display_list_optimized { self.print(format!("Optimized display list. Tile bounds: {:?}", paint_context.page_rect)); @@ -318,74 +317,48 @@ impl DisplayList { // Steps 1 and 2: Borders and background for the root. for display_item in &self.background_and_borders { - display_item.draw_into_context(&mut paint_subcontext) + display_item.draw_into_context(transform, &mut paint_subcontext) } // Step 3: Positioned descendants with negative z-indices. - for positioned_kid in &self.children { - if positioned_kid.z_index >= 0 { - break + for positioned_kid in &self.positioned_content { + if let &DisplayItem::StackingContextClass(ref stacking_context) = positioned_kid { + if stacking_context.z_index < 0 { + positioned_kid.draw_into_context(transform, &mut paint_subcontext); + } } - let new_transform = - transform.translate(positioned_kid.bounds - .origin - .x - .to_nearest_pixel(pixels_per_px) as AzFloat, - positioned_kid.bounds - .origin - .y - .to_nearest_pixel(pixels_per_px) as AzFloat, - 0.0); - positioned_kid.optimize_and_draw_into_context(&mut paint_subcontext, - &new_transform, - Some(&positioned_kid.overflow)) } // Step 4: Block backgrounds and borders. for display_item in &self.block_backgrounds_and_borders { - display_item.draw_into_context(&mut paint_subcontext) + display_item.draw_into_context(transform, &mut paint_subcontext) } // Step 5: Floats. for display_item in &self.floats { - display_item.draw_into_context(&mut paint_subcontext) + display_item.draw_into_context(transform, &mut paint_subcontext) } // TODO(pcwalton): Step 6: Inlines that generate stacking contexts. // Step 7: Content. for display_item in &self.content { - display_item.draw_into_context(&mut paint_subcontext) - } - - // Step 8: Positioned descendants with `z-index: auto`. - for display_item in &self.positioned_content { - display_item.draw_into_context(&mut paint_subcontext) + display_item.draw_into_context(transform, &mut paint_subcontext) } - // Step 9: Positioned descendants with nonnegative, numeric z-indices. - for positioned_kid in &self.children { - if positioned_kid.z_index < 0 { - continue + // Step 8 & 9: Positioned descendants with nonnegative, numeric z-indices. + for positioned_kid in &self.positioned_content { + if let &DisplayItem::StackingContextClass(ref stacking_context) = positioned_kid { + if stacking_context.z_index < 0 { + continue; + } } - let new_transform = - transform.translate(positioned_kid.bounds - .origin - .x - .to_nearest_pixel(pixels_per_px) as AzFloat, - positioned_kid.bounds - .origin - .y - .to_nearest_pixel(pixels_per_px) as AzFloat, - 0.0); - positioned_kid.optimize_and_draw_into_context(&mut paint_subcontext, - &new_transform, - Some(&positioned_kid.overflow)) + positioned_kid.draw_into_context(transform, &mut paint_subcontext); } // Step 10: Outlines. for display_item in &self.outlines { - display_item.draw_into_context(&mut paint_subcontext) + display_item.draw_into_context(transform, &mut paint_subcontext) } // Undo our clipping and transform. @@ -398,25 +371,27 @@ impl DisplayList { point: Point2D<Au>, result: &mut Vec<DisplayItemMetadata>, topmost_only: bool) { - fn hit_test_in_list<'a, I>(point: Point2D<Au>, - result: &mut Vec<DisplayItemMetadata>, - topmost_only: bool, - iterator: I) - where I: Iterator<Item=&'a DisplayItem> { - for item in iterator { + fn hit_test_item(point: Point2D<Au>, + result: &mut Vec<DisplayItemMetadata>, + item: &DisplayItem) { + let base_item = match item.base() { + Some(base) => base, + None => return, + }; + // TODO(pcwalton): Use a precise algorithm here. This will allow us to properly hit // test elements with `border-radius`, for example. - if !item.base().clip.might_intersect_point(&point) { + if !base_item.clip.might_intersect_point(&point) { // Clipped out. - continue + return; } if !geometry::rect_contains_point(item.bounds(), point) { // Can't possibly hit. - continue + return; } - if item.base().metadata.pointing.is_none() { + if base_item.metadata.pointing.is_none() { // `pointer-events` is `none`. Ignore this item. - continue + return; } if let DisplayItem::BorderClass(ref border) = *item { @@ -434,14 +409,23 @@ impl DisplayList { (border.border_widths.top + border.border_widths.bottom))); if geometry::rect_contains_point(interior_rect, point) { - continue + return; } } // We found a hit! - result.push(item.base().metadata); - if topmost_only { - return + result.push(base_item.metadata); + } + + fn hit_test_in_list<'a, I>(point: Point2D<Au>, + result: &mut Vec<DisplayItemMetadata>, + topmost_only: bool, + iterator: I) + where I: Iterator<Item=&'a DisplayItem> { + for item in iterator { + hit_test_item(point, result, item); + if topmost_only && !result.is_empty() { + return; } } } @@ -470,11 +454,16 @@ impl DisplayList { } // Steps 9 and 8: Positioned descendants with nonnegative z-indices. - for kid in self.children.iter().rev() { - if kid.z_index < 0 { - continue + for kid in self.positioned_content.iter().rev() { + if let &DisplayItem::StackingContextClass(ref stacking_context) = kid { + if stacking_context.z_index < 0 { + continue + } + stacking_context.hit_test(point, result, topmost_only); + } else { + hit_test_item(point, result, kid); } - kid.hit_test(point, result, topmost_only); + if topmost_only && !result.is_empty() { return } @@ -485,7 +474,6 @@ impl DisplayList { // // TODO(pcwalton): Step 6: Inlines that generate stacking contexts. for display_list in &[ - &self.positioned_content, &self.content, &self.floats, &self.block_backgrounds_and_borders, @@ -496,14 +484,15 @@ impl DisplayList { } } - // Step 3: Positioned descendants with negative z-indices. - for kid in self.children.iter().rev() { - if kid.z_index >= 0 { - continue - } - kid.hit_test(point, result, topmost_only); - if topmost_only && !result.is_empty() { - return + for kid in self.positioned_content.iter().rev() { + if let &DisplayItem::StackingContextClass(ref stacking_context) = kid { + if stacking_context.z_index >= 0 { + continue + } + stacking_context.hit_test(point, result, topmost_only); + if topmost_only && !result.is_empty() { + return + } } } @@ -523,9 +512,12 @@ impl DisplayList { } } - for kid in &self.children { - if let Some(paint_layer) = kid.display_list.find_layer_with_layer_id(layer_id) { - return Some(paint_layer); + for item in &self.positioned_content { + if let &DisplayItem::StackingContextClass(ref stacking_context) = item { + if let Some(paint_layer) + = stacking_context.display_list.find_layer_with_layer_id(layer_id) { + return Some(paint_layer); + } } } @@ -538,7 +530,7 @@ impl DisplayList { pub fn calculate_bounding_rect(&self) -> Rect<Au> { fn union_all_items(list: &LinkedList<DisplayItem>, mut bounds: Rect<Au>) -> Rect<Au> { for item in list { - bounds = bounds.union(&item.base().bounds); + bounds = bounds.union(&item.bounds()); } bounds }; @@ -550,13 +542,6 @@ impl DisplayList { bounds = union_all_items(&self.content, bounds); bounds = union_all_items(&self.positioned_content, bounds); bounds = union_all_items(&self.outlines, bounds); - - for stacking_context in &self.children { - bounds = bounds.union(&Rect::new( - stacking_context.overflow.origin + stacking_context.bounds.origin, - stacking_context.overflow.size)); - } - bounds } @@ -782,6 +767,7 @@ struct StackingContextLayerCreator { display_list_for_next_layer: Option<DisplayList>, next_layer_info: Option<LayerInfo>, building_ordering_layer: bool, + last_child_layer_info: Option<LayerInfo>, } impl StackingContextLayerCreator { @@ -790,6 +776,7 @@ impl StackingContextLayerCreator { display_list_for_next_layer: None, next_layer_info: None, building_ordering_layer: false, + last_child_layer_info: None, } } @@ -797,34 +784,43 @@ impl StackingContextLayerCreator { fn add_layers_to_preserve_drawing_order(stacking_context: &mut StackingContext) { let mut state = StackingContextLayerCreator::new(); + // First we need to sort positioned content by z-index, so we can paint + // it in order and also so that we can detect situations where unlayered + // content should be on top of layered content. + let positioned_content = mem::replace(&mut stacking_context.display_list.positioned_content, + LinkedList::new()); + let mut sorted_positioned_content: SmallVec<[DisplayItem; 8]> = SmallVec::new(); + sorted_positioned_content.extend(positioned_content.into_iter()); + sorted_positioned_content.sort_by(|this, other| this.compare_zindex(other)); + + // It's important here that we process all elements in paint order, so we can detect + // situations where layers are needed to maintain paint order. state.layerize_display_list_section(DisplayListSection::BackgroundAndBorders, stacking_context); + + let mut remaining_positioned_content: SmallVec<[DisplayItem; 8]> = SmallVec::new(); + for item in sorted_positioned_content.into_iter() { + if !item.has_negative_z_index() { + remaining_positioned_content.push(item); + } else { + state.add_display_item(item, DisplayListSection::PositionedContent, stacking_context); + } + } + state.layerize_display_list_section(DisplayListSection::BlockBackgroundsAndBorders, stacking_context); state.layerize_display_list_section(DisplayListSection::Floats, stacking_context); state.layerize_display_list_section(DisplayListSection::Content, stacking_context); - state.layerize_display_list_section(DisplayListSection::PositionedContent, stacking_context); - state.layerize_display_list_section(DisplayListSection::Outlines, stacking_context); - // First we need to sort child stacking contexts by z-index, so we can detect - // situations where unlayered ones should be on top of layered ones. - let existing_children = mem::replace(&mut stacking_context.display_list.children, - LinkedList::new()); - let mut sorted_children: SmallVec<[Arc<StackingContext>; 8]> = SmallVec::new(); - sorted_children.extend(existing_children.into_iter()); - sorted_children.sort_by(|this, other| this.z_index.cmp(&other.z_index)); - - for child_stacking_context in sorted_children.into_iter() { - state.add_stacking_context(child_stacking_context, stacking_context); + for item in remaining_positioned_content.into_iter() { + assert!(!item.has_negative_z_index()); + state.add_display_item(item, DisplayListSection::PositionedContent, stacking_context); } - state.finish_building_current_layer(stacking_context); - stacking_context.last_child_layer_info = - StackingContextLayerCreator::find_last_child_layer_info(stacking_context); - } - #[inline] - fn all_following_children_need_layers(&self) -> bool { - self.next_layer_info.is_some() + state.layerize_display_list_section(DisplayListSection::Outlines, stacking_context); + + state.finish_building_current_layer(stacking_context); + stacking_context.last_child_layer_info = state.find_last_child_layer_info(stacking_context); } #[inline] @@ -838,9 +834,16 @@ impl StackingContextLayerCreator { } #[inline] + fn all_following_children_need_layers(&self) -> bool { + self.next_layer_info.is_some() + } + + #[inline] fn display_item_needs_layer(&mut self, item: &DisplayItem) -> bool { match *item { LayeredItemClass(_) => true, + StackingContextClass(ref stacking_context) => + stacking_context.layer_info.is_some() || self.all_following_children_need_layers(), _ => self.all_following_children_need_layers(), } } @@ -865,31 +868,64 @@ impl StackingContextLayerCreator { fn add_display_item(&mut self, item: DisplayItem, section: DisplayListSection, - stacking_context: &mut StackingContext) { + parent_stacking_context: &mut StackingContext) { if !self.display_item_needs_layer(&item) { - stacking_context.display_list.get_section_mut(section).push_back(item); + if let DisplayItem::StackingContextClass(ref stacking_context) = item { + // This StackingContext has a layered child somewhere in its children. + // We need to give all new StackingContexts their own layer, so that they + // draw on top of this layered child. + if let Some(layer_info) = stacking_context.last_child_layer_info { + self.last_child_layer_info = stacking_context.last_child_layer_info; + self.building_ordering_layer = true; + self.next_layer_info = + Some(layer_info.clone().next_with_scroll_policy(ScrollPolicy::Scrollable)); + } + } + + parent_stacking_context.display_list.get_section_mut(section).push_back(item); return; } - if let LayeredItemClass(ref item) = item { + if let StackingContextClass(ref stacking_context) = item { + // There is a bit of subtlety here. If this item is a stacking context, + // yet doesn't have a layer assigned this code will fall through. This means that + // stacking contexts that are promoted to layers will share layers with sibling + // display items. + let layer_info = stacking_context.layer_info.clone(); + if let Some(mut layer_info) = layer_info { + self.finish_building_current_layer(parent_stacking_context); + + // We have started processing layered stacking contexts, so any stacking context that + // we process from now on needs its own layer to ensure proper rendering order. + self.building_ordering_layer = true; + self.next_layer_info = + Some(layer_info.next_with_scroll_policy(parent_stacking_context.scroll_policy())); + + parent_stacking_context.display_list.layered_children.push_back( + Arc::new(PaintLayer::new_with_stacking_context(layer_info, + stacking_context.clone(), + color::transparent()))); + return; + } + } + + if let LayeredItemClass(item) = item { if let Some(ref next_layer_info) = self.next_layer_info { if item.layer_id == next_layer_info.layer_id && !self.building_ordering_layer { return; } } - self.finish_building_current_layer(stacking_context); + self.finish_building_current_layer(parent_stacking_context); self.building_ordering_layer = false; - self.next_layer_info = Some(stacking_context.get_layer_info(item.layer_id).clone()); - } else { - self.prepare_ordering_layer(stacking_context); + self.next_layer_info = + Some(parent_stacking_context.get_layer_info(item.layer_id).clone()); + self.add_display_item_to_display_list(item.item, section); + return; } - match item { - LayeredItemClass(layered_item) => - self.add_display_item_to_display_list(layered_item.item, section), - _ => self.add_display_item_to_display_list(item, section), - } + self.prepare_ordering_layer(parent_stacking_context); + self.add_display_item_to_display_list(item, section); } fn add_display_item_to_display_list(&mut self, @@ -904,18 +940,14 @@ impl StackingContextLayerCreator { } } - fn find_last_child_layer_info(stacking_context: &mut StackingContext) -> Option<LayerInfo> { + fn find_last_child_layer_info(self, + stacking_context: &mut StackingContext) + -> Option<LayerInfo> { if let Some(layer) = stacking_context.display_list.layered_children.back() { return Some(LayerInfo::new(layer.id, ScrollPolicy::Scrollable, None)); } - // We only care about the last child, because a layer in a child's hierarchy - // automatically gives following children a layer, so they will be in the - // 'layered_children' list instead of 'children'. - match stacking_context.display_list.children.back() { - Some(child) => child.last_child_layer_info, - None => None, - } + return self.last_child_layer_info; } #[inline] @@ -926,57 +958,6 @@ impl StackingContextLayerCreator { Arc::new(PaintLayer::new_with_display_list(layer_info, display_list))); } } - - #[inline] - fn add_stacking_context(&mut self, - stacking_context: Arc<StackingContext>, - parent_stacking_context: &mut StackingContext) { - if self.all_following_children_need_layers() || stacking_context.layer_info.is_some() { - self.add_layered_stacking_context(stacking_context, parent_stacking_context); - return; - } - - // This StackingContext has a layered child somewhere in its children. - // We need to give all new StackingContexts their own layer, so that they - // draw on top of this layered child. - if let Some(layer_info) = stacking_context.last_child_layer_info { - self.building_ordering_layer = true; - self.next_layer_info = - Some(layer_info.clone().next_with_scroll_policy(ScrollPolicy::Scrollable)); - } - - parent_stacking_context.display_list.children.push_back(stacking_context); - } - - fn add_layered_stacking_context(&mut self, - stacking_context: Arc<StackingContext>, - parent_stacking_context: &mut StackingContext) { - let layer_info = stacking_context.layer_info.clone(); - if let Some(mut layer_info) = layer_info { - self.finish_building_current_layer(parent_stacking_context); - - // We have started processing layered stacking contexts, so any stacking context that - // we process from now on needs its own layer to ensure proper rendering order. - self.building_ordering_layer = true; - self.next_layer_info = - Some(layer_info.next_with_scroll_policy(parent_stacking_context.scroll_policy())); - - parent_stacking_context.display_list.layered_children.push_back( - Arc::new(PaintLayer::new_with_stacking_context(layer_info, - stacking_context, - color::transparent()))); - return; - } - - self.prepare_ordering_layer(parent_stacking_context); - - if self.display_list_for_next_layer.is_none() { - self.display_list_for_next_layer = Some(DisplayList::new()); - } - if let Some(ref mut display_list) = self.display_list_for_next_layer { - display_list.children.push_back(stacking_context); - } - } } /// One drawing command in the list. @@ -989,6 +970,7 @@ pub enum DisplayItem { GradientClass(Box<GradientDisplayItem>), LineClass(Box<LineDisplayItem>), BoxShadowClass(Box<BoxShadowDisplayItem>), + StackingContextClass(Arc<StackingContext>), LayeredItemClass(Box<LayeredItem>), NoopClass(Box<BaseDisplayItem>), } @@ -1436,11 +1418,13 @@ impl<'a> Iterator for DisplayItemIterator<'a> { impl DisplayItem { /// Paints this display item into the given painting context. - fn draw_into_context(&self, paint_context: &mut PaintContext) { - let this_clip = &self.base().clip; - match paint_context.transient_clip { - Some(ref transient_clip) if transient_clip == this_clip => {} - Some(_) | None => paint_context.push_transient_clip((*this_clip).clone()), + fn draw_into_context(&self, transform: &Matrix4, paint_context: &mut PaintContext) { + if let Some(base) = self.base() { + let this_clip = &base.clip; + match paint_context.transient_clip { + Some(ref transient_clip) if transient_clip == this_clip => {} + Some(_) | None => paint_context.push_transient_clip((*this_clip).clone()), + } } match *self { @@ -1491,44 +1475,52 @@ impl DisplayItem { box_shadow.clip_mode); } + DisplayItem::StackingContextClass(ref stacking_context) => { + let pixels_per_px = paint_context.screen_pixels_per_px(); + let new_transform = + transform.translate(stacking_context.bounds + .origin + .x + .to_nearest_pixel(pixels_per_px) as AzFloat, + stacking_context.bounds + .origin + .y + .to_nearest_pixel(pixels_per_px) as AzFloat, + 0.0); + stacking_context.optimize_and_draw_into_context(paint_context, + &new_transform, + Some(&stacking_context.overflow)) + + } + DisplayItem::LayeredItemClass(_) => panic!("Found layered item during drawing."), DisplayItem::NoopClass(_) => { } } } - pub fn base(&self) -> &BaseDisplayItem { + pub fn base(&self) -> Option<&BaseDisplayItem> { match *self { - DisplayItem::SolidColorClass(ref solid_color) => &solid_color.base, - DisplayItem::TextClass(ref text) => &text.base, - DisplayItem::ImageClass(ref image_item) => &image_item.base, - DisplayItem::BorderClass(ref border) => &border.base, - DisplayItem::GradientClass(ref gradient) => &gradient.base, - DisplayItem::LineClass(ref line) => &line.base, - DisplayItem::BoxShadowClass(ref box_shadow) => &box_shadow.base, + DisplayItem::SolidColorClass(ref solid_color) => Some(&solid_color.base), + DisplayItem::TextClass(ref text) => Some(&text.base), + DisplayItem::ImageClass(ref image_item) => Some(&image_item.base), + DisplayItem::BorderClass(ref border) => Some(&border.base), + DisplayItem::GradientClass(ref gradient) => Some(&gradient.base), + DisplayItem::LineClass(ref line) => Some(&line.base), + DisplayItem::BoxShadowClass(ref box_shadow) => Some(&box_shadow.base), DisplayItem::LayeredItemClass(ref layered_item) => layered_item.item.base(), - DisplayItem::NoopClass(ref base_item) => base_item, + DisplayItem::NoopClass(ref base_item) => Some(base_item), + DisplayItem::StackingContextClass(_) => None, } } - pub fn mut_base(&mut self) -> &mut BaseDisplayItem { + pub fn bounds(&self) -> Rect<Au> { match *self { - DisplayItem::SolidColorClass(ref mut solid_color) => &mut solid_color.base, - DisplayItem::TextClass(ref mut text) => &mut text.base, - DisplayItem::ImageClass(ref mut image_item) => &mut image_item.base, - DisplayItem::BorderClass(ref mut border) => &mut border.base, - DisplayItem::GradientClass(ref mut gradient) => &mut gradient.base, - DisplayItem::LineClass(ref mut line) => &mut line.base, - DisplayItem::BoxShadowClass(ref mut box_shadow) => &mut box_shadow.base, - DisplayItem::LayeredItemClass(ref mut layered_item) => layered_item.item.mut_base(), - DisplayItem::NoopClass(ref mut base_item) => base_item, + DisplayItem::StackingContextClass(ref stacking_context) => stacking_context.bounds, + _ => self.base().unwrap().bounds, } } - pub fn bounds(&self) -> Rect<Au> { - self.base().bounds - } - pub fn debug_with_level(&self, level: u32) { let mut indent = String::new(); for _ in 0..level { @@ -1536,11 +1528,29 @@ impl DisplayItem { } println!("{}+ {:?}", indent, self); } + + fn compare_zindex(&self, other: &DisplayItem) -> Ordering { + match (self, other) { + (&DisplayItem::StackingContextClass(ref this), + &DisplayItem::StackingContextClass(ref other)) => this.z_index.cmp(&other.z_index), + (&DisplayItem::StackingContextClass(ref this), _) => this.z_index.cmp(&0), + (_, &DisplayItem::StackingContextClass(ref other)) => 0.cmp(&other.z_index), + (_, _) => Ordering::Equal, + } + } + + fn has_negative_z_index(&self) -> bool { + if let &DisplayItem::StackingContextClass(ref stacking_context) = self { + stacking_context.z_index < 0 + } else { + false + } + } } impl fmt::Debug for DisplayItem { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{} @ {:?} ({:x})", + write!(f, "{} @ {:?}", match *self { DisplayItem::SolidColorClass(ref solid_color) => format!("SolidColor rgba({}, {}, {}, {})", @@ -1554,12 +1564,12 @@ impl fmt::Debug for DisplayItem { DisplayItem::GradientClass(_) => "Gradient".to_owned(), DisplayItem::LineClass(_) => "Line".to_owned(), DisplayItem::BoxShadowClass(_) => "BoxShadow".to_owned(), + DisplayItem::StackingContextClass(_) => "StackingContext".to_owned(), DisplayItem::LayeredItemClass(ref layered_item) => format!("LayeredItem({:?})", layered_item.item), DisplayItem::NoopClass(_) => "Noop".to_owned(), }, - self.base().bounds, - self.base().metadata.node.id() + self.bounds(), ) } } diff --git a/components/gfx/display_list/optimizer.rs b/components/gfx/display_list/optimizer.rs index cda26de2d96..10abe306549 100644 --- a/components/gfx/display_list/optimizer.rs +++ b/components/gfx/display_list/optimizer.rs @@ -40,7 +40,6 @@ impl DisplayListOptimizer { display_list.positioned_content.iter()); self.add_in_bounds_display_items(&mut result.outlines, display_list.outlines.iter()); - self.add_in_bounds_stacking_contexts(&mut result.children, display_list.children.iter()); result } @@ -50,39 +49,49 @@ impl DisplayListOptimizer { display_items: I) where I: Iterator<Item=&'a DisplayItem> { for display_item in display_items { - if self.visible_rect.intersects(&display_item.base().bounds) && - display_item.base().clip.might_intersect_rect(&self.visible_rect) { - result_list.push_back((*display_item).clone()) + if !self.should_include_display_item(display_item) { + continue; } + result_list.push_back((*display_item).clone()) } } - /// Adds child stacking contexts whose boundaries intersect the visible rect to `result_list`. - fn add_in_bounds_stacking_contexts<'a, I>(&self, - result_list: &mut LinkedList<Arc<StackingContext>>, - stacking_contexts: I) - where I: Iterator<Item=&'a Arc<StackingContext>> { - for stacking_context in stacking_contexts { - // Transform this stacking context to get it into the same space as - // the parent stacking context. - let origin_x = stacking_context.bounds.origin.x.to_f32_px(); - let origin_y = stacking_context.bounds.origin.y.to_f32_px(); - - let transform = Matrix4::identity().translate(origin_x, - origin_y, - 0.0) - .mul(&stacking_context.transform); - let transform_2d = Matrix2D::new(transform.m11, transform.m12, - transform.m21, transform.m22, - transform.m41, transform.m42); + fn should_include_display_item(&self, item: &DisplayItem) -> bool { + if let &DisplayItem::StackingContextClass(ref stacking_context) = item { + return self.should_include_stacking_context(stacking_context); + } - let overflow = geometry::au_rect_to_f32_rect(stacking_context.overflow); - let overflow = transform_2d.transform_rect(&overflow); - let overflow = geometry::f32_rect_to_au_rect(overflow); + if !self.visible_rect.intersects(&item.bounds()) { + return false; + } - if self.visible_rect.intersects(&overflow) { - result_list.push_back((*stacking_context).clone()) + if let Some(base_item) = item.base() { + if !base_item.clip.might_intersect_rect(&self.visible_rect) { + return false; } } + + true + } + + fn should_include_stacking_context(&self, stacking_context: &Arc<StackingContext>) -> bool { + // Transform this stacking context to get it into the same space as + // the parent stacking context. + let origin_x = stacking_context.bounds.origin.x.to_f32_px(); + let origin_y = stacking_context.bounds.origin.y.to_f32_px(); + + let transform = Matrix4::identity().translate(origin_x, + origin_y, + 0.0) + .mul(&stacking_context.transform); + let transform_2d = Matrix2D::new(transform.m11, transform.m12, + transform.m21, transform.m22, + transform.m41, transform.m42); + + let overflow = geometry::au_rect_to_f32_rect(stacking_context.overflow); + let overflow = transform_2d.transform_rect(&overflow); + let overflow = geometry::f32_rect_to_au_rect(overflow); + + self.visible_rect.intersects(&overflow) } } diff --git a/components/gfx/paint_task.rs b/components/gfx/paint_task.rs index 9a5821025a9..331c25a0be2 100644 --- a/components/gfx/paint_task.rs +++ b/components/gfx/paint_task.rs @@ -8,7 +8,7 @@ use app_units::Au; use azure::AzFloat; use azure::azure_hl::{BackendType, Color, DrawTarget, SurfaceFormat}; use canvas_traits::CanvasMsg; -use display_list::{DisplayList, LayerInfo, StackingContext}; +use display_list::{DisplayItem, DisplayList, LayerInfo, StackingContext}; use euclid::Matrix4; use euclid::point::Point2D; use euclid::rect::Rect; @@ -499,13 +499,16 @@ impl<C> PaintTask<C> where C: PaintListener + Send + 'static { transform: &Matrix4, perspective: &Matrix4, parent_id: Option<LayerId>) { - for kid in stacking_context.display_list.children.iter() { - build_from_stacking_context(properties, - &kid, - &parent_origin, - &transform, - &perspective, - parent_id) + for kid in stacking_context.display_list.positioned_content.iter() { + if let &DisplayItem::StackingContextClass(ref stacking_context) = kid { + build_from_stacking_context(properties, + &stacking_context, + &parent_origin, + &transform, + &perspective, + parent_id) + + } } for kid in stacking_context.display_list.layered_children.iter() { diff --git a/components/layout/animation.rs b/components/layout/animation.rs index 99d257f38a4..27bf118bfda 100644 --- a/components/layout/animation.rs +++ b/components/layout/animation.rs @@ -58,6 +58,12 @@ pub fn update_animation_state(rw_data: &mut LayoutTaskData, pipeline_id: Pipelin let mut running_animations_hash = (*rw_data.running_animations).clone(); + if running_animations_hash.is_empty() && new_running_animations.is_empty() { + // Nothing to do. Return early so we don't flood the compositor with + // `ChangeRunningAnimationsState` messages. + return + } + // Expire old running animations. let now = clock_ticks::precise_time_s(); let mut keys_to_remove = Vec::new(); diff --git a/components/layout/block.rs b/components/layout/block.rs index 06b003862b4..c4e7a371dce 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -949,9 +949,10 @@ impl BlockFlow { let mut block_size = cur_b - block_start_offset; let is_root = self.is_root(); if is_root { - let screen_size = LogicalSize::from_physical(self.fragment.style.writing_mode, - layout_context.shared.screen_size); - block_size = max(screen_size.block, block_size) + let viewport_size = + LogicalSize::from_physical(self.fragment.style.writing_mode, + layout_context.shared.viewport_size); + block_size = max(viewport_size.block, block_size) } if is_root || self.formatting_context_type() != FormattingContextType::None || @@ -1110,9 +1111,9 @@ impl BlockFlow { pub fn explicit_block_containing_size(&self, layout_context: &LayoutContext) -> Option<Au> { if self.is_root() || self.is_fixed() { - let screen_size = LogicalSize::from_physical(self.fragment.style.writing_mode, - layout_context.shared.screen_size); - Some(screen_size.block) + let viewport_size = LogicalSize::from_physical(self.fragment.style.writing_mode, + layout_context.shared.viewport_size); + Some(viewport_size.block) } else if self.base.flags.contains(IS_ABSOLUTELY_POSITIONED) && self.base.block_container_explicit_block_size.is_none() { self.base.absolute_cb.explicit_block_containing_size(layout_context) @@ -1177,7 +1178,7 @@ impl BlockFlow { fn calculate_absolute_block_size_and_margins(&mut self, layout_context: &LayoutContext) { let opaque_self = OpaqueFlow::from_flow(self); let containing_block_block_size = - self.containing_block_size(&layout_context.shared.screen_size, opaque_self).block; + self.containing_block_size(&layout_context.shared.viewport_size, opaque_self).block; // This is the stored content block-size value from assign-block-size let content_block_size = self.fragment.border_box.size.block; @@ -1335,7 +1336,7 @@ impl BlockFlow { // Calculate containing block inline size. let containing_block_size = if flags.contains(IS_ABSOLUTELY_POSITIONED) { - self.containing_block_size(&layout_context.shared.screen_size, opaque_self).inline + self.containing_block_size(&layout_context.shared.viewport_size, opaque_self).inline } else { content_inline_size }; @@ -1668,7 +1669,7 @@ impl Flow for BlockFlow { debug!("Setting root position"); self.base.position.start = LogicalPoint::zero(self.base.writing_mode); self.base.block_container_inline_size = LogicalSize::from_physical( - self.base.writing_mode, layout_context.shared.screen_size).inline; + self.base.writing_mode, layout_context.shared.viewport_size).inline; self.base.block_container_writing_mode = self.base.writing_mode; // The root element is never impacted by floats. @@ -1932,12 +1933,12 @@ impl Flow for BlockFlow { let visible_rect = match layout_context.shared.visible_rects.get(&self.layer_id()) { Some(visible_rect) => *visible_rect, - None => Rect::new(Point2D::zero(), layout_context.shared.screen_size), + None => Rect::new(Point2D::zero(), layout_context.shared.viewport_size), }; - let screen_size = layout_context.shared.screen_size; - visible_rect.inflate(screen_size.width * DISPLAY_PORT_SIZE_FACTOR, - screen_size.height * DISPLAY_PORT_SIZE_FACTOR) + let viewport_size = layout_context.shared.viewport_size; + visible_rect.inflate(viewport_size.width * DISPLAY_PORT_SIZE_FACTOR, + viewport_size.height * DISPLAY_PORT_SIZE_FACTOR) } else if is_stacking_context { self.base .stacking_relative_position_of_display_port @@ -2658,7 +2659,7 @@ impl ISizeAndMarginsComputer for AbsoluteNonReplaced { layout_context: &LayoutContext) -> Au { let opaque_block = OpaqueFlow::from_flow(block); - block.containing_block_size(&layout_context.shared.screen_size, opaque_block).inline + block.containing_block_size(&layout_context.shared.viewport_size, opaque_block).inline } fn set_inline_position_of_flow_if_necessary(&self, @@ -2770,7 +2771,7 @@ impl ISizeAndMarginsComputer for AbsoluteReplaced { -> MaybeAuto { let opaque_block = OpaqueFlow::from_flow(block); let containing_block_inline_size = - block.containing_block_size(&layout_context.shared.screen_size, opaque_block).inline; + block.containing_block_size(&layout_context.shared.viewport_size, opaque_block).inline; let fragment = block.fragment(); fragment.assign_replaced_inline_size_if_necessary(containing_block_inline_size); // For replaced absolute flow, the rest of the constraint solving will @@ -2784,7 +2785,7 @@ impl ISizeAndMarginsComputer for AbsoluteReplaced { layout_context: &LayoutContext) -> Au { let opaque_block = OpaqueFlow::from_flow(block); - block.containing_block_size(&layout_context.shared.screen_size, opaque_block).inline + block.containing_block_size(&layout_context.shared.viewport_size, opaque_block).inline } fn set_inline_position_of_flow_if_necessary(&self, diff --git a/components/layout/construct.rs b/components/layout/construct.rs index e8f9b8df81c..32f540e1d36 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -33,8 +33,8 @@ use inline::{InlineFragmentNodeInfo, LAST_FRAGMENT_OF_ELEMENT}; use list_item::{ListItemFlow, ListStyleTypeContent}; use multicol::MulticolFlow; use parallel; -use script::dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, ElementTypeId}; -use script::dom::bindings::codegen::InheritTypes::{HTMLElementTypeId, NodeTypeId}; +use script::dom::bindings::inheritance::{CharacterDataTypeId, ElementTypeId}; +use script::dom::bindings::inheritance::{HTMLElementTypeId, NodeTypeId}; use script::dom::htmlobjectelement::is_image_data; use std::borrow::ToOwned; use std::collections::LinkedList; diff --git a/components/layout/context.rs b/components/layout/context.rs index 4f2cf89de2e..f3db3d80a01 100644 --- a/components/layout/context.rs +++ b/components/layout/context.rs @@ -82,8 +82,8 @@ pub struct SharedLayoutContext { /// A channel for the image cache to send responses to. pub image_cache_sender: ImageCacheChan, - /// The current screen size. - pub screen_size: Size2D<Au>, + /// The current viewport size. + pub viewport_size: Size2D<Au>, /// Screen sized changed? pub screen_size_changed: bool, diff --git a/components/layout/css/matching.rs b/components/layout/css/matching.rs index 76a25671546..456f8cbe88f 100644 --- a/components/layout/css/matching.rs +++ b/components/layout/css/matching.rs @@ -10,7 +10,7 @@ use animation; use context::SharedLayoutContext; use data::LayoutDataWrapper; use incremental::{self, RestyleDamage}; -use script::dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId}; +use script::dom::bindings::inheritance::{CharacterDataTypeId, NodeTypeId}; use script::layout_interface::Animation; use selectors::bloom::BloomFilter; use selectors::matching::{CommonStyleAffectingAttributeMode, CommonStyleAffectingAttributes}; @@ -463,7 +463,7 @@ impl<'ln> PrivateMatchMethods for LayoutNode<'ln> { None => None, Some(ref style) => Some(&**style), }; - let (the_style, is_cacheable) = cascade(layout_context.screen_size, + let (the_style, is_cacheable) = cascade(layout_context.viewport_size, applicable_declarations, shareable, Some(&***parent_style), @@ -472,7 +472,7 @@ impl<'ln> PrivateMatchMethods for LayoutNode<'ln> { this_style = the_style } None => { - let (the_style, is_cacheable) = cascade(layout_context.screen_size, + let (the_style, is_cacheable) = cascade(layout_context.viewport_size, applicable_declarations, shareable, None, diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index f5c9e0dc600..6e89c4b0df6 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -81,7 +81,8 @@ impl DisplayListBuildingResult { match *self { DisplayListBuildingResult::None => return, DisplayListBuildingResult::StackingContext(ref mut stacking_context) => { - display_list.children.push_back((*stacking_context).clone()) + display_list.positioned_content.push_back( + DisplayItem::StackingContextClass((*stacking_context).clone())) } DisplayListBuildingResult::Normal(ref mut source_display_list) => { display_list.append_from(&mut **source_display_list) @@ -1691,11 +1692,12 @@ impl BlockFlowDisplayListBuilding for BlockFlow { let stacking_context = match outer_display_list_for_overflow_scroll { Some(mut outer_display_list) => { - outer_display_list.children.push_back(self.fragment.create_stacking_context( - &self.base, - display_list, - scroll_policy, - StackingContextCreationMode::InnerScrollWrapper)); + outer_display_list.positioned_content.push_back( + DisplayItem::StackingContextClass(self.fragment.create_stacking_context( + &self.base, + display_list, + scroll_policy, + StackingContextCreationMode::InnerScrollWrapper))); self.fragment.create_stacking_context( &self.base, outer_display_list, diff --git a/components/layout/flow.rs b/components/layout/flow.rs index baaf450e92b..8e585032c6e 100644 --- a/components/layout/flow.rs +++ b/components/layout/flow.rs @@ -921,11 +921,12 @@ pub struct BaseFlow { impl fmt::Debug for BaseFlow { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, - "@ {:?}, CC {}, ADC {}, Ovr {:?}", + "@ {:?}, CC {}, ADC {}, Ovr {:?}, Dmg {:?}", self.position, self.parallel.children_count.load(Ordering::SeqCst), self.abs_descendants.len(), - self.overflow) + self.overflow, + self.restyle_damage) } } @@ -1084,19 +1085,21 @@ impl BaseFlow { let all_items = match self.display_list_building_result { DisplayListBuildingResult::None => Vec::new(), DisplayListBuildingResult::StackingContext(ref stacking_context) => { - stacking_context.display_list.all_display_items() + stacking_context.display_list.flatten() } - DisplayListBuildingResult::Normal(ref display_list) => display_list.all_display_items(), + DisplayListBuildingResult::Normal(ref display_list) => display_list.flatten(), }; for item in &all_items { - let paint_bounds = item.base().clip.clone().intersect_rect(&item.base().bounds); - if !paint_bounds.might_be_nonempty() { - continue; - } + if let Some(base_item) = item.base() { + let paint_bounds = base_item.clip.clone().intersect_rect(&base_item.bounds); + if !paint_bounds.might_be_nonempty() { + continue; + } - if bounds.union(&paint_bounds.bounding_rect()) != bounds { - error!("DisplayList item {:?} outside of Flow overflow ({:?})", item, paint_bounds); + if bounds.union(&paint_bounds.bounding_rect()) != bounds { + error!("DisplayList item {:?} outside of Flow overflow ({:?})", item, paint_bounds); + } } } } diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index 06c56110386..42dcddb57a4 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -109,9 +109,13 @@ pub struct LayoutTaskData { /// The channel on which messages can be sent to the constellation. pub constellation_chan: ConstellationChan, - /// The size of the viewport. + /// The size of the screen. pub screen_size: Size2D<Au>, + /// The size of the viewport. This may be different from the size of the screen due to viewport + /// constraints. + pub viewport_size: Size2D<Au>, + /// The root stacking context. pub stacking_context: Option<Arc<StackingContext>>, @@ -408,6 +412,7 @@ impl LayoutTask { image_cache_task: image_cache_task, constellation_chan: constellation_chan, screen_size: screen_size, + viewport_size: screen_size, stacking_context: None, stylist: stylist, parallel_traversal: parallel_traversal, @@ -445,7 +450,7 @@ impl LayoutTask { SharedLayoutContext { image_cache_task: rw_data.image_cache_task.clone(), image_cache_sender: self.image_cache_sender.clone(), - screen_size: rw_data.screen_size.clone(), + viewport_size: rw_data.viewport_size.clone(), screen_size_changed: screen_size_changed, constellation_chan: rw_data.constellation_chan.clone(), layout_chan: self.chan.clone(), @@ -1033,7 +1038,7 @@ impl LayoutTask { || { flow::mut_base(flow_ref::deref_mut(layout_root)).stacking_relative_position = LogicalPoint::zero(writing_mode).to_physical(writing_mode, - rw_data.screen_size); + rw_data.viewport_size); flow::mut_base(flow_ref::deref_mut(layout_root)).clip = ClippingRegion::from_rect(&data.page_clip_rect); @@ -1138,24 +1143,31 @@ impl LayoutTask { let mut rw_data = self.lock_rw_data(possibly_locked_rw_data); let initial_viewport = data.window_size.initial_viewport; - let old_screen_size = rw_data.screen_size; + let old_viewport_size = rw_data.viewport_size; let current_screen_size = Size2D::new(Au::from_f32_px(initial_viewport.width.get()), Au::from_f32_px(initial_viewport.height.get())); rw_data.screen_size = current_screen_size; - // Handle conditions where the entire flow tree is invalid. - let screen_size_changed = current_screen_size != old_screen_size; - if screen_size_changed { - // Calculate the actual viewport as per DEVICE-ADAPT § 6 - let device = Device::new(MediaType::Screen, initial_viewport); - rw_data.stylist.set_device(device); + // Calculate the actual viewport as per DEVICE-ADAPT § 6 + let device = Device::new(MediaType::Screen, initial_viewport); + rw_data.stylist.set_device(device); - if let Some(constraints) = rw_data.stylist.constrain_viewport() { + let constraints = rw_data.stylist.constrain_viewport(); + rw_data.viewport_size = match constraints { + Some(ref constraints) => { debug!("Viewport constraints: {:?}", constraints); // other rules are evaluated against the actual viewport - rw_data.screen_size = Size2D::new(Au::from_f32_px(constraints.size.width.get()), - Au::from_f32_px(constraints.size.height.get())); + Size2D::new(Au::from_f32_px(constraints.size.width.get()), + Au::from_f32_px(constraints.size.height.get())) + } + None => current_screen_size, + }; + + // Handle conditions where the entire flow tree is invalid. + let viewport_size_changed = rw_data.viewport_size != old_viewport_size; + if viewport_size_changed { + if let Some(constraints) = constraints { let device = Device::new(MediaType::Screen, constraints.size); rw_data.stylist.set_device(device); @@ -1168,7 +1180,7 @@ impl LayoutTask { // If the entire flow tree is invalid, then it will be reflowed anyhow. let needs_dirtying = rw_data.stylist.update(); - let needs_reflow = screen_size_changed && !needs_dirtying; + let needs_reflow = viewport_size_changed && !needs_dirtying; unsafe { if needs_dirtying { LayoutTask::dirty_all_nodes(node); @@ -1184,14 +1196,16 @@ impl LayoutTask { if !needs_dirtying { for &(el, state_change) in state_changes.iter() { debug_assert!(!state_change.is_empty()); - let hint = rw_data.stylist.restyle_hint_for_state_change(&el, el.get_state(), state_change); + let hint = rw_data.stylist.restyle_hint_for_state_change(&el, + el.get_state(), + state_change); el.note_restyle_hint(hint); } } // Create a layout context for use throughout the following passes. let mut shared_layout_context = self.build_shared_layout_context(&*rw_data, - screen_size_changed, + viewport_size_changed, &self.url, data.reflow_info.goal); @@ -1262,8 +1276,8 @@ impl LayoutTask { let mut must_regenerate_display_lists = false; let mut old_visible_rects = HashMap::with_hash_state(Default::default()); let inflation_amount = - Size2D::new(rw_data.screen_size.width * DISPLAY_PORT_THRESHOLD_SIZE_FACTOR, - rw_data.screen_size.height * DISPLAY_PORT_THRESHOLD_SIZE_FACTOR); + Size2D::new(rw_data.viewport_size.width * DISPLAY_PORT_THRESHOLD_SIZE_FACTOR, + rw_data.viewport_size.height * DISPLAY_PORT_THRESHOLD_SIZE_FACTOR); for &(ref layer_id, ref new_visible_rect) in &new_visible_rects { match rw_data.visible_rects.get(layer_id) { None => { diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index a9bb80ee49a..b761e2dc926 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -37,9 +37,8 @@ use incremental::RestyleDamage; use msg::constellation_msg::PipelineId; use opaque_node::OpaqueNodeMethods; use script::dom::attr::AttrValue; -use script::dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, ElementTypeId}; -use script::dom::bindings::codegen::InheritTypes::{HTMLElementTypeId, NodeTypeId}; -use script::dom::bindings::conversions::Castable; +use script::dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId}; +use script::dom::bindings::inheritance::{HTMLElementTypeId, NodeTypeId}; use script::dom::bindings::js::LayoutJS; use script::dom::characterdata::LayoutCharacterDataHelpers; use script::dom::document::{Document, LayoutDocumentHelpers}; @@ -1005,10 +1004,9 @@ impl<'ln> ThreadSafeLayoutNode<'ln> { return Some(CharIndex(search_index(insertion_point, text.char_indices()))); } if let Some(input) = this.downcast::<HTMLInputElement>() { - let insertion_point = unsafe { input.get_insertion_point_for_layout() }; - if let Some(insertion_point) = insertion_point { - let text = unsafe { input.get_value_for_layout() }; - return Some(CharIndex(search_index(insertion_point.index, text.char_indices()))); + let insertion_point_index = unsafe { input.get_insertion_point_index_for_layout() }; + if let Some(insertion_point_index) = insertion_point_index { + return Some(CharIndex(insertion_point_index)); } } None diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 62e461dbc21..8f528943208 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -477,6 +477,39 @@ fn request_must_be_secured(url: &Url, hsts_list: &Arc<RwLock<HSTSList>>) -> bool } } +pub fn modify_request_headers(headers: &mut Headers, + doc_url: &Url, + user_agent: &str, + cookie_jar: &Arc<RwLock<CookieStorage>>) { + // Ensure that the host header is set from the original url + let host = Host { + hostname: doc_url.serialize_host().unwrap(), + port: doc_url.port_or_default() + }; + headers.set(host); + headers.set(UserAgent(user_agent.to_owned())); + + set_default_accept(headers); + set_default_accept_encoding(headers); + set_request_cookies(doc_url.clone(), headers, cookie_jar); +} + +pub fn process_response_headers(response: &HttpResponse, + url: &Url, + doc_url: &Url, + cookie_jar: &Arc<RwLock<CookieStorage>>, + hsts_list: &Arc<RwLock<HSTSList>>) { + info!("got HTTP response {}, headers:", response.status()); + if log_enabled!(log::LogLevel::Info) { + for header in response.headers().iter() { + info!(" - {}", header); + } + } + + set_cookies_from_response(doc_url.clone(), response, cookie_jar); + update_sts_list_from_response(url, response, hsts_list); +} + pub fn load<A>(load_data: LoadData, hsts_list: Arc<RwLock<HSTSList>>, cookie_jar: Arc<RwLock<CookieStorage>>, @@ -526,12 +559,6 @@ pub fn load<A>(load_data: LoadData, info!("requesting {}", url.serialize()); - // Ensure that the host header is set from the original url - let host = Host { - hostname: doc_url.serialize_host().unwrap(), - port: doc_url.port_or_default() - }; - // Avoid automatically preserving request headers when redirects occur. // See https://bugzilla.mozilla.org/show_bug.cgi?id=401564 and // https://bugzilla.mozilla.org/show_bug.cgi?id=216828 . @@ -544,13 +571,7 @@ pub fn load<A>(load_data: LoadData, load_data.preserved_headers.clone() }; - request_headers.set(host); - - request_headers.set(UserAgent(user_agent.clone())); - - set_default_accept(&mut request_headers); - set_default_accept_encoding(&mut request_headers); - set_request_cookies(doc_url.clone(), &mut request_headers, &cookie_jar); + modify_request_headers(&mut request_headers, &doc_url, &user_agent, &cookie_jar); let request_id = uuid::Uuid::new_v4().to_simple_string(); @@ -621,15 +642,7 @@ pub fn load<A>(load_data: LoadData, break; } - info!("got HTTP response {}, headers:", response.status()); - if log_enabled!(log::LogLevel::Info) { - for header in response.headers().iter() { - info!(" - {}", header); - } - } - - set_cookies_from_response(doc_url.clone(), &response, &cookie_jar); - update_sts_list_from_response(&url, &response, &hsts_list); + process_response_headers(&response, &url, &doc_url, &cookie_jar, &hsts_list); // --- Loop if there's a redirect if response.status().class() == StatusClass::Redirection { diff --git a/components/plugins/reflector.rs b/components/plugins/reflector.rs index 4e4a0f3b442..027f2ecf172 100644 --- a/components/plugins/reflector.rs +++ b/components/plugins/reflector.rs @@ -16,13 +16,13 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable: let struct_name = item.ident; // This path has to be hardcoded, unfortunately, since we can't resolve paths at expansion time match def.fields.iter().find( - |f| match_ty_unwrap(&*f.node.ty, &["dom", "bindings", "utils", "Reflector"]).is_some()) { + |f| match_ty_unwrap(&*f.node.ty, &["dom", "bindings", "reflector", "Reflector"]).is_some()) { // If it has a field that is a Reflector, use that Some(f) => { let field_name = f.node.ident(); let impl_item = quote_item!(cx, - impl ::dom::bindings::utils::Reflectable for $struct_name { - fn reflector<'a>(&'a self) -> &'a ::dom::bindings::utils::Reflector { + impl ::dom::bindings::reflector::Reflectable for $struct_name { + fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { &self.$field_name } fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { @@ -36,8 +36,8 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable: None => { let field_name = def.fields[0].node.ident(); let impl_item = quote_item!(cx, - impl ::dom::bindings::utils::Reflectable for $struct_name { - fn reflector<'a>(&'a self) -> &'a ::dom::bindings::utils::Reflector { + impl ::dom::bindings::reflector::Reflectable for $struct_name { + fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { self.$field_name.reflector() } fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { diff --git a/components/script/devtools.rs b/components/script/devtools.rs index bc6dc34ad4f..d78aab08d91 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -8,8 +8,9 @@ use devtools_traits::{EvaluateJSReply, Modification, NodeInfo, TimelineMarker, T use dom::bindings::codegen::Bindings::DOMRectBinding::{DOMRectMethods}; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::ElementBinding::{ElementMethods}; -use dom::bindings::conversions::{Castable, FromJSValConvertible, jsstring_to_str}; +use dom::bindings::conversions::{FromJSValConvertible, jsstring_to_str}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::element::Element; use dom::node::Node; @@ -155,12 +156,12 @@ pub fn handle_modify_attribute(page: &Rc<Page>, let node = find_node_by_unique_id(&*page, pipeline, node_id); let elem = node.downcast::<Element>().expect("should be getting layout of element"); - for modification in &modifications { + for modification in modifications { match modification.newValue { - Some(ref string) => { - let _ = elem.SetAttribute(modification.attributeName.clone(), string.clone()); + Some(string) => { + let _ = elem.SetAttribute(modification.attributeName, string); }, - None => elem.RemoveAttribute(modification.attributeName.clone()), + None => elem.RemoveAttribute(modification.attributeName), } } } diff --git a/components/script/dom/activation.rs b/components/script/dom/activation.rs index bd843f557bb..15db5e9f3eb 100644 --- a/components/script/dom/activation.rs +++ b/components/script/dom/activation.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::element::Element; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 50e028a03b3..747d5f74013 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -6,11 +6,11 @@ use cssparser::RGBA; use devtools_traits::AttrInfo; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::AttrBinding::{self, AttrMethods}; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap}; use dom::bindings::js::{LayoutJS, Root, RootedReference}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::element::{AttributeMutation, Element}; use dom::values::UNSIGNED_LONG_MAX; use dom::virtualmethods::vtable_for; diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index a879e469e27..1b067c5c596 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -6,7 +6,7 @@ use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::global_object_for_js_object; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use js::jsapi::GetGlobalForObjectCrossCompartment; use js::jsapi::{Heap, MutableHandleObject, RootedObject, RootedValue}; use js::jsapi::{IsCallable, JSContext, JSObject, JS_WrapObject}; diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 0aa15a8d5a6..4134fb104fe 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -5201,6 +5201,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::global::global_object_for_js_object', 'dom::bindings::js::{JS, Root, RootedReference}', 'dom::bindings::js::{OptionalRootedReference}', + 'dom::bindings::reflector::{Reflectable}', 'dom::bindings::utils::{create_dom_global, do_create_interface_objects}', 'dom::bindings::utils::ConstantSpec', 'dom::bindings::utils::{DOMClass}', @@ -5210,7 +5211,6 @@ class CGBindingRoot(CGThing): 'dom::bindings::utils::{finalize_global, trace_global}', 'dom::bindings::utils::has_property_on_prototype', 'dom::bindings::utils::is_platform_object', - 'dom::bindings::utils::{Reflectable}', 'dom::bindings::utils::throwing_constructor', 'dom::bindings::utils::get_dictionary_property', 'dom::bindings::utils::set_dictionary_property', @@ -5919,10 +5919,11 @@ class GlobalGenRoots(): descriptors = config.getDescriptors(register=True, isCallback=False) imports = [CGGeneric("use dom::types::*;\n"), - CGGeneric("use dom::bindings::conversions::{Castable, DerivedFrom, get_dom_class};\n"), + CGGeneric("use dom::bindings::conversions::{DerivedFrom, get_dom_class};\n"), + CGGeneric("use dom::bindings::inheritance::Castable;\n"), CGGeneric("use dom::bindings::js::{JS, LayoutJS, Root};\n"), CGGeneric("use dom::bindings::trace::JSTraceable;\n"), - CGGeneric("use dom::bindings::utils::Reflectable;\n"), + CGGeneric("use dom::bindings::reflector::Reflectable;\n"), CGGeneric("use js::jsapi::JSTracer;\n\n"), CGGeneric("use std::mem;\n\n")] allprotos = [] @@ -5959,8 +5960,8 @@ class GlobalGenRoots(): ("ID used by interfaces that are not castable.", "Alone"), ] topTypeVariants += [ - ("ID used by interfaces that derive from %s." % name, "%s(%sTypeId)" % (name, name)) - for name in topTypes + ("ID used by interfaces that derive from %s." % typeName, "%s(%sTypeId)" % (typeName, typeName)) + for typeName in topTypes ] topTypeVariantsAsStrings = [CGGeneric("/// %s\n%s," % variant) for variant in topTypeVariants] typeIdCode.append(CGWrapper(CGIndenter(CGList(topTypeVariantsAsStrings, "\n"), 4), @@ -5977,7 +5978,7 @@ class GlobalGenRoots(): variants = [] if not config.getInterface(base).getExtendedAttribute("Abstract"): variants.append(CGGeneric(base)) - variants += [CGGeneric(type_id_variant(name)) for name in derived] + variants += [CGGeneric(type_id_variant(derivedName)) for derivedName in derived] derives = "Clone, Copy, Debug" if base != 'EventTarget' and base != 'HTMLElement': derives += ", PartialEq" diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 710a5715fa4..591b468c515 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -34,10 +34,12 @@ use core::nonzero::NonZero; use dom::bindings::error::throw_type_error; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::num::Finite; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::str::{ByteString, USVString}; -use dom::bindings::utils::{DOMClass, Reflectable, Reflector}; +use dom::bindings::utils::DOMClass; use js; use js::glue::{GetProxyPrivate, IsWrapper, RUST_JS_NumberValue}; use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING, UnwrapObject}; @@ -55,7 +57,6 @@ use libc; use num::Float; use num::traits::{Bounded, Zero}; use std::borrow::ToOwned; -use std::mem; use std::rc::Rc; use std::{char, ptr, slice}; use util::str::DOMString; @@ -107,32 +108,6 @@ pub trait IDLInterface { fn derives(&'static DOMClass) -> bool; } -/// A trait to hold the cast functions of IDL interfaces that either derive -/// or are derived from other interfaces. -pub trait Castable: IDLInterface + Reflectable + Sized { - /// Check whether a DOM object implements one of its deriving interfaces. - fn is<T>(&self) -> bool where T: DerivedFrom<Self> { - let class = unsafe { - get_dom_class(self.reflector().get_jsobject().get()).unwrap() - }; - T::derives(class) - } - - /// Cast a DOM object upwards to one of the interfaces it derives from. - fn upcast<T>(&self) -> &T where T: Castable, Self: DerivedFrom<T> { - unsafe { mem::transmute(self) } - } - - /// Cast a DOM object downwards to one of the interfaces it might implement. - fn downcast<T>(&self) -> Option<&T> where T: DerivedFrom<Self> { - if self.is::<T>() { - Some(unsafe { mem::transmute(self) }) - } else { - None - } - } -} - /// A trait to mark an IDL interface as deriving from another one. #[rustc_on_unimplemented = "The IDL interface `{Self}` is not derived from `{T}`."] pub trait DerivedFrom<T: Castable>: Castable {} diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index e91e94a0a4b..d89c1c21f32 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -11,7 +11,7 @@ use devtools_traits::ScriptToDevtoolsControlMsg; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::conversions::native_from_reflector_jsmanaged; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::window::{self, ScriptHelpers}; use dom::workerglobalscope::WorkerGlobalScope; use ipc_channel::ipc::IpcSender; diff --git a/components/script/dom/bindings/inheritance.rs b/components/script/dom/bindings/inheritance.rs new file mode 100644 index 00000000000..920ecb07397 --- /dev/null +++ b/components/script/dom/bindings/inheritance.rs @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +//! The `Castable` trait. + +pub use dom::bindings::codegen::InheritTypes::*; + +use dom::bindings::conversions::get_dom_class; +use dom::bindings::conversions::{DerivedFrom, IDLInterface}; +use dom::bindings::reflector::Reflectable; +use std::mem; + +/// A trait to hold the cast functions of IDL interfaces that either derive +/// or are derived from other interfaces. +pub trait Castable: IDLInterface + Reflectable + Sized { + /// Check whether a DOM object implements one of its deriving interfaces. + fn is<T>(&self) -> bool where T: DerivedFrom<Self> { + let class = unsafe { + get_dom_class(self.reflector().get_jsobject().get()).unwrap() + }; + T::derives(class) + } + + /// Cast a DOM object upwards to one of the interfaces it derives from. + fn upcast<T>(&self) -> &T where T: Castable, Self: DerivedFrom<T> { + unsafe { mem::transmute(self) } + } + + /// Cast a DOM object downwards to one of the interfaces it might implement. + fn downcast<T>(&self) -> Option<&T> where T: DerivedFrom<Self> { + if self.is::<T>() { + Some(unsafe { mem::transmute(self) }) + } else { + None + } + } +} diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index c78399189ab..55491d5d624 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -24,10 +24,11 @@ //! use core::nonzero::NonZero; -use dom::bindings::conversions::{Castable, DerivedFrom}; +use dom::bindings::conversions::DerivedFrom; +use dom::bindings::inheritance::Castable; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::trace::JSTraceable; use dom::bindings::trace::trace_reflector; -use dom::bindings::utils::{Reflectable, Reflector}; use dom::node::Node; use js::jsapi::{Heap, JSObject, JSTracer}; use js::jsval::JSVal; diff --git a/components/script/dom/bindings/mod.rs b/components/script/dom/bindings/mod.rs index 394c7b722bf..f4b795f8c58 100644 --- a/components/script/dom/bindings/mod.rs +++ b/components/script/dom/bindings/mod.rs @@ -137,14 +137,17 @@ pub mod cell; pub mod conversions; pub mod error; pub mod global; +pub mod inheritance; pub mod js; pub mod num; pub mod proxyhandler; pub mod refcounted; +pub mod reflector; pub mod str; pub mod structuredclone; pub mod trace; pub mod utils; +pub mod xmlname; /// Generated JS-Rust bindings. #[allow(missing_docs, non_snake_case)] diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs index ee8647be3ce..88d853405a0 100644 --- a/components/script/dom/bindings/refcounted.rs +++ b/components/script/dom/bindings/refcounted.rs @@ -24,8 +24,8 @@ use core::nonzero::NonZero; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::trace::trace_reflector; -use dom::bindings::utils::{Reflectable, Reflector}; use js::jsapi::{JSContext, JSTracer}; use libc; use script_task::{CommonScriptMsg, ScriptChan}; diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs new file mode 100644 index 00000000000..e0a090a8d88 --- /dev/null +++ b/components/script/dom/bindings/reflector.rs @@ -0,0 +1,79 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +//! The `Reflector` struct. + +use dom::bindings::global::GlobalRef; +use dom::bindings::js::Root; +use js::jsapi::{HandleObject, JSContext, JSObject}; +use std::cell::UnsafeCell; +use std::ptr; + +/// Create the reflector for a new DOM object and yield ownership to the +/// reflector. +pub fn reflect_dom_object<T: Reflectable> + (obj: Box<T>, + global: GlobalRef, + wrap_fn: extern "Rust" fn(*mut JSContext, GlobalRef, Box<T>) -> Root<T>) + -> Root<T> { + wrap_fn(global.get_cx(), global, obj) +} + +/// A struct to store a reference to the reflector of a DOM object. +#[allow(raw_pointer_derive, unrooted_must_root)] +#[must_root] +#[servo_lang = "reflector"] +#[derive(HeapSizeOf)] +// If you're renaming or moving this field, update the path in plugins::reflector as well +pub struct Reflector { + #[ignore_heap_size_of = "defined and measured in rust-mozjs"] + object: UnsafeCell<*mut JSObject>, +} + +#[allow(unrooted_must_root)] +impl PartialEq for Reflector { + fn eq(&self, other: &Reflector) -> bool { + unsafe { *self.object.get() == *other.object.get() } + } +} + +impl Reflector { + /// Get the reflector. + #[inline] + pub fn get_jsobject(&self) -> HandleObject { + unsafe { HandleObject::from_marked_location(self.object.get()) } + } + + /// Initialize the reflector. (May be called only once.) + pub fn set_jsobject(&mut self, object: *mut JSObject) { + unsafe { + let obj = self.object.get(); + assert!((*obj).is_null()); + assert!(!object.is_null()); + *obj = object; + } + } + + /// Return a pointer to the memory location at which the JS reflector + /// object is stored. Used to root the reflector, as + /// required by the JSAPI rooting APIs. + pub fn rootable(&self) -> *mut *mut JSObject { + self.object.get() + } + + /// Create an uninitialized `Reflector`. + pub fn new() -> Reflector { + Reflector { + object: UnsafeCell::new(ptr::null_mut()) + } + } +} + +/// A trait to provide access to the `Reflector` for a DOM object. +pub trait Reflectable { + /// Returns the receiver's reflector. + fn reflector(&self) -> &Reflector; + /// Initializes the Reflector + fn init_reflector(&mut self, obj: *mut JSObject); +} diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index d656ae0fcad..84869943239 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -35,7 +35,8 @@ use canvas_traits::{CompositionOrBlending, LineCapStyle, LineJoinStyle, Repetiti use cssparser::RGBA; use dom::bindings::js::{JS, Root}; use dom::bindings::refcounted::Trusted; -use dom::bindings::utils::{Reflectable, Reflector, WindowProxyHandler}; +use dom::bindings::reflector::{Reflectable, Reflector}; +use dom::bindings::utils::WindowProxyHandler; use encoding::types::EncodingRef; use euclid::length::Length as EuclidLength; use euclid::matrix2d::Matrix2D; diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 6fae276271c..31961ca21b0 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -4,15 +4,13 @@ //! Various utilities to glue JavaScript and the DOM implementation together. -use dom::bindings::codegen::InheritTypes::TopTypeId; use dom::bindings::codegen::PrototypeList; use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH; use dom::bindings::conversions::native_from_handleobject; use dom::bindings::conversions::private_from_proto_check; use dom::bindings::conversions::{is_dom_class, jsstring_to_str, DOM_OBJECT_SLOT}; -use dom::bindings::error::throw_type_error; -use dom::bindings::error::{Error, ErrorResult, Fallible, throw_invalid_this}; -use dom::bindings::global::GlobalRef; +use dom::bindings::error::{throw_invalid_this, throw_type_error}; +use dom::bindings::inheritance::TopTypeId; use dom::bindings::js::Root; use dom::bindings::trace::trace_object; use dom::browsercontext; @@ -49,14 +47,10 @@ use js::rust::{GCMethods, ToString, define_methods, define_properties}; use js::{JSFUN_CONSTRUCTOR, JSPROP_ENUMERATE, JS_CALLEE}; use js::{JSPROP_PERMANENT, JSPROP_READONLY}; use libc::{self, c_uint}; -use std::cell::UnsafeCell; -use std::cmp::PartialEq; use std::default::Default; use std::ffi::CString; use std::ptr; -use string_cache::{Atom, Namespace}; use util::mem::HeapSizeOf; -use util::str::DOMString; /// Proxy handler for a WindowProxy. #[allow(raw_pointer_derive)] @@ -391,74 +385,6 @@ pub fn initialize_global(global: *mut JSObject) { } } -/// A trait to provide access to the `Reflector` for a DOM object. -pub trait Reflectable { - /// Returns the receiver's reflector. - fn reflector(&self) -> &Reflector; - /// Initializes the Reflector - fn init_reflector(&mut self, obj: *mut JSObject); -} - -/// Create the reflector for a new DOM object and yield ownership to the -/// reflector. -pub fn reflect_dom_object<T: Reflectable> - (obj: Box<T>, - global: GlobalRef, - wrap_fn: extern "Rust" fn(*mut JSContext, GlobalRef, Box<T>) -> Root<T>) - -> Root<T> { - wrap_fn(global.get_cx(), global, obj) -} - -/// A struct to store a reference to the reflector of a DOM object. -#[allow(raw_pointer_derive, unrooted_must_root)] -#[must_root] -#[servo_lang = "reflector"] -#[derive(HeapSizeOf)] -// If you're renaming or moving this field, update the path in plugins::reflector as well -pub struct Reflector { - #[ignore_heap_size_of = "defined and measured in rust-mozjs"] - object: UnsafeCell<*mut JSObject>, -} - -#[allow(unrooted_must_root)] -impl PartialEq for Reflector { - fn eq(&self, other: &Reflector) -> bool { - unsafe { *self.object.get() == *other.object.get() } - } -} - -impl Reflector { - /// Get the reflector. - #[inline] - pub fn get_jsobject(&self) -> HandleObject { - unsafe { HandleObject::from_marked_location(self.object.get()) } - } - - /// Initialize the reflector. (May be called only once.) - pub fn set_jsobject(&mut self, object: *mut JSObject) { - unsafe { - let obj = self.object.get(); - assert!((*obj).is_null()); - assert!(!object.is_null()); - *obj = object; - } - } - - /// Return a pointer to the memory location at which the JS reflector - /// object is stored. Used to root the reflector, as - /// required by the JSAPI rooting APIs. - pub fn rootable(&self) -> *mut *mut JSObject { - self.object.get() - } - - /// Create an uninitialized `Reflector`. - pub fn new() -> Reflector { - Reflector { - object: UnsafeCell::new(ptr::null_mut()) - } - } -} - /// Gets the property `id` on `proxy`'s prototype. If it exists, `*found` is /// set to true and `*vp` to the value, otherwise `*found` is set to false. /// @@ -800,21 +726,6 @@ pub unsafe extern fn generic_lenient_setter(cx: *mut JSContext, generic_call(cx, argc, vp, true, call_setter) } -/// Validate a qualified name. See https://dom.spec.whatwg.org/#validate for details. -pub fn validate_qualified_name(qualified_name: &str) -> ErrorResult { - match xml_name_type(qualified_name) { - XMLName::InvalidXMLName => { - // Step 1. - Err(Error::InvalidCharacter) - }, - XMLName::Name => { - // Step 2. - Err(Error::Namespace) - }, - XMLName::QName => Ok(()) - } -} - unsafe extern "C" fn instance_class_has_proto_at_depth(clasp: *const js::jsapi::Class, proto_id: u32, depth: u32) -> bool { @@ -827,155 +738,3 @@ unsafe extern "C" fn instance_class_has_proto_at_depth(clasp: *const js::jsapi:: pub const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks { instanceClassMatchesProto: Some(instance_class_has_proto_at_depth), }; - -/// Validate a namespace and qualified name and extract their parts. -/// See https://dom.spec.whatwg.org/#validate-and-extract for details. -pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str) - -> Fallible<(Namespace, Option<Atom>, Atom)> { - // Step 1. - let namespace = namespace_from_domstring(namespace); - - // Step 2. - try!(validate_qualified_name(qualified_name)); - - let colon = ':'; - - // Step 5. - let mut parts = qualified_name.splitn(2, colon); - - let (maybe_prefix, local_name) = { - let maybe_prefix = parts.next(); - let maybe_local_name = parts.next(); - - debug_assert!(parts.next().is_none()); - - if let Some(local_name) = maybe_local_name { - debug_assert!(!maybe_prefix.unwrap().is_empty()); - - (maybe_prefix, local_name) - } else { - (None, maybe_prefix.unwrap()) - } - }; - - debug_assert!(!local_name.contains(colon)); - - match (namespace, maybe_prefix) { - (ns!(""), Some(_)) => { - // Step 6. - Err(Error::Namespace) - }, - (ref ns, Some("xml")) if ns != &ns!(XML) => { - // Step 7. - Err(Error::Namespace) - }, - (ref ns, p) if ns != &ns!(XMLNS) && - (qualified_name == "xmlns" || p == Some("xmlns")) => { - // Step 8. - Err(Error::Namespace) - }, - (ns!(XMLNS), p) if qualified_name != "xmlns" && p != Some("xmlns") => { - // Step 9. - Err(Error::Namespace) - }, - (ns, p) => { - // Step 10. - Ok((ns, p.map(Atom::from_slice), Atom::from_slice(local_name))) - } - } -} - -/// Results of `xml_name_type`. -#[derive(PartialEq)] -#[allow(missing_docs)] -pub enum XMLName { - QName, - Name, - InvalidXMLName -} - -/// Check if an element name is valid. See http://www.w3.org/TR/xml/#NT-Name -/// for details. -pub fn xml_name_type(name: &str) -> XMLName { - fn is_valid_start(c: char) -> bool { - match c { - ':' | - 'A' ... 'Z' | - '_' | - 'a' ... 'z' | - '\u{C0}' ... '\u{D6}' | - '\u{D8}' ... '\u{F6}' | - '\u{F8}' ... '\u{2FF}' | - '\u{370}' ... '\u{37D}' | - '\u{37F}' ... '\u{1FFF}' | - '\u{200C}' ... '\u{200D}' | - '\u{2070}' ... '\u{218F}' | - '\u{2C00}' ... '\u{2FEF}' | - '\u{3001}' ... '\u{D7FF}' | - '\u{F900}' ... '\u{FDCF}' | - '\u{FDF0}' ... '\u{FFFD}' | - '\u{10000}' ... '\u{EFFFF}' => true, - _ => false, - } - } - - fn is_valid_continuation(c: char) -> bool { - is_valid_start(c) || match c { - '-' | - '.' | - '0' ... '9' | - '\u{B7}' | - '\u{300}' ... '\u{36F}' | - '\u{203F}' ... '\u{2040}' => true, - _ => false, - } - } - - let mut iter = name.chars(); - let mut non_qname_colons = false; - let mut seen_colon = false; - let mut last = match iter.next() { - None => return XMLName::InvalidXMLName, - Some(c) => { - if !is_valid_start(c) { - return XMLName::InvalidXMLName; - } - if c == ':' { - non_qname_colons = true; - } - c - } - }; - - for c in iter { - if !is_valid_continuation(c) { - return XMLName::InvalidXMLName; - } - if c == ':' { - match seen_colon { - true => non_qname_colons = true, - false => seen_colon = true - } - } - last = c - } - - if last == ':' { - non_qname_colons = true - } - - match non_qname_colons { - false => XMLName::QName, - true => XMLName::Name - } -} - -/// Convert a possibly-null URL to a namespace. -/// -/// If the URL is None, returns the empty namespace. -pub fn namespace_from_domstring(url: Option<DOMString>) -> Namespace { - match url { - None => ns!(""), - Some(ref s) => Namespace(Atom::from_slice(s)), - } -} diff --git a/components/script/dom/bindings/xmlname.rs b/components/script/dom/bindings/xmlname.rs new file mode 100644 index 00000000000..e8a53707420 --- /dev/null +++ b/components/script/dom/bindings/xmlname.rs @@ -0,0 +1,176 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +//! Functions for validating and extracting qualified XML names. + +use dom::bindings::error::{Error, ErrorResult, Fallible}; +use string_cache::{Atom, Namespace}; +use util::str::DOMString; + +/// Validate a qualified name. See https://dom.spec.whatwg.org/#validate for details. +pub fn validate_qualified_name(qualified_name: &str) -> ErrorResult { + match xml_name_type(qualified_name) { + XMLName::InvalidXMLName => { + // Step 1. + Err(Error::InvalidCharacter) + }, + XMLName::Name => { + // Step 2. + Err(Error::Namespace) + }, + XMLName::QName => Ok(()) + } +} + +/// Validate a namespace and qualified name and extract their parts. +/// See https://dom.spec.whatwg.org/#validate-and-extract for details. +pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str) + -> Fallible<(Namespace, Option<Atom>, Atom)> { + // Step 1. + let namespace = namespace_from_domstring(namespace); + + // Step 2. + try!(validate_qualified_name(qualified_name)); + + let colon = ':'; + + // Step 5. + let mut parts = qualified_name.splitn(2, colon); + + let (maybe_prefix, local_name) = { + let maybe_prefix = parts.next(); + let maybe_local_name = parts.next(); + + debug_assert!(parts.next().is_none()); + + if let Some(local_name) = maybe_local_name { + debug_assert!(!maybe_prefix.unwrap().is_empty()); + + (maybe_prefix, local_name) + } else { + (None, maybe_prefix.unwrap()) + } + }; + + debug_assert!(!local_name.contains(colon)); + + match (namespace, maybe_prefix) { + (ns!(""), Some(_)) => { + // Step 6. + Err(Error::Namespace) + }, + (ref ns, Some("xml")) if ns != &ns!(XML) => { + // Step 7. + Err(Error::Namespace) + }, + (ref ns, p) if ns != &ns!(XMLNS) && + (qualified_name == "xmlns" || p == Some("xmlns")) => { + // Step 8. + Err(Error::Namespace) + }, + (ns!(XMLNS), p) if qualified_name != "xmlns" && p != Some("xmlns") => { + // Step 9. + Err(Error::Namespace) + }, + (ns, p) => { + // Step 10. + Ok((ns, p.map(Atom::from_slice), Atom::from_slice(local_name))) + } + } +} + +/// Results of `xml_name_type`. +#[derive(PartialEq)] +#[allow(missing_docs)] +pub enum XMLName { + QName, + Name, + InvalidXMLName +} + +/// Check if an element name is valid. See http://www.w3.org/TR/xml/#NT-Name +/// for details. +pub fn xml_name_type(name: &str) -> XMLName { + fn is_valid_start(c: char) -> bool { + match c { + ':' | + 'A' ... 'Z' | + '_' | + 'a' ... 'z' | + '\u{C0}' ... '\u{D6}' | + '\u{D8}' ... '\u{F6}' | + '\u{F8}' ... '\u{2FF}' | + '\u{370}' ... '\u{37D}' | + '\u{37F}' ... '\u{1FFF}' | + '\u{200C}' ... '\u{200D}' | + '\u{2070}' ... '\u{218F}' | + '\u{2C00}' ... '\u{2FEF}' | + '\u{3001}' ... '\u{D7FF}' | + '\u{F900}' ... '\u{FDCF}' | + '\u{FDF0}' ... '\u{FFFD}' | + '\u{10000}' ... '\u{EFFFF}' => true, + _ => false, + } + } + + fn is_valid_continuation(c: char) -> bool { + is_valid_start(c) || match c { + '-' | + '.' | + '0' ... '9' | + '\u{B7}' | + '\u{300}' ... '\u{36F}' | + '\u{203F}' ... '\u{2040}' => true, + _ => false, + } + } + + let mut iter = name.chars(); + let mut non_qname_colons = false; + let mut seen_colon = false; + let mut last = match iter.next() { + None => return XMLName::InvalidXMLName, + Some(c) => { + if !is_valid_start(c) { + return XMLName::InvalidXMLName; + } + if c == ':' { + non_qname_colons = true; + } + c + } + }; + + for c in iter { + if !is_valid_continuation(c) { + return XMLName::InvalidXMLName; + } + if c == ':' { + match seen_colon { + true => non_qname_colons = true, + false => seen_colon = true + } + } + last = c + } + + if last == ':' { + non_qname_colons = true + } + + match non_qname_colons { + false => XMLName::QName, + true => XMLName::Name + } +} + +/// Convert a possibly-null URL to a namespace. +/// +/// If the URL is None, returns the empty namespace. +pub fn namespace_from_domstring(url: Option<DOMString>) -> Namespace { + match url { + None => ns!(""), + Some(ref s) => Namespace(Atom::from_slice(s)), + } +} diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index efbf1abbc15..0645a146c0f 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use dom::bindings::error::Fallible; use dom::bindings::global::{GlobalField, GlobalRef}; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use num::ToPrimitive; use std::ascii::AsciiExt; use std::borrow::ToOwned; diff --git a/components/script/dom/browsercontext.rs b/components/script/dom/browsercontext.rs index 60dbdc5523e..2c5a5504045 100644 --- a/components/script/dom/browsercontext.rs +++ b/components/script/dom/browsercontext.rs @@ -6,8 +6,9 @@ use dom::bindings::conversions::native_from_handleobject; use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::js::{JS, Root}; use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor}; +use dom::bindings::reflector::Reflectable; +use dom::bindings::utils::WindowProxyHandler; use dom::bindings::utils::get_array_index_from_id; -use dom::bindings::utils::{Reflectable, WindowProxyHandler}; use dom::document::Document; use dom::element::Element; use dom::window::Window; diff --git a/components/script/dom/canvasgradient.rs b/components/script/dom/canvasgradient.rs index 8f8ad3cc99f..a9cf8a2d878 100644 --- a/components/script/dom/canvasgradient.rs +++ b/components/script/dom/canvasgradient.rs @@ -10,7 +10,7 @@ use dom::bindings::error::{Error, ErrorResult}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; use dom::bindings::num::Finite; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::canvasrenderingcontext2d::parse_color; // https://html.spec.whatwg.org/multipage/#canvasgradient diff --git a/components/script/dom/canvaspattern.rs b/components/script/dom/canvaspattern.rs index 7457c06a30d..2f385be82bf 100644 --- a/components/script/dom/canvaspattern.rs +++ b/components/script/dom/canvaspattern.rs @@ -6,7 +6,7 @@ use canvas_traits::{FillOrStrokeStyle, RepetitionStyle, SurfaceStyle}; use dom::bindings::codegen::Bindings::CanvasPatternBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::canvasgradient::ToFillOrStrokeStyle; use euclid::size::Size2D; diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index dbb9718e134..f3d85c619a2 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -15,12 +15,12 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasWin use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; use dom::bindings::codegen::UnionTypes::HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D; use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, LayoutJS, Root}; use dom::bindings::num::Finite; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle}; use dom::canvaspattern::CanvasPattern; use dom::htmlcanvaselement::HTMLCanvasElement; diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index 8bc61288a0e..8d8fc2e20fa 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -7,8 +7,8 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/closeevent.rs b/components/script/dom/closeevent.rs index 75f2f0e5bb0..45362ea5741 100644 --- a/components/script/dom/closeevent.rs +++ b/components/script/dom/closeevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::CloseEventBinding; use dom::bindings::codegen::Bindings::CloseEventBinding::CloseEventMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use script_task::ScriptChan; use util::str::DOMString; diff --git a/components/script/dom/console.rs b/components/script/dom/console.rs index 8845ecd5b22..9303a433e36 100644 --- a/components/script/dom/console.rs +++ b/components/script/dom/console.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::ConsoleBinding; use dom::bindings::codegen::Bindings::ConsoleBinding::ConsoleMethods; use dom::bindings::global::{GlobalField, GlobalRef}; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use util::str::DOMString; // https://developer.mozilla.org/en-US/docs/Web/API/Console diff --git a/components/script/dom/crypto.rs b/components/script/dom/crypto.rs index cd5338a1868..5caa678017a 100644 --- a/components/script/dom/crypto.rs +++ b/components/script/dom/crypto.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::CryptoBinding::CryptoMethods; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use js::jsapi::{JSContext, JSObject}; use js::jsapi::{JS_GetArrayBufferViewType, JS_GetObjectAsArrayBufferView, Type}; use rand::{OsRng, Rng}; diff --git a/components/script/dom/css.rs b/components/script/dom/css.rs index 527b08315e9..a4cd3a132ec 100644 --- a/components/script/dom/css.rs +++ b/components/script/dom/css.rs @@ -5,7 +5,7 @@ use cssparser::serialize_identifier; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; -use dom::bindings::utils::Reflector; +use dom::bindings::reflector::Reflector; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index f4ab910e913..c095931a95d 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -3,11 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::{self, CSSStyleDeclarationMethods}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::element::{Element, StylePriority}; use dom::node::{Node, NodeDamage, document_from_node, window_from_node}; use dom::window::Window; diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index 17e834e318a..d23075565b8 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::CustomEventBinding; use dom::bindings::codegen::Bindings::CustomEventBinding::CustomEventMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{MutHeapJSVal, Root}; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::Event; use js::jsapi::{HandleValue, JSContext}; use js::jsval::JSVal; diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 2c9a6f9f629..598654e7ab9 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -8,13 +8,13 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding; use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; -use dom::bindings::conversions::Castable; use dom::bindings::error::ErrorResult; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootCollection}; use dom::bindings::refcounted::LiveDOMReferences; +use dom::bindings::reflector::Reflectable; use dom::bindings::structuredclone::StructuredCloneData; -use dom::bindings::utils::Reflectable; use dom::messageevent::MessageEvent; use dom::worker::{SimpleWorkerErrorHandler, TrustedWorkerAddress, WorkerMessageHandler}; use dom::workerglobalscope::WorkerGlobalScope; diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 42530e4922c..bf4c57e4e51 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -13,20 +13,20 @@ use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; +use dom::bindings::codegen::Bindings::TouchBinding::TouchMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::RootedReference; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root}; use dom::bindings::num::Finite; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::trace::RootedVec; -use dom::bindings::utils::XMLName::InvalidXMLName; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; -use dom::bindings::utils::{validate_and_extract, xml_name_type}; +use dom::bindings::xmlname::XMLName::InvalidXMLName; +use dom::bindings::xmlname::{validate_and_extract, xml_name_type}; use dom::comment::Comment; use dom::customevent::CustomEvent; use dom::documentfragment::DocumentFragment; @@ -84,7 +84,7 @@ use net_traits::CookieSource::NonHTTP; use net_traits::{AsyncResponseTarget, PendingAsyncLoad}; use num::ToPrimitive; use script_task::{MainThreadScriptMsg, Runnable}; -use script_traits::{MouseButton, UntrustedNodeAddress}; +use script_traits::{MouseButton, TouchEventType, TouchId, UntrustedNodeAddress}; use selectors::states::*; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -175,8 +175,10 @@ pub struct Document { /// This field is set to the document itself for inert documents. /// https://html.spec.whatwg.org/multipage/#appropriate-template-contents-owner-document appropriate_template_contents_owner_document: MutNullableHeap<JS<Document>>, - // The collection of ElementStates that have been changed since the last restyle. + /// The collection of ElementStates that have been changed since the last restyle. element_state_changes: DOMRefCell<HashMap<JS<Element>, ElementState>>, + /// http://w3c.github.io/touch-events/#dfn-active-touch-point + active_touch_points: DOMRefCell<Vec<JS<Touch>>>, } impl PartialEq for Document { @@ -347,7 +349,6 @@ impl Document { pub fn content_and_heritage_changed(&self, node: &Node, damage: NodeDamage) { node.force_dirty_ancestors(damage); - node.dirty(damage); } /// Reflows and disarms the timer if the reflow timer has expired. @@ -728,9 +729,17 @@ impl Document { pub fn handle_touch_event(&self, js_runtime: *mut JSRuntime, - identifier: i32, - point: Point2D<f32>, - event_name: String) -> bool { + event_type: TouchEventType, + TouchId(identifier): TouchId, + point: Point2D<f32>) + -> bool { + let event_name = match event_type { + TouchEventType::Down => "touchstart", + TouchEventType::Move => "touchmove", + TouchEventType::Up => "touchend", + TouchEventType::Cancel => "touchcancel", + }; + let node = match self.hit_test(&point) { Some(node_address) => node::from_untrusted_node_address(js_runtime, node_address), None => return false @@ -745,7 +754,7 @@ impl Document { } }, }; - let target = el.upcast::<EventTarget>(); + let target = Root::upcast::<EventTarget>(el); let window = &*self.window; let client_x = Finite::wrap(point.x as f64); @@ -753,26 +762,58 @@ impl Document { let page_x = Finite::wrap(point.x as f64 + window.PageXOffset() as f64); let page_y = Finite::wrap(point.y as f64 + window.PageYOffset() as f64); - let touch = Touch::new(window, identifier, target, + let touch = Touch::new(window, identifier, target.r(), client_x, client_y, // TODO: Get real screen coordinates? client_x, client_y, page_x, page_y); + match event_type { + TouchEventType::Down => { + // Add a new touch point + self.active_touch_points.borrow_mut().push(JS::from_rooted(&touch)); + } + TouchEventType::Move => { + // Replace an existing touch point + let mut active_touch_points = self.active_touch_points.borrow_mut(); + match active_touch_points.iter_mut().find(|t| t.Identifier() == identifier) { + Some(t) => *t = JS::from_rooted(&touch), + None => warn!("Got a touchmove event for a non-active touch point") + } + } + TouchEventType::Up | + TouchEventType::Cancel => { + // Remove an existing touch point + let mut active_touch_points = self.active_touch_points.borrow_mut(); + match active_touch_points.iter().position(|t| t.Identifier() == identifier) { + Some(i) => { active_touch_points.swap_remove(i); } + None => warn!("Got a touchend event for a non-active touch point") + } + } + } + let mut touches = RootedVec::new(); - touches.push(JS::from_rooted(&touch)); - let touches = TouchList::new(window, touches.r()); + touches.extend(self.active_touch_points.borrow().iter().cloned()); + + let mut changed_touches = RootedVec::new(); + changed_touches.push(JS::from_rooted(&touch)); + + let mut target_touches = RootedVec::new(); + target_touches.extend(self.active_touch_points.borrow().iter().filter( + |t| t.Target() == target).cloned()); let event = TouchEvent::new(window, - event_name, + event_name.to_owned(), EventBubbles::Bubbles, EventCancelable::Cancelable, Some(window), 0i32, - &touches, &touches, &touches, + &TouchList::new(window, touches.r()), + &TouchList::new(window, changed_touches.r()), + &TouchList::new(window, target_touches.r()), // FIXME: modifier keys false, false, false, false); let event = event.upcast::<Event>(); - let result = event.fire(target); + let result = event.fire(target.r()); window.reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, @@ -1269,6 +1310,7 @@ impl Document { base_element: Default::default(), appropriate_template_contents_owner_document: Default::default(), element_state_changes: DOMRefCell::new(HashMap::new()), + active_touch_points: DOMRefCell::new(Vec::new()), } } diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index 26a0259fab9..31568622600 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -6,9 +6,9 @@ use dom::bindings::codegen::Bindings::DocumentFragmentBinding; use dom::bindings::codegen::Bindings::DocumentFragmentBinding::DocumentFragmentMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::Castable; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs index 1d72d783e7e..1754ad84f66 100644 --- a/components/script/dom/documenttype.rs +++ b/components/script/dom/documenttype.rs @@ -5,8 +5,8 @@ use dom::bindings::codegen::Bindings::DocumentTypeBinding; use dom::bindings::codegen::Bindings::DocumentTypeBinding::DocumentTypeMethods; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::Castable; use dom::bindings::error::ErrorResult; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::node::Node; diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index e63cbedafbc..8bc3497f5c9 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionConstants use dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use std::borrow::ToOwned; use util::str::DOMString; diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index 02c8ad4fa84..caf53a0d749 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -7,12 +7,12 @@ use dom::bindings::codegen::Bindings::DOMImplementationBinding; use dom::bindings::codegen::Bindings::DOMImplementationBinding::DOMImplementationMethods; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::validate_qualified_name; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::xmlname::validate_qualified_name; use dom::document::DocumentSource; use dom::document::{Document, IsHTMLDocument}; use dom::documenttype::DocumentType; diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index a66b8ea3962..10ecd077a31 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::document::DocumentSource; use dom::document::{Document, IsHTMLDocument}; use dom::window::Window; diff --git a/components/script/dom/dompoint.rs b/components/script/dom/dompoint.rs index 1f8e85f50ad..3d797598ba0 100644 --- a/components/script/dom/dompoint.rs +++ b/components/script/dom/dompoint.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::DOMPointReadOnlyM use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::dompointreadonly::{DOMPointReadOnly, DOMPointWriteMethods}; // http://dev.w3.org/fxtf/geometry/Overview.html#dompoint diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index fd4965402cf..db56e70113d 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::{DOMPointReadOnly use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use std::cell::Cell; // http://dev.w3.org/fxtf/geometry/Overview.html#dompointreadonly diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index fa1dcc1b165..aa4758d2b89 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::DOMRectReadOnlyMet use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::domrectreadonly::DOMRectReadOnly; #[dom_struct] diff --git a/components/script/dom/domrectlist.rs b/components/script/dom/domrectlist.rs index 963d97df623..cd5bc11b25e 100644 --- a/components/script/dom/domrectlist.rs +++ b/components/script/dom/domrectlist.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::DOMRectListBinding; use dom::bindings::codegen::Bindings::DOMRectListBinding::DOMRectListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::domrect::DOMRect; use dom::window::Window; diff --git a/components/script/dom/domrectreadonly.rs b/components/script/dom/domrectreadonly.rs index a6ba99ead2a..f0bb23a20fe 100644 --- a/components/script/dom/domrectreadonly.rs +++ b/components/script/dom/domrectreadonly.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::{DOMRectReadOnlyMe use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use std::cell::Cell; #[dom_struct] diff --git a/components/script/dom/domstringmap.rs b/components/script/dom/domstringmap.rs index bed48031786..b27f0eca4e0 100644 --- a/components/script/dom/domstringmap.rs +++ b/components/script/dom/domstringmap.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DOMStringMapBinding::DOMStringMapMethods; use dom::bindings::error::ErrorResult; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::htmlelement::HTMLElement; use dom::node::window_from_node; use util::str::DOMString; diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index c3944b7627c..13210528905 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::DOMTokenListBinding::DOMTokenListMethods; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::element::Element; use dom::node::window_from_node; use std::borrow::ToOwned; @@ -64,10 +64,7 @@ impl DOMTokenListMethods for DOMTokenList { // https://dom.spec.whatwg.org/#dom-domtokenlist-item fn Item(&self, index: u32) -> Option<DOMString> { self.attribute().and_then(|attr| { - let attr = attr.r(); - Some(attr.value().as_tokens()).and_then(|tokens| { - tokens.get(index as usize).map(|token| (**token).to_owned()) - }) + attr.value().as_tokens().get(index as usize).map(|token| (**token).to_owned()) }) } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index a78ba89b485..6eaea65d154 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -19,16 +19,15 @@ use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementM use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods; use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap}; use dom::bindings::js::{Root, RootedReference}; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::XMLName::InvalidXMLName; -use dom::bindings::utils::{namespace_from_domstring, validate_and_extract, xml_name_type}; +use dom::bindings::xmlname::XMLName::InvalidXMLName; +use dom::bindings::xmlname::{namespace_from_domstring, validate_and_extract, xml_name_type}; use dom::characterdata::CharacterData; use dom::create::create_element; use dom::document::{Document, LayoutDocumentHelpers}; diff --git a/components/script/dom/errorevent.rs b/components/script/dom/errorevent.rs index 39327d967cf..21e70ab8436 100644 --- a/components/script/dom/errorevent.rs +++ b/components/script/dom/errorevent.rs @@ -6,12 +6,12 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::ErrorEventBinding; use dom::bindings::codegen::Bindings::ErrorEventBinding::ErrorEventMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{MutHeapJSVal, Root}; +use dom::bindings::reflector::reflect_dom_object; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use js::jsapi::{RootedValue, HandleValue, JSContext}; use js::jsval::JSVal; diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 0aa57146a8e..c0a6a9a19aa 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::EventBinding::{EventConstants, EventMethod use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutNullableHeap, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::eventtarget::EventTarget; use std::borrow::ToOwned; use std::cell::Cell; diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 503ddc147e3..589d5a53f8b 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -5,8 +5,8 @@ use devtools_traits::{StartedTimelineMarker, TimelineMarker, TimelineMarkerType}; use dom::bindings::callback::ExceptionHandling::Report; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::{GlobalRoot, global_object_for_reflector}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::trace::RootedVec; use dom::event::{Event, EventPhase}; diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 9f62cb5b139..84f59d8c498 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -7,9 +7,9 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener; use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods; -use dom::bindings::codegen::InheritTypes::EventTargetTypeId; use dom::bindings::error::{Error, Fallible, report_pending_exception}; -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::inheritance::EventTargetTypeId; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::event::Event; use dom::eventdispatcher::dispatch_event; use dom::virtualmethods::VirtualMethods; diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index b9ccd721a47..5dfffd62541 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::FileBinding; use dom::bindings::codegen::Bindings::FileBinding::FileMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::blob::Blob; use util::str::DOMString; diff --git a/components/script/dom/filelist.rs b/components/script/dom/filelist.rs index 78a9ee30012..e60258fa330 100644 --- a/components/script/dom/filelist.rs +++ b/components/script/dom/filelist.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::FileListBinding; use dom::bindings::codegen::Bindings::FileListBinding::FileListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::file::File; use dom::window::Window; diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 606debbc106..e01c91def32 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -6,12 +6,12 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::refcounted::Trusted; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::blob::Blob; use dom::domexception::{DOMErrorName, DOMException}; use dom::event::{Event, EventBubbles, EventCancelable}; diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 5956aadd26c..d37bbbc738e 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -7,11 +7,11 @@ use dom::bindings::codegen::Bindings::FormDataBinding; use dom::bindings::codegen::Bindings::FormDataBinding::FormDataMethods; use dom::bindings::codegen::UnionTypes::FileOrString; use dom::bindings::codegen::UnionTypes::FileOrString::{eFile, eString}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Fallible}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::blob::Blob; use dom::file::File; use dom::htmlformelement::HTMLFormElement; diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index a269dd948fc..c3438050f9d 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -10,7 +10,7 @@ use dom::bindings::codegen::Bindings::HTMLAnchorElementBinding; use dom::bindings::codegen::Bindings::HTMLAnchorElementBinding::HTMLAnchorElementMethods; use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::document::Document; use dom::domtokenlist::DOMTokenList; diff --git a/components/script/dom/htmlappletelement.rs b/components/script/dom/htmlappletelement.rs index 801fafa2593..9c197308e58 100644 --- a/components/script/dom/htmlappletelement.rs +++ b/components/script/dom/htmlappletelement.rs @@ -5,7 +5,7 @@ use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLAppletElementBinding; use dom::bindings::codegen::Bindings::HTMLAppletElementBinding::HTMLAppletElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index c9023bdbb23..cd01baf4930 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -5,9 +5,9 @@ use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLAreaElementBinding::HTMLAreaElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::document::Document; use dom::domtokenlist::DOMTokenList; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index dd3c79b06cd..d31fb1f8dec 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -4,7 +4,7 @@ use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLBaseElementBinding; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 333febd77c9..b980e93dc5e 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -8,9 +8,9 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::document::Document; use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; use dom::eventtarget::EventTarget; diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 85eca4b18bd..f42b6f307ad 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -6,7 +6,7 @@ use dom::activation::Activatable; use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLButtonElementBinding; use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 67894f36429..786ce9eaa16 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -10,12 +10,12 @@ use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding; use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::HTMLCanvasElementMethods; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::UnionTypes::CanvasRenderingContext2DOrWebGLRenderingContext; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{HeapGCValue, JS, LayoutJS, Root}; use dom::bindings::num::Finite; -use dom::bindings::utils::{Reflectable}; +use dom::bindings::reflector::Reflectable; use dom::canvasrenderingcontext2d::{CanvasRenderingContext2D, LayoutCanvasRenderingContext2DHelpers}; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 62335a33a6e..28cc9635052 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -4,11 +4,12 @@ use dom::bindings::codegen::Bindings::HTMLCollectionBinding; use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::{Reflector, namespace_from_domstring, reflect_dom_object}; +use dom::bindings::xmlname::namespace_from_domstring; use dom::element::Element; use dom::node::{Node, TreeIterator}; use dom::window::Window; diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index 9b262ab686f..d0a9a51dce1 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::Bindings::HTMLDataListElementBinding; use dom::bindings::codegen::Bindings::HTMLDataListElementBinding::HTMLDataListElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 8d73511c6d5..43c319678c9 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -10,11 +10,11 @@ use dom::bindings::codegen::Bindings::HTMLElementBinding; use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods; use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult}; +use dom::bindings::inheritance::Castable; +use dom::bindings::inheritance::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration}; use dom::document::Document; use dom::domstringmap::DOMStringMap; diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index 98c6b86b5f7..db3845da73a 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -5,8 +5,7 @@ use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding; use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods; -use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::{Root, RootedReference}; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index da551dd0deb..61ac4f47797 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -6,7 +6,7 @@ use cssparser::RGBA; use dom::attr::{Attr, AttrValue}; use dom::bindings::codegen::Bindings::HTMLFontElementBinding; use dom::bindings::codegen::Bindings::HTMLFontElementBinding::HTMLFontElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index be4f092da72..6c9faa687bb 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -9,11 +9,11 @@ use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElemen use dom::bindings::codegen::Bindings::HTMLFormElementBinding; use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods; use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; -use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; -use dom::bindings::conversions::{Castable, DerivedFrom}; +use dom::bindings::conversions::DerivedFrom; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::{Root}; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::document::Document; use dom::element::Element; use dom::event::{Event, EventBubbles, EventCancelable}; diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index a2231a17729..7bb42b0cfea 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::HTMLHeadElementBinding; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 505b727b3b8..e123c101f6f 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -6,11 +6,12 @@ use dom::attr::{Attr, AttrHelpersForLayout, AttrValue}; use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding; use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::conversions::{Castable, ToJSValConvertible}; +use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, LayoutJS}; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::customevent::CustomEvent; use dom::document::Document; use dom::element::{self, AttributeMutation, Element}; diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index e3b2fd85111..b059fe3ada3 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -8,9 +8,9 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLImageElementBinding; use dom::bindings::codegen::Bindings::HTMLImageElementBinding::HTMLImageElementMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; use dom::bindings::refcounted::Trusted; use dom::document::Document; diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index f1a5bc8a818..d5acbbad745 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -11,8 +11,8 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLInputElementBinding; use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, LayoutJS, Root, RootedReference}; use dom::document::Document; use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers, LayoutElementHelpers}; @@ -34,8 +34,8 @@ use std::cell::Cell; use string_cache::Atom; use textinput::KeyReaction::{DispatchInput, Nothing, RedrawSelection, TriggerDefaultAction}; use textinput::Lines::Single; -use textinput::{TextInput, TextPoint}; -use util::str::DOMString; +use textinput::TextInput; +use util::str::{DOMString, search_index}; const DEFAULT_SUBMIT_VALUE: &'static str = "Submit"; const DEFAULT_RESET_VALUE: &'static str = "Reset"; @@ -135,27 +135,27 @@ pub trait LayoutHTMLInputElementHelpers { #[allow(unsafe_code)] unsafe fn get_size_for_layout(self) -> u32; #[allow(unsafe_code)] - unsafe fn get_insertion_point_for_layout(self) -> Option<TextPoint>; + unsafe fn get_insertion_point_index_for_layout(self) -> Option<isize>; #[allow(unsafe_code)] unsafe fn get_checked_state_for_layout(self) -> bool; #[allow(unsafe_code)] unsafe fn get_indeterminate_state_for_layout(self) -> bool; } +#[allow(unsafe_code)] +unsafe fn get_raw_textinput_value(input: LayoutJS<HTMLInputElement>) -> String { + let textinput = (*input.unsafe_get()).textinput.borrow_for_layout().get_content(); + if !textinput.is_empty() { + textinput + } else { + (*input.unsafe_get()).placeholder.borrow_for_layout().to_owned() + } +} + impl LayoutHTMLInputElementHelpers for LayoutJS<HTMLInputElement> { #[allow(unsafe_code)] unsafe fn get_value_for_layout(self) -> String { #[allow(unsafe_code)] - unsafe fn get_raw_textinput_value(input: LayoutJS<HTMLInputElement>) -> String { - let textinput = (*input.unsafe_get()).textinput.borrow_for_layout().get_content(); - if !textinput.is_empty() { - textinput - } else { - (*input.unsafe_get()).placeholder.borrow_for_layout().to_owned() - } - } - - #[allow(unsafe_code)] unsafe fn get_raw_attr_value(input: LayoutJS<HTMLInputElement>) -> Option<String> { let elem = input.upcast::<Element>(); (*elem.unsafe_get()).get_attr_val_for_layout(&ns!(""), &atom!("value")) @@ -170,6 +170,7 @@ impl LayoutHTMLInputElementHelpers for LayoutJS<HTMLInputElement> { InputType::InputReset => get_raw_attr_value(self).unwrap_or_else(|| DEFAULT_RESET_VALUE.to_owned()), InputType::InputPassword => { let raw = get_raw_textinput_value(self); + // The implementation of get_insertion_point_index_for_layout expects a 1:1 mapping of chars. raw.chars().map(|_| '●').collect() } _ => get_raw_textinput_value(self), @@ -184,11 +185,21 @@ impl LayoutHTMLInputElementHelpers for LayoutJS<HTMLInputElement> { #[allow(unrooted_must_root)] #[allow(unsafe_code)] - unsafe fn get_insertion_point_for_layout(self) -> Option<TextPoint> { + unsafe fn get_insertion_point_index_for_layout(self) -> Option<isize> { match (*self.unsafe_get()).input_type.get() { - InputType::InputText | InputType::InputPassword => - Some((*self.unsafe_get()).textinput.borrow_for_layout().edit_point), - _ => None + InputType::InputText => { + let raw = self.get_value_for_layout(); + Some(search_index((*self.unsafe_get()).textinput.borrow_for_layout().edit_point.index, + raw.char_indices())) + } + InputType::InputPassword => { + // Use the raw textinput to get the index as long as we use a 1:1 char mapping + // in get_input_value_for_layout. + let raw = get_raw_textinput_value(self); + Some(search_index((*self.unsafe_get()).textinput.borrow_for_layout().edit_point.index, + raw.char_indices())) + } + _ => None } } diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 62fbec44731..f64633082b4 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -6,7 +6,7 @@ use dom::activation::Activatable; use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLLabelElementBinding; use dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index fc7a1818c00..37b442e6cea 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -8,8 +8,8 @@ use dom::attr::{Attr, AttrValue}; use dom::bindings::codegen::Bindings::HTMLLinkElementBinding; use dom::bindings::codegen::Bindings::HTMLLinkElementBinding::HTMLLinkElementMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::js::{RootedReference}; use dom::bindings::refcounted::Trusted; diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 0b0fcd4e4c8..fa981a767ad 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::Bindings::HTMLMetaElementBinding; use dom::bindings::codegen::Bindings::HTMLMetaElementBinding::HTMLMetaElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index 74b48434339..91006fb486b 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::HTMLMeterElementBinding::{self, HTMLMeterElementMethods}; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 49a16688854..c69329c2148 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -6,7 +6,7 @@ use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLObjectElementBinding; use dom::bindings::codegen::Bindings::HTMLObjectElementBinding::HTMLObjectElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index cb97991b52b..b44bad67b91 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -5,7 +5,7 @@ use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLOptGroupElementBinding; use dom::bindings::codegen::Bindings::HTMLOptGroupElementBinding::HTMLOptGroupElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 749bbd62b51..873745dd6a7 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods use dom::bindings::codegen::Bindings::HTMLOptionElementBinding; use dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::characterdata::CharacterData; use dom::document::Document; diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index 937fcea3919..9049262aa8c 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::Bindings::HTMLOutputElementBinding; use dom::bindings::codegen::Bindings::HTMLOutputElementBinding::HTMLOutputElementMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 669f25942b6..904055a21a0 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::HTMLProgressElementBinding::{self, HTMLProgressElementMethods}; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 3b0f17a881f..6f2cb5de84e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -10,8 +10,8 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::HTMLScriptElementBinding; use dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::RootedReference; use dom::bindings::js::{JS, Root}; use dom::bindings::refcounted::Trusted; diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index fc2c12fe9bd..8ff563dfef1 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::HTMLSelectElementBinding; use dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index f33eb938f4e..ee1e38da54c 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -5,7 +5,7 @@ use cssparser::Parser as CssParser; use dom::bindings::codegen::Bindings::HTMLStyleElementBinding; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::element::Element; diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index e61aefeb674..d95d663ffee 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -6,7 +6,7 @@ use cssparser::RGBA; use dom::attr::{Attr, AttrValue}; use dom::bindings::codegen::Bindings::HTMLTableCellElementBinding::HTMLTableCellElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::LayoutJS; use dom::document::Document; use dom::element::AttributeMutation; diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index 1f20bc54ef8..2ad152c65ef 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -7,7 +7,7 @@ use dom::attr::{Attr, AttrValue}; use dom::bindings::codegen::Bindings::HTMLTableElementBinding; use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index e7bb8b1fd6d..224252d3506 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -6,8 +6,8 @@ use cssparser::RGBA; use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLTableRowElementBinding::{self, HTMLTableRowElementMethods}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{ErrorResult, Fallible}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index c4983552d3a..af7bf7b9727 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -6,8 +6,8 @@ use cssparser::RGBA; use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLTableSectionElementBinding::{self, HTMLTableSectionElementMethods}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{ErrorResult, Fallible}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::document::Document; use dom::element::{AttributeMutation, Element}; diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index cd2f7393614..77e7843d0e5 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding; use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::document::Document; use dom::documentfragment::DocumentFragment; diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 42005f1f174..2c6a2fde20c 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -8,8 +8,8 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; use dom::bindings::refcounted::Trusted; use dom::document::Document; diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index cb22a7bd9c2..a5e608ca891 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::HTMLTitleElementBinding; use dom::bindings::codegen::Bindings::HTMLTitleElementBinding::HTMLTitleElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::characterdata::CharacterData; use dom::document::Document; diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 7f2b561e85f..ffbe0a4b225 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::ImageDataBinding; use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use euclid::size::Size2D; use js::jsapi::{Heap, JSContext, JSObject}; use js::jsapi::{JS_GetUint8ClampedArrayData, JS_NewUint8ClampedArray}; diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 7883cc89306..9fea1da5b6f 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -6,11 +6,11 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::KeyboardEventBinding; use dom::bindings::codegen::Bindings::KeyboardEventBinding::{KeyboardEventConstants, KeyboardEventMethods}; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::event::Event; use dom::uievent::UIEvent; use dom::window::Window; diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index a9e788a7b04..fa3cba5cf5c 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -6,8 +6,8 @@ use dom::bindings::codegen::Bindings::LocationBinding; use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::urlhelper::UrlHelper; use dom::window::Window; use url::{Url, UrlParser}; diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index e5193dcc8f1..13477436a08 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -6,7 +6,7 @@ macro_rules! make_getter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self) -> DOMString { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -22,7 +22,7 @@ macro_rules! make_getter( macro_rules! make_bool_getter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self) -> bool { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -39,7 +39,7 @@ macro_rules! make_bool_getter( macro_rules! make_uint_getter( ($attr:ident, $htmlname:expr, $default:expr) => ( fn $attr(&self) -> u32 { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -59,7 +59,7 @@ macro_rules! make_uint_getter( macro_rules! make_url_getter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self) -> DOMString { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -77,7 +77,7 @@ macro_rules! make_url_getter( macro_rules! make_url_or_base_getter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self) -> DOMString { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -99,7 +99,7 @@ macro_rules! make_url_or_base_getter( macro_rules! make_enumerated_getter( ( $attr:ident, $htmlname:expr, $default:expr, $(($choices: pat))|+) => ( fn $attr(&self) -> DOMString { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -125,7 +125,7 @@ macro_rules! make_enumerated_getter( macro_rules! make_setter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -139,7 +139,7 @@ macro_rules! make_setter( macro_rules! make_bool_setter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self, value: bool) { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -153,7 +153,7 @@ macro_rules! make_bool_setter( macro_rules! make_uint_setter( ($attr:ident, $htmlname:expr, $default:expr) => ( fn $attr(&self, value: u32) { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use dom::values::UNSIGNED_LONG_MAX; use string_cache::Atom; @@ -176,7 +176,7 @@ macro_rules! make_uint_setter( macro_rules! make_limited_uint_setter( ($attr:ident, $htmlname:expr, $default:expr) => ( fn $attr(&self, value: u32) -> $crate::dom::bindings::error::ErrorResult { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use dom::values::UNSIGNED_LONG_MAX; use string_cache::Atom; @@ -205,7 +205,7 @@ macro_rules! make_limited_uint_setter( macro_rules! make_atomic_setter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; let element = self.upcast::<Element>(); @@ -250,14 +250,14 @@ macro_rules! no_jsmanaged_fields( macro_rules! define_event_handler( ($handler: ident, $event_type: ident, $getter: ident, $setter: ident) => ( fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::eventtarget::EventTarget; let eventtarget = self.upcast::<EventTarget>(); eventtarget.get_event_handler_common(stringify!($event_type)) } fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) { - use dom::bindings::conversions::Castable; + use dom::bindings::inheritance::Castable; use dom::eventtarget::EventTarget; let eventtarget = self.upcast::<EventTarget>(); eventtarget.set_event_handler_common(stringify!($event_type), listener) diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index 4af83b3af7d..2509031abdc 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::MessageEventBinding; use dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::Event; use dom::eventtarget::EventTarget; use js::jsapi::{RootedValue, HandleValue, Heap, JSContext}; diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index b248e2dac1c..bacc88834f9 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -60,7 +60,7 @@ //! and check whether a given instance is of a given type. //! //! ```ignore -//! use dom::bindings::conversions::Castable; +//! use dom::bindings::inheritance::Castable; //! use dom::element::Element; //! use dom::htmlelement::HTMLElement; //! use dom::htmlinputelement::HTMLInputElement; @@ -81,7 +81,7 @@ //! on the `Node` interface to avoid unnecessary upcasts to `EventTarget`. //! //! ```ignore -//! use dom::bindings::codegen::InheritTypes::{EventTargetTypeId, NodeTypeId}; +//! use dom::bindings::inheritance::{EventTargetTypeId, NodeTypeId}; //! //! match *node.type_id() { //! EventTargetTypeId::Node(NodeTypeId::CharacterData(_)) => ..., @@ -160,11 +160,11 @@ //! ======================= //! //! For all DOM interfaces `Foo` in an inheritance chain, a -//! `dom::bindings::codegen::InheritTypes::FooCast` provides methods to cast +//! `dom::bindings::inheritance::FooCast` provides methods to cast //! to other types in the inheritance chain. For example: //! //! ```ignore -//! # use script::dom::bindings::codegen::InheritTypes::{NodeCast, HTMLElementCast}; +//! # use script::dom::bindings::inheritance::{NodeCast, HTMLElementCast}; //! # use script::dom::element::Element; //! # use script::dom::node::Node; //! # use script::dom::htmlelement::HTMLElement; diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index e34be058cd1..adb0024b889 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::MouseEventBinding; use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::uievent::UIEvent; diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index fc344e78ccf..3d6c3c4535c 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -8,7 +8,8 @@ use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, namespace_from_domstring, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::xmlname::namespace_from_domstring; use dom::element::Element; use dom::window::Window; use string_cache::Atom; diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 4f3f3d2c2da..5fa0465d361 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::NavigatorBinding; use dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::navigatorinfo; use dom::window::Window; use util::str::DOMString; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index a8dd8972ca0..02e929be155 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -19,18 +19,19 @@ use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::codegen::Bindings::NodeBinding::{NodeConstants, NodeMethods}; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use dom::bindings::codegen::Bindings::ProcessingInstructionBinding::ProcessingInstructionMethods; -use dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, ElementTypeId, EventTargetTypeId}; -use dom::bindings::codegen::InheritTypes::{HTMLElementTypeId, NodeTypeId}; use dom::bindings::codegen::UnionTypes::NodeOrString; -use dom::bindings::conversions::{self, Castable, DerivedFrom}; +use dom::bindings::conversions::{self, DerivedFrom}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId}; +use dom::bindings::inheritance::{EventTargetTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::Root; use dom::bindings::js::RootedReference; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap}; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::trace::JSTraceable; use dom::bindings::trace::RootedVec; -use dom::bindings::utils::{Reflectable, namespace_from_domstring, reflect_dom_object}; +use dom::bindings::xmlname::namespace_from_domstring; use dom::characterdata::CharacterData; use dom::comment::Comment; use dom::document::{Document, DocumentSource, IsHTMLDocument}; diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index 762d2233c6c..76c8e536e2b 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::NodeIteratorBinding::NodeIteratorMethods; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutHeap, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::document::Document; use dom::node::Node; use std::cell::Cell; diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index f059cf6bbb6..6747ee5a948 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::NodeListBinding; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::node::{ChildrenMutation, Node}; use dom::window::Window; use std::cell::Cell; diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index 591cb5472c4..07ddbe2c312 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; use dom::bindings::num::Finite; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::performancetiming::PerformanceTiming; use dom::window::Window; use time; diff --git a/components/script/dom/performancetiming.rs b/components/script/dom/performancetiming.rs index 9992f87f3c8..1799d6a7f91 100644 --- a/components/script/dom/performancetiming.rs +++ b/components/script/dom/performancetiming.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::PerformanceTimingBinding; use dom::bindings::codegen::Bindings::PerformanceTimingBinding::PerformanceTimingMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::window::Window; #[dom_struct] diff --git a/components/script/dom/progressevent.rs b/components/script/dom/progressevent.rs index 864fd4285c4..9c31291a6b2 100644 --- a/components/script/dom/progressevent.rs +++ b/components/script/dom/progressevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::ProgressEventBinding; use dom::bindings::codegen::Bindings::ProgressEventBinding::ProgressEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use util::str::DOMString; diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 974255e8741..fbef27341ec 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -10,12 +10,12 @@ use dom::bindings::codegen::Bindings::RangeBinding::RangeMethods; use dom::bindings::codegen::Bindings::RangeBinding::{self, RangeConstants}; use dom::bindings::codegen::Bindings::TextBinding::TextMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::inheritance::{CharacterDataTypeId, NodeTypeId}; use dom::bindings::js::{JS, MutHeap, Root, RootedReference}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::characterdata::CharacterData; use dom::document::Document; use dom::documentfragment::DocumentFragment; diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs index e38dc676afe..158615e84dc 100644 --- a/components/script/dom/screen.rs +++ b/components/script/dom/screen.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::ScreenBinding; use dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::window::Window; #[dom_struct] diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index c3ef82c9bc3..3465dc723fc 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -11,8 +11,8 @@ use dom::bindings::codegen::Bindings::ServoHTMLParserBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::document::Document; use dom::node::Node; use dom::text::Text; diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 8d0377b30ee..3bc14c44820 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -4,12 +4,12 @@ use dom::bindings::codegen::Bindings::StorageBinding; use dom::bindings::codegen::Bindings::StorageBinding::StorageMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::bindings::refcounted::Trusted; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::storageevent::StorageEvent; use dom::urlhelper::UrlHelper; diff --git a/components/script/dom/storageevent.rs b/components/script/dom/storageevent.rs index 8d1e9139254..13a9c20d060 100644 --- a/components/script/dom/storageevent.rs +++ b/components/script/dom/storageevent.rs @@ -5,11 +5,11 @@ use dom::bindings::codegen::Bindings::EventBinding::{EventMethods}; use dom::bindings::codegen::Bindings::StorageEventBinding; use dom::bindings::codegen::Bindings::StorageEventBinding::{StorageEventMethods}; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; -use dom::bindings::utils::{reflect_dom_object}; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::storage::Storage; use util::str::DOMString; diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 057b3c2172b..9e6d98dc3dd 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -19,8 +19,8 @@ use dom::bindings::codegen::UnionTypes::HTMLElementOrLong::eLong; use dom::bindings::global::{GlobalField, GlobalRef}; use dom::bindings::js::Root; use dom::bindings::num::Finite; +use dom::bindings::reflector::Reflector; use dom::bindings::str::{ByteString, USVString}; -use dom::bindings::utils::Reflector; use dom::blob::Blob; use js::jsapi::{HandleValue, JSContext, JSObject}; use js::jsval::{JSVal, NullValue}; diff --git a/components/script/dom/testbindingproxy.rs b/components/script/dom/testbindingproxy.rs index 079e7656f68..0c323a3f4c3 100644 --- a/components/script/dom/testbindingproxy.rs +++ b/components/script/dom/testbindingproxy.rs @@ -5,7 +5,7 @@ // check-tidy: no specs after this line use dom::bindings::codegen::Bindings::TestBindingProxyBinding::TestBindingProxyMethods; -use dom::bindings::utils::Reflector; +use dom::bindings::reflector::Reflector; use util::str::DOMString; diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index d7c21cfa78d..21e2edb8193 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -7,9 +7,9 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::TextBinding::{self, TextMethods}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::js::{RootedReference}; use dom::characterdata::CharacterData; diff --git a/components/script/dom/textdecoder.rs b/components/script/dom/textdecoder.rs index c09fcd25614..d4c49b490f8 100644 --- a/components/script/dom/textdecoder.rs +++ b/components/script/dom/textdecoder.rs @@ -7,9 +7,9 @@ use dom::bindings::codegen::Bindings::TextDecoderBinding::TextDecoderMethods; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use encoding::Encoding; use encoding::label::encoding_from_whatwg_label; use encoding::types::{DecoderTrap, EncodingRef}; diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs index e6aa9a3d747..4e796699fc2 100644 --- a/components/script/dom/textencoder.rs +++ b/components/script/dom/textencoder.rs @@ -7,8 +7,8 @@ use dom::bindings::codegen::Bindings::TextEncoderBinding::TextEncoderMethods; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use encoding::label::encoding_from_whatwg_label; use encoding::types::EncodingRef; use encoding::{EncoderTrap, Encoding}; diff --git a/components/script/dom/touch.rs b/components/script/dom/touch.rs index 9e25dacf422..29bfac34152 100644 --- a/components/script/dom/touch.rs +++ b/components/script/dom/touch.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::TouchBinding::TouchMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutHeap, Root}; use dom::bindings::num::Finite; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::eventtarget::EventTarget; use dom::window::Window; diff --git a/components/script/dom/touchevent.rs b/components/script/dom/touchevent.rs index 5244e4c9e35..7340316f9fc 100644 --- a/components/script/dom/touchevent.rs +++ b/components/script/dom/touchevent.rs @@ -5,10 +5,10 @@ use dom::bindings::codegen::Bindings::TouchEventBinding; use dom::bindings::codegen::Bindings::TouchEventBinding::TouchEventMethods; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutHeap, Root}; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{EventBubbles, EventCancelable}; use dom::touchlist::TouchList; use dom::uievent::UIEvent; diff --git a/components/script/dom/touchlist.rs b/components/script/dom/touchlist.rs index f964a1ff250..ae5313e855e 100644 --- a/components/script/dom/touchlist.rs +++ b/components/script/dom/touchlist.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::TouchListBinding; use dom::bindings::codegen::Bindings::TouchListBinding::TouchListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::touch::Touch; use dom::window::Window; diff --git a/components/script/dom/treewalker.rs b/components/script/dom/treewalker.rs index 2bd5cc706e7..38f723c995c 100644 --- a/components/script/dom/treewalker.rs +++ b/components/script/dom/treewalker.rs @@ -12,7 +12,7 @@ use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; use dom::bindings::js::{JS, MutHeap}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::document::Document; use dom::node::Node; use std::rc::Rc; diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index 5f6e8609795..602ee6fd02d 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -5,12 +5,12 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::UIEventBinding; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::js::{JS, MutNullableHeap, RootedReference}; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::window::Window; use std::cell::Cell; diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs index 3bb1d48cee9..d4ed5b1bbed 100644 --- a/components/script/dom/url.rs +++ b/components/script/dom/url.rs @@ -7,8 +7,8 @@ use dom::bindings::codegen::Bindings::URLBinding::{self, URLMethods}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::urlhelper::UrlHelper; use std::borrow::ToOwned; use url::{Host, ParseResult, Url, UrlParser}; diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index 887869eafa4..0e3c21679fd 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -10,8 +10,8 @@ use dom::bindings::codegen::UnionTypes::USVStringOrURLSearchParams::{eUSVString, use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use encoding::types::EncodingRef; use url::form_urlencoded::{parse, serialize_with_encoding}; use util::str::DOMString; diff --git a/components/script/dom/userscripts.rs b/components/script/dom/userscripts.rs index 35b1c2333a5..ad03330bd7f 100644 --- a/components/script/dom/userscripts.rs +++ b/components/script/dom/userscripts.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{RootedReference}; use dom::htmlheadelement::HTMLHeadElement; use dom::node::Node; diff --git a/components/script/dom/validitystate.rs b/components/script/dom/validitystate.rs index 547e7363b82..ae48a1624b0 100644 --- a/components/script/dom/validitystate.rs +++ b/components/script/dom/validitystate.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::ValidityStateBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::window::Window; // https://html.spec.whatwg.org/multipage/#validitystate diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 32406205e5d..7223ffd8b37 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -3,10 +3,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::attr::{Attr, AttrValue}; -use dom::bindings::codegen::InheritTypes::ElementTypeId; -use dom::bindings::codegen::InheritTypes::HTMLElementTypeId; -use dom::bindings::codegen::InheritTypes::NodeTypeId; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::Castable; +use dom::bindings::inheritance::ElementTypeId; +use dom::bindings::inheritance::HTMLElementTypeId; +use dom::bindings::inheritance::NodeTypeId; use dom::document::Document; use dom::element::{AttributeMutation, Element}; use dom::event::Event; diff --git a/components/script/dom/webglactiveinfo.rs b/components/script/dom/webglactiveinfo.rs index efac59725b5..3b069407f36 100644 --- a/components/script/dom/webglactiveinfo.rs +++ b/components/script/dom/webglactiveinfo.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::WebGLActiveInfoBinding; use dom::bindings::codegen::Bindings::WebGLActiveInfoBinding::WebGLActiveInfoMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index 17f13f33380..3932eb56dc8 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -7,7 +7,7 @@ use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLError, WebGLResult}; use dom::bindings::codegen::Bindings::WebGLBufferBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; diff --git a/components/script/dom/webglcontextevent.rs b/components/script/dom/webglcontextevent.rs index 6a2e709f765..ce42026b5d2 100644 --- a/components/script/dom/webglcontextevent.rs +++ b/components/script/dom/webglcontextevent.rs @@ -6,11 +6,11 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::WebGLContextEventBinding; use dom::bindings::codegen::Bindings::WebGLContextEventBinding::WebGLContextEventInit; use dom::bindings::codegen::Bindings::WebGLContextEventBinding::WebGLContextEventMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::event::{Event, EventBubbles, EventCancelable}; use util::str::DOMString; diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs index 6239312f9a9..86ed0e61b30 100644 --- a/components/script/dom/webglframebuffer.rs +++ b/components/script/dom/webglframebuffer.rs @@ -7,7 +7,7 @@ use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLFramebufferBindingRequest}; use dom::bindings::codegen::Bindings::WebGLFramebufferBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; diff --git a/components/script/dom/webglobject.rs b/components/script/dom/webglobject.rs index c950768e329..c6bc733de62 100644 --- a/components/script/dom/webglobject.rs +++ b/components/script/dom/webglobject.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::WebGLObjectBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; #[dom_struct] pub struct WebGLObject { diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 5e51172cb68..44958f358ba 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::WebGLProgramBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutNullableHeap, Root}; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN; use dom::webglshader::WebGLShader; diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 6a534da53e6..5257c4782a9 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -7,7 +7,7 @@ use canvas_traits::{CanvasMsg, CanvasWebGLMsg}; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 07ac00000a2..a1db033c283 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -9,10 +9,11 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{WebGLRenderingContextMethods}; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes}; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; -use dom::bindings::conversions::{Castable, ToJSValConvertible}; +use dom::bindings::conversions::ToJSValConvertible; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root}; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::htmlcanvaselement::HTMLCanvasElement; use dom::htmlcanvaselement::utils as canvas_utils; diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index cd7ea165ae6..6a2e558974c 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -10,7 +10,7 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; diff --git a/components/script/dom/webglshaderprecisionformat.rs b/components/script/dom/webglshaderprecisionformat.rs index e3b8f473bc5..6cd78b8d51a 100644 --- a/components/script/dom/webglshaderprecisionformat.rs +++ b/components/script/dom/webglshaderprecisionformat.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::WebGLShaderPrecisionFormatBinding; use dom::bindings::codegen::Bindings::WebGLShaderPrecisionFormatBinding::WebGLShaderPrecisionFormatMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; #[dom_struct] pub struct WebGLShaderPrecisionFormat { diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index d5f7ad8258e..2288c9be7f7 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi use dom::bindings::codegen::Bindings::WebGLTextureBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; diff --git a/components/script/dom/webgluniformlocation.rs b/components/script/dom/webgluniformlocation.rs index ea30afc8b51..7367f9f1d7d 100644 --- a/components/script/dom/webgluniformlocation.rs +++ b/components/script/dom/webgluniformlocation.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::WebGLUniformLocationBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; #[dom_struct] pub struct WebGLUniformLocation { diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index c0933aaa7e0..ca71fc93487 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -6,14 +6,15 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::WebSocketBinding; use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods}; -use dom::bindings::conversions::{Castable, ToJSValConvertible}; +use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::USVString; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::blob::Blob; use dom::closeevent::CloseEvent; use dom::event::{Event, EventBubbles, EventCancelable}; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index d87b04cbfba..4abdcc3337e 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -11,14 +11,15 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, use dom::bindings::codegen::Bindings::FunctionBinding::Function; use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions}; use dom::bindings::codegen::Bindings::WindowBinding::{self, FrameRequestCallback, WindowMethods}; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, Fallible, report_pending_exception}; use dom::bindings::global::GlobalRef; use dom::bindings::global::global_object_for_js_object; +use dom::bindings::inheritance::Castable; use dom::bindings::js::RootedReference; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::num::Finite; -use dom::bindings::utils::{GlobalStaticData, Reflectable, WindowProxyHandler}; +use dom::bindings::reflector::Reflectable; +use dom::bindings::utils::{GlobalStaticData, WindowProxyHandler}; use dom::browsercontext::BrowsingContext; use dom::console::Console; use dom::crypto::Crypto; @@ -54,7 +55,7 @@ use profile_traits::mem; use rustc_serialize::base64::{FromBase64, STANDARD, ToBase64}; use script_task::{ScriptChan, ScriptPort, MainThreadScriptMsg}; use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan, MainThreadTimerEventChan}; -use script_traits::{ConstellationControlMsg, TimerEventChan, TimerEventId, TimerEventRequest, TimerSource}; +use script_traits::{TimerEventChan, TimerEventId, TimerEventRequest, TimerSource}; use selectors::parser::PseudoElement; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -109,8 +110,6 @@ pub struct Window { eventtarget: EventTarget, #[ignore_heap_size_of = "trait objects are hard"] script_chan: MainThreadScriptChan, - #[ignore_heap_size_of = "channels are hard"] - control_chan: Sender<ConstellationControlMsg>, console: MutNullableHeap<JS<Console>>, crypto: MutNullableHeap<JS<Crypto>>, navigator: MutNullableHeap<JS<Navigator>>, @@ -163,9 +162,6 @@ pub struct Window { /// Subpage id associated with this page, if any. parent_info: Option<(PipelineId, SubpageId)>, - /// Unique id for last reflow request; used for confirming completion reply. - last_reflow_id: Cell<u32>, - /// Global static data related to the DOM. dom_static: GlobalStaticData, @@ -901,9 +897,6 @@ impl Window { // Layout will let us know when it's done. let (join_chan, join_port) = channel(); - let last_reflow_id = &self.last_reflow_id; - last_reflow_id.set(last_reflow_id.get() + 1); - // On debug mode, print the reflow event information. if opts::get().relayout_event { debug_reflow_events(&goal, &query_type, &reason); @@ -917,9 +910,7 @@ impl Window { }, document: self.Document().r().upcast::<Node>().to_trusted_node_address(), window_size: window_size, - script_chan: self.control_chan.clone(), script_join_chan: join_chan, - id: last_reflow_id.get(), query_type: query_type, }; @@ -1212,7 +1203,6 @@ impl Window { page: Rc<Page>, script_chan: MainThreadScriptChan, image_cache_chan: ImageCacheChan, - control_chan: Sender<ConstellationControlMsg>, compositor: IpcSender<ScriptToCompositorMsg>, image_cache_task: ImageCacheTask, resource_task: Arc<ResourceTask>, @@ -1238,7 +1228,6 @@ impl Window { eventtarget: EventTarget::new_inherited(), script_chan: script_chan, image_cache_chan: image_cache_chan, - control_chan: control_chan, console: Default::default(), crypto: Default::default(), compositor: compositor, @@ -1266,7 +1255,6 @@ impl Window { constellation_chan: constellation_chan, page_clip_rect: Cell::new(MAX_RECT), fragment_name: DOMRefCell::new(None), - last_reflow_id: Cell::new(0), resize_event: Cell::new(None), next_subpage_id: Cell::new(SubpageId(0)), layout_chan: layout_chan, diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index b80f89720fa..6441828185c 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -6,14 +6,14 @@ use devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg}; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::{GlobalField, GlobalRef}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::JSTraceable; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::dedicatedworkerglobalscope::{DedicatedWorkerGlobalScope, WorkerScriptMsg}; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index abf7f935240..f775c335f8c 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -5,11 +5,11 @@ use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg}; use dom::bindings::codegen::Bindings::FunctionBinding::Function; use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods; -use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible, report_pending_exception}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::console::Console; use dom::crypto::Crypto; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; diff --git a/components/script/dom/workerlocation.rs b/components/script/dom/workerlocation.rs index 477c329cf75..92b8b8492a3 100644 --- a/components/script/dom/workerlocation.rs +++ b/components/script/dom/workerlocation.rs @@ -6,8 +6,8 @@ use dom::bindings::codegen::Bindings::WorkerLocationBinding; use dom::bindings::codegen::Bindings::WorkerLocationBinding::WorkerLocationMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::USVString; -use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::urlhelper::UrlHelper; use dom::workerglobalscope::WorkerGlobalScope; use url::Url; diff --git a/components/script/dom/workernavigator.rs b/components/script/dom/workernavigator.rs index 6bef4bdb048..146c098d7d1 100644 --- a/components/script/dom/workernavigator.rs +++ b/components/script/dom/workernavigator.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::WorkerNavigatorBinding; use dom::bindings::codegen::Bindings::WorkerNavigatorBinding::WorkerNavigatorMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::navigatorinfo; use dom::workerglobalscope::WorkerGlobalScope; use util::str::DOMString; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index c5f8ef62556..e8a4ddc638a 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -12,14 +12,15 @@ use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::XMLHttpRequestRespo use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::XMLHttpRequestResponseType::{Json, Text, _empty}; use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams; use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLSearchParams}; -use dom::bindings::conversions::{Castable, ToJSValConvertible}; +use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::{GlobalField, GlobalRef, GlobalRoot}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::js::{JS, MutNullableHeap}; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::ByteString; -use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::document::Document; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; diff --git a/components/script/dom/xmlhttprequestupload.rs b/components/script/dom/xmlhttprequestupload.rs index e426c63c30c..900548f2e05 100644 --- a/components/script/dom/xmlhttprequestupload.rs +++ b/components/script/dom/xmlhttprequestupload.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::XMLHttpRequestUploadBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::utils::reflect_dom_object; +use dom::bindings::reflector::reflect_dom_object; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget; #[dom_struct] diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs index acb69a02321..afc7adedbd3 100644 --- a/components/script/layout_interface.rs +++ b/components/script/layout_interface.rs @@ -175,14 +175,10 @@ pub struct ScriptReflow { pub reflow_info: Reflow, /// The document node. pub document: TrustedNodeAddress, - /// The channel through which messages can be sent back to the script task. - pub script_chan: Sender<ConstellationControlMsg>, /// The current window size. pub window_size: WindowSizeData, /// The channel that we send a notification to. pub script_join_chan: Sender<()>, - /// Unique identifier - pub id: u32, /// The type of query if any to perform during this reflow. pub query_type: ReflowQueryType, } diff --git a/components/script/mem.rs b/components/script/mem.rs index aae70c5ef45..113f03b8396 100644 --- a/components/script/mem.rs +++ b/components/script/mem.rs @@ -5,7 +5,7 @@ //! Routines for handling measuring the memory usage of arbitrary DOM nodes. use dom::bindings::conversions::get_dom_class; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use libc::c_void; use util::mem::{HeapSizeOf, heap_size_of}; diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index 07c5d19b1f3..680d96a32a8 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -8,8 +8,7 @@ use document_loader::DocumentLoader; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId}; -use dom::bindings::conversions::Castable; +use dom::bindings::inheritance::{Castable, CharacterDataTypeId, NodeTypeId}; use dom::bindings::js::{JS, RootedReference}; use dom::characterdata::CharacterData; use dom::comment::Comment; diff --git a/components/script/script_task.rs b/components/script/script_task.rs index cd4a4a09308..54501fa0335 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -23,8 +23,9 @@ use devtools_traits::{DevtoolScriptControlMsg, DevtoolsPageInfo}; use document_loader::{DocumentLoader, LoadType}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState}; -use dom::bindings::conversions::{Castable, FromJSValConvertible, StringificationBehavior}; +use dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior}; use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, RootCollection, trace_roots}; use dom::bindings::js::{Root, RootCollectionPtr, RootedReference}; use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference, trace_refcounted_objects}; @@ -78,12 +79,12 @@ use profile_traits::mem::{self, OpaqueSender, Report, ReportKind, ReportsChan}; use profile_traits::time::{self, ProfilerCategory, profile}; use script_traits::CompositorEvent::{ClickEvent, ResizeEvent}; use script_traits::CompositorEvent::{KeyEvent, MouseMoveEvent}; -use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent}; -use script_traits::CompositorEvent::{TouchDownEvent, TouchMoveEvent, TouchUpEvent}; +use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent, TouchEvent}; use script_traits::{CompositorEvent, ConstellationControlMsg}; use script_traits::{InitialScriptState, MouseButton, NewLayoutInfo}; use script_traits::{OpaqueScriptLayoutChannel, ScriptState, ScriptTaskFactory}; use script_traits::{TimerEvent, TimerEventChan, TimerEventRequest, TimerSource}; +use script_traits::{TouchEventType, TouchId}; use std::any::Any; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; @@ -1588,7 +1589,6 @@ impl ScriptTask { page.clone(), MainThreadScriptChan(sender.clone()), self.image_cache_channel.clone(), - self.control_chan.clone(), self.compositor.borrow_mut().clone(), self.image_cache_task.clone(), self.resource_task.clone(), @@ -1764,27 +1764,27 @@ impl ScriptTask { std_mem::swap(&mut *self.mouse_over_targets.borrow_mut(), &mut *mouse_over_targets); } - TouchDownEvent(identifier, point) => { - let default_action_allowed = - self.handle_touch_event(pipeline_id, identifier, point, "touchstart"); - if default_action_allowed { - // TODO: Wait to see if preventDefault is called on the first touchmove event. - self.compositor.borrow_mut().send(ScriptToCompositorMsg::TouchEventProcessed( - EventResult::DefaultAllowed)).unwrap(); - } else { - self.compositor.borrow_mut().send(ScriptToCompositorMsg::TouchEventProcessed( - EventResult::DefaultPrevented)).unwrap(); + TouchEvent(event_type, identifier, point) => { + let handled = self.handle_touch_event(pipeline_id, event_type, identifier, point); + match event_type { + TouchEventType::Down => { + if handled { + // TODO: Wait to see if preventDefault is called on the first touchmove event. + self.compositor.borrow_mut() + .send(ScriptToCompositorMsg::TouchEventProcessed( + EventResult::DefaultAllowed)).unwrap(); + } else { + self.compositor.borrow_mut() + .send(ScriptToCompositorMsg::TouchEventProcessed( + EventResult::DefaultPrevented)).unwrap(); + } + } + _ => { + // TODO: Calling preventDefault on a touchup event should prevent clicks. + } } } - TouchMoveEvent(identifier, point) => { - self.handle_touch_event(pipeline_id, identifier, point, "touchmove"); - } - - TouchUpEvent(identifier, point) => { - self.handle_touch_event(pipeline_id, identifier, point, "touchend"); - } - KeyEvent(key, state, modifiers) => { let page = get_page(&self.root_page(), pipeline_id); let document = page.document(); @@ -1806,13 +1806,13 @@ impl ScriptTask { fn handle_touch_event(&self, pipeline_id: PipelineId, - identifier: i32, - point: Point2D<f32>, - event_name: &str) -> bool { + event_type: TouchEventType, + identifier: TouchId, + point: Point2D<f32>) + -> bool { let page = get_page(&self.root_page(), pipeline_id); let document = page.document(); - document.r().handle_touch_event(self.js_runtime.rt(), identifier, point, - event_name.to_owned()) + document.r().handle_touch_event(self.js_runtime.rt(), event_type, identifier, point) } /// https://html.spec.whatwg.org/multipage/#navigating-across-documents diff --git a/components/script/timers.rs b/components/script/timers.rs index a431c51b138..a7395de5e02 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -6,7 +6,7 @@ use dom::bindings::callback::ExceptionHandling::Report; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::FunctionBinding::Function; use dom::bindings::global::global_object_for_js_object; -use dom::bindings::utils::Reflectable; +use dom::bindings::reflector::Reflectable; use dom::window::ScriptHelpers; use euclid::length::Length; use js::jsapi::{HandleValue, Heap, RootedValue}; diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 9669ce0fd2b..321e000a1be 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -7,7 +7,8 @@ use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; -use dom::bindings::conversions::{Castable, FromJSValConvertible, StringificationBehavior}; +use dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior}; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::element::Element; use dom::htmliframeelement::HTMLIFrameElement; diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index eda5cf1b459..2db79ff93d3 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -158,6 +158,25 @@ pub enum MouseButton { Right, } +/// The type of input represented by a multi-touch event. +#[derive(Clone, Copy, Debug)] +pub enum TouchEventType { + /// A new touch point came in contact with the screen. + Down, + /// An existing touch point changed location. + Move, + /// A touch point was removed from the screen. + Up, + /// The system stopped tracking a touch point. + Cancel, +} + +/// An opaque identifier for a touch point. +/// +/// http://w3c.github.io/touch-events/#widl-Touch-identifier +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct TouchId(pub i32); + /// Events from the compositor that the script task needs to know about pub enum CompositorEvent { /// The window was resized. @@ -170,12 +189,8 @@ pub enum CompositorEvent { MouseUpEvent(MouseButton, Point2D<f32>), /// The mouse was moved over a point. MouseMoveEvent(Point2D<f32>), - /// A touch began at a point. - TouchDownEvent(i32, Point2D<f32>), - /// A touch was moved over a point. - TouchMoveEvent(i32, Point2D<f32>), - /// A touch ended at a point. - TouchUpEvent(i32, Point2D<f32>), + /// A touch event was generated with a touch ID and location. + TouchEvent(TouchEventType, TouchId, Point2D<f32>), /// A key was pressed. KeyEvent(Key, KeyState, KeyModifiers), } diff --git a/components/style/properties.mako.rs b/components/style/properties.mako.rs index 2912d4ea871..760672efdbd 100644 --- a/components/style/properties.mako.rs +++ b/components/style/properties.mako.rs @@ -546,7 +546,25 @@ pub mod longhands { </%self:longhand> ${single_keyword("position", "static absolute relative fixed")} - ${single_keyword("float", "none left right")} + + <%self:single_keyword_computed name="float" values="none left right"> + use values::computed::Context; + + impl ToComputedValue for SpecifiedValue { + type ComputedValue = computed_value::T; + + #[inline] + fn to_computed_value(&self, context: &Context) -> computed_value::T { + if context.positioned { + SpecifiedValue::none + } else { + *self + } + } + } + + </%self:single_keyword_computed> + ${single_keyword("clear", "none left right both")} <%self:longhand name="-servo-display-for-hypothetical-box" derived_from="display"> diff --git a/components/util/opts.rs b/components/util/opts.rs index 9f68ffb432b..31e3eb899ea 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -272,12 +272,6 @@ impl DebugOptions { pub fn new(debug_string: &str) -> Result<DebugOptions, &str> { let mut debug_options = DebugOptions::default(); - // FIXME: Glutin currently converts touch input to mouse events on Android. - // Convert it back to touch events. - if cfg!(target_os = "android") { - debug_options.convert_mouse_to_touch = true; - } - for option in debug_string.split(',') { match option { "help" => debug_options.help = true, diff --git a/ports/glutin/window.rs b/ports/glutin/window.rs index af8cf8a242b..4741c1f3ad2 100644 --- a/ports/glutin/window.rs +++ b/ports/glutin/window.rs @@ -16,6 +16,7 @@ use gleam::gl; use glutin; #[cfg(feature = "window")] use glutin::{Api, ElementState, Event, GlRequest, MouseButton, VirtualKeyCode, MouseScrollDelta}; +use glutin::{TouchPhase}; use layers::geometry::DevicePixel; use layers::platform::surface::NativeDisplay; #[cfg(feature = "window")] @@ -157,6 +158,8 @@ impl Window { } fn handle_window_event(&self, event: glutin::Event) -> bool { + use script_traits::{TouchEventType, TouchId}; + match event { Event::KeyboardInput(element_state, _scan_code, virtual_key_code) => { if virtual_key_code.is_some() { @@ -204,18 +207,19 @@ impl Window { MouseScrollDelta::LineDelta(dx, dy) => (dx, dy * LINE_HEIGHT), MouseScrollDelta::PixelDelta(dx, dy) => (dx, dy), }; - - if !self.key_modifiers.get().intersects(LEFT_CONTROL | RIGHT_CONTROL) { - self.scroll_window(dx, dy); - } else { - let factor = if dy > 0. { - 1.1 - } else { - 1.0 / 1.1 - }; - self.pinch_zoom(factor); - } + self.scroll_window(dx, dy); }, + Event::Touch(touch) => { + let phase = match touch.phase { + TouchPhase::Started => TouchEventType::Down, + TouchPhase::Moved => TouchEventType::Move, + TouchPhase::Ended => TouchEventType::Up, + TouchPhase::Cancelled => TouchEventType::Cancel, + }; + let id = TouchId(touch.id as i32); + let point = Point2D::typed(touch.location.0 as f32, touch.location.1 as f32); + self.event_queue.borrow_mut().push(WindowEvent::Touch(phase, id, point)); + } Event::Refresh => { self.event_queue.borrow_mut().push(WindowEvent::Refresh); } @@ -234,10 +238,6 @@ impl Window { self.key_modifiers.set(modifiers); } - fn pinch_zoom(&self, factor: f32) { - self.event_queue.borrow_mut().push(WindowEvent::PinchZoom(factor)); - } - /// Helper function to send a scroll event. fn scroll_window(&self, dx: f32, dy: f32) { let mouse_pos = self.mouse_pos.get(); @@ -646,12 +646,19 @@ impl WindowMethods for Window { fn handle_key(&self, key: Key, mods: constellation_msg::KeyModifiers) { match (mods, key) { - (_, Key::Equal) if mods & !SHIFT == CMD_OR_CONTROL => { - self.event_queue.borrow_mut().push(WindowEvent::Zoom(1.1)); + (_, Key::Equal) => { + if mods & !SHIFT == CMD_OR_CONTROL { + self.event_queue.borrow_mut().push(WindowEvent::Zoom(1.1)); + } else if mods & !SHIFT == CMD_OR_CONTROL | ALT { + self.event_queue.borrow_mut().push(WindowEvent::PinchZoom(1.1)); + } } (CMD_OR_CONTROL, Key::Minus) => { self.event_queue.borrow_mut().push(WindowEvent::Zoom(1.0 / 1.1)); } + (_, Key::Minus) if mods == CMD_OR_CONTROL | ALT => { + self.event_queue.borrow_mut().push(WindowEvent::PinchZoom(1.0 / 1.1)); + } (CMD_OR_CONTROL, Key::Num0) | (CMD_OR_CONTROL, Key::Kp0) => { self.event_queue.borrow_mut().push(WindowEvent::ResetZoom); diff --git a/tests/ref/basic.list b/tests/ref/basic.list index c363d8f96f6..7e8551c33e3 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -11,10 +11,6 @@ fragment=top != ../html/acid2.html acid2_ref.html == acid2_noscroll.html acid2_ref_broken.html flaky_cpu == append_style_a.html append_style_b.html -== box_shadow_inset_a.html box_shadow_inset_ref.html -== box_shadow_inset_parsing_a.html box_shadow_inset_parsing_ref.html -== box_shadow_spread_a.html box_shadow_spread_ref.html -== canvas_radial_gradient_a.html canvas_radial_gradient_ref.html == fixed_width_overrides_child_intrinsic_width_a.html fixed_width_overrides_child_intrinsic_width_ref.html prefs:"layout.flex-direction.enabled,layout.flex.enabled" == flex_column_direction.html flex_column_direction_ref.html prefs:"layout.flex.enabled" == flex_row_direction.html flex_row_direction_ref.html diff --git a/tests/wpt/grouping_formatter.py b/tests/wpt/grouping_formatter.py new file mode 100644 index 00000000000..614c3c0ae37 --- /dev/null +++ b/tests/wpt/grouping_formatter.py @@ -0,0 +1,241 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# 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/. + +from mozlog.formatters import base +import collections +import mozlog.commandline +import os +import sys + +class GroupingFormatter(base.BaseFormatter): + """Formatter designed to produce unexpected test results grouped + together in a readable format.""" + def __init__(self): + self.number_of_tests = 0 + self.completed_tests = 0 + self.need_to_erase_last_line = False + self.current_display = "" + self.running_tests = {} + self.test_output = collections.defaultdict(str) + self.subtest_failures = collections.defaultdict(list) + self.tests_with_failing_subtests = [] + self.interactive = os.isatty(sys.stdout.fileno()) + + self.expected = { + 'OK': 0, + 'PASS': 0, + 'FAIL': 0, + 'ERROR': 0, + 'TIMEOUT': 0, + 'SKIP': 0, + 'CRASH': 0, + } + + self.unexpected_tests = { + 'OK': [], + 'PASS': [], + 'FAIL': [], + 'ERROR': [], + 'TIMEOUT': [], + 'CRASH': [], + } + + def text_to_erase_display(self): + if not self.interactive or not self.current_display: + return "" + # TODO(mrobinson, 8313): We need to add support for Windows terminals here. + return ("\033[F" + "\033[K") * len(self.current_display.splitlines()) + + def generate_output(self, text=None, new_display=None): + if not self.interactive: + return text + + output = self.text_to_erase_display() + if text: + output += text + if new_display != None: + self.current_display = new_display + return output + self.current_display + + def build_status_line(self): + if self.number_of_tests == 0: + new_display = " [%i] " % self.completed_tests + else: + new_display = " [%i/%i] " % (self.completed_tests, self.number_of_tests) + + if self.running_tests: + indent = " " * len(new_display) + return new_display + ("\n%s" % indent).join( + self.running_tests.values()) + "\n" + else: + return new_display + "No tests running.\n" + + def suite_start(self, data): + self.number_of_tests = len(data["tests"]) + self.start_time = data["time"] + + if self.number_of_tests == 0: + return "Running tests in %s\n\n" % data[u'source'] + else: + return "Running %i tests in %s\n\n" % (self.number_of_tests, data[u'source']) + + def test_start(self, data): + self.running_tests[data['thread']] = data['test'] + return self.generate_output(text=None, + new_display=self.build_status_line()) + + def wrap_and_indent_lines(self, lines, indent): + assert(len(lines) > 0) + + output = indent + u"\u25B6 %s\n" % lines[0] + for line in lines[1:-1]: + output += indent + u"\u2502 %s\n" % line + if len(lines) > 1: + output += indent + u"\u2514 %s\n" % lines[-1] + return output + + def get_lines_for_unexpected_result(self, + test_name, + status, + expected, + message, + stack): + # Test names sometimes contain control characters, which we want + # to be printed in their raw form, and not their interpreted form. + test_name = test_name.encode('unicode-escape') + + if expected: + expected_text = u" [expected %s]" % expected + else: + expected_text = u"" + + lines = [u"%s%s %s" % (status, expected_text, test_name)] + if message: + lines.append(u" \u2192 %s" % message) + if stack: + lines.append("") + lines += [stackline for stackline in stack.splitlines()] + return lines + + def get_output_for_unexpected_subtests(self, test_name, unexpected_subtests): + if not unexpected_subtests: + return "" + + def add_subtest_failure(lines, subtest, stack=None): + lines += self.get_lines_for_unexpected_result( + subtest.get('subtest', None), + subtest.get('status', None), + subtest.get('expected', None), + subtest.get('message', None), + stack) + + def make_subtests_failure(test_name, subtests, stack=None): + lines = [u"Unexpected subtest result in %s:" % test_name] + for subtest in subtests[:-1]: + add_subtest_failure(lines, subtest, None) + add_subtest_failure(lines, subtests[-1], stack) + return self.wrap_and_indent_lines(lines, " ") + "\n" + + # Organize the failures by stack trace so we don't print the same stack trace + # more than once. They are really tall and we don't want to flood the screen + # with duplicate information. + output = "" + failures_by_stack = collections.defaultdict(list) + for failure in unexpected_subtests: + # Print stackless results first. They are all separate. + if 'stack' not in failure: + output += make_subtests_failure(test_name, [failure], None) + else: + failures_by_stack[failure['stack']].append(failure) + + for (stack, failures) in failures_by_stack.iteritems(): + output += make_subtests_failure(test_name, failures, stack) + return output + + def test_end(self, data): + self.completed_tests += 1 + test_status = data["status"] + test_name = data["test"] + had_unexpected_test_result = "expected" in data + subtest_failures = self.subtest_failures.pop(test_name, []) + + del self.running_tests[data['thread']] + new_display = self.build_status_line() + + if not had_unexpected_test_result and not subtest_failures: + self.expected[test_status] += 1 + return self.generate_output(text=None, new_display=new_display) + + # If the test crashed, we also include any process output, because there is a good + # chance that the test produced a stack trace. + if test_status == "CRASH": + stack = self.test_output[test_name] + data.get('stack', "") + else: + stack = data.get('stack', None) + + output = "" + if had_unexpected_test_result: + self.unexpected_tests[test_status].append(data) + lines = self.get_lines_for_unexpected_result( + test_name, + test_status, + data.get('expected', None), + data.get('message', None), + stack) + output += self.wrap_and_indent_lines(lines, " ") + "\n" + + if subtest_failures: + self.tests_with_failing_subtests.append(test_name) + output += self.get_output_for_unexpected_subtests(test_name, + subtest_failures) + + return self.generate_output(text=output, new_display=new_display) + + def test_status(self, data): + if "expected" in data: + self.subtest_failures[data["test"]].append(data) + + def suite_end(self, data): + self.end_time = data["time"] + + output = u"Ran %i tests finished in %.1f seconds.\n" % ( + self.completed_tests, (self.end_time - self.start_time) / 1000) + output += u" \u2022 %i ran as expected. %i tests skipped.\n" % ( + sum(self.expected.values()), self.expected['SKIP']) + + def text_for_unexpected_list(text, section): + tests = self.unexpected_tests[section] + if not tests: + return u"" + return u" \u2022 %i tests %s\n" % (len(tests), text) + + output += text_for_unexpected_list(u"crashed unexpectedly", 'CRASH') + output += text_for_unexpected_list(u"had errors unexpectedly", 'ERROR') + output += text_for_unexpected_list(u"failed unexpectedly", 'FAIL') + output += text_for_unexpected_list(u"timed out unexpectedly", 'TIMEOUT') + output += text_for_unexpected_list(u"passed unexpectedly", 'PASS') + output += text_for_unexpected_list(u"unexpectedly okay", 'OK') + + num_with_failing_subtests = len(self.tests_with_failing_subtests) + if num_with_failing_subtests: + output += (u" \u2022 %i tests had unexpected subtest results\n" + % num_with_failing_subtests) + + output += "\n" + return self.generate_output(text=output, new_display="") + + def process_output(self, data): + if data['thread'] not in self.running_tests: + return + test_name = self.running_tests[data['thread']] + self.test_output[test_name] += data['data'] + "\n" + + def log(self, data): + # We are logging messages that begin with STDERR, because that is how exceptions + # in this formatter are indicated. + if data['message'].startswith('STDERR'): + return self.generate_output(text=data['message']+"\n") + + if data['level'] in ('CRITICAL', 'ERROR'): + return self.generate_output(text=data['message']+"\n") diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-154.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-154.htm.ini deleted file mode 100644 index 2c712334d6e..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-154.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-154.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/left-offset-position-fixed-001.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/left-offset-position-fixed-001.htm.ini deleted file mode 100644 index b228b078d55..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/left-offset-position-fixed-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[left-offset-position-fixed-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/max-height-107.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/max-height-107.htm.ini deleted file mode 100644 index c9bfff0eacd..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/max-height-107.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[max-height-107.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/max-height-110.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/max-height-110.htm.ini deleted file mode 100644 index 21d4e382984..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/max-height-110.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[max-height-110.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/min-height-104.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/min-height-104.htm.ini deleted file mode 100644 index 1fec05c57f0..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/min-height-104.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[min-height-104.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/min-height-105.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/min-height-105.htm.ini deleted file mode 100644 index 165e8dea549..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/min-height-105.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[min-height-105.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index da05b5bcb77..5b8a445b28c 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -911,6 +911,18 @@ "url": "/_mozilla/css/box_shadow_default_color_a.html" } ], + "css/box_shadow_inset_a.html": [ + { + "path": "css/box_shadow_inset_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_inset_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_inset_a.html" + } + ], "css/box_shadow_inset_bg.html": [ { "path": "css/box_shadow_inset_bg.html", @@ -923,6 +935,18 @@ "url": "/_mozilla/css/box_shadow_inset_bg.html" } ], + "css/box_shadow_inset_parsing_a.html": [ + { + "path": "css/box_shadow_inset_parsing_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_inset_parsing_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_inset_parsing_a.html" + } + ], "css/box_shadow_paint_order_a.html": [ { "path": "css/box_shadow_paint_order_a.html", @@ -935,6 +959,18 @@ "url": "/_mozilla/css/box_shadow_paint_order_a.html" } ], + "css/box_shadow_spread_a.html": [ + { + "path": "css/box_shadow_spread_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_spread_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_spread_a.html" + } + ], "css/box_sizing_border_box_a.html": [ { "path": "css/box_sizing_border_box_a.html", @@ -1031,6 +1067,18 @@ "url": "/_mozilla/css/canvas_over_area.html" } ], + "css/canvas_radial_gradient_a.html": [ + { + "path": "css/canvas_radial_gradient_a.html", + "references": [ + [ + "/_mozilla/css/canvas_radial_gradient_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/canvas_radial_gradient_a.html" + } + ], "css/case-insensitive-font-family.html": [ { "path": "css/case-insensitive-font-family.html", @@ -4115,68 +4163,74 @@ "url": "/_mozilla/mozilla/webgl/clearcolor.html" } ], - "mozilla/webgl/tex_image_2d_canvas_no_context.html": [ + "mozilla/webgl/draw_arrays_simple.html": [ { - "path": "mozilla/webgl/tex_image_2d_canvas_no_context.html", + "path": "mozilla/webgl/draw_arrays_simple.html", "references": [ [ - "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context_ref.html", + "/_mozilla/mozilla/webgl/draw_arrays_simple_ref.html", "==" ] ], - "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context.html" + "url": "/_mozilla/mozilla/webgl/draw_arrays_simple.html" } ], - "mozilla/webgl/tex_image_2d_canvas2d.html": [ + "mozilla/webgl/tex_image_2d_canvas.html": [ { - "path": "mozilla/webgl/tex_image_2d_canvas2d.html", + "path": "mozilla/webgl/tex_image_2d_canvas.html", "references": [ [ "/_mozilla/mozilla/webgl/tex_image_2d_canvas_ref.html", "==" ] ], - "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas2d.html" + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas.html" } ], - "mozilla/webgl/tex_image_2d_canvas.html": [ + "mozilla/webgl/tex_image_2d_canvas2d.html": [ { - "path": "mozilla/webgl/tex_image_2d_canvas.html", + "path": "mozilla/webgl/tex_image_2d_canvas2d.html", "references": [ [ "/_mozilla/mozilla/webgl/tex_image_2d_canvas_ref.html", "==" ] ], - "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas.html" + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas2d.html" } ], - "mozilla/webgl/tex_image_2d_simple.html": [ + "mozilla/webgl/tex_image_2d_canvas_no_context.html": [ { - "path": "mozilla/webgl/tex_image_2d_simple.html", + "path": "mozilla/webgl/tex_image_2d_canvas_no_context.html", "references": [ [ - "/_mozilla/mozilla/webgl/tex_image_2d_simple_ref.html", + "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context.html", "==" ] ], - "url": "/_mozilla/mozilla/webgl/tex_image_2d_simple.html" + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context.html" } ], - "mozilla/webgl/draw_arrays_simple.html": [ + "mozilla/webgl/tex_image_2d_simple.html": [ { - "path": "mozilla/webgl/draw_arrays_simple.html", + "path": "mozilla/webgl/tex_image_2d_simple.html", "references": [ [ - "/_mozilla/mozilla/webgl/draw_arrays_simple_ref.html", + "/_mozilla/mozilla/webgl/tex_image_2d_simple_ref.html", "==" ] ], - "url": "/_mozilla/mozilla/webgl/draw_arrays_simple.html" + "url": "/_mozilla/mozilla/webgl/tex_image_2d_simple.html" } ] }, "testharness": { + "css/float_relative_to_position.html": [ + { + "path": "css/float_relative_to_position.html", + "url": "/_mozilla/css/float_relative_to_position.html" + } + ], "css/test_variable_legal_values.html": [ { "path": "css/test_variable_legal_values.html", @@ -5658,6 +5712,18 @@ "url": "/_mozilla/css/box_shadow_default_color_a.html" } ], + "css/box_shadow_inset_a.html": [ + { + "path": "css/box_shadow_inset_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_inset_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_inset_a.html" + } + ], "css/box_shadow_inset_bg.html": [ { "path": "css/box_shadow_inset_bg.html", @@ -5670,6 +5736,18 @@ "url": "/_mozilla/css/box_shadow_inset_bg.html" } ], + "css/box_shadow_inset_parsing_a.html": [ + { + "path": "css/box_shadow_inset_parsing_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_inset_parsing_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_inset_parsing_a.html" + } + ], "css/box_shadow_paint_order_a.html": [ { "path": "css/box_shadow_paint_order_a.html", @@ -5682,6 +5760,18 @@ "url": "/_mozilla/css/box_shadow_paint_order_a.html" } ], + "css/box_shadow_spread_a.html": [ + { + "path": "css/box_shadow_spread_a.html", + "references": [ + [ + "/_mozilla/css/box_shadow_spread_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/box_shadow_spread_a.html" + } + ], "css/box_sizing_border_box_a.html": [ { "path": "css/box_sizing_border_box_a.html", @@ -5778,6 +5868,18 @@ "url": "/_mozilla/css/canvas_over_area.html" } ], + "css/canvas_radial_gradient_a.html": [ + { + "path": "css/canvas_radial_gradient_a.html", + "references": [ + [ + "/_mozilla/css/canvas_radial_gradient_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/canvas_radial_gradient_a.html" + } + ], "css/case-insensitive-font-family.html": [ { "path": "css/case-insensitive-font-family.html", @@ -8849,6 +8951,78 @@ ], "url": "/_mozilla/mozilla/canvas/drawimage_html_image_9.html" } + ], + "mozilla/webgl/clearcolor.html": [ + { + "path": "mozilla/webgl/clearcolor.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/clearcolor_ref.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/clearcolor.html" + } + ], + "mozilla/webgl/draw_arrays_simple.html": [ + { + "path": "mozilla/webgl/draw_arrays_simple.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/draw_arrays_simple_ref.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/draw_arrays_simple.html" + } + ], + "mozilla/webgl/tex_image_2d_canvas.html": [ + { + "path": "mozilla/webgl/tex_image_2d_canvas.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/tex_image_2d_canvas_ref.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas.html" + } + ], + "mozilla/webgl/tex_image_2d_canvas2d.html": [ + { + "path": "mozilla/webgl/tex_image_2d_canvas2d.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/tex_image_2d_canvas_ref.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas2d.html" + } + ], + "mozilla/webgl/tex_image_2d_canvas_no_context.html": [ + { + "path": "mozilla/webgl/tex_image_2d_canvas_no_context.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/tex_image_2d_canvas_no_context.html" + } + ], + "mozilla/webgl/tex_image_2d_simple.html": [ + { + "path": "mozilla/webgl/tex_image_2d_simple.html", + "references": [ + [ + "/_mozilla/mozilla/webgl/tex_image_2d_simple_ref.html", + "==" + ] + ], + "url": "/_mozilla/mozilla/webgl/tex_image_2d_simple.html" + } ] } }, diff --git a/tests/ref/box_shadow_inset_a.html b/tests/wpt/mozilla/tests/css/box_shadow_inset_a.html index c6076a6c730..ba4b5b19f92 100644 --- a/tests/ref/box_shadow_inset_a.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_inset_a.html @@ -1,6 +1,7 @@ <!DOCTYPE html> <head> <!-- Tests that box-shadow inset works. --> +<link rel=match href=box_shadow_inset_ref.html> <style> section { position: absolute; diff --git a/tests/ref/box_shadow_inset_parsing_a.html b/tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_a.html index eb21c825107..741f697f1c8 100644 --- a/tests/ref/box_shadow_inset_parsing_a.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_a.html @@ -1,6 +1,7 @@ <!DOCTYPE html> <head> <!-- Tests that box-shadow inset parsing quirks work properly. --> +<link rel=match href=box_shadow_inset_parsing_ref.html> <style> section { position: absolute; diff --git a/tests/ref/box_shadow_inset_parsing_ref.html b/tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_ref.html index 3811f315635..3811f315635 100644 --- a/tests/ref/box_shadow_inset_parsing_ref.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_ref.html diff --git a/tests/ref/box_shadow_inset_ref.html b/tests/wpt/mozilla/tests/css/box_shadow_inset_ref.html index 48ee086ea3d..48ee086ea3d 100644 --- a/tests/ref/box_shadow_inset_ref.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_inset_ref.html diff --git a/tests/ref/box_shadow_spread_a.html b/tests/wpt/mozilla/tests/css/box_shadow_spread_a.html index 6e1e45a2738..8f593aefae5 100644 --- a/tests/ref/box_shadow_spread_a.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_spread_a.html @@ -1,5 +1,6 @@ <head> <!-- Tests that spread works. --> +<link rel=match href=box_shadow_spread_ref.html> <style> section { position: absolute; diff --git a/tests/ref/box_shadow_spread_ref.html b/tests/wpt/mozilla/tests/css/box_shadow_spread_ref.html index bb0cc767044..bb0cc767044 100644 --- a/tests/ref/box_shadow_spread_ref.html +++ b/tests/wpt/mozilla/tests/css/box_shadow_spread_ref.html diff --git a/tests/ref/canvas_radial_gradient.png b/tests/wpt/mozilla/tests/css/canvas_radial_gradient.png Binary files differindex 0192aa2b240..0192aa2b240 100644 --- a/tests/ref/canvas_radial_gradient.png +++ b/tests/wpt/mozilla/tests/css/canvas_radial_gradient.png diff --git a/tests/ref/canvas_radial_gradient_a.html b/tests/wpt/mozilla/tests/css/canvas_radial_gradient_a.html index 7fe5f8e4186..1d956a5f7bd 100644 --- a/tests/ref/canvas_radial_gradient_a.html +++ b/tests/wpt/mozilla/tests/css/canvas_radial_gradient_a.html @@ -1,6 +1,7 @@ <!DOCTYPE html> <html> <body> +<link rel=match href=canvas_radial_gradient_ref.html> <style> html, body { margin: 0; diff --git a/tests/ref/canvas_radial_gradient_ref.html b/tests/wpt/mozilla/tests/css/canvas_radial_gradient_ref.html index 4376341d31b..4376341d31b 100644 --- a/tests/ref/canvas_radial_gradient_ref.html +++ b/tests/wpt/mozilla/tests/css/canvas_radial_gradient_ref.html diff --git a/tests/wpt/mozilla/tests/css/float_relative_to_position.html b/tests/wpt/mozilla/tests/css/float_relative_to_position.html new file mode 100644 index 00000000000..bdeb133ef11 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/float_relative_to_position.html @@ -0,0 +1,40 @@ +<!doctype html> +<html> +<head> +<meta charset=utf-8> +<title>Tests the relationship between float and position</title> +<style> + div { + float: left; + } +</style> +<head> +<body> +<div></div> + +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> + test(function() { + var computed_style = getComputedStyle(document.querySelector("div"))["float"]; + assert_equals(computed_style, "left"); + + document.querySelector("div").setAttribute("style", "position: fixed;"); + + computed_style = getComputedStyle(document.querySelector("div"))["float"]; + assert_equals(computed_style, "none"); + + document.querySelector("div").setAttribute("style", "position: absolute;"); + + computed_style = getComputedStyle(document.querySelector("div"))["float"]; + assert_equals(computed_style, "none"); + + document.querySelector("div").removeAttribute("style"); + + computed_style = getComputedStyle(document.querySelector("div"))["float"]; + assert_equals(computed_style, "left"); + }); +</script> + +</body> +</html> diff --git a/tests/wpt/mozilla/tests/css/stacked_layers.html b/tests/wpt/mozilla/tests/css/stacked_layers.html index 3f7f5cf7ebd..d5c9c017f21 100644 --- a/tests/wpt/mozilla/tests/css/stacked_layers.html +++ b/tests/wpt/mozilla/tests/css/stacked_layers.html @@ -22,6 +22,13 @@ <div class="gray box" style="margin-left: 20px; margin-top: 10px; position: absolute; top: 20px; z-index: 5;"> </div> </div> + <!-- These divs should be stacked in tree order, even though the second one + initiates a stacking context and the third one does not. --> + <div class="test grayest box"> + <div class="grayer box" style="transform: translateX(10px) translateY(10px);"> </div> + <div class="gray box" style="top: -30px; left: 20px; position: relative; "></div> + </div> + <!-- The z-index of the second box should be ignored since it is not a positioned element. so these boxes stack in tree order. --> <div class="test grayest box"> @@ -36,6 +43,16 @@ <div class="gray box" style="position: relative; left: 20px; top: -40px;"> </div> </div> + <!-- Same as the previous test case, but the iframe is now a descendant + of the sibling of the second div, instead of a direct sibling. --> + <div class="test grayest box"> + <div> + <iframe class="box" style="margin-left: 10px; margin-top: 10px;" src="data:text/html;charset=utf-8;base64,PGh0bWw+PGJvZHkgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig4MCwgODAsIDgwKTsiPjwvYm9keT48L2Rpdj4="></iframe> + </div> + <div class="gray box" style="position: relative; left: 20px; top: -40px;"> </div> + </div> + + <!-- The iframe should be painted in tree order since both it and the inner div are not positioned elements. --> <div class="test grayest box"> diff --git a/tests/wpt/mozilla/tests/css/stacked_layers_ref.html b/tests/wpt/mozilla/tests/css/stacked_layers_ref.html index b676ca985fc..1a513fb86f1 100644 --- a/tests/wpt/mozilla/tests/css/stacked_layers_ref.html +++ b/tests/wpt/mozilla/tests/css/stacked_layers_ref.html @@ -21,6 +21,11 @@ </div> <div class="test grayest box"> + <div class="grayer box" style="margin-left: 10px; margin-top: 10px;"></div> + <div class="gray box" style="margin-left: 20px; margin-top: -40px;"></div> + </div> + + <div class="test grayest box"> <div class="grayer box" style="margin-left: 10px; margin-top: 10px; position: absolute; opacity: 0.999;"></div> <div class="gray box" style="margin-left: 20px; margin-top: 20px; position: relative; opacity: 0.999;"></div> </div> @@ -44,5 +49,10 @@ <div class="grayer box" style="margin-left: 10px; margin-top: 10px;"></div> <div class="gray box" style="margin-left: 20px; margin-top: -40px;"></div> </div> + + <div class="test grayest box"> + <div class="grayer box" style="margin-left: 10px; margin-top: 10px;"></div> + <div class="gray box" style="margin-left: 20px; margin-top: -40px;"></div> + </div> </body> </html> diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/clearcolor.html b/tests/wpt/mozilla/tests/mozilla/webgl/clearcolor.html index 7d0bdeb8f2d..4760f382f03 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/clearcolor.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/clearcolor.html @@ -1,6 +1,7 @@ <!DOCTYPE html> <html> <head> + <link rel="match" href="clearcolor_ref.html"></link> <meta charset="utf-8" /> <title>WebGL ClearColor Test</title> </head> diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/draw_arrays_simple.html b/tests/wpt/mozilla/tests/mozilla/webgl/draw_arrays_simple.html index b006143491d..13835c92930 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/draw_arrays_simple.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/draw_arrays_simple.html @@ -1,4 +1,5 @@ <!doctype html> +<link rel="match" href="draw_arrays_simple_ref.html"></link> <meta charset="utf-8"> <title>WebGL drawArrays test</title> <!-- diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas.html index 0b21aad94bf..70debe8d2af 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas.html @@ -1,5 +1,6 @@ <!doctype html> <html> + <link rel="match" href="tex_image_2d_canvas_ref.html"></link> <meta charset="utf-8"> <title>WebGL texture test</title> <!-- diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas2d.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas2d.html index e360f9ceddf..884fda9f7ed 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas2d.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas2d.html @@ -1,5 +1,6 @@ <!doctype html> <html> + <link rel="match" href="tex_image_2d_canvas_ref.html"></link> <meta charset="utf-8"> <title>WebGL texture test</title> <!-- diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas_no_context.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas_no_context.html index 157773ff10d..390425e3a09 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas_no_context.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas_no_context.html @@ -1,5 +1,6 @@ <!doctype html> <html> + <link rel="match" href="tex_image_2d_canvas_no_context.html"></link> <meta charset="utf-8"> <title>WebGL texture test</title> <!-- diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html index 60ea4674530..f3bba7d4f2d 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html @@ -1,5 +1,6 @@ <!doctype html> <html class="reftest-wait"> + <link rel="match" href="tex_image_2d_simple_ref.html"></link> <meta charset="utf-8"> <title>WebGL texture test</title> <!-- diff --git a/tests/wpt/run.py b/tests/wpt/run.py index 44b646956f9..ad11763d3e6 100644 --- a/tests/wpt/run.py +++ b/tests/wpt/run.py @@ -6,6 +6,8 @@ import argparse import multiprocessing import os import sys +import mozlog +import grouping_formatter here = os.path.split(__file__)[0] servo_root = os.path.abspath(os.path.join(here, "..", "..")) @@ -24,7 +26,11 @@ def run_tests(paths=None, **kwargs): if paths is None: paths = {} set_defaults(paths, kwargs) - wptrunner.setup_logging(kwargs, {"mach": sys.stdout}) + + mozlog.commandline.log_formatters["servo"] = \ + (grouping_formatter.GroupingFormatter, "A grouping output formatter") + wptrunner.setup_logging(kwargs, {"servo": sys.stdout}) + success = wptrunner.run_tests(**kwargs) return 0 if success else 1 |