μ›”κ°„ 크둬 이슈 리포트 2023λ…„ 3μ›”ν˜Έ


λ“€μ–΄κ°€λ©°

ν”„λŸ°νŠΈμ—”λ“œ κ°œλ°œμ— κ°€μž₯ λ§Žμ€ 영ν–₯을 μ£ΌλŠ” 크둬 λΈŒλΌμš°μ €μ˜ 버전별 λ³€κ²½ μ˜ˆμ • ν•­λͺ©μ„ 정리 및 κ³΅μœ ν•œλ‹€.

πŸ’‘ 각 ν•­λͺ©μ€ Chrome Platform Status의 Roadmapκ³Ό ν•œ λ‹¬κ°„μ˜ blink-dev ν™œλ™ μš”μ•½μ„ λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν–ˆλ‹€.

πŸ’‘ 각 ν•­λͺ©μ˜ πŸš«λŠ” 지원 쀑단 및 제거(Removed), βš οΈλŠ” 지원 쀑단(Deprecated), βœ…λŠ” μƒˆλ‘œμš΄ κΈ°λŠ₯(Enabled by default)λ₯Ό μ˜λ―Έν•œλ‹€.

πŸ’‘ 각 ν•­λͺ© 쀑 κΈ°μ‘΄ μ„œλΉ„μŠ€μ— λ―ΈμΉ˜λŠ” 영ν–₯이 크닀고 νŒλ‹¨ν•œ ν•­λͺ©μ€ μ†Œμ œλͺ© 뒀에 πŸ“Œ ν‘œμ‹œλ₯Ό ν–ˆλ‹€.

πŸ’‘ 지원 쀑단 및 제거(🚫), 지원 쀑단(⚠️) μ™Έμ˜ ν•­λͺ©μ€ 곡유 κ°€μΉ˜κ°€ μžˆλ‹€κ³  νŒλ‹¨ν•œ κ²½μš°μ—λ§Œ ν¬ν•¨ν–ˆλ‹€.

πŸ’‘ 각 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ Chrome Platform Statusλ₯Ό κ·ΈλŒ€λ‘œ μΈμš©ν–ˆλ‹€.

λͺ©μ°¨

  1. Chrome 112

    • ⚠️ document.domain μ„€μ •μž(Setter) 지원 쀑단 πŸ“Œ
    • βœ… 선언적 Shadow DOM ν™œμ„±ν™”μ— μ‚¬μš©ν•˜λŠ” λΉ„ν‘œμ€€ shadowroot 속성 지원 쀑단 미리 보기
    • βœ… FormData μƒμ„±μžμ— submitter 인자 μΆ”κ°€
    • βœ… CSS 쀑첩 λͺ¨λ“ˆ
    • βœ… μ •κ·œμ‹ v ν”Œλž˜κ·Έ μΆ”κ°€
    • πŸ—“οΈ 배포 μ˜ˆμ •μΌ
  2. Chrome 113

    • ⚠️ Secure Payment Confirmation: CollectedClientAdditionalPaymentData의 rp 속성 이름 λ³€κ²½
    • βœ… Fetch: Headers.getSetCookie() λ©”μ„œλ“œ μΆ”κ°€
    • βœ… RTCPeerConnection.getStats() 콜백 방식 지원 쀑단 미리 보기 πŸ“Œ
    • πŸ—“οΈ 배포 μ˜ˆμ •μΌ
  3. Chrome 114

    • βœ… Popover API
    • βœ… display, content-visibility의 μ• λ‹ˆλ©”μ΄μ…˜ μ‚¬μš© 지원
    • βœ… CSS λΆˆμ—°μ† μ†μ„±μ˜ Transition 지원
    • πŸ—“οΈ 배포 μ˜ˆμ •μΌ
  4. Chrome NEXT

    • ⚠️ [Chrome 119] 선언적 Shadow DOM ν™œμ„±ν™”μ— μ‚¬μš©ν•˜λŠ” λΉ„ν‘œμ€€ shadowroot 속성 지원 쀑단
    • ⚠️ [Chrome 119] RTCPeerConnection.getStats() 콜백 방식 지원 쀑단 πŸ“Œ
    • βœ… [Chrome ???] 내뢀망에 λŒ€ν•œ ν•˜μœ„ λ¦¬μ†ŒμŠ€ μš”μ²­ μ œν•œ πŸ“Œ

1. Chrome 112

⚠️ document.domain μ„€μ •μž(Setter) 지원 쀑단 πŸ“Œ

