aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/Cargo.toml19
-rw-r--r--components/script/dom/cssstyledeclaration.rs3
-rw-r--r--components/script/dom/document.rs2
-rw-r--r--components/script/dom/element.rs4
-rw-r--r--components/script/dom/htmllinkelement.rs8
-rw-r--r--components/script/dom/htmlstyleelement.rs2
-rw-r--r--components/script/dom/servohtmlparser.rs10
-rw-r--r--components/script/dom/websocket.rs30
-rw-r--r--components/script/dom/window.rs12
-rw-r--r--components/script/lib.rs2
-rw-r--r--components/script/reporter.rs25
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;
+ }
+}