mirror of
https://github.com/servo/servo
synced 2026-05-13 18:37:30 +02:00
CryptoKey interface has an internal slot named [[algorithm]], which store a WebIDL dictionary [1]. CryptoKey also stores a cached ECMAScript Object associated with the [[algorithm]] internal slot, and returns this object when the interface member `algorithm` is called [2]. In our current implementation, when we create a new `CryptoKey`, we need to manually construct an ECMAScript Object for the [[algorithm]] internal slot, and provide it to `CryptoKey::new`. Then, the provided object directly is stored in `CryptoKey`. There are several issues with this design. - `CryptoKey::new` accepts arbitrary ECMAScript Object via a `HandleObject` value. It basically relies on the caller to provide a correct object. - When we want to access the dictionary members of the [[algorithm]] internal slot, we need to first convert the ECMAScript Object back to a WebIDL dictionary. Although we have a separate field in the `CryptoKey` struct to store the `name` member of the dictionary for convenience, it is still not easy to access other members. This patch makes the following change: Instead of storing an ECMAScript Object provided by the caller and a separate name for convenience, we store (our "subtle" struct of) WebIDL dictionary type in Rust, generated by codegen, in the [[algorithm]] internal slot. Moreover, the cached ECMAScript Object associated with the [[algorithm]] internal slot is constructed from the [[algorithm]] internal slot internally, and we store it in the [[algorithm_cached]] internal slot. The benefits of this new design are: - The caller can directly provide the WebIDL dictionary in Rust to `CryptoKey`, without manually creating an ECMAScript Object. - When we want to access the [[algorithm]] internal slot, we don't need to do a ECMAScript-Object-to-dictionary conversion. - The Rust type system with an implementation of the `SafeToJSValConversion` trait can guarantee the cached ECMAScript Object associated with the [[algorithm]] internal slot is in good shape. [1] https://w3c.github.io/webcrypto/#dfn-CryptoKey-slot-algorithm [2] https://w3c.github.io/webcrypto/#dom-cryptokey-algorithm Testing: Refatoring. No behavioral change. Existing WPT test suffices. Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>