SOP(Same-Origin Policy)λŠ” λΈŒλΌμš°μ € λ³΄μ•ˆ μ •μ±…μœΌλ‘œ, 두 νŽ˜μ΄μ§€κ°€ μ„œλ‘œ λ‹€λ₯Έ 좜처(origin)일 λ•Œ 이 두 νŽ˜μ΄μ§€ μ‚¬μ΄μ˜ 톡신을 λ§‰λŠ”λ‹€. 예λ₯Ό λ“€μ–΄ parent.example.com νŽ˜μ΄μ§€μ— <iframe>으둜 child.example.com νŽ˜μ΄μ§€λ₯Ό 뢈러였면 기본적으둜 child.example.com은 window.parent둜 λΆ€λͺ¨μ°½μ— μ ‘κ·Όν•  수 μ—†κ³ , 이 λ°˜λŒ€λ„ λ§ˆμ°¬κ°€μ§€λ‹€. κΈ°μ‘΄μ—λŠ” μƒμœ„ 도메인이 같은 경우, document.domain μ„€μ •μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμœ„ 도메인(example.com)으둜 좜처λ₯Ό λ³€κ²½ν•΄ SOPλ₯Ό μ™„ν™”ν•  수 μžˆμ—ˆλ‹€. 보닀 κ°•λ ₯ν•œ λ³΄μ•ˆμ„ μœ„ν•΄ 이 μ„€μ •μžλ₯Ό 지원 μ€‘λ‹¨ν•œλ‹€. 지원 쀑단 κΈ°κ°„ λ™μ•ˆ document.domain μ„€μ •μžλ₯Ό ν˜ΈμΆœν•  μˆ˜λŠ” μžˆμ§€λ§Œ μΆœμ²˜λŠ” λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ‚¬μš©μžκ°€ 직접 chrome://flagsμ—μ„œ Origin-keyed agent clusters κΈ°λŠ₯을 μ„€μ •ν•΄ 기쑴처럼 document.domain으둜 좜처λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ κΈ°λ³Έ μ˜΅μ…˜μ΄ μ•„λ‹ˆκΈ°μ— λŒ€μ•ˆμ„ μ°ΎλŠ” 것이 μ’‹λ‹€. κ°€μž₯ κ°„λ‹¨ν•˜κ²Œ μ„œλ‘œ λ‹€λ₯Έ 좜처 κ°„ 톡신은 window.postMessage둜 κ΅¬ν˜„ν•  수 μžˆλ‹€.

// parent.example.com
window.addEventListener('message', (event) => {
  if (event.origin !== 'http://child.example.com') {
    return;
  }

  console.log(event.data); // μ•ˆλ…•ν•˜μ„Έμš”?
});

// child.example.com
window.postMessage('μ•ˆλ…•ν•˜μ„Έμš”?', 'http://parent.example.com');

window.postMessage의 μžμ„Έν•œ μ‚¬μš©λ²• 및 λ‹€λ₯Έ λŒ€μ•ˆμ€ μ—¬κΈ°λ₯Ό 참고해도 μ’‹λ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


βœ… 선언적 Shadow DOM ν™œμ„±ν™”μ— μ‚¬μš©ν•˜λŠ” λΉ„ν‘œμ€€ shadowroot 속성 지원 쀑단 미리 보기

선언적 Shadow DOM은 <template> μš”μ†Œμ— shadowroot 속성을 지정해 ν…œν”Œλ¦Ώμ—μ„œ 직접 Shadow DOM을 ν™œμ„±ν™”ν•  수 μžˆλŠ” κΈ°λŠ₯이닀. ν‘œμ€€μ—μ„œ 이 속성에 λŒ€ν•œ 이름을 shadowrootmode둜 변경함에 따라 κΈ°μ‘΄ shadowroot 속성을 지원 쀑단할 μ˜ˆμ •μ΄λ‹€. shadowrootλŠ” ν¬λ‘¬μ—μ„œ κ·ΈλŒ€λ‘œ λ™μž‘ν•˜λ‚˜, Chrome 111μ—μ„œ μΆ”κ°€λœ 슀트리밍 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μ—†λ‹€. shadowrootmodeλŠ” Chrome 111 μ΄μƒμ—μ„œ μ‚¬μš©ν•  수 있으며, λ‹€λ₯Έ λΈŒλΌμš°μ €μ—μ„œλ„ 지원 μ˜ˆμ •μ΄λ―€λ‘œ shadowrootmode 속성을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

<host-element>
- <template shadowroot="open">
+ <template shadowrootmode="open">
    <slot></slot>
  </template>
  <h2>Light content</h2>
</host-element>

shadowroot 속성은 μ˜€λŠ” 10μ›” 말 배포 μ˜ˆμ •μΈ Chrome 119μ—μ„œ 지원 쀑단 μ˜ˆμ •μ΄λ‹€. Chrome 112μ—μ„œλŠ” shadowroot 속성 지원 쀑단에 λŒ€ν•œ 미리 보기만 μΆ”κ°€ν•œλ‹€. chrome://flagsμ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 ν™œμ„±ν™”ν•΄ 속성 지원 쀑단을 미리 μ²΄ν—˜ν•  수 μžˆλ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 의견 μ—†μŒ
  • Safari: 의견 μ—†μŒ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


βœ… FormData μƒμ„±μžμ— submitter 인자 μΆ”κ°€

FormData μƒμ„±μžμ˜ 두 번째 선택 인자둜 submitterλ₯Ό μΆ”κ°€ν•œλ‹€. submitterλŠ” λŒ€μƒ <form> μš”μ†Œμ—μ„œ submit 역할을 ν•˜λŠ” μš”μ†Œλ‘œ, <button type=submit>이 λŒ€ν‘œμ μ΄λ‹€. FormData μΈμŠ€ν„΄μŠ€ 생성 μ‹œ 이 submitter 인자λ₯Ό λ„˜κΈ°λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ 값을 ν¬ν•¨ν•œ FormData μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

