diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/Cargo.toml | 19 | ||||
-rw-r--r-- | components/script/dom/cssstyledeclaration.rs | 3 | ||||
-rw-r--r-- | components/script/dom/document.rs | 2 | ||||
-rw-r--r-- | components/script/dom/element.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmlstyleelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/servohtmlparser.rs | 10 | ||||
-rw-r--r-- | components/script/dom/websocket.rs | 30 | ||||
-rw-r--r-- | components/script/dom/window.rs | 12 | ||||
-rw-r--r-- | components/script/lib.rs | 2 | ||||
-rw-r--r-- | components/script/reporter.rs | 25 |
11 files changed, 77 insertions, 40 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 04c9e98bed5..06e5f325ccc 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -36,6 +36,9 @@ path = "../devtools_traits" [dependencies.style] path = "../style" +[dependencies.style_traits] +path = "../style_traits" + [dependencies.canvas] path = "../canvas" @@ -45,10 +48,6 @@ path = "../canvas_traits" [dependencies.js] git = "https://github.com/servo/rust-mozjs" -[dependencies.url] -version = "0.2.36" -features = ["query_encoding", "serde_serialization"] - [dependencies.offscreen_gl_context] git = "https://github.com/ecoal95/rust-offscreen-rendering-context" @@ -59,10 +58,6 @@ branch = "servo" [dependencies.ipc-channel] git = "https://github.com/servo/ipc-channel" -[dependencies.hyper] -version = "0.6" -features = [ "serde-serialization" ] - [dependencies.xml5ever] git = "https://github.com/Ygg01/xml5ever" features = ["unstable"] @@ -73,13 +68,14 @@ cssparser = { version = "0.4", features = [ "serde-serialization" ] } log = "0.3" encoding = "0.2" fnv = "1.0" +hyper = { version = "0.7", features = [ "serde-serialization" ] } time = "0.1.12" bitflags = "0.3" rustc-serialize = "0.3" -libc = "0.1" +libc = "0.2" unicase = "1.0" num = "0.1.24" -websocket = "0.12.0" +websocket = "0.14.0" uuid = "0.1.16" smallvec = "0.1" html5ever = { version = "0.2.1", features = ["unstable"] } @@ -90,4 +86,5 @@ tendril = "0.1.1" rand = "0.3" serde = "0.6" caseless = "0.1.0" -image = "0.4.0" +image = "0.5.0" +url = "0.5" diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 14285dc4c2e..64b6f738d2f 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -18,6 +18,7 @@ use std::cell::Ref; use string_cache::Atom; use style::properties::{PropertyDeclaration, Shorthand}; use style::properties::{is_supported_property, parse_one_declaration}; +use style_traits::ParseErrorReporter; use util::str::{DOMString, str_join}; // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface @@ -240,7 +241,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { // Step 6 let window = window_from_node(&*self.owner); - let declarations = parse_one_declaration(&property, &value, &window.get_url()); + let declarations = parse_one_declaration(&property, &value, &window.get_url(), window.css_error_reporter()); // Step 7 let declarations = if let Ok(declarations) = declarations { diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 7703272bb8b..31f67f33801 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1659,7 +1659,7 @@ impl DocumentMethods for Document { if let Some(&Host::Ipv6(ipv6)) = origin.host() { // Omit square brackets for IPv6 addresses. - return DOMString::from(ipv6.serialize()); + return DOMString::from(ipv6.to_string()); } DOMString::from(origin.serialize_host().unwrap_or_else(|| "".to_owned())) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index d2a3861828d..e7d6a47076f 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -80,6 +80,7 @@ use style::properties::longhands::{self, background_image, border_spacing, font_ use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, parse_style_attribute}; use style::values::CSSFloat; use style::values::specified::{self, CSSColor, CSSRGBA, LengthOrPercentage}; +use style_traits::ParseErrorReporter; use url::UrlParser; use util::mem::HeapSizeOf; use util::str::{DOMString, LengthOrPercentageOrAuto}; @@ -1514,7 +1515,8 @@ impl VirtualMethods for Element { // Modifying the `style` attribute might change style. *self.style_attribute.borrow_mut() = mutation.new_value(attr).map(|value| { - parse_style_attribute(&value, &doc.base_url()) + let win = window_from_node(self); + parse_style_attribute(&value, &doc.base_url(), win.css_error_reporter()) }); if node.is_in_doc() { doc.content_changed(node, NodeDamage::NodeStyleDamaged); diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index b0954796b8d..2687d758948 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -281,13 +281,17 @@ impl AsyncResponseListener for StylesheetContext { let environment_encoding = UTF_8 as EncodingRef; let protocol_encoding_label = metadata.charset.as_ref().map(|s| &**s); let final_url = metadata.final_url; + + let elem = self.elem.root(); + let win = window_from_node(&*elem); + let mut sheet = Stylesheet::from_bytes(&data, final_url, protocol_encoding_label, - Some(environment_encoding), Origin::Author); + Some(environment_encoding), Origin::Author, + win.css_error_reporter()); let media = self.media.take().unwrap(); sheet.set_media(Some(media)); let sheet = Arc::new(sheet); - let elem = self.elem.root(); let elem = elem.r(); let document = document_from_node(elem); let document = document.r(); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 42c4d0315ac..8eba6b5982f 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -58,7 +58,7 @@ impl HTMLStyleElement { }; let data = node.GetTextContent().expect("Element.textContent must be a string"); - let mut sheet = Stylesheet::from_str(&data, url, Origin::Author); + let mut sheet = Stylesheet::from_str(&data, url, Origin::Author, win.css_error_reporter()); let mut css_parser = CssParser::new(&mq_str); let media = parse_media_query_list(&mut css_parser); sheet.set_media(Some(media)); diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index 50132dc42a2..68920e19c22 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -121,17 +121,11 @@ impl AsyncResponseListener for ParserContext { parser.parse_sync(); }, Some(ContentType(Mime(TopLevel::Text, SubLevel::Plain, _))) => { - // FIXME: When servo/html5ever#109 is fixed remove <plaintext> usage and - // replace with fix from that issue. - - // text/plain documents require setting the tokenizer into PLAINTEXT mode. - // This is done by using a <plaintext> element as the html5ever tokenizer - // provides no other way to change to that state. - // Spec for text/plain handling is: // https://html.spec.whatwg.org/multipage/#read-text - let page = format!("<pre>\u{000A}<plaintext>"); + let page = format!("<pre>\n"); parser.pending_input.borrow_mut().push(page); parser.parse_sync(); + parser.tokenizer().borrow_mut().set_plaintext_state(); }, Some(ContentType(Mime(TopLevel::Text, SubLevel::Html, _))) => {}, // Handle text/html Some(ContentType(Mime(toplevel, sublevel, _))) => { diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index d96ee00311d..f2060566877 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -39,7 +39,7 @@ use websocket::client::receiver::Receiver; use websocket::client::request::Url; use websocket::client::sender::Sender; use websocket::header::Origin; -use websocket::message::CloseData; +use websocket::message::Type; use websocket::result::WebSocketResult; use websocket::stream::WebSocketStream; use websocket::ws::receiver::Receiver as WSReceiver; @@ -264,23 +264,27 @@ impl WebSocket { sender.send(CommonScriptMsg::RunnableMsg(WebSocketEvent, open_task)).unwrap(); for message in receiver.incoming_messages() { - let message = match message { - Ok(Message::Text(text)) => MessageData::Text(text), - Ok(Message::Binary(data)) => MessageData::Binary(data), - Ok(Message::Ping(data)) => { - ws_sender.lock().unwrap().send_message(Message::Pong(data)).unwrap(); + let message: Message = match message { + Ok(m) => m, + Err(_) => break, + }; + let message = match message.opcode { + Type::Text => MessageData::Text(String::from_utf8_lossy(&message.payload).into_owned()), + Type::Binary => MessageData::Binary(message.payload.into_owned()), + Type::Ping => { + let pong = Message::pong(message.payload); + ws_sender.lock().unwrap().send_message(&pong).unwrap(); continue; }, - Ok(Message::Pong(_)) => continue, - Ok(Message::Close(data)) => { - ws_sender.lock().unwrap().send_message(Message::Close(data)).unwrap(); + Type::Pong => continue, + Type::Close => { + ws_sender.lock().unwrap().send_message(&message).unwrap(); let task = box CloseTask { addr: address, }; sender.send(CommonScriptMsg::RunnableMsg(WebSocketEvent, task)).unwrap(); break; }, - Err(_) => break, }; let message_task = box MessageReceivedTask { address: address.clone(), @@ -385,7 +389,7 @@ impl WebSocketMethods for WebSocket { if send_data { let mut other_sender = self.sender.borrow_mut(); let my_sender = other_sender.as_mut().unwrap(); - let _ = my_sender.lock().unwrap().send_message(Message::Text(data.0)); + let _ = my_sender.lock().unwrap().send_message(&Message::text(data.0)); } Ok(()) @@ -404,7 +408,7 @@ impl WebSocketMethods for WebSocket { if send_data { let mut other_sender = self.sender.borrow_mut(); let my_sender = other_sender.as_mut().unwrap(); - let _ = my_sender.lock().unwrap().send_message(Message::Binary(data.clone_bytes())); + let _ = my_sender.lock().unwrap().send_message(&Message::binary(data.clone_bytes())); } Ok(()) @@ -420,7 +424,7 @@ impl WebSocketMethods for WebSocket { if let Some(sender) = sender.as_mut() { let code: u16 = this.code.get(); let reason = this.reason.borrow().clone(); - let _ = sender.lock().unwrap().send_message(Message::Close(Some(CloseData::new(code, reason)))); + let _ = sender.lock().unwrap().send_message(&Message::close_because(code, reason)); } } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2910632a76f..f8af9be77b5 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -52,6 +52,7 @@ use net_traits::storage_task::{StorageTask, StorageType}; use num::traits::ToPrimitive; use page::Page; use profile_traits::mem; +use reporter::CSSErrorReporter; use rustc_serialize::base64::{FromBase64, STANDARD, ToBase64}; use script_task::{ScriptChan, ScriptPort, MainThreadScriptMsg, RunnableWrapper}; use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan}; @@ -70,6 +71,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::TryRecvError::{Disconnected, Empty}; use std::sync::mpsc::{Sender, channel}; use string_cache::Atom; +use style_traits::ParseErrorReporter; use time; use timers::{ActiveTimers, IsInterval, ScheduledCallback, TimerCallback, TimerHandle}; use url::Url; @@ -216,6 +218,8 @@ pub struct Window { /// A flag to prevent async events from attempting to interact with this window. #[ignore_heap_size_of = "defined in std"] ignore_further_async_events: Arc<AtomicBool>, + + error_reporter: CSSErrorReporter, } impl Window { @@ -289,6 +293,10 @@ impl Window { pub fn storage_task(&self) -> StorageTask { self.storage_task.clone() } + + pub fn css_error_reporter(&self) -> Box<ParseErrorReporter + Send> { + return self.error_reporter.clone(); + } } // https://html.spec.whatwg.org/multipage/#atob @@ -1243,7 +1251,7 @@ impl Window { lchan.send(Msg::GetRPC(rpc_send)).unwrap(); rpc_recv.recv().unwrap() }; - + let error_reporter = CSSErrorReporter; let win = box Window { eventtarget: EventTarget::new_inherited(), script_chan: script_chan, @@ -1288,8 +1296,8 @@ impl Window { devtools_markers: DOMRefCell::new(HashSet::new()), devtools_wants_updates: Cell::new(false), webdriver_script_chan: DOMRefCell::new(None), - ignore_further_async_events: Arc::new(AtomicBool::new(false)), + error_reporter: error_reporter }; WindowBinding::Wrap(runtime.cx(), win) diff --git a/components/script/lib.rs b/components/script/lib.rs index 0d0278f7172..4f1d9f66cd0 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -42,6 +42,7 @@ extern crate log; extern crate profile_traits; #[macro_use] extern crate style; +extern crate style_traits; #[macro_use] extern crate util; extern crate angle; @@ -90,6 +91,7 @@ mod mem; mod network_listener; pub mod page; pub mod parse; +pub mod reporter; #[allow(unsafe_code)] pub mod script_task; pub mod textinput; diff --git a/components/script/reporter.rs b/components/script/reporter.rs new file mode 100644 index 00000000000..16958201103 --- /dev/null +++ b/components/script/reporter.rs @@ -0,0 +1,25 @@ +/* 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 cssparser::{Parser, SourcePosition}; +use log; +use style_traits::ParseErrorReporter; + +#[derive(JSTraceable, HeapSizeOf)] +pub struct CSSErrorReporter; + +impl ParseErrorReporter for CSSErrorReporter { + fn report_error(&self, input: &mut Parser, position: SourcePosition, message: &str) { + if log_enabled!(log::LogLevel::Info) { + let location = input.source_location(position); + // TODO eventually this will got into a "web console" or something. + info!("{}:{} {}", location.line, location.column, message) + } + } + + fn clone(&self) -> Box<ParseErrorReporter + Send + Sync> { + let error_reporter = box CSSErrorReporter; + return error_reporter; + } +} |