Panzoom: λͺ¨λ°”μΌμ˜ Chrome v55.02883.91μ—μ„œ ν•€μΉ˜ 쀌이 깨짐

에 λ§Œλ“  2016λ…„ 12μ›” 12일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: timmywil/panzoom

문제의 주제

λͺ¨λ°”일 및 Android μ‹œμŠ€ν…œ WebView v55.02883.91의 Chrome v55.02883.91μ—μ„œ ν•€μΉ˜ 쀌이 깨짐
μ΄λŠ” Chrome(λΈŒλΌμš°μ €)을 μ‚¬μš©ν•˜λŠ” Android λͺ¨λ°”일 μž₯μΉ˜μ™€ Android μ‹œμŠ€ν…œ WebViewλ₯Ό μ‚¬μš©ν•˜λŠ” Cordova 앱에 μ μš©λ©λ‹ˆλ‹€.

κ·€ν•˜μ˜ ν™˜κ²½

  • jquery.panzoom.min.js 3.2.2
  • jquery-1.11.1.min.js(λ‚΄ μ½”λ₯΄λ„λ°” μ•±μš©) κ·ΈλŸ¬λ‚˜ 데λͺ¨ μ›Ή μ‚¬μ΄νŠΈλ„ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • Chrome이 κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€(μœ„ 버전 μ°Έμ‘°). μ—¬μ „νžˆ μ‚Όμ„± νœ΄λŒ€ν°μ—μ„œ "인터넷"을 λΈŒλΌμš°μ €λ‘œ μ‚¬μš©ν•˜μ—¬ μž‘λ™ν•©λ‹ˆλ‹€.

μž¬ν˜„ 단계

  1. Samsung Galaxy S6 Edge +(λ˜λŠ” 동급 μ œν’ˆ) κ΅¬μž…
  2. Chrome 및/λ˜λŠ” Android μ‹œμŠ€ν…œ WebViewλ₯Ό v55 λ“±μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œν•˜μ‹­μ‹œμ˜€.
  3. 데λͺ¨ νŽ˜μ΄μ§€μ—μ„œ λ‘œλ“œ
  4. ν˜Έλž‘μ΄λ₯Ό ν™•λŒ€ν•΄ λ³΄μ‹­μ‹œμ˜€. κ·Έλ…€λŠ” 친ꡬλ₯Ό κΉ¨λœ¨λ ΈμŠ΅λ‹ˆλ‹€!

μ˜ˆμƒλ˜λŠ” 행동