<form id="myForm" action="/api">
  <input name="title" value="여름 νœ΄μ–‘μ§€λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”." />
  <button name="type" value="beach">λ°”λ‹€</button>
  <button name="type" value="mountain">μ‚°</button>
  <button name="type" value="valley">계곑</button>
</form>

μœ„ <form>은 μ–΄λ–€ λ²„νŠΌμ„ λˆŒλ €λŠ”μ§€μ— 따라 μ„œλ²„(/api)에 λ³΄λ‚΄λŠ” 값이 달라진닀. λ§Œμ•½ λ°”λ‹€ λ²„νŠΌμ„ λˆŒλ €λ‹€λ©΄ μ„œλ²„κ°€ λ°›λŠ” 값은 μ•„λž˜μ™€ κ°™λ‹€.

title=여름 νœ΄μ–‘μ§€λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.
type=beach

ν•˜μ§€λ§Œ μŠ€ν¬λ¦½νŠΈμ—μ„œ μœ„ 데이터와 같은 FormDataλ₯Ό μƒμ„±ν•˜λ €λ©΄ 직접 값을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

document.getElementById('myForm').addEventListener('submit', (event) => {
  event.preventDefault();

  const formData = new FormData(event.target);
  // β–Έ FormData(1) { title -> "여름 νœ΄μ–‘μ§€λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”." }

  formData.append(event.submitter.name, event.submitter.value);
});

Chrome 112λΆ€ν„°λŠ” FormData에 submitter 인자λ₯Ό λ„˜κΈ°λ©΄ submitter의 값을 ν¬ν•¨ν•œ FormData μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

document.getElementById('myForm').addEventListener('submit', (event) => {
  event.preventDefault();

  const formData = new FormData(event.target, event.submitter);
  // β–Έ FormData(2) { title -> "여름 νœ΄μ–‘μ§€λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.", type -> "beach" }
});

SubmitEvent.submitterλŠ” Chrome 81 μ΄μƒμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 ν•­λͺ©μ— λŒ€ν•œ 폴리필이 μžˆμœΌλ‹ˆ μ‹€μ œ 적용 μ‹œ μ°Έκ³ ν•˜μž.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


βœ… CSS 쀑첩 λͺ¨λ“ˆ

CSS κ·œμΉ™μ„ 쀑첩 μ •μ˜ν•  수 μžˆλŠ” κΈ°λŠ₯을 μΆ”κ°€ν•œλ‹€. Scss 문법과 λΉ„μŠ·ν•˜λ‚˜, 근본적인 차이가 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ ScssλŠ” μƒμœ„ μ„ νƒμž, &λ₯Ό λ¬Έμžμ—΄λ‘œ λ³Έλ‹€.

.foo {
  &Bar {
    color: red;
  }
}

μœ„ νŒŒμΌμ„ Scss μ—”μ§„μœΌλ‘œ λ³€ν™˜ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

.fooBar {
  color: red;
}

ν•˜μ§€λ§Œ CSS의 쀑첩 λͺ¨λ“ˆμ€ &λ₯Ό λ³„λ„μ˜ μ»΄ν¬λ„ŒνŠΈλ‘œ λ³Έλ‹€. λ”°λΌμ„œ 첫 번째 μ˜ˆμ‹œλ₯Ό μ•„λž˜μ²˜λŸΌ ν•΄μ„ν•œλ‹€.

Bar.foo {
  color: red;
}

CSS 쀑첩 λͺ¨λ“ˆμ€ μ•žμ„  μ˜ˆμ‹œλ₯Ό .foo λ¬Έμžμ—΄κ³Ό Bar λ¬Έμžμ—΄μ„ ν•©μΉœ 게 μ•„λ‹Œ .foo 클래슀 μ„ νƒμžμ™€ Bar νƒ€μž… μ„ νƒμžλ₯Ό ν•©μΉœ κ²ƒμœΌλ‘œ λ³Έλ‹€.

λ˜ν•œ 쀑첩 ꡬ문은 νƒ€μž… μ„ νƒμžλ‚˜ ν•¨μˆ˜ ꡬ문으둜 μ‹œμž‘ν•  수 μ—†λ‹€.

/* μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ CSS ꡬ문! */
li {
  color: lime;

  input {
    margin-top: 1em;
  }
}

이 κΈ°λŠ₯은 아직 μ΄ˆμ•ˆμ΄κΈ° λ•Œλ¬Έμ— μ‹€μ œ κ΅¬ν˜„ κ³Όμ •μ—μ„œ κ·œμΉ™μ΄ 변경될 수 μžˆλ‹€. μžμ„Έν•œ κ·œμΉ™μ€ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μž.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


βœ… μ •κ·œμ‹ v ν”Œλž˜κ·Έ μΆ”κ°€

μ •κ·œμ‹μ— μœ λ‹ˆμ½”λ“œ 집합 λͺ¨λ“œ(/v)λ₯Ό μΆ”κ°€ν•œλ‹€. v ν”Œλž˜κ·ΈλŠ” ES2015 μœ λ‹ˆμ½”λ“œ λͺ¨λ“œ(/u)의 ν™•μž₯판으둜, u ν”Œλž˜κ·Έλ³΄λ‹€ 더 λ§Žμ€ κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.

