기여 목록 / 8466964
[WebCrypto] Cache CryptoKey algorithm and usages objects
BlinkfixMerged
WebCrypto의 CryptoKey.algorithm과 CryptoKey.usages getter가 접근할 때마다 새 객체를 만들어 key.algorithm === key.algorithm이 false가 되던 문제를 고쳤습니다. 4파일 +2/−18.
문제 설명
- issue url: https://crbug.com/40397976, https://crbug.com/41147789
- 40397976: Spec compliance: CryptoKey.algorithm needs to use a cached object
- 41147789: Spec compliance: CryptoKey.usages needs to use a cached object
- 스펙은
algorithm,usagesgetter가 내부 슬롯에 캐시해 둔 같은 ECMAScript 객체를 반환하도록 정의합니다. - Blink는 getter가 호출될 때마다 새 객체를 만들었습니다. 코드에도
FIXME: This creates a new javascript array each time.라는 주석이 남아 있었습니다. - 이 동작을 확인하는 WPT
crypto_key_cached_slots.https.any.js가 이미 Chromium에 import되어 있었지만, 실패 결과가-expected.txt로 고정되어 있었습니다.
해결 내용
crypto_key.idl의algorithm,usages속성에[SameObject, SaveSameObject]를 추가했습니다. 이렇게 하면 바인딩이 처음 반환한 객체를 wrapper에 저장해 두고 이후 접근에서는 같은 객체를 돌려줍니다.crypto_key.cc에 남아 있던 FIXME 주석을 지웠습니다.- 이제 테스트가 통과하므로 실패를 기록하던
-expected.txt두 개(window, worker)를 삭제했습니다.
- [CallWith=ScriptState] readonly attribute object algorithm;
- [CallWith=ScriptState] readonly attribute object usages;
+ [CallWith=ScriptState, SameObject, SaveSameObject] readonly attribute object algorithm;
+ [CallWith=ScriptState, SameObject, SaveSameObject] readonly attribute object usages;리뷰 과정
- davidben@, dcheng@ 모두 PS3에서 별도 코멘트 없이 Code-Review+1을 주었습니다.
- PS4는 CQ가 rebase해서 머지한 패치셋입니다.
테스트 방법
- 새 테스트를 추가하지 않고 기존 WPT
WebCryptoAPI/crypto_key_cached_slots.https.any.js로 확인했습니다. - PS1 dry run에서 linux-rel의
headless_shell_wpt_tests가crypto_key_cached_slots때문에 실패했습니다. 테스트가 통과하게 되면서 실패를 기대하던-expected.txt와 결과가 달라졌기 때문입니다. PS3에서 두 파일을 삭제했습니다. - PS3 첫 dry run은 ios-simulator에서 이 CL과 무관한
ios/chrome/browser/home_customization컴파일 오류로 실패했고, 다음 날 다시 돌린 dry run은 통과했습니다. - CQ 통과 후 머지.
배운 점
- 생각보다 쉬운 이슈여서 AI와 같이 할 때 어렵지는 않았던 이슈였습니다. 다만, 다음에는 조금더 내 스스로 공부하는 시간이 있으면 좋겠다라는 생각을 했습니다.