mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
CanGc fixes in components/script/dom (#33862)
Signed-off-by: taniishkaaa <tanishkasingh2004@gmail.com>
This commit is contained in:
parent
5148b444be
commit
2b9527262c
10 changed files with 43 additions and 19 deletions
|
@ -276,20 +276,22 @@ impl AudioContextMethods for AudioContext {
|
||||||
fn CreateMediaStreamSource(
|
fn CreateMediaStreamSource(
|
||||||
&self,
|
&self,
|
||||||
stream: &MediaStream,
|
stream: &MediaStream,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
|
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
|
||||||
let global = self.global();
|
let global = self.global();
|
||||||
let window = global.as_window();
|
let window = global.as_window();
|
||||||
MediaStreamAudioSourceNode::new(window, self, stream)
|
MediaStreamAudioSourceNode::new(window, self, stream, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamtracksource>
|
/// <https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamtracksource>
|
||||||
fn CreateMediaStreamTrackSource(
|
fn CreateMediaStreamTrackSource(
|
||||||
&self,
|
&self,
|
||||||
track: &MediaStreamTrack,
|
track: &MediaStreamTrack,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
|
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
|
||||||
let global = self.global();
|
let global = self.global();
|
||||||
let window = global.as_window();
|
let window = global.as_window();
|
||||||
MediaStreamTrackAudioSourceNode::new(window, self, track)
|
MediaStreamTrackAudioSourceNode::new(window, self, track, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamdestination>
|
/// <https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamdestination>
|
||||||
|
|
|
@ -577,13 +577,14 @@ impl BaseAudioContextMethods for BaseAudioContext {
|
||||||
&self,
|
&self,
|
||||||
feedforward: Vec<Finite<f64>>,
|
feedforward: Vec<Finite<f64>>,
|
||||||
feedback: Vec<Finite<f64>>,
|
feedback: Vec<Finite<f64>>,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<IIRFilterNode>> {
|
) -> Fallible<DomRoot<IIRFilterNode>> {
|
||||||
let opts = IIRFilterOptions {
|
let opts = IIRFilterOptions {
|
||||||
parent: AudioNodeOptions::empty(),
|
parent: AudioNodeOptions::empty(),
|
||||||
feedback,
|
feedback,
|
||||||
feedforward,
|
feedforward,
|
||||||
};
|
};
|
||||||
IIRFilterNode::new(self.global().as_window(), self, &opts)
|
IIRFilterNode::new(self.global().as_window(), self, &opts, can_gc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,12 @@ DOMInterfaces = {
|
||||||
|
|
||||||
'AudioContext': {
|
'AudioContext': {
|
||||||
'inRealms': ['Close', 'Suspend'],
|
'inRealms': ['Close', 'Suspend'],
|
||||||
'canGc':['CreateMediaStreamDestination', 'CreateMediaElementSource'],
|
'canGc':['CreateMediaStreamDestination', 'CreateMediaElementSource', 'CreateMediaStreamSource', 'CreateMediaStreamTrackSource'],
|
||||||
},
|
},
|
||||||
|
|
||||||
'BaseAudioContext': {
|
'BaseAudioContext': {
|
||||||
'inRealms': ['DecodeAudioData', 'Resume', 'ParseFromString', 'GetBounds', 'GetClientRects'],
|
'inRealms': ['DecodeAudioData', 'Resume', 'ParseFromString', 'GetBounds', 'GetClientRects'],
|
||||||
'canGc': ['CreateOscillator', 'CreateStereoPanner', 'CreateGain'],
|
'canGc': ['CreateOscillator', 'CreateStereoPanner', 'CreateGain', 'CreateIIRFilter'],
|
||||||
},
|
},
|
||||||
|
|
||||||
'Blob': {
|
'Blob': {
|
||||||
|
|
|
@ -72,8 +72,9 @@ impl IIRFilterNode {
|
||||||
window: &Window,
|
window: &Window,
|
||||||
context: &BaseAudioContext,
|
context: &BaseAudioContext,
|
||||||
options: &IIRFilterOptions,
|
options: &IIRFilterOptions,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<IIRFilterNode>> {
|
) -> Fallible<DomRoot<IIRFilterNode>> {
|
||||||
Self::new_with_proto(window, None, context, options, CanGc::note())
|
Self::new_with_proto(window, None, context, options, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(crown::unrooted_must_root)]
|
#[allow(crown::unrooted_must_root)]
|
||||||
|
|
|
@ -55,8 +55,9 @@ impl MediaStreamAudioSourceNode {
|
||||||
window: &Window,
|
window: &Window,
|
||||||
context: &AudioContext,
|
context: &AudioContext,
|
||||||
stream: &MediaStream,
|
stream: &MediaStream,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
|
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
|
||||||
Self::new_with_proto(window, None, context, stream, CanGc::note())
|
Self::new_with_proto(window, None, context, stream, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(crown::unrooted_must_root)]
|
#[allow(crown::unrooted_must_root)]
|
||||||
|
|
|
@ -48,8 +48,9 @@ impl MediaStreamTrackAudioSourceNode {
|
||||||
window: &Window,
|
window: &Window,
|
||||||
context: &AudioContext,
|
context: &AudioContext,
|
||||||
track: &MediaStreamTrack,
|
track: &MediaStreamTrack,
|
||||||
|
can_gc: CanGc,
|
||||||
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
|
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
|
||||||
Self::new_with_proto(window, None, context, track, CanGc::note())
|
Self::new_with_proto(window, None, context, track, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(crown::unrooted_must_root)]
|
#[allow(crown::unrooted_must_root)]
|
||||||
|
|
|
@ -37,7 +37,7 @@ use crate::dom::bindings::settings_stack::AutoEntryScript;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::promisenativehandler::PromiseNativeHandler;
|
use crate::dom::promisenativehandler::PromiseNativeHandler;
|
||||||
use crate::realms::{enter_realm, AlreadyInRealm, InRealm};
|
use crate::realms::{enter_realm, AlreadyInRealm, InRealm};
|
||||||
use crate::script_runtime::JSContext as SafeJSContext;
|
use crate::script_runtime::{CanGc, JSContext as SafeJSContext};
|
||||||
use crate::script_thread::ScriptThread;
|
use crate::script_thread::ScriptThread;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -320,11 +320,13 @@ unsafe extern "C" fn native_handler_callback(
|
||||||
*cx,
|
*cx,
|
||||||
HandleValue::from_raw(args.get(0)),
|
HandleValue::from_raw(args.get(0)),
|
||||||
InRealm::Already(&in_realm_proof),
|
InRealm::Already(&in_realm_proof),
|
||||||
|
CanGc::note(),
|
||||||
),
|
),
|
||||||
v if v == NativeHandlerTask::Reject as i32 => handler.rejected_callback(
|
v if v == NativeHandlerTask::Reject as i32 => handler.rejected_callback(
|
||||||
*cx,
|
*cx,
|
||||||
HandleValue::from_raw(args.get(0)),
|
HandleValue::from_raw(args.get(0)),
|
||||||
InRealm::Already(&in_realm_proof),
|
InRealm::Already(&in_realm_proof),
|
||||||
|
CanGc::note(),
|
||||||
),
|
),
|
||||||
_ => panic!("unexpected native handler task value"),
|
_ => panic!("unexpected native handler task value"),
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,18 +47,31 @@ impl PromiseNativeHandler {
|
||||||
cx: *mut JSContext,
|
cx: *mut JSContext,
|
||||||
v: HandleValue,
|
v: HandleValue,
|
||||||
realm: InRealm,
|
realm: InRealm,
|
||||||
|
can_gc: CanGc,
|
||||||
) {
|
) {
|
||||||
let cx = unsafe { SafeJSContext::from_ptr(cx) };
|
let cx = unsafe { SafeJSContext::from_ptr(cx) };
|
||||||
if let Some(ref callback) = *callback {
|
if let Some(ref callback) = *callback {
|
||||||
callback.callback(cx, v, realm, CanGc::note())
|
callback.callback(cx, v, realm, can_gc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn resolved_callback(&self, cx: *mut JSContext, v: HandleValue, realm: InRealm) {
|
pub fn resolved_callback(
|
||||||
PromiseNativeHandler::callback(&self.resolve, cx, v, realm)
|
&self,
|
||||||
|
cx: *mut JSContext,
|
||||||
|
v: HandleValue,
|
||||||
|
realm: InRealm,
|
||||||
|
can_gc: CanGc,
|
||||||
|
) {
|
||||||
|
PromiseNativeHandler::callback(&self.resolve, cx, v, realm, can_gc)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rejected_callback(&self, cx: *mut JSContext, v: HandleValue, realm: InRealm) {
|
pub fn rejected_callback(
|
||||||
PromiseNativeHandler::callback(&self.reject, cx, v, realm)
|
&self,
|
||||||
|
cx: *mut JSContext,
|
||||||
|
v: HandleValue,
|
||||||
|
realm: InRealm,
|
||||||
|
can_gc: CanGc,
|
||||||
|
) {
|
||||||
|
PromiseNativeHandler::callback(&self.reject, cx, v, realm, can_gc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ impl ResizeObserver {
|
||||||
box_size.origin.y.to_f64_px(),
|
box_size.origin.y.to_f64_px(),
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
CanGc::note(),
|
can_gc,
|
||||||
);
|
);
|
||||||
let entry = ResizeObserverEntry::new(
|
let entry = ResizeObserverEntry::new(
|
||||||
&window,
|
&window,
|
||||||
|
|
|
@ -361,7 +361,7 @@ impl ServoParser {
|
||||||
input.push_back(String::from(chunk).into());
|
input.push_back(String::from(chunk).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tokenize(|tokenizer| tokenizer.feed(&input, can_gc));
|
self.tokenize(|tokenizer| tokenizer.feed(&input, can_gc), can_gc);
|
||||||
|
|
||||||
if self.suspended.get() {
|
if self.suspended.get() {
|
||||||
// Parser got suspended, insert remaining input at end of
|
// Parser got suspended, insert remaining input at end of
|
||||||
|
@ -546,7 +546,10 @@ impl ServoParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.tokenize(|tokenizer| tokenizer.feed(&self.network_input, can_gc));
|
self.tokenize(
|
||||||
|
|tokenizer| tokenizer.feed(&self.network_input, can_gc),
|
||||||
|
can_gc,
|
||||||
|
);
|
||||||
|
|
||||||
if self.suspended.get() {
|
if self.suspended.get() {
|
||||||
return;
|
return;
|
||||||
|
@ -576,7 +579,7 @@ impl ServoParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tokenize<F>(&self, feed: F)
|
fn tokenize<F>(&self, feed: F, can_gc: CanGc)
|
||||||
where
|
where
|
||||||
F: Fn(&Tokenizer) -> TokenizerResult<DomRoot<HTMLScriptElement>>,
|
F: Fn(&Tokenizer) -> TokenizerResult<DomRoot<HTMLScriptElement>>,
|
||||||
{
|
{
|
||||||
|
@ -600,7 +603,7 @@ impl ServoParser {
|
||||||
self.document
|
self.document
|
||||||
.window()
|
.window()
|
||||||
.upcast::<GlobalScope>()
|
.upcast::<GlobalScope>()
|
||||||
.perform_a_microtask_checkpoint(CanGc::note());
|
.perform_a_microtask_checkpoint(can_gc);
|
||||||
}
|
}
|
||||||
|
|
||||||
let script_nesting_level = self.script_nesting_level.get();
|
let script_nesting_level = self.script_nesting_level.get();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue