aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/compositing/compositor.rs162
-rw-r--r--components/compositing/windowing.rs6
-rw-r--r--components/gfx/display_list/mod.rs464
-rw-r--r--components/gfx/display_list/optimizer.rs63
-rw-r--r--components/gfx/paint_task.rs19
-rw-r--r--components/layout/animation.rs6
-rw-r--r--components/layout/block.rs33
-rw-r--r--components/layout/construct.rs4
-rw-r--r--components/layout/context.rs4
-rw-r--r--components/layout/css/matching.rs6
-rw-r--r--components/layout/display_list_builder.rs14
-rw-r--r--components/layout/flow.rs23
-rw-r--r--components/layout/layout_task.rs50
-rw-r--r--components/layout/wrapper.rs12
-rw-r--r--components/net/http_loader.rs57
-rw-r--r--components/plugins/reflector.rs10
-rw-r--r--components/script/devtools.rs11
-rw-r--r--components/script/dom/activation.rs2
-rw-r--r--components/script/dom/attr.rs4
-rw-r--r--components/script/dom/bindings/callback.rs2
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py13
-rw-r--r--components/script/dom/bindings/conversions.rs31
-rw-r--r--components/script/dom/bindings/global.rs2
-rw-r--r--components/script/dom/bindings/inheritance.rs38
-rw-r--r--components/script/dom/bindings/js.rs5
-rw-r--r--components/script/dom/bindings/mod.rs3
-rw-r--r--components/script/dom/bindings/refcounted.rs2
-rw-r--r--components/script/dom/bindings/reflector.rs79
-rw-r--r--components/script/dom/bindings/trace.rs3
-rw-r--r--components/script/dom/bindings/utils.rs245
-rw-r--r--components/script/dom/bindings/xmlname.rs176
-rw-r--r--components/script/dom/blob.rs2
-rw-r--r--components/script/dom/browsercontext.rs3
-rw-r--r--components/script/dom/canvasgradient.rs2
-rw-r--r--components/script/dom/canvaspattern.rs2
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs4
-rw-r--r--components/script/dom/characterdata.rs2
-rw-r--r--components/script/dom/closeevent.rs4
-rw-r--r--components/script/dom/console.rs2
-rw-r--r--components/script/dom/crypto.rs2
-rw-r--r--components/script/dom/css.rs2
-rw-r--r--components/script/dom/cssstyledeclaration.rs4
-rw-r--r--components/script/dom/customevent.rs4
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs4
-rw-r--r--components/script/dom/document.rs78
-rw-r--r--components/script/dom/documentfragment.rs2
-rw-r--r--components/script/dom/documenttype.rs2
-rw-r--r--components/script/dom/domexception.rs2
-rw-r--r--components/script/dom/domimplementation.rs6
-rw-r--r--components/script/dom/domparser.rs2
-rw-r--r--components/script/dom/dompoint.rs2
-rw-r--r--components/script/dom/dompointreadonly.rs2
-rw-r--r--components/script/dom/domrect.rs2
-rw-r--r--components/script/dom/domrectlist.rs2
-rw-r--r--components/script/dom/domrectreadonly.rs2
-rw-r--r--components/script/dom/domstringmap.rs2
-rw-r--r--components/script/dom/domtokenlist.rs7
-rw-r--r--components/script/dom/element.rs7
-rw-r--r--components/script/dom/errorevent.rs4
-rw-r--r--components/script/dom/event.rs2
-rw-r--r--components/script/dom/eventdispatcher.rs2
-rw-r--r--components/script/dom/eventtarget.rs4
-rw-r--r--components/script/dom/file.rs2
-rw-r--r--components/script/dom/filelist.rs2
-rw-r--r--components/script/dom/filereader.rs4
-rw-r--r--components/script/dom/formdata.rs4
-rw-r--r--components/script/dom/htmlanchorelement.rs2
-rw-r--r--components/script/dom/htmlappletelement.rs2
-rw-r--r--components/script/dom/htmlareaelement.rs4
-rw-r--r--components/script/dom/htmlbaseelement.rs2
-rw-r--r--components/script/dom/htmlbodyelement.rs4
-rw-r--r--components/script/dom/htmlbuttonelement.rs2
-rw-r--r--components/script/dom/htmlcanvaselement.rs4
-rw-r--r--components/script/dom/htmlcollection.rs5
-rw-r--r--components/script/dom/htmldatalistelement.rs2
-rw-r--r--components/script/dom/htmlelement.rs6
-rw-r--r--components/script/dom/htmlfieldsetelement.rs3
-rw-r--r--components/script/dom/htmlfontelement.rs2
-rw-r--r--components/script/dom/htmlformelement.rs6
-rw-r--r--components/script/dom/htmlheadelement.rs2
-rw-r--r--components/script/dom/htmliframeelement.rs5
-rw-r--r--components/script/dom/htmlimageelement.rs2
-rw-r--r--components/script/dom/htmlinputelement.rs47
-rw-r--r--components/script/dom/htmllabelelement.rs2
-rw-r--r--components/script/dom/htmllinkelement.rs2
-rw-r--r--components/script/dom/htmlmetaelement.rs2
-rw-r--r--components/script/dom/htmlmeterelement.rs2
-rw-r--r--components/script/dom/htmlobjectelement.rs2
-rw-r--r--components/script/dom/htmloptgroupelement.rs2
-rw-r--r--components/script/dom/htmloptionelement.rs2
-rw-r--r--components/script/dom/htmloutputelement.rs2
-rw-r--r--components/script/dom/htmlprogresselement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs2
-rw-r--r--components/script/dom/htmlselectelement.rs2
-rw-r--r--components/script/dom/htmlstyleelement.rs2
-rw-r--r--components/script/dom/htmltablecellelement.rs2
-rw-r--r--components/script/dom/htmltableelement.rs2
-rw-r--r--components/script/dom/htmltablerowelement.rs2
-rw-r--r--components/script/dom/htmltablesectionelement.rs2
-rw-r--r--components/script/dom/htmltemplateelement.rs2
-rw-r--r--components/script/dom/htmltextareaelement.rs2
-rw-r--r--components/script/dom/htmltitleelement.rs2
-rw-r--r--components/script/dom/imagedata.rs2
-rw-r--r--components/script/dom/keyboardevent.rs4
-rw-r--r--components/script/dom/location.rs2
-rw-r--r--components/script/dom/macros.rs26
-rw-r--r--components/script/dom/messageevent.rs4
-rw-r--r--components/script/dom/mod.rs8
-rw-r--r--components/script/dom/mouseevent.rs4
-rw-r--r--components/script/dom/namednodemap.rs3
-rw-r--r--components/script/dom/navigator.rs2
-rw-r--r--components/script/dom/node.rs9
-rw-r--r--components/script/dom/nodeiterator.rs2
-rw-r--r--components/script/dom/nodelist.rs2
-rw-r--r--components/script/dom/performance.rs2
-rw-r--r--components/script/dom/performancetiming.rs2
-rw-r--r--components/script/dom/progressevent.rs4
-rw-r--r--components/script/dom/range.rs6
-rw-r--r--components/script/dom/screen.rs2
-rw-r--r--components/script/dom/servohtmlparser.rs2
-rw-r--r--components/script/dom/storage.rs4
-rw-r--r--components/script/dom/storageevent.rs4
-rw-r--r--components/script/dom/testbinding.rs2
-rw-r--r--components/script/dom/testbindingproxy.rs2
-rw-r--r--components/script/dom/text.rs2
-rw-r--r--components/script/dom/textdecoder.rs2
-rw-r--r--components/script/dom/textencoder.rs2
-rw-r--r--components/script/dom/touch.rs2
-rw-r--r--components/script/dom/touchevent.rs4
-rw-r--r--components/script/dom/touchlist.rs2
-rw-r--r--components/script/dom/treewalker.rs2
-rw-r--r--components/script/dom/uievent.rs4
-rw-r--r--components/script/dom/url.rs2
-rw-r--r--components/script/dom/urlsearchparams.rs2
-rw-r--r--components/script/dom/userscripts.rs2
-rw-r--r--components/script/dom/validitystate.rs2
-rw-r--r--components/script/dom/virtualmethods.rs8
-rw-r--r--components/script/dom/webglactiveinfo.rs2
-rw-r--r--components/script/dom/webglbuffer.rs2
-rw-r--r--components/script/dom/webglcontextevent.rs4
-rw-r--r--components/script/dom/webglframebuffer.rs2
-rw-r--r--components/script/dom/webglobject.rs2
-rw-r--r--components/script/dom/webglprogram.rs2
-rw-r--r--components/script/dom/webglrenderbuffer.rs2
-rw-r--r--components/script/dom/webglrenderingcontext.rs5
-rw-r--r--components/script/dom/webglshader.rs2
-rw-r--r--components/script/dom/webglshaderprecisionformat.rs2
-rw-r--r--components/script/dom/webgltexture.rs2
-rw-r--r--components/script/dom/webgluniformlocation.rs2
-rw-r--r--components/script/dom/websocket.rs5
-rw-r--r--components/script/dom/window.rs20
-rw-r--r--components/script/dom/worker.rs4
-rw-r--r--components/script/dom/workerglobalscope.rs4
-rw-r--r--components/script/dom/workerlocation.rs2
-rw-r--r--components/script/dom/workernavigator.rs2
-rw-r--r--components/script/dom/xmlhttprequest.rs5
-rw-r--r--components/script/dom/xmlhttprequestupload.rs2
-rw-r--r--components/script/layout_interface.rs4
-rw-r--r--components/script/mem.rs2
-rw-r--r--components/script/parse/html.rs3
-rw-r--r--components/script/script_task.rs54
-rw-r--r--components/script/timers.rs2
-rw-r--r--components/script/webdriver_handlers.rs3
-rw-r--r--components/script_traits/lib.rs27
-rw-r--r--components/style/properties.mako.rs20
-rw-r--r--components/util/opts.rs6
-rw-r--r--ports/glutin/window.rs41
-rw-r--r--tests/ref/basic.list4
-rw-r--r--tests/wpt/grouping_formatter.py241
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/floats-154.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/left-offset-position-fixed-001.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/max-height-107.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/max-height-110.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/min-height-104.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/min-height-105.htm.ini3
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json210
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_inset_a.html (renamed from tests/ref/box_shadow_inset_a.html)1
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_a.html (renamed from tests/ref/box_shadow_inset_parsing_a.html)1
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_inset_parsing_ref.html (renamed from tests/ref/box_shadow_inset_parsing_ref.html)0
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_inset_ref.html (renamed from tests/ref/box_shadow_inset_ref.html)0
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_spread_a.html (renamed from tests/ref/box_shadow_spread_a.html)1
-rw-r--r--tests/wpt/mozilla/tests/css/box_shadow_spread_ref.html (renamed from tests/ref/box_shadow_spread_ref.html)0
-rw-r--r--tests/wpt/mozilla/tests/css/canvas_radial_gradient.png (renamed from tests/ref/canvas_radial_gradient.png)bin5210 -> 5210 bytes
-rw-r--r--tests/wpt/mozilla/tests/css/canvas_radial_gradient_a.html (renamed from tests/ref/canvas_radial_gradient_a.html)1
-rw-r--r--tests/wpt/mozilla/tests/css/canvas_radial_gradient_ref.html (renamed from tests/ref/canvas_radial_gradient_ref.html)0
-rw-r--r--tests/wpt/mozilla/tests/css/float_relative_to_position.html40
-rw-r--r--tests/wpt/mozilla/tests/css/stacked_layers.html17
-rw-r--r--tests/wpt/mozilla/tests/css/stacked_layers_ref.html10
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/clearcolor.html1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/draw_arrays_simple.html1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas.html1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas2d.html1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_canvas_no_context.html1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html1
-rw-r--r--tests/wpt/run.py8
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
index 0192aa2b240..0192aa2b240 100644
--- a/tests/ref/canvas_radial_gradient.png
+++ b/tests/wpt/mozilla/tests/css/canvas_radial_gradient.png
Binary files differ
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