λ¨Όμ € u ν”Œλž˜κ·Έκ°€ ν•˜λ‚˜μ˜ μ½”λ“œ 포인트(code point)만 μ§€μ›ν•˜λŠ” 것과 달리 v ν”Œλž˜κ·ΈλŠ” λ‹€μˆ˜μ˜ μ½”λ“œ 포인트λ₯Ό μ§€μ›ν•œλ‹€.

{
  // u ν”Œλž˜κ·Έ
  const regex = /^\p{RGI_Emoji}$/u;

  regex.test('⚽'); // '\u26BD', ν•œ 개의 μ½”λ“œ 포인트
  // -> true

  regex.test('πŸ‘¨πŸΎβ€βš•οΈ'); // '\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F', 5개의 μ½”λ“œ 포인트둜 이루어져 u ν”Œλž˜κ·Έλ‘œλŠ” 검사할 수 μ—†λ‹€.
  //-> false
}
{
  // v ν”Œλž˜κ·Έ
  const regex = /^\p{RGI_Emoji}$/v;

  regex.test('⚽'); // '\u26BD'
  // -> true

  regex.test('πŸ‘¨πŸΎβ€βš•οΈ'); // '\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F'
  // -> true
}

λ˜ν•œ μœ λ‹ˆμ½”λ“œ 속성 μ˜ˆμ™Έ ν‘œν˜„(\p)κ³Ό μœ λ‹ˆμ½”λ“œ 집합 ν‘œν˜„μ‹μ„ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€.

// ν•œκΈ€μ΄λ©°, "γ„΄"이 μ•„λ‹Œ μœ λ‹ˆμ½”λ“œ 문자
/[\p{Script_Extensions=Hangul}--γ„΄]/v.test('γ„΄'); // -> false
// ν•œκΈ€μ΄λ©°, "γ„±", "γ„΄", "γ„·"이 μ•„λ‹Œ μœ λ‹ˆμ½”λ“œ 문자
/[\p{Script_Extensions=Hangul}--[γ„±-γ„·]]/v.test('γ„΄'); // -> false

--λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • μœ λ‹ˆμ½”λ“œ 속성을 가진 문자 μ€‘μ—μ„œ μ§€μ •ν•œ 문자 λ˜λŠ” 문자 집합을 μ œμ™Έν•  수 μžˆλ‹€.

&&λŠ” ꡐ차 ꡬ문으둜 두 μœ λ‹ˆμ½”λ“œ 속성을 λͺ¨λ‘ 가진 μœ λ‹ˆμ½”λ“œ 문자λ₯Ό 가리킨닀.

// 그리슀 문자이며, 문자인 μœ λ‹ˆμ½”λ“œ 문자
const regex = /[\p{Script_Extensions=Greek}&&\p{Letter}]/v;
// U+03C0 그리슀 PI μ†Œλ¬Έμž
regex.test('Ο€'); // true
// U+1018A 그리슀 0에 ν•΄λ‹Ήν•˜λŠ” 숫자
regex.test('π†Š'); // false

u ν”Œλž˜κ·ΈλŠ” μœ λ‹ˆμ½”λ“œ μ†μ„±λΌλ¦¬λ§Œ 집합을 생성할 수 μžˆμ§€λ§Œ, v ν”Œλž˜κ·ΈλŠ” λ¬Έμžμ—΄κ³Όλ„ ν•¨κ»˜ 집합을 생성할 수 μžˆλ‹€.

// ν•œκΈ€ λ˜λŠ” 0-9 μ‚¬μ΄μ˜ 아라비아 숫자
const regex = /^[\p{Script_Extensions=Hangul}0-9]$/v;

regex.test('μŠ€λ¬Όλ‘μ‚΄'); // true
regex.test('22μ‚΄'); // true

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


πŸ—“οΈ 배포 μ˜ˆμ •μΌ

Chrome 112은 2023λ…„ 3μ›” 29일에 정식 배포 μ˜ˆμ •μ΄λ‹€. 3μ›” 9일뢀터 16일 사이에 크둬 베타 λ²„μ „μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 미리 확인해 λ³Ό 수 μžˆλ‹€.


2. Chrome 113

⚠️ Secure Payment Confirmation: CollectedClientAdditionalPaymentData의 rp 속성 이름 λ³€κ²½

SPC(Secure Payment Confirmation)λŠ” 결제 거래 쀑 κ°„μ†Œν™”λœ 인증 절차λ₯Ό μ œκ³΅ν•˜λŠ” μ›Ή API이닀. WebAuthn을 기반으둜 λ§Œλ“€μ—ˆμœΌλ©°, WebAuthnμ—μ„œ CollectedClientAdditionalPaymentData의 rp(Relying Party, μ‹ λ’° λ‹Ήμžμ‚¬) μ†μ„±μ˜ 이름을 rpId둜 변경함에 따라 ν‘œμ€€μ—μ„œλ„ rpλ₯Ό rpId둜 λ³€κ²½ν•˜μ˜€λ‹€. λ³€κ²½λœ ν‘œμ€€ λ¬Έμ„œμ˜ λ°˜μ˜μ„ μœ„ν•΄ rp 속성을 μ œκ±°ν•œλ‹€.

