aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkarenher <karenher@seas.upenn.edu>2016-12-21 10:40:13 -0500
committerJosh Matthews <josh@joshmatthews.net>2017-01-11 21:11:00 -0500
commitdb2082bc6e0edc0028f287d4acc203e7c3bc829f (patch)
treee9f737449599ef928321d8f338e955680ebde851
parentd1bc1a4f1b66ab9f63fa37f649eaf79035e12f8e (diff)
downloadservo-db2082bc6e0edc0028f287d4acc203e7c3bc829f.tar.gz
servo-db2082bc6e0edc0028f287d4acc203e7c3bc829f.zip
Store parser's current line when script elements are created.
Use the newly stored line as the starting line number when evaluating JS. This ensures that inline scripts will report errors with meaningful line numbers.
-rw-r--r--components/script/dom/element.rs17
-rw-r--r--components/script/dom/globalscope.rs6
-rw-r--r--components/script/dom/htmllinkelement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs10
-rw-r--r--components/script/dom/htmlstyleelement.rs4
-rw-r--r--components/script/dom/servoparser/html.rs8
-rw-r--r--components/script/dom/servoparser/xml.rs3
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html.ini5
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json6
-rw-r--r--tests/wpt/mozilla/tests/mozilla/track_line.html17
11 files changed, 61 insertions, 22 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 24b4e779099..00323bfe50b 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 {
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html.ini
deleted file mode 100644
index 7a06f9dc035..00000000000
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[window-onerror-parse-error.html]
- type: testharness
- [correct line number passed to window.onerror]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html.ini
deleted file mode 100644
index eae9e05c0bf..00000000000
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[window-onerror-runtime-error.html]
- type: testharness
- [correct line number passed to window.onerror]
- expected: FAIL
-
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 5b3faa75be7..d49d2d362d1 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -15200,6 +15200,12 @@
"url": "/_mozilla/mozilla/trace_null.html"
}
],
+ "mozilla/track_line.html": [
+ {
+ "path": "mozilla/track_line.html",
+ "url": "/_mozilla/mozilla/track_line.html"
+ }
+ ],
"mozilla/union.html": [
{
"path": "mozilla/union.html",
diff --git a/tests/wpt/mozilla/tests/mozilla/track_line.html b/tests/wpt/mozilla/tests/mozilla/track_line.html
new file mode 100644
index 00000000000..1e6b12e5cad
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/track_line.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Test that errors from inline scripts report meaningful line numbers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({allow_uncaught_exception:true});
+var t = async_test("error event has proper line number");
+window.addEventListener('error', t.step_func(function(e) {
+ assert_true(e instanceof ErrorEvent);
+ assert_equals(e.lineno, 16);
+ t.done();
+}), true);
+</script>
+<script>
+this_is_a_js_error
+</script>