הוצאה משימוש והסרות של ממשקי API ב-Chrome 54

ג'ו מדלי
ג'ו מדלי

כמעט בכל גרסה של Chrome אנחנו רואים מספר משמעותי של עדכונים ושיפורים למוצר, לביצועים שלו וליכולות של פלטפורמת האינטרנט. במאמר הזה מתוארות ההוצאה משימוש וההסרות ב-Chrome 54, שנמצא בגרסת בטא נכון ל-15 בספטמבר. הרשימה הזו עשויה להשתנות בכל עת.

השבתת ניווטים ב-handler של הסרת הנתונים שנטענו

TL;DR: כל הניווטים ממקורות שונים ייחסמו ב-handler של אירועים מסוג window.onunload כדי ש-Chrome יהיה בתוך השורה עם מפרט ה-HTML וגם עם Firefox ו-Safari.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

גרסאות קודמות של Chrome אפשרו הפרעה לניווט בין מקורות ב-window.onunload. על ידי הגדרה של window.location.href = '#fragment'. לפי מפרט ה-HTML, ברכיבי ה-handler של הסרת הנתונים שנטענו ניתן להשתמש רק בניווטים בתוך דף, ובגרסאות קודמות של Chrome נחסמו שיטות ניווט אחרות בהתאם לדרישות המפרט. החל מגרסה Chrome 54, ניווטים כאלה לא יאפשרו לנו להתאים אותנו למפרט וגם ל-Firefox ו-Safari.

HTTP/0.9 הוצא משימוש

TL;DR: HTTP/0.9 הוצא משימוש. על מפתחים לעבור לגרסה מאוחרת יותר, עם עדיפות ל-HTTP/2.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

HTTP/0.9 הוא הקוד הקודם של HTTP/1.x. חסרות תכונות רבות של היורשים. אחד מהחששות העיקריים של האינטרנט המודרני הוא היעדר כותרות תגובה. בלעדיהם, אין דרך לוודא שתגובת HTTP/0.9 היא באמת תגובת HTTP/0.9. הדבר יכול לגרום למספר בעיות. דוגמאות לבעיות מהסוג הזה:

  • לקוחות שמטפלים בתגובות שגיאה מסוימות כתגובות HTTP/0.9 חוקיות.
  • שרתים שלא סוגרים את שקע הבקשות וגורמים ללקוחות להתייחס לתגובות כ-GET תלויה שנשארת פעילה לתמיד או עד שמשתמש מנווט לדף ששלח את הבקשה.
  • שרתים שלא יכולים להודיע לדפדפן שבקשה נכשלה, מה שעלול לגרום לבעיות בהיוריסטיקה של שמירה במטמון.

הדרך היחידה למנוע תקלות ב-HTTP/0.9 היא להסיר את התמיכה לחלוטין. לכן התמיכה ב-HTTP/0.9 הוסרה ב-Chrome 54.

השימוש ב-initTouchEvent הוסר

TL;DR: initTouchEvent הוצא משימוש לטובת TouchEvent constructor כדי לשפר את התאימות למפרטים, והוא יוסר לגמרי ב-Chrome 54.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

מזה זמן רב מפתחים יכולים ליצור אירועי מגע סינתטי ב-Chrome באמצעות initTouchEvent API. האירועים האלה משמשים לעיתים קרובות כדי לדמות אירועי מגע לבדיקה או לאוטומציה של ממשקי משתמש מסוימים באתר. החל מגרסה 49 של Chrome, ה-API הזה שהוצא משימוש מציג את האזהרה הבאה .

אזהרה על אירוע מגע
TouchEvent.initTouchEvent הוצא משימוש ויוסר בגרסה M53, בסביבות ספטמבר 2016. במקום זאת, יש להשתמש ב-constructor TouchEvent. אפשר לקרוא פרטים נוספים בכתובת https://www.chromestatus.com/features/5730982598541312.

מלבד העובדה שלא מופיעה במפרט של אירועי המגע, יש כמה סיבות לכך שהשינוי הזה טוב. ההטמעה של Chrome ב-initTouchEvent לא תואמת בכלל ל-API של initTouchEvent של Safari, ושונה מ-Firefox ב-Android. לבסוף, הרבה יותר קל להשתמש ב-constructor של TouchEvent.

