diff options
41 files changed, 166 insertions, 161 deletions
diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 8d37b6aa6ba..3dfcfdf2689 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -34,9 +34,9 @@ use inline::{InlineFragmentNodeInfo, LAST_FRAGMENT_OF_ELEMENT}; use list_item::{ListItemFlow, ListStyleTypeContent}; use multicol::{MulticolFlow, MulticolColumnFlow}; use parallel; -use script::dom::bindings::inheritance::{CharacterDataTypeId, ElementTypeId}; -use script::dom::bindings::inheritance::{HTMLElementTypeId, NodeTypeId}; -use script::dom::htmlobjectelement::is_image_data; +use script::layout_interface::is_image_data; +use script::layout_interface::{CharacterDataTypeId, ElementTypeId}; +use script::layout_interface::{HTMLElementTypeId, NodeTypeId}; use std::borrow::ToOwned; use std::collections::LinkedList; use std::marker::PhantomData; diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 705868a5afe..640b7acce1a 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -30,7 +30,7 @@ use net_traits::image::base::{Image, ImageMetadata}; use net_traits::image_cache_thread::{ImageOrMetadataAvailable, UsePlaceholder}; use range::*; use rustc_serialize::{Encodable, Encoder}; -use script::dom::htmlcanvaselement::HTMLCanvasData; +use script::layout_interface::HTMLCanvasData; use std::borrow::ToOwned; use std::cmp::{max, min}; use std::collections::LinkedList; diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs index 6307e5a79fc..5bef2050932 100644 --- a/components/layout/layout_thread.rs +++ b/components/layout/layout_thread.rs @@ -47,7 +47,7 @@ use query::process_offset_parent_query; use query::{LayoutRPCImpl, process_content_box_request, process_content_boxes_request}; use query::{process_node_geometry_request, process_node_layer_id_request, process_node_scroll_area_request}; use query::{process_node_overflow_request, process_resolved_style_request, process_margin_style_query}; -use script::dom::node::OpaqueStyleAndLayoutData; +use script::layout_interface::OpaqueStyleAndLayoutData; use script::layout_interface::{LayoutRPC, OffsetParentResponse, NodeOverflowResponse, MarginStyleResponse}; use script::layout_interface::{Msg, NewLayoutThreadInfo, Reflow, ReflowQueryType, ScriptReflow}; use script::reporter::CSSErrorReporter; diff --git a/components/layout/opaque_node.rs b/components/layout/opaque_node.rs index 023b9cb34c0..a05a49d48e6 100644 --- a/components/layout/opaque_node.rs +++ b/components/layout/opaque_node.rs @@ -6,8 +6,8 @@ use gfx::display_list::OpaqueNode; use libc::{c_void, uintptr_t}; -use script::dom::bindings::js::LayoutJS; -use script::dom::node::Node; +use script::layout_interface::LayoutJS; +use script::layout_interface::Node; use script::layout_interface::TrustedNodeAddress; use script_traits::UntrustedNodeAddress; diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 10dde4b2ff0..b6c5266c2cb 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -39,22 +39,12 @@ use incremental::RestyleDamage; use msg::constellation_msg::PipelineId; use opaque_node::OpaqueNodeMethods; use range::Range; -use script::dom::attr::AttrValue; -use script::dom::bindings::inheritance::{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}; -use script::dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers}; -use script::dom::htmlcanvaselement::{LayoutHTMLCanvasElementHelpers, HTMLCanvasData}; -use script::dom::htmliframeelement::HTMLIFrameElement; -use script::dom::htmlimageelement::LayoutHTMLImageElementHelpers; -use script::dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers}; -use script::dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers}; -use script::dom::node::{CAN_BE_FRAGMENTED, HAS_CHANGED, HAS_DIRTY_DESCENDANTS, IS_DIRTY}; -use script::dom::node::{LayoutNodeHelpers, Node, OpaqueStyleAndLayoutData}; -use script::dom::text::Text; -use script::layout_interface::TrustedNodeAddress; +use script::layout_interface::{CAN_BE_FRAGMENTED, HAS_CHANGED, HAS_DIRTY_DESCENDANTS, IS_DIRTY}; +use script::layout_interface::{CharacterDataTypeId, Document, Element, ElementTypeId}; +use script::layout_interface::{HTMLCanvasData, HTMLElementTypeId, LayoutCharacterDataHelpers}; +use script::layout_interface::{LayoutDocumentHelpers, LayoutElementHelpers, LayoutJS}; +use script::layout_interface::{LayoutNodeHelpers, Node, NodeTypeId, OpaqueStyleAndLayoutData}; +use script::layout_interface::{RawLayoutElementHelpers, Text, TrustedNodeAddress}; use selectors::matching::{DeclarationBlock, ElementFlags}; use selectors::parser::{AttrSelector, NamespaceConstraint}; use smallvec::VecLike; @@ -63,6 +53,7 @@ use std::marker::PhantomData; use std::mem::{transmute, transmute_copy}; use std::sync::Arc; use string_cache::{Atom, BorrowedAtom, BorrowedNamespace, Namespace}; +use style::attr::AttrValue; use style::computed_values::content::ContentItem; use style::computed_values::{content, display}; use style::dom::{PresentationalHintsSynthetizer, TDocument, TElement, TNode, UnsafeNode}; @@ -1142,39 +1133,25 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { fn selection(&self) -> Option<Range<ByteIndex>> { let this = unsafe { self.get_jsmanaged() }; - let selection = if let Some(area) = this.downcast::<HTMLTextAreaElement>() { - unsafe { area.selection_for_layout() } - } else if let Some(input) = this.downcast::<HTMLInputElement>() { - unsafe { input.selection_for_layout() } - } else { - return None; - }; - selection.map(|range| Range::new(ByteIndex(range.start as isize), - ByteIndex(range.len() as isize))) + this.selection().map(|range| { + Range::new(ByteIndex(range.start as isize), + ByteIndex(range.len() as isize)) + }) } fn image_url(&self) -> Option<Url> { - unsafe { - self.get_jsmanaged().downcast() - .expect("not an image!") - .image_url() - } + let this = unsafe { self.get_jsmanaged() }; + this.image_url() } fn canvas_data(&self) -> Option<HTMLCanvasData> { - unsafe { - let canvas_element = self.get_jsmanaged().downcast(); - canvas_element.map(|canvas| canvas.data()) - } + let this = unsafe { self.get_jsmanaged() }; + this.canvas_data() } fn iframe_pipeline_id(&self) -> PipelineId { - use script::dom::htmliframeelement::HTMLIFrameElementLayoutMethods; - unsafe { - let iframe_element = self.get_jsmanaged().downcast::<HTMLIFrameElement>() - .expect("not an iframe element!"); - iframe_element.pipeline_id().unwrap() - } + let this = unsafe { self.get_jsmanaged() }; + this.iframe_pipeline_id() } fn get_colspan(&self) -> u32 { diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 4eab3e725e9..be6cbf4ee95 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -573,3 +573,27 @@ pub enum NetworkError { /// SSL validation error that has to be handled in the HTML parser SslValidation(Url), } + +/// Normalize `slice`, as defined by +/// [the Fetch Spec](https://fetch.spec.whatwg.org/#concept-header-value-normalize). +pub fn trim_http_whitespace(mut slice: &[u8]) -> &[u8] { + const HTTP_WS_BYTES: &'static [u8] = b"\x09\x0A\x0D\x20"; + + loop { + match slice.split_first() { + Some((first, remainder)) if HTTP_WS_BYTES.contains(first) => + slice = remainder, + _ => break, + } + } + + loop { + match slice.split_last() { + Some((last, remainder)) if HTTP_WS_BYTES.contains(last) => + slice = remainder, + _ => break, + } + } + + slice +} diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 43c1226b295..d5a00e6c1fa 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -18,7 +18,7 @@ use std::borrow::ToOwned; use std::cell::Ref; use std::mem; use string_cache::{Atom, Namespace}; -pub use style::attr::{AttrIdentifier, AttrValue}; +use style::attr::{AttrIdentifier, AttrValue}; // https://dom.spec.whatwg.org/#interface-attr #[dom_struct] diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index 3ee685fbe02..69565520899 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -8,7 +8,6 @@ use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::fmt; use std::hash::{Hash, Hasher}; -use std::mem; use std::ops; use std::ops::{Deref, DerefMut}; use std::str; @@ -31,12 +30,6 @@ impl ByteString { str::from_utf8(&self.0).ok() } - /// Returns ownership of the underlying Vec<u8> and copies an empty - /// vec in its place - pub fn bytes(&mut self) -> Vec<u8> { - mem::replace(&mut self.0, Vec::new()) - } - /// Returns the length. pub fn len(&self) -> usize { self.0.len() diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 0897ccc24ae..a3a9d4beeaa 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -4,7 +4,7 @@ use document_loader::{DocumentLoader, LoadType}; use dom::activation::{ActivationSource, synthetic_click_activation}; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods; use dom::bindings::codegen::Bindings::DocumentBinding; @@ -120,6 +120,7 @@ use std::ptr; use std::rc::Rc; use std::sync::Arc; use string_cache::{Atom, QualName}; +use style::attr::AttrValue; use style::context::ReflowGoal; use style::restyle_hints::ElementSnapshot; use style::servo::Stylesheet; diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 0432be3987c..34791c3417c 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -8,7 +8,6 @@ use app_units::Au; use cssparser::{Color, ToCss}; use devtools_traits::AttrInfo; use dom::activation::Activatable; -use dom::attr::AttrValue; use dom::attr::{Attr, AttrHelpersForLayout}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; @@ -85,7 +84,7 @@ use std::mem; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use string_cache::{Atom, BorrowedAtom, BorrowedNamespace, Namespace, QualName}; -use style::attr::LengthOrPercentageOrAuto; +use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use style::element_state::*; use style::parser::ParserContextExtraData; use style::properties::DeclaredValue; diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 4fb575dd1e2..161a7d43eaf 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -2,9 +2,7 @@ * 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/. */ - use dom::activation::Activatable; -use dom::attr::AttrValue; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; use dom::bindings::codegen::Bindings::HTMLAnchorElementBinding; @@ -29,6 +27,7 @@ use num_traits::ToPrimitive; use script_traits::MozBrowserEvent; use std::default::Default; use string_cache::Atom; +use style::attr::AttrValue; use url::Url; use util::prefs::mozbrowser_enabled; diff --git a/components/script/dom/htmlappletelement.rs b/components/script/dom/htmlappletelement.rs index df46e89f06f..16d7e46b10e 100644 --- a/components/script/dom/htmlappletelement.rs +++ b/components/script/dom/htmlappletelement.rs @@ -2,7 +2,6 @@ * 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/. */ -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLAppletElementBinding; use dom::bindings::codegen::Bindings::HTMLAppletElementBinding::HTMLAppletElementMethods; use dom::bindings::inheritance::Castable; @@ -13,6 +12,7 @@ use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; #[dom_struct] pub struct HTMLAppletElement { diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index 4e8139374f0..7998333810e 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -2,7 +2,6 @@ * 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/. */ -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLAreaElementBinding::HTMLAreaElementMethods; use dom::bindings::inheritance::Castable; @@ -15,6 +14,7 @@ use dom::node::Node; use dom::virtualmethods::VirtualMethods; use std::default::Default; use string_cache::Atom; +use style::attr::AttrValue; #[dom_struct] pub struct HTMLAreaElement { diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index 944b3675cba..e0c38b1ab41 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -2,7 +2,7 @@ * 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/. */ -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLBaseElementBinding; use dom::bindings::codegen::Bindings::HTMLBaseElementBinding::HTMLBaseElementMethods; use dom::bindings::inheritance::Castable; @@ -14,6 +14,7 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, UnbindContext, document_from_node}; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; use url::Url; #[dom_struct] diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index b5408d877ac..79dbd1438e4 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnBeforeUnloadEventHandlerNonNull}; use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; @@ -18,6 +18,7 @@ use dom::node::{Node, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use script_traits::ScriptMsg as ConstellationMsg; use string_cache::Atom; +use style::attr::AttrValue; use time; use url::Url; diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 18dcb6d2e34..95073d49cd3 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -4,7 +4,6 @@ use canvas_traits::{CanvasMsg, FromLayoutMsg, CanvasData}; use dom::attr::Attr; -use dom::attr::AttrValue; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods; use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding; @@ -33,6 +32,7 @@ use offscreen_gl_context::GLContextAttributes; use rustc_serialize::base64::{STANDARD, ToBase64}; use std::iter::repeat; use string_cache::Atom; +use style::attr::AttrValue; const DEFAULT_WIDTH: u32 = 300; const DEFAULT_HEIGHT: u32 = 150; diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 086eb6ff687..87bf5d92ff4 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -4,7 +4,6 @@ use dom::activation::{ActivationSource, synthetic_click_activation}; use dom::attr::Attr; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull; @@ -35,6 +34,7 @@ use std::borrow::ToOwned; use std::default::Default; use std::rc::Rc; use string_cache::Atom; +use style::attr::AttrValue; use style::element_state::*; #[dom_struct] diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index 74526b569bb..5968efc7948 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLFontElementBinding; use dom::bindings::codegen::Bindings::HTMLFontElementBinding::HTMLFontElementMethods; use dom::bindings::inheritance::Castable; @@ -15,6 +14,7 @@ use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; use style::values::specified; use util::str::{HTML_SPACE_CHARACTERS, read_numbers}; diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 66121a422bb..fcc10e3d134 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -2,7 +2,6 @@ * 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/. */ -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; @@ -50,6 +49,7 @@ use std::borrow::ToOwned; use std::cell::Cell; use std::sync::mpsc::Sender; use string_cache::Atom; +use style::attr::AttrValue; use task_source::TaskSource; use task_source::dom_manipulation::DOMManipulationTask; use url::form_urlencoded; diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index 1041319f907..a3127449fcc 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLHRElementBinding::{self, HTMLHRElementMethods}; use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; @@ -14,7 +13,7 @@ use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; -use style::attr::LengthOrPercentageOrAuto; +use style::attr::{AttrValue, LengthOrPercentageOrAuto}; #[dom_struct] pub struct HTMLHRElement { diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index bc37f526f88..6d37513d01a 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use document_loader::{LoadType, LoadBlocker}; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserElementErrorEventDetail; use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserElementIconChangeEventDetail; @@ -42,7 +42,7 @@ use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed}; use script_traits::{IFrameLoadInfo, MozBrowserEvent, ScriptMsg as ConstellationMsg}; use std::cell::Cell; use string_cache::Atom; -use style::attr::LengthOrPercentageOrAuto; +use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use style::context::ReflowGoal; use url::Url; use util::prefs::mozbrowser_enabled; diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 49f771824d3..06a5bf93abf 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -4,7 +4,6 @@ use app_units::Au; use dom::attr::Attr; -use dom::attr::AttrValue; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLImageElementBinding; use dom::bindings::codegen::Bindings::HTMLImageElementBinding::HTMLImageElementMethods; @@ -31,7 +30,7 @@ use script_runtime::ScriptThreadEventCategory::UpdateReplacedElement; use script_thread::Runnable; use std::sync::Arc; use string_cache::Atom; -use style::attr::LengthOrPercentageOrAuto; +use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use url::Url; #[derive(JSTraceable, HeapSizeOf)] diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index a7bb9846bb9..4c164f2c819 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -4,7 +4,7 @@ use caseless::compatibility_caseless_match_str; use dom::activation::{Activatable, ActivationSource, synthetic_click_activation}; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::FileListBinding::FileListMethods; @@ -39,6 +39,7 @@ use std::borrow::ToOwned; use std::cell::Cell; use std::ops::Range; use string_cache::Atom; +use style::attr::AttrValue; use style::element_state::*; use textinput::KeyReaction::{DispatchInput, Nothing, RedrawSelection, TriggerDefaultAction}; use textinput::Lines::Single; diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index e14dce36b88..6e808a14fc3 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::activation::{Activatable, ActivationSource, synthetic_click_activation}; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLLabelElementBinding; use dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods; use dom::bindings::inheritance::Castable; @@ -18,6 +17,7 @@ use dom::htmlformelement::{FormControl, HTMLFormElement}; use dom::node::{document_from_node, Node}; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; #[dom_struct] pub struct HTMLLabelElement { diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index a69ec5b9aa5..2b0056a8d65 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -4,7 +4,7 @@ use cssparser::Parser as CssParser; use document_loader::LoadType; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLLinkElementBinding; use dom::bindings::codegen::Bindings::HTMLLinkElementBinding::HTMLLinkElementMethods; @@ -36,6 +36,7 @@ use std::default::Default; use std::mem; use std::sync::{Arc, Mutex}; use string_cache::Atom; +use style::attr::AttrValue; use style::media_queries::{MediaQueryList, parse_media_query_list}; use style::parser::ParserContextExtraData; use style::servo::Stylesheet; diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 13bf926cded..160b4a9c68e 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -2,7 +2,7 @@ * 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/. */ -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLMetaElementBinding; use dom::bindings::codegen::Bindings::HTMLMetaElementBinding::HTMLMetaElementMethods; @@ -19,6 +19,7 @@ use dom::virtualmethods::VirtualMethods; use std::ascii::AsciiExt; use std::sync::Arc; use string_cache::Atom; +use style::attr::AttrValue; use style::servo::Stylesheet; use style::stylesheets::{CSSRule, Origin}; use style::viewport::ViewportRule; diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 8b04c9b00eb..26e1ad9b0c4 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -2,7 +2,7 @@ * 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/. */ -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use dom::bindings::codegen::Bindings::HTMLSelectElementBinding; use dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; @@ -23,6 +23,7 @@ use dom::validation::Validatable; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; use style::element_state::*; #[dom_struct] diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index ae54b915342..eeeafd8f977 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLTableCellElementBinding::HTMLTableCellElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::inheritance::Castable; @@ -16,7 +15,7 @@ use dom::htmltablerowelement::HTMLTableRowElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; -use style::attr::LengthOrPercentageOrAuto; +use style::attr::{AttrValue, LengthOrPercentageOrAuto}; const DEFAULT_COLSPAN: u32 = 1; diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index a86381967b4..ec6e4b59efe 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods; use dom::bindings::codegen::Bindings::HTMLTableElementBinding; use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods; @@ -24,7 +24,7 @@ use dom::node::{Node, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use std::cell::Cell; use string_cache::Atom; -use style::attr::{LengthOrPercentageOrAuto, parse_unsigned_integer}; +use style::attr::{AttrValue, LengthOrPercentageOrAuto, parse_unsigned_integer}; #[dom_struct] pub struct HTMLTableElement { diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 06669b74c18..92c62115bd4 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods; use dom::bindings::codegen::Bindings::HTMLTableRowElementBinding::{self, HTMLTableRowElementMethods}; use dom::bindings::codegen::Bindings::HTMLTableSectionElementBinding::HTMLTableSectionElementMethods; @@ -23,7 +22,7 @@ use dom::htmltablesectionelement::HTMLTableSectionElement; use dom::node::{Node, window_from_node}; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; - +use style::attr::AttrValue; #[derive(JSTraceable)] struct CellsFilter; diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index bc907c16324..7b047439743 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLTableSectionElementBinding::{self, HTMLTableSectionElementMethods}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::error::{ErrorResult, Fallible}; @@ -18,6 +17,7 @@ use dom::htmltablerowelement::HTMLTableRowElement; use dom::node::{Node, window_from_node}; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; +use style::attr::AttrValue; #[dom_struct] pub struct HTMLTableSectionElement { diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 19d108d95cc..69fe9046dad 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -2,7 +2,7 @@ * 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/. */ -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding; @@ -29,6 +29,7 @@ use script_traits::ScriptMsg as ConstellationMsg; use std::cell::Cell; use std::ops::Range; use string_cache::Atom; +use style::attr::AttrValue; use style::element_state::*; use textinput::{KeyReaction, Lines, TextInput, SelectionDirection}; diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index 5983890e51a..3ad9713fb70 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -228,9 +228,9 @@ macro_rules! make_atomic_setter( macro_rules! make_legacy_color_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::attr::AttrValue; use dom::bindings::inheritance::Castable; use dom::element::Element; + use style::attr::AttrValue; let element = self.upcast::<Element>(); let value = AttrValue::from_legacy_color(value.into()); element.set_attribute(&atom!($htmlname), value) diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 384465a8039..d3e6a955284 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -38,8 +38,11 @@ use dom::documenttype::DocumentType; use dom::element::{Element, ElementCreator}; use dom::eventtarget::EventTarget; use dom::htmlbodyelement::HTMLBodyElement; +use dom::htmlcanvaselement::{LayoutHTMLCanvasElementHelpers, HTMLCanvasData}; use dom::htmlcollection::HTMLCollection; use dom::htmlelement::HTMLElement; +use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMethods}; +use dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers}; use dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers}; use dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers}; use dom::nodelist::NodeList; @@ -56,6 +59,7 @@ use html5ever::tree_builder::QuirksMode; use js::jsapi::{JSContext, JSObject, JSRuntime}; use layout_interface::Msg; use libc::{self, c_void, uintptr_t}; +use msg::constellation_msg::PipelineId; use parse::html::parse_html_fragment; use ref_slice::ref_slice; use script_traits::UntrustedNodeAddress; @@ -68,8 +72,10 @@ use std::cmp::max; use std::default::Default; use std::iter::{self, FilterMap, Peekable}; use std::mem; +use std::ops::Range; use string_cache::{Atom, Namespace, QualName}; use style::selector_impl::ServoSelectorImpl; +use url::Url; use util::thread_state; use uuid::Uuid; @@ -960,6 +966,10 @@ pub trait LayoutNodeHelpers { unsafe fn init_style_and_layout_data(&self, OpaqueStyleAndLayoutData); fn text_content(&self) -> String; + fn selection(&self) -> Option<Range<usize>>; + fn image_url(&self) -> Option<Url>; + fn canvas_data(&self) -> Option<HTMLCanvasData>; + fn iframe_pipeline_id(&self) -> PipelineId; } impl LayoutNodeHelpers for LayoutJS<Node> { @@ -1067,6 +1077,39 @@ impl LayoutNodeHelpers for LayoutJS<Node> { panic!("not text!") } + + #[allow(unsafe_code)] + fn selection(&self) -> Option<Range<usize>> { + if let Some(area) = self.downcast::<HTMLTextAreaElement>() { + return unsafe { area.selection_for_layout() }; + } + + if let Some(input) = self.downcast::<HTMLInputElement>() { + return unsafe { input.selection_for_layout() }; + } + + None + } + + #[allow(unsafe_code)] + fn image_url(&self) -> Option<Url> { + unsafe { + self.downcast::<HTMLImageElement>() + .expect("not an image!") + .image_url() + } + } + + fn canvas_data(&self) -> Option<HTMLCanvasData> { + self.downcast() + .map(|canvas| canvas.data()) + } + + fn iframe_pipeline_id(&self) -> PipelineId { + let iframe_element = self.downcast::<HTMLIFrameElement>() + .expect("not an iframe element!"); + iframe_element.pipeline_id().unwrap() + } } diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index d8259307274..b42e8b676c3 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -2,7 +2,7 @@ * 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/. */ -use dom::attr::{Attr, AttrValue}; +use dom::attr::Attr; use dom::bindings::inheritance::Castable; use dom::bindings::inheritance::ElementTypeId; use dom::bindings::inheritance::HTMLElementTypeId; @@ -47,7 +47,7 @@ use dom::htmltextareaelement::HTMLTextAreaElement; use dom::htmltitleelement::HTMLTitleElement; use dom::node::{ChildrenMutation, CloneChildrenFlag, Node, UnbindContext}; use string_cache::Atom; - +use style::attr::AttrValue; /// Trait to allow DOM nodes to opt-in to overriding (or adding to) common /// behaviours. Replicates the effect of C++ virtual methods. diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 18131bd5fd8..318d3bbc1ec 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -46,6 +46,7 @@ use js::jsapi::{JSContext, JS_ParseJSON, RootedValue}; use js::jsval::{JSVal, NullValue, UndefinedValue}; use msg::constellation_msg::{PipelineId, ReferrerPolicy}; use net_traits::CoreResourceMsg::Load; +use net_traits::trim_http_whitespace; use net_traits::{AsyncResponseListener, AsyncResponseTarget, Metadata, NetworkError, RequestSource}; use net_traits::{LoadConsumer, LoadContext, LoadData, ResourceCORSData, CoreResourceThread, LoadOrigin}; use network_listener::{NetworkListener, PreInvoke}; @@ -1506,27 +1507,3 @@ pub fn is_field_value(slice: &[u8]) -> bool { } }) } - -/// Normalize `self`, as defined by -/// [the Fetch Spec](https://fetch.spec.whatwg.org/#concept-header-value-normalize). -pub fn trim_http_whitespace(mut slice: &[u8]) -> &[u8] { - const HTTP_WS_BYTES: &'static [u8] = b"\x09\x0A\x0D\x20"; - - loop { - match slice.split_first() { - Some((first, remainder)) if HTTP_WS_BYTES.contains(first) => - slice = remainder, - _ => break, - } - } - - loop { - match slice.split_last() { - Some((last, remainder)) if HTTP_WS_BYTES.contains(last) => - slice = remainder, - _ => break, - } - } - - slice -} diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs index 61c99bc530b..37b6d169481 100644 --- a/components/script/layout_interface.rs +++ b/components/script/layout_interface.rs @@ -7,7 +7,6 @@ //! the DOM to be placed in a separate crate from layout. use app_units::Au; -use dom::node::OpaqueStyleAndLayoutData; use euclid::point::Point2D; use euclid::rect::Rect; use gfx_traits::{Epoch, LayerId}; @@ -27,7 +26,21 @@ use style::servo::Stylesheet; use url::Url; use util::ipc::OptionalOpaqueIpcSender; +pub use dom::bindings::inheritance::{CharacterDataTypeId, ElementTypeId}; +pub use dom::bindings::inheritance::{HTMLElementTypeId, NodeTypeId}; +pub use dom::bindings::js::LayoutJS; +pub use dom::characterdata::LayoutCharacterDataHelpers; +pub use dom::document::{Document, LayoutDocumentHelpers}; +pub use dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers}; +pub use dom::htmlcanvaselement::HTMLCanvasData; +pub use dom::htmlobjectelement::is_image_data; +pub use dom::node::{CAN_BE_FRAGMENTED, HAS_CHANGED, HAS_DIRTY_DESCENDANTS, IS_DIRTY}; +pub use dom::node::LayoutNodeHelpers; +pub use dom::node::Node; +pub use dom::node::OpaqueStyleAndLayoutData; pub use dom::node::TrustedNodeAddress; +pub use dom::text::Text; + /// Asynchronous messages that script can send to layout. pub enum Msg { diff --git a/tests/unit/net_traits/lib.rs b/tests/unit/net_traits/lib.rs index 89bded99c22..0ea8e4cfe78 100644 --- a/tests/unit/net_traits/lib.rs +++ b/tests/unit/net_traits/lib.rs @@ -5,3 +5,25 @@ extern crate net_traits; #[cfg(test)] mod image; + +#[test] +fn test_trim_http_whitespace() { + fn test_trim(in_: &[u8], out: &[u8]) { + let b = net_traits::trim_http_whitespace(in_); + assert_eq!(b, out); + } + + test_trim(b"", b""); + + test_trim(b" ", b""); + test_trim(b"a", b"a"); + test_trim(b" a", b"a"); + test_trim(b"a ", b"a"); + test_trim(b" a ", b"a"); + + test_trim(b"\t", b""); + test_trim(b"a", b"a"); + test_trim(b"\ta", b"a"); + test_trim(b"a\t", b"a"); + test_trim(b"\ta\t", b"a"); +} diff --git a/tests/unit/script/dom/bindings.rs b/tests/unit/script/dom/bindings.rs deleted file mode 100644 index 7dfb308e1ed..00000000000 --- a/tests/unit/script/dom/bindings.rs +++ /dev/null @@ -1,17 +0,0 @@ -/* 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/. */ - -use script::dom::bindings::str::ByteString; - -#[test] -fn test_byte_string_move() { - let mut byte_str = ByteString::new(vec![0x73, 0x65, 0x72, 0x76, 0x6f]); - let mut byte_vec = byte_str.bytes(); - - assert_eq!(byte_vec, "servo".as_bytes()); - assert_eq!(&*byte_str, &*Vec::<u8>::new()); - - byte_vec = byte_str.into(); - assert_eq!(byte_vec, Vec::<u8>::new()); -} diff --git a/tests/unit/script/dom/xmlhttprequest.rs b/tests/unit/script/dom/xmlhttprequest.rs deleted file mode 100644 index f9d4ebc25e8..00000000000 --- a/tests/unit/script/dom/xmlhttprequest.rs +++ /dev/null @@ -1,27 +0,0 @@ -/* 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/. */ - -use script::dom::xmlhttprequest::trim_http_whitespace; - -#[test] -fn test_trim_http_whitespace() { - fn test_trim(in_: &[u8], out: &[u8]) { - let b = trim_http_whitespace(in_); - assert_eq!(b, out); - } - - test_trim(b"", b""); - - test_trim(b" ", b""); - test_trim(b"a", b"a"); - test_trim(b" a", b"a"); - test_trim(b"a ", b"a"); - test_trim(b" a ", b"a"); - - test_trim(b"\t", b""); - test_trim(b"a", b"a"); - test_trim(b"\ta", b"a"); - test_trim(b"a\t", b"a"); - test_trim(b"\ta\t", b"a"); -} diff --git a/tests/unit/script/lib.rs b/tests/unit/script/lib.rs index cab595e0500..8446ddc2330 100644 --- a/tests/unit/script/lib.rs +++ b/tests/unit/script/lib.rs @@ -13,7 +13,5 @@ extern crate url; #[cfg(all(test, target_pointer_width = "64"))] mod size_of; #[cfg(test)] mod textinput; #[cfg(test)] mod dom { - mod bindings; mod blob; - mod xmlhttprequest; } |