diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-01-11 18:11:52 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-11 18:11:52 -0800 |
commit | eb72c0ec7bc1e3547aa09fbe2ad800310f42989b (patch) | |
tree | 2f242cc83e6c4e60ab0a9c6234cdabfa58ffcfa8 /components/script | |
parent | 6447a9783892d6ed585cf75b056ef81f0aba504c (diff) | |
parent | db2082bc6e0edc0028f287d4acc203e7c3bc829f (diff) | |
download | servo-eb72c0ec7bc1e3547aa09fbe2ad800310f42989b.tar.gz servo-eb72c0ec7bc1e3547aa09fbe2ad800310f42989b.zip |
Auto merge of #14963 - jdm:script_current_line, r=asajeffrey
Report meaningful line numbers for inline script errors
Rebased from #14661.
---
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #12744 and partially #9604
- [X] There are tests for these changes
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14963)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/element.rs | 17 | ||||
-rw-r--r-- | components/script/dom/globalscope.rs | 6 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 10 | ||||
-rw-r--r-- | components/script/dom/htmlstyleelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/servoparser/html.rs | 8 | ||||
-rw-r--r-- | components/script/dom/servoparser/xml.rs | 3 |
7 files changed, 38 insertions, 12 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index d9c2f6907e7..be1e0eca42e 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -145,10 +145,25 @@ impl fmt::Debug for Element { #[derive(PartialEq, HeapSizeOf)] pub enum ElementCreator { - ParserCreated, + ParserCreated(u64), ScriptCreated, } +impl ElementCreator { + pub fn is_parser_created(&self) -> bool { + match *self { + ElementCreator::ParserCreated(_) => true, + ElementCreator::ScriptCreated => false, + } + } + pub fn return_line_number(&self) -> u64 { + match *self { + ElementCreator::ParserCreated(l) => l, + ElementCreator::ScriptCreated => 1, + } + } +} + pub enum AdjacentPosition { BeforeBegin, AfterEnd, diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index fca829c9904..4203d0e724c 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -339,13 +339,13 @@ impl GlobalScope { /// Evaluate JS code on this global scope. pub fn evaluate_js_on_global_with_result( &self, code: &str, rval: MutableHandleValue) { - self.evaluate_script_on_global_with_result(code, "", rval) + self.evaluate_script_on_global_with_result(code, "", rval, 1) } /// Evaluate a JS script on this global scope. #[allow(unsafe_code)] pub fn evaluate_script_on_global_with_result( - &self, code: &str, filename: &str, rval: MutableHandleValue) { + &self, code: &str, filename: &str, rval: MutableHandleValue, line_number: u32) { let metadata = time::TimerMetadata { url: if filename.is_empty() { self.get_url().as_str().into() @@ -367,7 +367,7 @@ impl GlobalScope { let _ac = JSAutoCompartment::new(cx, globalhandle.get()); let _aes = AutoEntryScript::new(self); - let options = CompileOptionsWrapper::new(cx, filename.as_ptr(), 1); + let options = CompileOptionsWrapper::new(cx, filename.as_ptr(), line_number); unsafe { if !Evaluate2(cx, options.ptr, code.as_ptr(), code.len() as libc::size_t, diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 3466fa10dab..8f5d530769a 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -59,7 +59,7 @@ impl HTMLLinkElement { HTMLLinkElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), rel_list: Default::default(), - parser_inserted: Cell::new(creator == ElementCreator::ParserCreated), + parser_inserted: Cell::new(creator.is_parser_created()), stylesheet: DOMRefCell::new(None), cssom_stylesheet: MutNullableJS::new(None), pending_loads: Cell::new(0), diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8273aab31f0..52935e32dcf 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -60,6 +60,9 @@ pub struct HTMLScriptElement { /// Document of the parser that created this element parser_document: JS<Document>, + + /// Track line line_number + line_number: u64, } impl HTMLScriptElement { @@ -69,10 +72,11 @@ impl HTMLScriptElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), already_started: Cell::new(false), - parser_inserted: Cell::new(creator == ElementCreator::ParserCreated), - non_blocking: Cell::new(creator != ElementCreator::ParserCreated), + parser_inserted: Cell::new(creator.is_parser_created()), + non_blocking: Cell::new(!creator.is_parser_created()), ready_to_be_parser_executed: Cell::new(false), parser_document: JS::from_ref(document), + line_number: creator.return_line_number(), } } @@ -508,7 +512,7 @@ impl HTMLScriptElement { let window = window_from_node(self); rooted!(in(window.get_cx()) let mut rval = UndefinedValue()); window.upcast::<GlobalScope>().evaluate_script_on_global_with_result( - &script.text, script.url.as_str(), rval.handle_mut()); + &script.text, script.url.as_str(), rval.handle_mut(), self.line_number as u32); // Step 6. document.set_current_script(old_script.r()); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 97fd6591de8..35da9bb6368 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -50,8 +50,8 @@ impl HTMLStyleElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), stylesheet: DOMRefCell::new(None), cssom_stylesheet: MutNullableJS::new(None), - parser_inserted: Cell::new(creator == ElementCreator::ParserCreated), - in_stack_of_open_elements: Cell::new(creator == ElementCreator::ParserCreated), + parser_inserted: Cell::new(creator.is_parser_created()), + in_stack_of_open_elements: Cell::new(creator.is_parser_created()), pending_loads: Cell::new(0), any_failed_load: Cell::new(false), } diff --git a/components/script/dom/servoparser/html.rs b/components/script/dom/servoparser/html.rs index d4b53175b49..1e53cea8341 100644 --- a/components/script/dom/servoparser/html.rs +++ b/components/script/dom/servoparser/html.rs @@ -52,6 +52,7 @@ impl Tokenizer { let sink = Sink { base_url: url, document: JS::from_ref(document), + current_line: 1, }; let options = TreeBuilderOpts { @@ -122,6 +123,7 @@ unsafe impl JSTraceable for HtmlTokenizer<TreeBuilder<JS<Node>, Sink>> { struct Sink { base_url: ServoUrl, document: JS<Document>, + current_line: u64, } impl TreeSink for Sink { @@ -156,7 +158,7 @@ impl TreeSink for Sink { fn create_element(&mut self, name: QualName, attrs: Vec<Attribute>) -> JS<Node> { let elem = Element::create(name, None, &*self.document, - ElementCreator::ParserCreated); + ElementCreator::ParserCreated(self.current_line)); for attr in attrs { elem.set_attribute_from_parser(attr.name, DOMString::from(String::from(attr.value)), None); @@ -234,6 +236,10 @@ impl TreeSink for Sink { } } + fn set_current_line(&mut self, line_number: u64) { + self.current_line = line_number; + } + fn pop(&mut self, node: JS<Node>) { let node = Root::from_ref(&*node); vtable_for(&node).pop(); diff --git a/components/script/dom/servoparser/xml.rs b/components/script/dom/servoparser/xml.rs index 4a62be75cff..96de50f293d 100644 --- a/components/script/dom/servoparser/xml.rs +++ b/components/script/dom/servoparser/xml.rs @@ -134,8 +134,9 @@ impl TreeSink for Sink { ns: name.namespace_url, local: name.local, }; + //TODO: Add ability to track lines to API of xml5ever let elem = Element::create(name, prefix, &*self.document, - ElementCreator::ParserCreated); + ElementCreator::ParserCreated(1)); for attr in attrs { let name = QualName { |