לכן החלטנו לפעול בהתאם למפרט ולא לתחזק ממשק API שלא הוגדר או תואם להטמעה היחידה האחרת. מפתחים שצריכים חלופה צריכים להשתמש ב-constructor של TouchEvent.

מאחר שההטמעות של ה-API initTouchEvent ב-iOS וב-Android או ב-Chrome היו שונות כל כך, בהרבה מקרים, אתרים היו מכילים קוד בהתאם (לרוב, דפדפן Firefox)

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

היא גרועה כי היא מחפשת את "Android" בסוכן המשתמש ו-Chrome ב-Android יתאים ויצאה משימוש. עדיין לא ניתן להסיר אותה, מכיוון שב-Android יהיו במשך תקופה מסוימת דפדפנים אחרים המבוססים על WebKit ודפדפנים ישנים יותר של Blink, שעדיין תצטרכו לתמוך בממשק ה-API הישן.

כדי לטפל כראוי בפונקציות TouchEvent באינטרנט, צריך לשנות את הקוד כך שיתמוך ב-Firefox, IE Edge ו-Chrome. לשם כך, צריך לבדוק אם קיים TouchEvent באובייקט window, ואם יש לו "length" חיובי (שמציין שזהו בנאי שמקבל ארגומנט) צריך להשתמש בו.

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

המאפיין KeyboardEvent.keyIdentifier הוסר

TL;DR: נכס keyboardEvent.keyIdentifier הנתמך מעט יוסר לטובת הנכס KeyboardEvent.key המבוסס על תקנים.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

המאפיין keyboardEvent.keyIdentifier היה חלק קצר ממפרט W3C ב-2009 וב-2010. עם זאת, היא הוטמעה בעבר רק ב-WebKit.

מפתחים שצריכים להחליף את המאפיין הזה יכולים להשתמש בנכס KeyboardEvent.key המבוסס על סטנדרטי או בנכס KeyboardEvent.code (כפי שמתואר במאמר שעשינו באביב שעבר). לממשק הישן יש בסיס הטמעה רחב ככל האפשר, והוא נתמך בכל הדפדפנים המובילים למחשבים, למעט Safari. הגרסה מאוחרת יותר נתמכת כרגע ב-Chrome, Firefox ו-Opera. הסרת התכונה הזו נועדה לקדם את השימוש בנכס KeyboardEvent.key. מ-Apple לא הודיעה אם היא תתמוך בתכונה הזו. עם זאת, גם הנכסים KeyboardEvent.keyCode ו-KeyboardEvent.charCode שהוצאו משימוש (אבל עדיין לא הוסרו מ-Chrome) זמינים ב-Safari.

הסרה של אירוע ומאפיין שהסתיים ב-MediaStream ומאפיין מצורף

TL;DR: האירוע והמאפיין ended וonended מטפלים באירועים אנחנו מסירים מאחר שהם הוסרו מהמפרט של תיעוד מדיה ותזרים.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

האירוע ended וה-handler של האירועים onended לא היו חלק מהמפרט של WebRTC במשך כשלוש שנים. מפתחים שרוצים לצפות באירועים צריכים להשתמש ב-MediaStreamTracks במקום ב-MediaStreams.

הוצאה משימוש של SVGElementElement.viewPort

ההטמעה לא פועלת ב-Chrome מאז 2012. המאפיין לא קיים בכלל בדפדפנים אחרים והוא הוסר מהמפרט. מהסיבות האלה, אנחנו מוציאים את הנכס משימוש. ההסרה צפויה להתבצע ב-Chrome 55.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הוצאה משימוש של SVGViewElement.viewTarget

המאפיין SVGViewElement.viewTarget אינו חלק ממפרט SVG2.0 והשימוש בו קטן או לא קיים. המאפיין הזה הוצא משימוש ב-Chrome 54. ההסרה צפויה להתבצע ב-Chrome 56.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרת SVGZoomEvent

SVGZoomEvent אינו חלק ממפרט SVG2.0 ולא פועל ב-Chromium. למרות העובדה שהיא עדיין ניתנת לזיהוי, המפתחים עלולים לבלבל את המפתחים. הוא יוסר.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium