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

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

השבתת ניווטים ב-unload handler

תמצית: כל הניווטים בין מקורות שונים ייחסמו ב-handlers של אירועים מסוג window.onunload כדי ש-Chrome יתאים למפרט HTML, וגם ל-Firefox ול-Safari.

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

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

הפרוטוקול HTTP/0.9 יצא משימוש

בקיצור: פרוטוקול 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 הוסר

תקציר: initTouchEvent הוצא משימוש והוחלף ב-TouchEvent constructor כדי לשפר את התאימות למפרט, והוא יוסר לחלוטין ב-Chrome 54.

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

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

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

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

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

מכיוון שההטמעות של initTouchEvent API ב-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 יתאים ויגיע להוצאה משימוש הזו. אי אפשר להסיר אותו עדיין כי יהיו עוד דפדפנים מבוססי WebKit ו-Blink ישנים יותר ב-Android למשך זמן מה, ותצטרכו עדיין לתמוך בממשק ה-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 הוסר

בקצרה: אנחנו מסירים את המאפיין keyboardEvent.keyIdentifier, שיש לו תמיכה מועטה, ומעדיפים במקומו את המאפיין KeyboardEvent.key שמבוסס על תקנים.

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

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

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

הסרה של אירוע ומאפיין MediaStream ended ושל מאפיין onended

בקצרה: האירוע והמאפיין ended ומטפל האירועים onended מוסרים כי הם הוסרו מהמפרט של Media Capture and Streams.

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

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

הוצאה משימוש של SVGSVGElement.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