LibWeb: Fix crash accessing 'empty' PromiseRejectionEvent reason
The 'reason' was getting initialized to 'empty' state when not provided through the constructor, which results in a crash when accessed through throw_dom_exception_if_needed in the generated IDL getter.
This commit is contained in:
parent
05b4676917
commit
6ac018bcb6
Notes:
github-actions[bot]
2024-12-02 23:20:42 +00:00
Author: https://github.com/shannonbooth Commit: https://github.com/LadybirdBrowser/ladybird/commit/6ac018bcb6d Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2702 Reviewed-by: https://github.com/gmta ✅
3 changed files with 62 additions and 1 deletions
|
@ -17,7 +17,7 @@ namespace Web::HTML {
|
|||
|
||||
struct PromiseRejectionEventInit : public DOM::EventInit {
|
||||
GC::Root<JS::Object> promise;
|
||||
JS::Value reason;
|
||||
JS::Value reason { JS::js_undefined() };
|
||||
};
|
||||
|
||||
class PromiseRejectionEvent final : public DOM::Event {
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
Summary
|
||||
|
||||
Harness status: OK
|
||||
|
||||
Rerun
|
||||
|
||||
Found 1 tests
|
||||
|
||||
1 Pass
|
||||
Details
|
||||
Result Test Name MessagePass This tests the constructor for the PromiseRejectionEvent DOM class.
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../../../resources/testharness.js"></script>
|
||||
<script src="../../../../../resources/testharnessreport.js"></script>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/#the-promiserejectionevent-interface">
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
test(function() {
|
||||
var p = new Promise(function(resolve, reject) {});
|
||||
|
||||
assert_throws_js(TypeError,
|
||||
function() {
|
||||
PromiseRejectionEvent('', { promise: p });
|
||||
},
|
||||
"Calling PromiseRejectionEvent constructor without 'new' must throw");
|
||||
|
||||
// No custom options are passed (besides required promise).
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p }).bubbles, false);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p }).cancelable, false);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p }).promise, p);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p }).reason, undefined);
|
||||
|
||||
// No promise is passed.
|
||||
assert_throws_js(TypeError,
|
||||
function() {
|
||||
new PromiseRejectionEvent('eventType', { bubbles: false });
|
||||
},
|
||||
'Cannot construct PromiseRejectionEventInit without promise');
|
||||
|
||||
// bubbles is passed.
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: false, promise: p }).bubbles, false);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, promise: p }).bubbles, true);
|
||||
|
||||
// cancelable is passed.
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { cancelable: false, promise: p }).cancelable, false);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { cancelable: true, promise: p }).cancelable, true);
|
||||
|
||||
// reason is passed.
|
||||
var r = new Error();
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p, reason: r }).reason, r);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { promise: p, reason: null }).reason, null);
|
||||
|
||||
// All initializers are passed.
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, cancelable: true, promise: p, reason: r }).bubbles, true);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, cancelable: true, promise: p, reason: r }).cancelable, true);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, cancelable: true, promise: p, reason: r }).promise, p);
|
||||
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, cancelable: true, promise: p, reason: r }).reason, r);
|
||||
}, "This tests the constructor for the PromiseRejectionEvent DOM class.");
|
||||
</script>
|
Loading…
Add table
Reference in a new issue