OSSCA Chromium

기여 목록 / 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, usages getter가 내부 슬롯에 캐시해 둔 같은 ECMAScript 객체를 반환하도록 정의합니다.
  • Blink는 getter가 호출될 때마다 새 객체를 만들었습니다. 코드에도 FIXME: This creates a new javascript array each time.라는 주석이 남아 있었습니다.
  • 이 동작을 확인하는 WPT crypto_key_cached_slots.https.any.js가 이미 Chromium에 import되어 있었지만, 실패 결과가 -expected.txt로 고정되어 있었습니다.

해결 내용

  1. crypto_key.idl의 algorithm, usages 속성에 [SameObject, SaveSameObject]를 추가했습니다. 이렇게 하면 바인딩이 처음 반환한 객체를 wrapper에 저장해 두고 이후 접근에서는 같은 객체를 돌려줍니다.
  2. crypto_key.cc에 남아 있던 FIXME 주석을 지웠습니다.
  3. 이제 테스트가 통과하므로 실패를 기록하던 -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와 같이 할 때 어렵지는 않았던 이슈였습니다. 다만, 다음에는 조금더 내 스스로 공부하는 시간이 있으면 좋겠다라는 생각을 했습니다.

참고 자료