Chrome 107μ—μ„œ λ¨Όμ € CollectedClientAdditionalPaymentData에 rpId 속성을 μΆ”κ°€ν–ˆμœΌλ―€λ‘œ rp λŒ€μ‹  rpIdλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: ν•΄λ‹Ή μ—†μŒ
  • Safari: ν•΄λ‹Ή μ—†μŒ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


βœ… Fetch: Headers.getSetCookie() λ©”μ„œλ“œ μΆ”κ°€

HTTP μš”μ²­μ„ 보낼 λ•Œ Set-Cookie ν—€λ”λŠ” μ—¬λŸ¬ 번 μ€‘λ³΅μœΌλ‘œ μ„ μ–Έν•  수 있으며, μžλ™μœΌλ‘œ 합쳐지지 μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ ν˜„μž¬ HeadersλŠ” λ“±λ‘ν•œ Set-Cookie 헀더λ₯Ό λ”°λ‘œ κ°€μ Έμ˜¬ 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€. μ˜ˆμ‹œλ‘œ ν˜„μž¬ Headers.get('Set-Cookie')λŠ” λͺ¨λ“  Set-Cookie ν—€λ”μ˜ 값을 ν•©μΉœ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

const a = new Headers();

a.append('Set-Cookie', 'a=1');
a.append('Set-Cookie', 'b=2');
console.log(a.get('Set-Cookie')); // a=1, b=2

HTTP의 κ·œμΉ™κ³Ό λ™μΌν•˜κ²Œ Headers의 Set-Cookieλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•˜λŠ” Headers.getSetCookie() λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•œλ‹€. 일뢀 λΈŒλΌμš°μ €λŠ” Headers 객체λ₯Ό μˆœνšŒν•  λ•Œ Set-Cookieλ₯Ό ν•©μΉ˜μ§€ μ•ŠλŠ” κΈ°λŠ₯도 λ¨Όμ € μ μš©ν–ˆλ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


βœ… RTCPeerConnection.getStats() 콜백 방식 지원 쀑단 미리 보기 πŸ“Œ

RTCPeerConnection.getStats()λŠ” ν•΄λ‹Ή μ˜€λ””μ˜€λ‚˜ λΉ„λ””μ˜€ 연결에 λŒ€ν•œ 톡계 자료λ₯Ό λ°˜ν™˜ν•˜λŠ” APIλ‹€. ν˜„μž¬ ν¬λ‘¬μ—μ„œ 이 APIλŠ” ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” μ΅œμ‹  버전과, μ½œλ°±μ„ μ‚¬μš©ν•˜λŠ” ꡬ버전 두 κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

myPeerConnection.getStats(); // μ΅œμ‹  버전
myPeerConnection.getStats(null, onSuccess, onFailure); // ꡬ버전, Promise λ°˜ν™˜ X

콜백 방식은 λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ μ–΄μšΈλ¦¬μ§€ μ•Šκ³ , ν‘œμ€€ μŠ€νŽ™ λ¬Έμ„œλ„ μ—†μ–΄ μž₯기적으둜 지원을 쀑단할 μ˜ˆμ •μ΄λ‹€. Chrome 113μ—μ„œλŠ” 콜백 방식 μ‚¬μš© μ‹œ μ½˜μ†”μ— κ²½κ³ λ₯Ό λ…ΈμΆœν•˜λ©°, chrome://flagsμ—μ„œ 지원 쀑단을 μ²΄ν—˜ν•  수 μžˆλŠ” κΈ°λŠ₯을 μΆ”κ°€ν•  μ˜ˆμ •μ΄λ‹€.

콜백 방식은 μ˜€λŠ” 10μ›” 말에 정식 배포 μ˜ˆμ •μΈ Chrome 119μ—μ„œ 지원 쀑단 μ˜ˆμ •μ΄λ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 배포 μ™„λ£Œ
  • Safari: 배포 μ™„λ£Œ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


πŸ—“οΈ 배포 μ˜ˆμ •μΌ

Chrome 113은 2023λ…„ 4μ›” 26일에 정식 배포 μ˜ˆμ •μ΄λ‹€. 4μ›” 6일뢀터 13일 사이에 크둬 베타 λ²„μ „μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 미리 확인해 λ³Ό 수 μžˆλ‹€.


3. Chrome 114

βœ… Popover API

PopoverλŠ” μ›Ή νŽ˜μ΄μ§€ μœ„μ— λ§μ”Œμš°λŠ” UIλ₯Ό λ§ν•œλ‹€. Date Picker, Context Menu, κ°„λ‹¨ν•œ 툴팁 λ“±, μ›Ή κ°œλ°œμ—μ„œ Popoverλ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆλŠ” μ•„μ£Ό λ§Žλ‹€. ν•˜μ§€λ§Œ μƒνƒœ 관리, 포컀슀 관리, μ ‘κ·Όμ„± λ“± κ³ λ €ν•  사항이 λ§Žμ•„ μ€κ·Όνžˆ κ΅¬ν˜„μ΄ 쉽지 μ•Šμ€ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‹€.

tui-datepicker example

Chrome 114μ—μ„œ μΆ”κ°€ μ˜ˆμ •μΈ HTML μš”μ†Œμ˜ popover 속성을 μ‚¬μš©ν•˜λ©΄ 이 Popoverλ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

<div popover>μ•ˆλ…•ν•˜μ„Έμš”?</div>

