@@ -16,7 +16,7 @@ pub use crate::util::{inner_u32, inner_u64};
1616#[ cfg( not( all( target_arch = "wasm32" , any( target_os = "unknown" , target_os = "none" ) ) ) ) ]
1717compile_error ! ( "`wasm_js` backend can be enabled only for OS-less WASM targets!" ) ;
1818
19- use js_sys:: { SharedArrayBuffer , Uint8Array , WebAssembly :: Memory } ;
19+ use js_sys:: { JsString , Object , Uint8Array , WebAssembly :: Memory } ;
2020use wasm_bindgen:: { prelude:: wasm_bindgen, JsCast , JsValue } ;
2121
2222// Size of our temporary Uint8Array buffer used with WebCrypto methods
@@ -39,9 +39,15 @@ pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
3939 MEMORY_KIND_SHARED => true ,
4040 MEMORY_KIND_UNINIT => {
4141 let memory: Memory = wasm_bindgen:: memory ( ) . unchecked_into ( ) ;
42- let val = if memory. buffer ( ) . is_instance_of :: < SharedArrayBuffer > ( ) {
42+ // We can't use `instanceof` because of a bug in Firefox.
43+ // Instead we compare the constructor name, which always works.
44+ let constructor_name = Object :: from ( memory. buffer ( ) ) . constructor ( ) . name ( ) ;
45+ let val = if SHARED_ARRAY_BUFFER_NAME . with ( |name| & constructor_name == name) {
4346 MEMORY_KIND_SHARED
4447 } else {
48+ web_sys:: console:: log_1 (
49+ & Object :: from ( memory. buffer ( ) ) . constructor ( ) . name ( ) ,
50+ ) ;
4551 MEMORY_KIND_NOT_SHARED
4652 } ;
4753 MEMORY_KIND . store ( val, Ordering :: Relaxed ) ;
@@ -87,6 +93,7 @@ pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
8793}
8894
8995#[ wasm_bindgen]
96+ #[ rustfmt:: skip]
9097extern "C" {
9198 // Web Crypto API: Crypto interface (https://www.w3.org/TR/WebCryptoAPI/)
9299 type Crypto ;
@@ -98,4 +105,6 @@ extern "C" {
98105 fn get_random_values ( this : & Crypto , buf : & Uint8Array ) -> Result < ( ) , JsValue > ;
99106 #[ wasm_bindgen( method, js_name = getRandomValues, catch) ]
100107 fn get_random_values_ref ( this : & Crypto , buf : & mut [ u8 ] ) -> Result < ( ) , JsValue > ;
108+ #[ wasm_bindgen( thread_local_v2, static_string) ]
109+ static SHARED_ARRAY_BUFFER_NAME : JsString = "SharedArrayBuffer" ;
101110}
0 commit comments