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:
Rocketjumper 2025-09-30 13:42:32 +08:00 committed by GitHub
parent 5018cd8015
commit 91e4188a64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 33 additions and 4 deletions

View file

@ -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,
); );
}, },

View file

@ -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 {

View file

@ -758650,6 +758650,13 @@
{} {}
] ]
], ],
"evaluation-error-5.html": [
"3021ecd4a9f9c68a5632c43d1253e4938debf994",
[
null,
{}
]
],
"execorder.html": [ "execorder.html": [
"6a7513dc1361de0716584df8a5e7c8b3df2b69f3", "6a7513dc1361de0716584df8a5e7c8b3df2b69f3",
[ [

View 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>