mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-03-31 17:31:06 +00:00
Merge pull request #1350 from alexlapa/enable-rtc-rtp-transceiver
Enable OptionIntoWasmAbi and OptionFromWasmAbi for ast::ImportEnum, RTCRtpTransceiver.webidl
This commit is contained in:
commit
8cc9374904
crates
backend/src
web-sys
webidl-tests
@ -844,6 +844,18 @@ impl ToTokens for ast::ImportEnum {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::all)]
|
||||||
|
impl ::wasm_bindgen::convert::OptionIntoWasmAbi for #name {
|
||||||
|
#[inline]
|
||||||
|
fn none() -> Self::Abi { Object::none() }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::all)]
|
||||||
|
impl ::wasm_bindgen::convert::OptionFromWasmAbi for #name {
|
||||||
|
#[inline]
|
||||||
|
fn is_none(abi: &Self::Abi) -> bool { Object::is_none(abi) }
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::all)]
|
#[allow(clippy::all)]
|
||||||
impl From<#name> for ::wasm_bindgen::JsValue {
|
impl From<#name> for ::wasm_bindgen::JsValue {
|
||||||
fn from(obj: #name) -> ::wasm_bindgen::JsValue {
|
fn from(obj: #name) -> ::wasm_bindgen::JsValue {
|
||||||
|
@ -814,6 +814,9 @@ RtcRtpSender = []
|
|||||||
RtcRtpSourceEntry = []
|
RtcRtpSourceEntry = []
|
||||||
RtcRtpSourceEntryType = []
|
RtcRtpSourceEntryType = []
|
||||||
RtcRtpSynchronizationSource = []
|
RtcRtpSynchronizationSource = []
|
||||||
|
RtcRtpTransceiver = []
|
||||||
|
RtcRtpTransceiverDirection = []
|
||||||
|
RtcRtpTransceiverInit = []
|
||||||
RtcRtxParameters = []
|
RtcRtxParameters = []
|
||||||
RtcSdpType = []
|
RtcSdpType = []
|
||||||
RtcSessionDescription = []
|
RtcSessionDescription = []
|
||||||
@ -826,6 +829,7 @@ RtcStatsReport = []
|
|||||||
RtcStatsReportInternal = []
|
RtcStatsReportInternal = []
|
||||||
RtcStatsType = []
|
RtcStatsType = []
|
||||||
RtcTrackEvent = []
|
RtcTrackEvent = []
|
||||||
|
RtcTrackEventInit = []
|
||||||
RtcTransportStats = []
|
RtcTransportStats = []
|
||||||
RtcdtmfSender = []
|
RtcdtmfSender = []
|
||||||
RtcdtmfToneChangeEvent = []
|
RtcdtmfToneChangeEvent = []
|
||||||
|
@ -48,6 +48,7 @@ pub mod pre_element;
|
|||||||
pub mod progress_element;
|
pub mod progress_element;
|
||||||
pub mod quote_element;
|
pub mod quote_element;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
|
pub mod rtc_rtp_transceiver_direction;
|
||||||
pub mod script_element;
|
pub mod script_element;
|
||||||
pub mod select_element;
|
pub mod select_element;
|
||||||
pub mod slot_element;
|
pub mod slot_element;
|
||||||
|
92
crates/web-sys/tests/wasm/rtc_rtp_transceiver_direction.rs
Normal file
92
crates/web-sys/tests/wasm/rtc_rtp_transceiver_direction.rs
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
use wasm_bindgen::{prelude::*, JsCast};
|
||||||
|
use wasm_bindgen_futures::JsFuture;
|
||||||
|
use wasm_bindgen_test::*;
|
||||||
|
|
||||||
|
use futures::{
|
||||||
|
future::{ok, IntoFuture},
|
||||||
|
Future,
|
||||||
|
};
|
||||||
|
|
||||||
|
use web_sys::{
|
||||||
|
RtcPeerConnection, RtcRtpTransceiver, RtcRtpTransceiverDirection, RtcRtpTransceiverInit,
|
||||||
|
RtcSessionDescriptionInit,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[wasm_bindgen(
|
||||||
|
inline_js = "export function is_unified_avail() { return Object.keys(RTCRtpTransceiver.prototype).indexOf('currentDirection')>-1; }"
|
||||||
|
)]
|
||||||
|
extern "C" {
|
||||||
|
/// Available in FF since forever, in Chrome since 72, in Safari since 12.1
|
||||||
|
fn is_unified_avail() -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test(async)]
|
||||||
|
fn rtc_rtp_transceiver_direction() -> Box<dyn Future<Item = (), Error = JsValue>> {
|
||||||
|
if !is_unified_avail() {
|
||||||
|
return Box::new(Ok(()).into_future());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut tr_init: RtcRtpTransceiverInit = RtcRtpTransceiverInit::new();
|
||||||
|
|
||||||
|
let pc1: RtcPeerConnection = RtcPeerConnection::new().unwrap();
|
||||||
|
|
||||||
|
let tr1: RtcRtpTransceiver = pc1.add_transceiver_with_str_and_init(
|
||||||
|
"audio",
|
||||||
|
tr_init.direction(RtcRtpTransceiverDirection::Sendonly),
|
||||||
|
);
|
||||||
|
assert_eq!(tr1.direction(), RtcRtpTransceiverDirection::Sendonly);
|
||||||
|
assert_eq!(tr1.current_direction(), None);
|
||||||
|
|
||||||
|
let pc2: RtcPeerConnection = RtcPeerConnection::new().unwrap();
|
||||||
|
|
||||||
|
let r = exchange_sdps(pc1, pc2).and_then(move |(_, p2)| {
|
||||||
|
assert_eq!(tr1.direction(), RtcRtpTransceiverDirection::Sendonly);
|
||||||
|
assert_eq!(
|
||||||
|
tr1.current_direction(),
|
||||||
|
Some(RtcRtpTransceiverDirection::Sendonly)
|
||||||
|
);
|
||||||
|
|
||||||
|
let tr2: RtcRtpTransceiver = js_sys::try_iter(&p2.get_transceivers())
|
||||||
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
|
.unchecked_into();
|
||||||
|
|
||||||
|
assert_eq!(tr2.direction(), RtcRtpTransceiverDirection::Recvonly);
|
||||||
|
assert_eq!(
|
||||||
|
tr2.current_direction(),
|
||||||
|
Some(RtcRtpTransceiverDirection::Recvonly)
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
|
||||||
|
Box::new(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn exchange_sdps(
|
||||||
|
p1: RtcPeerConnection,
|
||||||
|
p2: RtcPeerConnection,
|
||||||
|
) -> impl Future<Item = (RtcPeerConnection, RtcPeerConnection), Error = JsValue> {
|
||||||
|
JsFuture::from(p1.create_offer())
|
||||||
|
.and_then(move |offer| {
|
||||||
|
let offer = offer.unchecked_into::<RtcSessionDescriptionInit>();
|
||||||
|
JsFuture::from(p1.set_local_description(&offer)).join4(
|
||||||
|
JsFuture::from(p2.set_remote_description(&offer)),
|
||||||
|
Ok(p1),
|
||||||
|
Ok(p2),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.and_then(|(_, _, p1, p2)| JsFuture::from(p2.create_answer()).join3(Ok(p1), Ok(p2)))
|
||||||
|
.and_then(|(answer, p1, p2)| {
|
||||||
|
let answer = answer.unchecked_into::<RtcSessionDescriptionInit>();
|
||||||
|
JsFuture::from(p2.set_local_description(&answer)).join4(
|
||||||
|
JsFuture::from(p1.set_remote_description(&answer)),
|
||||||
|
Ok(p1),
|
||||||
|
Ok(p2),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.and_then(|(_, _, p1, p2)| Ok((p1, p2)))
|
||||||
|
}
|
@ -18,4 +18,12 @@ global.Shape = class Shape {
|
|||||||
getShape() {
|
getShape() {
|
||||||
return this.kind;
|
return this.kind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get shapeTypeNone() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
get shapeTypeSome() {
|
||||||
|
return this.kind;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -35,3 +35,17 @@ fn invalid_enum_return() {
|
|||||||
_ => {} // Success
|
_ => {} // Success
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn read_optional_enum_attribute_none() {
|
||||||
|
let shape = Shape::new(ShapeType::Circle).unwrap();
|
||||||
|
let shape_type: Option<ShapeType> = shape.shape_type_none();
|
||||||
|
assert_eq!(shape_type, None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn read_optional_enum_attribute_some() {
|
||||||
|
let shape = Shape::new(ShapeType::Circle).unwrap();
|
||||||
|
let shape_type: Option<ShapeType> = shape.shape_type_some();
|
||||||
|
assert_eq!(shape_type, Some(ShapeType::Circle));
|
||||||
|
}
|
||||||
|
4
crates/webidl-tests/enums.webidl
vendored
4
crates/webidl-tests/enums.webidl
vendored
@ -12,4 +12,8 @@ interface Shape {
|
|||||||
|
|
||||||
[Pure]
|
[Pure]
|
||||||
ShapeType getShape();
|
ShapeType getShape();
|
||||||
|
|
||||||
|
readonly attribute ShapeType? shapeTypeNone;
|
||||||
|
|
||||||
|
readonly attribute ShapeType? shapeTypeSome;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user