popover 속성에 지정할 수 μžˆλŠ” 값은 "auto" | "manual"이며, 기본값은 "auto"이닀. 두 κ°’μ˜ μ°¨μ΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • "auto":

    • One at a Time: 화면에 λ‚˜νƒ€λ‚  λ•Œ λ‹€λ₯Έ popover μš”μ†Œλ₯Ό μˆ¨κΈ΄λ‹€.
    • Light Dismiss: popover μš”μ†Œ λ°”κΉ₯을 ν΄λ¦­ν•˜κ±°λ‚˜, escape λ²„νŠΌμ„ λˆ„λ£¨λŠ” μ„±κ²©μ˜ λ™μž‘ μ‹œ ν˜„μž¬ popover μš”μ†Œλ₯Ό μˆ¨κΈ΄λ‹€.
  • "manual":

    • 화면에 λ‚˜νƒ€λ‚  λŒ€ λ‹€λ₯Έ popover μš”μ†Œλ₯Ό μˆ¨κΈ°μ§€ μ•ŠλŠ”λ‹€.
    • Light Dismissλ₯Ό μ μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

popover μš”μ†ŒλŠ” 기본적으둜 position: fixed; μŠ€νƒ€μΌμ„ 가진닀. <dialog>처럼 ::backdrop 가상 μ„ νƒμžλ‘œ λ°°κ²½ μš”μ†Œμ— μ ‘κ·Όν•  수 있으며, :open으둜 화면에 λ‚˜νƒ€λ‚œ popover μš”μ†Œλ₯Ό, :closed둜 μˆ¨μ€ popover μš”μ†Œλ₯Ό 선택할 수 μžˆλ‹€.

[popover]::backdrop {
  background-color: rgba(0, 0, 0, 0.6);
}

[popover]:open {
  display: flex;
}

popovertarget, popovertargetaction 속성을 μ‚¬μš©ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 없이도 popover μš”μ†Œλ₯Ό μ œμ–΄ν•  수 μžˆλ‹€.

<span id="myPopover" popover>μ•ˆλ…•ν•˜μ„Έμš”?</span>
<button type="button" popovertarget="myPopover">
  이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜κ±°λ‚˜ μ‚¬λΌμ§‘λ‹ˆλ‹€.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="show">
  이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="hide">
  이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ©”μ‹œμ§€κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="toggle">
  이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜κ±°λ‚˜ μ‚¬λΌμ§‘λ‹ˆλ‹€.
</button>

λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 톡해 직접 popover μš”μ†Œμ˜ μƒνƒœλ₯Ό μ œμ–΄ν•  μˆ˜λ„ μžˆλ‹€.

const popover = document.getElementById('myPopover');

popover.showPopover();
console.log(popover.matches(':open')); // true
popover.hidePopover();
console.log(popover.matches(':open')); // false
popover.togglePopover();
console.log(popover.matches(':open')); // true

popover 속성은 <dialog>에 λΉ„ν•΄ μ’€ 더 λ²”μš©μ μ΄λ‹€. HTML νƒœκ·Έκ°€ μ•„λ‹Œ 속성이기 λ•Œλ¬Έμ— μ‹œλ§¨ν‹±(sementic) 웹을 κ΅¬μΆ•ν•˜κΈ° μ’‹μœΌλ©°, μˆœμˆ˜ν•˜κ²Œ CSS둜 μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•  μˆ˜λ„ 있고, <dialog>에 open μ΄λ²€νŠΈκ°€ μ—†λŠ” 것과 달리 화면에 λ‚˜νƒ€λ‚  λ•Œλ„ 이벀트(beforetoggle)λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

λ‹€λ§Œ popoverλŠ” λΈŒλΌμš°μ €κ°€ 직접 display μŠ€νƒ€μΌμ„ μ‘°μž‘ν•΄ μƒνƒœλ₯Ό μ œμ–΄ν•˜λ―€λ‘œ μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€. display 속성에 κ΄€ν•œ μ• λ‹ˆλ©”μ΄μ…˜ 및 transition 지원이 Chrome 114에 같이 배포될 μ˜ˆμ •μ΄λ‹ˆ μ°Έκ³ ν•˜μž.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έμ‘°


βœ… display, content-visibility의 μ• λ‹ˆλ©”μ΄μ…˜ μ‚¬μš© 지원

display 속성 및 content-visibility 속성을 CSS μ• λ‹ˆλ©”μ΄μ…˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ³€κ²½ν•œλ‹€.

@keyframes slideOut {
  from {
    display: block;
  }
  to {
    transform: translateX(40px);
    opacity: 0;
  }
}

.hide {
  animation: slideOut 0.2s;
  display: none;
}

μœ„ μ˜ˆμ‹œμ—μ„œ hide 클래슀λ₯Ό μ§€μ •ν•œ μš”μ†ŒλŠ” μ• λ‹ˆλ©”μ΄μ…˜ 없이 λ°”λ‘œ ν™”λ©΄μ—μ„œ 사라진닀. display 속성은 opacity λ“±μ˜ 속성과 달리 쀑간 값을 μ—°μ‚°ν•  수 μ—†λŠ” λΆˆμ—°μ†(discrete) 속성이닀. μ• λ‹ˆλ©”μ΄μ…˜μ—μ„œ display 속성 자체λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•„ display: block; ꡬ문을 λ¬΄μ‹œν•œ 것이닀.

