mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-03-16 18:20:51 +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
@ -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)]
|
||||
impl From<#name> for ::wasm_bindgen::JsValue {
|
||||
fn from(obj: #name) -> ::wasm_bindgen::JsValue {
|
||||
|
@ -814,6 +814,9 @@ RtcRtpSender = []
|
||||
RtcRtpSourceEntry = []
|
||||
RtcRtpSourceEntryType = []
|
||||
RtcRtpSynchronizationSource = []
|
||||
RtcRtpTransceiver = []
|
||||
RtcRtpTransceiverDirection = []
|
||||
RtcRtpTransceiverInit = []
|
||||
RtcRtxParameters = []
|
||||
RtcSdpType = []
|
||||
RtcSessionDescription = []
|
||||
@ -826,6 +829,7 @@ RtcStatsReport = []
|
||||
RtcStatsReportInternal = []
|
||||
RtcStatsType = []
|
||||
RtcTrackEvent = []
|
||||
RtcTrackEventInit = []
|
||||
RtcTransportStats = []
|
||||
RtcdtmfSender = []
|
||||
RtcdtmfToneChangeEvent = []
|
||||
|
@ -48,6 +48,7 @@ pub mod pre_element;
|
||||
pub mod progress_element;
|
||||
pub mod quote_element;
|
||||
pub mod response;
|
||||
pub mod rtc_rtp_transceiver_direction;
|
||||
pub mod script_element;
|
||||
pub mod select_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() {
|
||||
return this.kind;
|
||||
}
|
||||
|
||||
get shapeTypeNone() {
|
||||
return null;
|
||||
}
|
||||
|
||||
get shapeTypeSome() {
|
||||
return this.kind;
|
||||
}
|
||||
};
|
||||
|
@ -35,3 +35,17 @@ fn invalid_enum_return() {
|
||||
_ => {} // 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]
|
||||
ShapeType getShape();
|
||||
|
||||
readonly attribute ShapeType? shapeTypeNone;
|
||||
|
||||
readonly attribute ShapeType? shapeTypeSome;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user