mirror of
https://github.com/servo/servo.git
synced 2025-09-30 16:49:16 +01:00
script: Add line number argument to module script compilation functions (#39544)
Script: added ```line_no``` as argument to both ```fetch_inline_module_script()``` & ```compile_module_script()``` to fix the inline script reporting wrong line issue ([#39415](https://github.com/servo/servo/issues/39415)). Originally, the function ```compile_module_script()``` hardwires the value 1 when invoking ```CompileOptionsWrapper::new()```. This is fine if the script is written in separate JS file, but for inline scripts, it will cause confusion if the ```<script>``` tag doesn't start from line #1. ```line_no``` is obtained from ```line_number```, a member variable from ```HTMLScriptElement```. Credits to @jdm for actually pointing out which functions to fix. Testing: Created a WPT test for this change, specifically: ```tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-5.html```. Fixes: issue [#39415](https://github.com/servo/servo/issues/39415) --------- Signed-off-by: RichardTjokroutomo <richard.tjokro2@gmail.com> Signed-off-by: Rocketjumper <112361665+RichardTjokroutomo@users.noreply.github.com> Co-authored-by: Josh Matthews <josh@joshmatthews.net> Co-authored-by: Euclid Ye <yezhizhenjiakang@gmail.com>
This commit is contained in:
parent
5018cd8015
commit
91e4188a64
4 changed files with 33 additions and 4 deletions
|
@ -943,6 +943,7 @@ impl HTMLScriptElement {
|
||||||
base_url.clone(),
|
base_url.clone(),
|
||||||
self.id,
|
self.id,
|
||||||
options,
|
options,
|
||||||
|
self.line_number,
|
||||||
can_gc,
|
can_gc,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
@ -467,13 +467,15 @@ impl ModuleTree {
|
||||||
options: ScriptFetchOptions,
|
options: ScriptFetchOptions,
|
||||||
mut module_script: RustMutableHandleObject,
|
mut module_script: RustMutableHandleObject,
|
||||||
inline: bool,
|
inline: bool,
|
||||||
can_gc: CanGc,
|
line_number: u64,
|
||||||
introduction_type: Option<&'static CStr>,
|
introduction_type: Option<&'static CStr>,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Result<(), RethrowError> {
|
) -> Result<(), RethrowError> {
|
||||||
let cx = GlobalScope::get_cx();
|
let cx = GlobalScope::get_cx();
|
||||||
let _ac = JSAutoRealm::new(*cx, *global.reflector().get_jsobject());
|
let _ac = JSAutoRealm::new(*cx, *global.reflector().get_jsobject());
|
||||||
|
|
||||||
let mut compile_options = unsafe { CompileOptionsWrapper::new(*cx, url.as_str(), 1) };
|
let mut compile_options =
|
||||||
|
unsafe { CompileOptionsWrapper::new(*cx, url.as_str(), line_number as u32) };
|
||||||
if let Some(introduction_type) = introduction_type {
|
if let Some(introduction_type) = introduction_type {
|
||||||
compile_options.set_introduction_type(introduction_type);
|
compile_options.set_introduction_type(introduction_type);
|
||||||
}
|
}
|
||||||
|
@ -1341,8 +1343,9 @@ impl FetchResponseListener for ModuleContext {
|
||||||
self.options.clone(),
|
self.options.clone(),
|
||||||
compiled_module.handle_mut(),
|
compiled_module.handle_mut(),
|
||||||
false,
|
false,
|
||||||
CanGc::note(),
|
1, // external scripts start at the first line of the file
|
||||||
self.introduction_type,
|
self.introduction_type,
|
||||||
|
CanGc::note(),
|
||||||
);
|
);
|
||||||
|
|
||||||
match compiled_module_result {
|
match compiled_module_result {
|
||||||
|
@ -1890,6 +1893,7 @@ pub(crate) fn fetch_inline_module_script(
|
||||||
url: ServoUrl,
|
url: ServoUrl,
|
||||||
script_id: ScriptId,
|
script_id: ScriptId,
|
||||||
options: ScriptFetchOptions,
|
options: ScriptFetchOptions,
|
||||||
|
line_number: u64,
|
||||||
can_gc: CanGc,
|
can_gc: CanGc,
|
||||||
) {
|
) {
|
||||||
let global = owner.global();
|
let global = owner.global();
|
||||||
|
@ -1906,8 +1910,9 @@ pub(crate) fn fetch_inline_module_script(
|
||||||
options.clone(),
|
options.clone(),
|
||||||
compiled_module.handle_mut(),
|
compiled_module.handle_mut(),
|
||||||
true,
|
true,
|
||||||
can_gc,
|
line_number,
|
||||||
Some(IntroductionType::INLINE_SCRIPT),
|
Some(IntroductionType::INLINE_SCRIPT),
|
||||||
|
can_gc,
|
||||||
);
|
);
|
||||||
|
|
||||||
match compiled_module_result {
|
match compiled_module_result {
|
||||||
|
|
7
tests/wpt/meta/MANIFEST.json
vendored
7
tests/wpt/meta/MANIFEST.json
vendored
|
@ -758650,6 +758650,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"evaluation-error-5.html": [
|
||||||
|
"3021ecd4a9f9c68a5632c43d1253e4938debf994",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"execorder.html": [
|
"execorder.html": [
|
||||||
"6a7513dc1361de0716584df8a5e7c8b3df2b69f3",
|
"6a7513dc1361de0716584df8a5e7c8b3df2b69f3",
|
||||||
[
|
[
|
||||||
|
|
16
tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-5.html
vendored
Normal file
16
tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-5.html
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>Handling of evaluation errors, 5</title>
|
||||||
|
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
setup({allow_uncaught_exception: true});
|
||||||
|
const test_load = async_test("Test for the inline module script error that reports wrong line\n");
|
||||||
|
window.addEventListener("error", test_load.step_func_done(ev => {
|
||||||
|
|
||||||
|
const expectedLine = 16;
|
||||||
|
assert_equals(ev.lineno, expectedLine);
|
||||||
|
|
||||||
|
}));
|
||||||
|
</script>
|
||||||
|
<script type="module">a</script>
|
Loading…
Add table
Add a link
Reference in a new issue