Chrome 114λΆ€ν„°λŠ” display 및 content-visibility μ†μ„±μ˜ 쀑간 값을 none | hidden이 μ•„λ‹Œ νŠΉμ • κ°’μœΌλ‘œ μ—°μ‚°ν•΄ ν•΄λ‹Ή μ†μ„±μ˜ μ• λ‹ˆλ©”μ΄μ…˜ μ‚¬μš©μ„ 지원할 μ˜ˆμ •μ΄λ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 의견 μ—†μŒ
  • Safari: 의견 μ—†μŒ
  • μ›Ή 개발자: 긍정적

μ°Έμ‘°


βœ… CSS λΆˆμ—°μ† μ†μ„±μ˜ Transition 지원

CSS λΆˆμ—°μ†(discrete) μ†μ„±μ΄λž€ 쀑간 값을 μ—°μ‚°ν•  수 μ—†λŠ” display, visibility 등을 λ§ν•œλ‹€. 이듀은 쀑간 값을 μ—°μ‚°ν•  수 μ—†μ–΄ transition 속성과 ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μ—ˆλ‹€.

κΈ°μ‘΄μ—λŠ” νŠΉμ • μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ ν›„ display: none; 속성을 μ μš©ν•˜λ €λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 직접 μŠ€νƒ€μΌμ„ λ³€κ²½ν•΄μ•Ό ν–ˆλ‹€.

.hide {
  transition: opacity 0.3s;
  opacity: 0;
  /* display: none; */
}
const target = document.querySelector('#target');

target.addEventListener('transitionend', () => {
  target.style.setProperty('display', 'none');
});

target.classList.add('.hide');

Chrome 114λΆ€ν„°λŠ” transition-property 속성에 λΆˆμ—°μ† 속성을 λͺ…μ‹œν•΄ transition의 λŒ€μƒμœΌλ‘œ 지정할 수 μžˆλ‹€.

.hide {
  transition: opacity 0.3s, display 0.3s;
  opacity: 0;
  display: none;
}
const target = document.querySelector('#target');

target.classList.add('.hide');

μ£Όμ˜ν•΄μ•Ό ν•  점은 all은 μ—¬μ „νžˆ λΆˆμ—°μ† 속성을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점이닀. λΆˆμ—°μ† 속성을 transition의 λŒ€μƒμœΌλ‘œ μ§€μ •ν•˜λ €λ©΄ ν•΄λ‹Ή 속성을 λͺ…μ‹œμ μœΌλ‘œ transition-property에 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

/* μ• λ‹ˆλ©”μ΄μ…˜ 없이 λ°”λ‘œ 사라진닀. */
.hide {
  transition: all 0.3s;
  opacity: 0;
  display: none;
}

/* 0.3초 ν›„ 사라진닀. */
.hide {
  transition: display 0.3s, opacity 0.3s;
  opacity: 0;
  display: none;
}

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 의견 μ—†μŒ
  • Safari: 의견 μ—†μŒ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


πŸ—“οΈ 배포 μ˜ˆμ •μΌ

Chrome 114은 2023λ…„ 5μ›” 24일에 정식 배포 μ˜ˆμ •μ΄λ‹€. 5μ›” 4일뢀터 11일 사이에 크둬 베타 λ²„μ „μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 미리 확인해 λ³Ό 수 μžˆλ‹€.


4. Chrome NEXT

⚠️ [Chrome 119] 선언적 Shadow DOM ν™œμ„±ν™”μ— μ‚¬μš©ν•˜λŠ” λΉ„ν‘œμ€€ shadowroot 속성 지원 쀑단

선언적 Shadow DOM은 <template> μš”μ†Œμ— shadowroot 속성을 지정해 ν…œν”Œλ¦Ώμ—μ„œ 직접 Shadow DOM을 ν™œμ„±ν™”ν•  수 μžˆλŠ” κΈ°λŠ₯이닀. ν‘œμ€€μ—μ„œ 이 속성에 λŒ€ν•œ 이름을 shadowrootmode둜 변경함에 따라 κΈ°μ‘΄ shadowroot 속성을 지원 μ€‘λ‹¨ν•œλ‹€. shadowrootλŠ” ν¬λ‘¬μ—μ„œ κ·ΈλŒ€λ‘œ λ™μž‘ν•˜λ‚˜, Chrome 111μ—μ„œ μΆ”κ°€λœ 슀트리밍 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μ—†λ‹€. shadowrootmodeλŠ” Chrome 111 μ΄μƒμ—μ„œ μ‚¬μš©ν•  수 있으며, λ‹€λ₯Έ λΈŒλΌμš°μ €μ—μ„œλ„ 지원 μ˜ˆμ •μ΄λ―€λ‘œ shadowrootmode 속성을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

<host-element>
-  <template shadowroot="open">
+ <template shadowrootmode="open">
    <slot></slot>
  </template>
  <h2>Light content</h2>
</host-element>