이전 λ²„μ „μ˜ Chromeμ—μ„œ(v54κΉŒμ§€ μ™„λ²½ν•˜κ²Œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. 즉, ν™•λŒ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

μ‹€μ œ 행동

v55μ—μ„œ λ°œμƒν•˜λŠ” 일은 ν™•λŒ€/μΆ•μ†Œκ°€ μ•„λ‹Œ 팬뿐이며 νŒ¨λ‹λœ μ΄λ―Έμ§€λŠ” ν•€μΉ˜ 손가락 μ‚¬μ΄μ—μ„œ λ•Œλ•Œλ‘œ '점프'ν•˜κ³  두 손가락 μ‚¬μ΄μ—μ„œ 이미지가 λ’€μ§‘νž λ•Œ κΉœλ°•μ΄λŠ” 효과λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

this.panning = true;
ν•€μΉ˜ μ€Œμ„ λ‹€μ‹œ ν—ˆμš©ν•©λ‹ˆλ‹€(νŒ¨λ‹μ— 영ν–₯을 주지 μ•ŠμŒ). μ΄ˆκΈ°ν™”λ₯Ό μ œμ™Έν•˜κ³  this.panning이 false둜 μ„€μ •λ˜λŠ” μœ„μΉ˜λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€... YMMV.

λͺ¨λ“  20 λŒ“κΈ€

이 문제λ₯Ό μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. ν•œ μˆœκ°„μ— λ‚΄ 앱이 ν™•λŒ€/μΆ•μ†Œ μž‘μ—…μ„ μ€‘μ§€ν•˜κ³  이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

λ‚΄ 앱도 κ³ μž₯λ‚¬μŠ΅λ‹ˆλ‹€. μƒˆλ‘œ μ—…λ°μ΄νŠΈλœ ν¬λ‘¬μ—μ„œ μ΄μƒν•œ λ™μž‘(λ“œλž˜κ·Έ μ΄λ²€νŠΈκ°€ 창을 μŠ€ν¬λ‘€ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이고 ν•€μΉ˜ μ΄λ²€νŠΈκ°€... 기괴함). μ—…λ°μ΄νŠΈλ˜μ§€ μ•Šμ€ 크둬이 μžˆλŠ” λ‹€λ₯Έ κΈ°κΈ°λŠ” μ •μƒμ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 어젯밀에 크둬을 μ—…λ°μ΄νŠΈν–ˆλŠ”λ° 그것도 κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό μ—΄μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 이유둜 λ‚΄ 앱이 Chrome λ°μŠ€ν¬ν†±μ—μ„œλ„ μž‘λ™μ„ 멈μΆ₯λ‹ˆλ‹€.

μ†”λ£¨μ…˜ - μΆ”κ°€
touch-action: none;
panzoom μ»¨ν…Œμ΄λ„ˆμ˜ CSS에 μΆ”κ°€ν•˜κ³  λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή ꡬ성 μš”μ†Œμ— λŒ€ν•΄ 자체 ν„°μΉ˜ 이벀트λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ κΈ°λŠ₯μž…λ‹ˆλ‹€: https://developers.google.com/web/updates/2016/10/pointer-events

μ†”λ£¨μ…˜ - μΆ”κ°€
ν„°μΉ˜ μ•‘μ…˜: μ—†μŒ;
panzoom μ»¨ν…Œμ΄λ„ˆμ˜ CSS에 μΆ”κ°€ν•˜κ³  λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή ꡬ성 μš”μ†Œμ— λŒ€ν•΄ 자체 ν„°μΉ˜ 이벀트λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ κΈ°λŠ₯μž…λ‹ˆλ‹€: https://developers.google.com/web/updates/2016/10/pointer-events

μž‘λ™ μ•ˆν•¨.

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

this.panning = true;
ν•€μΉ˜ μ€Œμ„ λ‹€μ‹œ ν—ˆμš©ν•©λ‹ˆλ‹€(νŒ¨λ‹μ— 영ν–₯을 주지 μ•ŠμŒ). μ΄ˆκΈ°ν™”λ₯Ό μ œμ™Έν•˜κ³  this.panning이 false둜 μ„€μ •λ˜λŠ” μœ„μΉ˜λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€... YMMV.

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
this.panning = 사싀;
ν•€μΉ˜ μ€Œμ„ λ‹€μ‹œ ν—ˆμš©ν•©λ‹ˆλ‹€(νŒ¨λ‹μ— 영ν–₯을 주지 μ•ŠμŒ). μ΄ˆκΈ°ν™”λ₯Ό μ œμ™Έν•˜κ³  this.panning이 false둜 μ„€μ •λ˜λŠ” μœ„μΉ˜λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€... YMMV.

κ°μ‚¬ν•©λ‹ˆλ‹€.

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
this.panning = 사싀;

헐 κ±°κΈ°.....

이 'ν•΄ν‚Ή'이 νŠΈλ¦­μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€! 이제 Android 55μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.

iOS 10.2, Android 53μ—μ„œ λ‹€μ‹œ ν…ŒμŠ€νŠΈ - μ—¬μ „νžˆ 이전과 같이 μž‘λ™ν•©λ‹ˆλ‹€!

vrtual κ°μ‚¬ν•©λ‹ˆλ‹€!

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
this.panning = 사싀;
ν•€μΉ˜ μ€Œμ„ λ‹€μ‹œ ν—ˆμš©ν•©λ‹ˆλ‹€(νŒ¨λ‹μ— 영ν–₯을 주지 μ•ŠμŒ). this.panning이 μ΄ˆκΈ°ν™”λ₯Ό μ œμ™Έν•˜κ³ λŠ” >false둜 μ„€μ •λ˜λŠ” μœ„μΉ˜λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€... YMMV.

λ‚˜λ₯Ό μœ„ν•΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€ ... κ°μ‚¬ν•©λ‹ˆλ‹€.
λ‚˜λ§Œμ˜ ν™•λŒ€/μΆ•μ†Œ κΈ°λŠ₯을 ν•˜κ³  μžˆμ§€λ§Œ μ§€κΈˆμ€ μ €μž₯이 λ©λ‹ˆλ‹€... κ°μ‚¬ν•©λ‹ˆλ‹€.

Android google webview 2016 12μ›” 14일 μ—…λ°μ΄νŠΈμ—μ„œ ν…ŒμŠ€νŠΈ...

μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ ν•΄ν‚Ήν•˜κ³  1164행을 주석 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
this.panning = 사싀;

이것은 λΆ€λΆ„μ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 감사 ν•΄μš”!

ν•΄λ‹Ή 쀄을 주석 μ²˜λ¦¬ν•˜λŠ” 데 λΆ€λΆ„μ μœΌλ‘œ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€. 이제 μƒν˜Έ μž‘μš© μœ„μΉ˜ λŒ€μ‹  μ™Όμͺ½ μƒλ‹¨μ—μ„œ ν™•λŒ€/μΆ•μ†Œλ˜μ§€λ§Œ 큰 κ°œμ„  μ‚¬ν•­μž…λ‹ˆλ‹€.

μ΅œμ‹  크둬이 μ΄λ²€νŠΈμ—μ„œ pageX 및 pageY μ°Έμ‘°κ°€ μžˆλŠ” μœ„μΉ˜λ₯Ό λ³€κ²½ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.
크둬이 변경될 λ•ŒκΉŒμ§€ λͺ¨λ“  λΈŒλΌμš°μ €μ—λŠ” event.pageXκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€....
이제 event.originalEvent.pageX에 μžˆμŠ΅λ‹ˆλ‹€...

Panzoom μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λŠ” μ€‘μž…λ‹ˆλ‹€. 마우슀 이벀트λ₯Ό μ‚¬μš©ν•˜μ—¬ ν¬λ‘¬μ—μ„œ μž‘λ™ν•˜κ²Œ ν•˜λ €λ©΄ λ‹€μŒ 행을 λ³€κ²½ν•˜μ‹­μ‹œμ˜€.
라인 1191:1192
λ³€κ²½:
startPageX = event.pageX; startPageY = event.pageY;
μ—κ²Œ:
if (typeof event.pageX === 'undefined'){ startPageX = event.originalEvent.pageX; startPageY = event.originalEvent.pageY; }else{ startPageX = event.pageX; startPageY = event.pageY; }
1232ν–‰μ—μ„œ λ‹€μŒμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
if (typeof coords.pageX === 'undefined'){ coords['pageX'] = coords.originalEvent.pageX; coords['pageY'] = coords.originalEvent.pageY; }

ν„°μΉ˜ μ΄λ²€νŠΈλŠ” λ‚΄κ°€ μ§„ν–‰ν•˜λ©΄μ„œ 더 많이 올 κ²ƒμž…λ‹ˆλ‹€.

"this.panning = true;" 주석 처리 μˆ˜μ •ν•˜μ§€λ§Œ 더 이상 κ·Έλ ‡κ²Œ λ§€λ„λŸ½μ§€ μ•ŠμœΌλ©° κ΅¬ν˜• μž₯μΉ˜μ—μ„œλŠ” ν™•λŒ€/μΆ•μ†Œκ°€ μƒλ‹Ήνžˆ μ§€μ—°λ©λ‹ˆλ‹€. λ‚˜λŠ” 그것을 주석 μ²˜λ¦¬ν•˜λŠ” 것이 훨씬 더 λ§Žμ€ CPU μ „λ ₯을 μ‚¬μš©ν•˜λ―€λ‘œ 였래된 μž₯μΉ˜κ°€ λ”°λΌκ°ˆ 수 μ—†λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

μƒˆ 버전(3.2.2)으둜 μ—…λ°μ΄νŠΈν•˜κ³  주어진 쀄을 주석 μ²˜λ¦¬ν•΄ λ³΄μ…¨μŠ΅λ‹ˆκΉŒ?

v3.2.2 및 Chrome 56μ—μ„œ 이 버그가 μ—¬μ „νžˆ μ‘΄μž¬ν•˜κ³  μˆ˜μ • 사항이 μž‘λ™ν•¨μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

100% ν™•μ‹ ν•  μˆ˜λŠ” μ—†μ§€λ§Œ λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
κ·Έ λ³€μˆ˜( this.panning )λŠ” _startMove ν•¨μˆ˜μ˜ λ‘˜ μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. endEvent 이벀트(1249ν–‰)μ—μ„œ false 둜 μž¬μ„€μ •λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ 이것이 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€(이유λ₯Ό μ•Œμ•„λ‚Ό 만큼 μΆ©λΆ„νžˆ 깊이 νƒκ΅¬ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€). 이것이 ThorConzalesκ°€ μˆ˜μ • μ‚¬ν•­μœΌλ‘œ 인해 μ„±λŠ₯이 μ €ν•˜λ¨μ„ λ°œκ²¬ν•œ 이유일 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€μ²΄ μˆ˜μ •: _startMove ν•¨μˆ˜ 끝에 this.panning = false; λ₯Ό μΆ”κ°€ν•˜λ©΄(1255ν–‰ 이후) 이 λ¬Έμ œλ„ ν•΄κ²°λ©λ‹ˆλ‹€. 이전 μž₯μΉ˜μ—μ„œ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ 이것이 μ„±λŠ₯ 손싀에 λ„μ›€μ΄λ˜λŠ”μ§€ 확인할 μˆ˜λŠ” μ—†μ§€λ§Œ λ‹€λ₯Έ μ‚¬λžŒμ΄ ν•  수 μžˆλ‹€λ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€ @JamesCatt λŠ” λ‹Ήμ‹ μ˜ λŒ€μ•ˆμ„ μ‹œλ„ν•  κ²ƒμž…λ‹ˆλ‹€.

@ν‹°λ―ΈμœŒ !?

@JamesCatt λŒ€μ²΄ μˆ˜μ •μ΄ μž‘λ™ν•˜μ§€ μ•Šμ•˜κ³  ν™•λŒ€/μΆ•μ†Œκ°€ λ‹€μ‹œ μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€(직접 ν…ŒμŠ€νŠΈν•  μž₯μΉ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— μ‚¬μš©μžκ°€ 보고함).

주석 ν–‰ 1164(this.panning = true)κ°€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 1143ν–‰μ—μ„œ moveEvent = 'pointermove' tomoveEvent = 'touchmove'둜 λ³€κ²½ν•˜λŠ” μ†μž„μˆ˜λ₯Ό μΌμŠ΅λ‹ˆλ‹€. 그러면 μž‘λ™ν•˜μ§€λ§Œ λ‹€λ₯Έ 문제λ₯Ό μΌμœΌν‚¬μ§€ ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 해킹을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

μ΄ˆκΈ°ν™” μ‹œ options.which λ₯Ό -1 둜 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

$("a.panzoom-elements").panzoom({
  which: -1,
});

__κ²½κ³ __
이 해킹은 ν„°μΉ˜ μž₯μΉ˜μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ 이것은 λ§ˆμš°μŠ€μ—μ„œ μž‘λ™ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

@JamesCatt 의 λŒ€μ•ˆμ΄ μ €μ—κ²Œ νš¨κ³Όκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. @hshiozawa 의 해킹은 적어도 Pixelμ—μ„œλŠ” Android 7.1.2λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