diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/cssstyledeclaration.rs | 2 | ||||
-rw-r--r-- | components/script/dom/document.rs | 8 | ||||
-rw-r--r-- | components/script/dom/element.rs | 2 | ||||
-rw-r--r-- | components/script/dom/window.rs | 4 | ||||
-rw-r--r-- | components/script/reporter.rs | 12 | ||||
-rw-r--r-- | components/script/script_task.rs | 30 |
6 files changed, 50 insertions, 8 deletions
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 64b6f738d2f..cbffda3e834 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -11,6 +11,7 @@ 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; +use msg::ParseErrorReporter; use selectors::parser::PseudoElement; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -18,7 +19,6 @@ 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 diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 299df8d592d..1d7c7c43eb3 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -89,6 +89,7 @@ use net_traits::ControlMsg::{GetCookiesForUrl, SetCookiesForUrl}; use net_traits::CookieSource::NonHTTP; use net_traits::{AsyncResponseTarget, PendingAsyncLoad}; use num::ToPrimitive; +use script_task::CSSError; use script_task::{MainThreadScriptMsg, Runnable}; use script_traits::{ScriptMsg as ConstellationMsg, TouchEventType, TouchId, UntrustedNodeAddress}; use std::ascii::AsciiExt; @@ -203,6 +204,8 @@ pub struct Document { dom_content_loaded_event_start: Cell<u64>, dom_content_loaded_event_end: Cell<u64>, dom_complete: Cell<u64>, + /// Vector to store CSS errors + css_errors_store: DOMRefCell<Vec<CSSError>>, } impl PartialEq for Document { @@ -294,6 +297,10 @@ impl Document { self.is_html_document } + pub fn report_css_error(&self, css_error: CSSError) { + self.css_errors_store.borrow_mut().push(css_error); + } + // https://html.spec.whatwg.org/multipage/#fully-active pub fn is_fully_active(&self) -> bool { let browsing_context = self.window.browsing_context(); @@ -1495,6 +1502,7 @@ impl Document { dom_content_loaded_event_start: Cell::new(Default::default()), dom_content_loaded_event_end: Cell::new(Default::default()), dom_complete: Cell::new(Default::default()), + css_errors_store: DOMRefCell::new(vec![]), } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e47879051e7..3a7e7f861f2 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -63,6 +63,7 @@ use html5ever::serialize::SerializeOpts; use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode}; use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks}; +use msg::ParseErrorReporter; use selectors::matching::{DeclarationBlock, matches}; use selectors::matching::{common_style_affecting_attributes, rare_style_affecting_attributes}; use selectors::parser::{AttrSelector, NamespaceConstraint, parse_author_origin_selector_list_from_str}; @@ -80,7 +81,6 @@ 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}; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index a0ca6cfa432..0c0b1c01445 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -42,6 +42,7 @@ use js::rust::Runtime; use layout_interface::{ContentBoxResponse, ContentBoxesResponse, ResolvedStyleResponse, ScriptReflow}; use layout_interface::{LayoutChan, LayoutRPC, Msg, Reflow, ReflowGoal, ReflowQueryType}; use libc; +use msg::ParseErrorReporter; use msg::compositor_msg::{LayerId, ScriptToCompositorMsg}; use msg::constellation_msg::{ConstellationChan, LoadData, PipelineId, SubpageId, WindowSizeData}; use msg::webdriver_msg::{WebDriverJSError, WebDriverJSResult}; @@ -71,7 +72,6 @@ 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; @@ -1272,7 +1272,7 @@ impl Window { lchan.send(Msg::GetRPC(rpc_send)).unwrap(); rpc_recv.recv().unwrap() }; - let error_reporter = CSSErrorReporter; + let error_reporter = CSSErrorReporter { pipelineid: id }; let win = box Window { eventtarget: EventTarget::new_inherited(), script_chan: script_chan, diff --git a/components/script/reporter.rs b/components/script/reporter.rs index 16958201103..1ad6ee9987e 100644 --- a/components/script/reporter.rs +++ b/components/script/reporter.rs @@ -4,10 +4,13 @@ use cssparser::{Parser, SourcePosition}; use log; -use style_traits::ParseErrorReporter; +use msg::ParseErrorReporter; +use msg::constellation_msg::PipelineId; #[derive(JSTraceable, HeapSizeOf)] -pub struct CSSErrorReporter; +pub struct CSSErrorReporter { + pub pipelineid: PipelineId, +} impl ParseErrorReporter for CSSErrorReporter { fn report_error(&self, input: &mut Parser, position: SourcePosition, message: &str) { @@ -19,7 +22,10 @@ impl ParseErrorReporter for CSSErrorReporter { } fn clone(&self) -> Box<ParseErrorReporter + Send + Sync> { - let error_reporter = box CSSErrorReporter; + let error_reporter = box CSSErrorReporter { pipelineid: self.pipelineid, } ; return error_reporter; } + fn pipeline(&self) -> PipelineId { + return self.pipelineid; + } } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index c4efab48169..3c54259fc3e 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -592,6 +592,14 @@ pub unsafe extern "C" fn shadow_check_callback(_cx: *mut JSContext, DOMProxyShadowsResult::ShadowCheckFailed } +#[derive(JSTraceable, HeapSizeOf)] +pub struct CSSError { + filename: String, + line: usize, + column: usize, + msg: String +} + impl ScriptTask { pub fn page_fetch_complete(id: PipelineId, subpage: Option<SubpageId>, metadata: Metadata) -> Option<ParserRoot> { @@ -1009,7 +1017,9 @@ impl ScriptTask { ConstellationControlMsg::GetCurrentState(sender, pipeline_id) => { let state = self.handle_get_current_state(pipeline_id); sender.send(state).unwrap(); - } + }, + ConstellationControlMsg::ReportCSSError(pipeline_id, filename, line, column, msg) => + self.handle_css_error_reporting(pipeline_id, filename, line, column, msg), } } @@ -2054,6 +2064,24 @@ impl ScriptTask { // script runs? self.notify_devtools(document.Title(), (*final_url).clone(), (id, None)); } + + fn handle_css_error_reporting(&self, pipeline_id: PipelineId, filename: String, + line: usize, column: usize, msg: String) { + let parent_page = self.root_page(); + let page = match parent_page.find(pipeline_id) { + Some(page) => page, + None => return, + }; + + let document = page.document(); + let css_error = CSSError { + filename: filename, + line: line, + column: column, + msg: msg + }; + document.report_css_error(css_error); + } } impl Drop for ScriptTask { |