Chrome 112μ—μ„œ shadowroot 속성에 λŒ€ν•œ 지원 쀑단 미리 보기λ₯Ό μΆ”κ°€ν•  μ˜ˆμ •μ΄λ‹€. 배포 ν›„ chrome://flagsμ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 ν™œμ„±ν™”ν•΄ 속성 지원 쀑단을 미리 μ²΄ν—˜ν•  수 μžˆλ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 의견 μ—†μŒ
  • Safari: 의견 μ—†μŒ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


⚠️ [Chrome 119] RTCPeerConnection.getStats() 콜백 방식 지원 쀑단 πŸ“Œ

RTCPeerConnection.getStats()λŠ” ν•΄λ‹Ή μ˜€λ””μ˜€λ‚˜ λΉ„λ””μ˜€ 연결에 λŒ€ν•œ 톡계 자료λ₯Ό λ°˜ν™˜ν•˜λŠ” APIλ‹€. ν˜„μž¬ ν¬λ‘¬μ—μ„œ 이 APIλŠ” ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” μ΅œμ‹  버전과, μ½œλ°±μ„ μ‚¬μš©ν•˜λŠ” ꡬ버전 두 κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

myPeerConnection.getStats(); // μ΅œμ‹  버전, Promise λ°˜ν™˜
myPeerConnection.getStats(null, onSuccess, onFailure); // ꡬ버전, Promise λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ

콜백 방식은 λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ μ–΄μšΈλ¦¬μ§€ μ•Šκ³ , ν‘œμ€€ μŠ€νŽ™ λ¬Έμ„œλ„ μ—†μ–΄ μž₯기적으둜 지원을 쀑단할 μ˜ˆμ •μ΄λ‹€.

Chrome 113μ—μ„œλŠ” 콜백 방식 μ‚¬μš© μ‹œ μ½˜μ†”μ— κ²½κ³ λ₯Ό λ…ΈμΆœν•˜λ©°, chrome://flagsμ—μ„œ 지원 쀑단을 μ²΄ν—˜ν•  수 μžˆλŠ” κΈ°λŠ₯을 μΆ”κ°€ν•  μ˜ˆμ •μ΄λ‹€.

이 ν•­λͺ©μ— λŒ€ν•œ μ£Όμš” λΈŒλΌμš°μ € 및 μ›Ή 개발자의 μ˜κ²¬μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Firefox: 배포 μ™„λ£Œ
  • Safari: 배포 μ™„λ£Œ
  • μ›Ή 개발자: 의견 μ—†μŒ

μ°Έμ‘°


βœ… [Chrome ???] 내뢀망에 λŒ€ν•œ ν•˜μœ„ λ¦¬μ†ŒμŠ€ μš”μ²­ μ œν•œ πŸ“Œ

내뢀망 μ ‘κ·Ό κ·œμΉ™(Local Network Access) 적용의 μΌλΆ€λ‘œ ν•˜μœ„ λ¦¬μ†ŒμŠ€(.js, .css λ“±)λ₯Ό μš”μ²­ν•  λ•Œ 내뢀망(사섀 IP, localhost)에 λŒ€ν•œ μ ‘κ·Ό μ œν•œμ„ κ²€ν†  쀑이닀. 정식 적용 일정은 뢈투λͺ…ν•˜λ‚˜, 미리 보기둜 일뢀 κΈ°λŠ₯을 μ²΄ν—˜ν•  수 μžˆλ‹€.

곡개 μ›Ή μ‚¬μ΄νŠΈμ˜ 내뢀망 ν•˜μœ„ λ¦¬μ†ŒμŠ€ μ ‘κ·Ό μ œν•œ

곡개 μ›Ή μ‚¬μ΄νŠΈ(곡개 IP둜 μ ‘κ·Ό κ°€λŠ₯ν•œ μ‚¬μ΄νŠΈ)μ—μ„œ 내뢀망에 ν•˜μœ„ λ¦¬μ†ŒμŠ€(.js, .css λ“±) μš”μ²­ μ‹œ λ°˜λ“œμ‹œ λ³΄μ•ˆ μ»¨ν…μŠ€νŠΈ(HTTPS)λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ œν•œν•œλ‹€. λ‚΄λΆ€λ§μ˜ ν•˜μœ„ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λ €λ©΄ λ³΄μ•ˆ μ»¨ν…μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

Chrome 86 μ΄μƒμ˜ chrome://flagsμ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 ν™œμ„±ν™”ν•΄ μ ‘κ·Ό μ œν•œμ„ 미리 μ²΄ν—˜ν•  수 μžˆλ‹€.

내뢀망에 ν•˜μœ„ λ¦¬μ†ŒμŠ€ μš”μ²­ μ‹œ 사전 μš”μ²­ λ°œμ†‘

내뢀망에 ν•˜μœ„ λ¦¬μ†ŒμŠ€ μš”μ²­ μ‹œ 사전 μš”μ²­μ„ 보내 μ—°κ²° ν—ˆμš© μ—¬λΆ€λ₯Ό λ¨Όμ € λ¬»λŠ”λ‹€.

Chrome 98 μ΄μƒμ˜ chrome://flagsμ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 ν™œμ„±ν™”ν•΄ 사전 μš”μ²­ λ°œμ†‘μ„ 미리 μ²΄ν—˜ν•  수 μžˆλ‹€.

μ°Έμ‘°


μ΄μ›ν‘œ2023.03.22
Back to list