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

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

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

ב-Chrome 50 (תאריך הבטא המשוער: 10 עד 17 במרץ) יש מספר שינויים ב-Chrome. הרשימה הזו עשויה להשתנות בכל עת.

מטמון האפליקציה הוצא משימוש בהקשרים לא מאובטחים

TL;DR: כדי לעכב סקריפטים חוצי-אתרים, אנחנו מוציאים משימוש את מטמון האפליקציה במקורות לא מאובטחים. אנחנו צופים שב-Chrome בגרסה 52 היא תפעל רק במקורות שמציגים תוכן ב-HTTPS.

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

מטמון האפליקציה הוא תכונה שמאפשרת גישה אופליין ועקבית למקור, שמהווה הסלמת הרשאות (privilege escalation) במקרה של מתקפת סקריפטים חוצת-אתרים. כחלק ממאמץ גדול יותר להסיר תכונות מתקדמות במקורות לא מאובטחים.

Chrome מסיר את וקטור ההתקפה באמצעות אישורו רק ב-HTTPS. אנחנו מוציאים משימוש את התמיכה ב-HTTP ב-Chrome 50, ואנחנו מצפים שנסיר אותה לחלוטין ב-Chrome 52.

Document.defaultCharset הוסר

אמ;לק: document.defaultCharset הוסר כדי לשפר את התאימות למפרט.

Intent to Remove | Chromestatus tracker | בעיית CRBug

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

במקום זאת, השתמשו ב-document.characterSet כדי לקבל את הערך הראשון שצוין בכותרת ה-HTTP. אם הוא לא קיים, הערך יופיע במאפיין charset של הרכיב <meta> (לדוגמה, <meta charset="utf-8">). אם אף אחת מהאפשרויות האלה לא זמינה, document.characterSet תהיה הגדרת המערכת של המשתמש.

בבעיה הזו ב-GitHub אפשר לקרוא דיון נוסף לגבי הסיבה שלא לעסוק בהמלצה הזו באופן מפורש.

TL;DR: הסרה של תמיכה בערך subresource עבור המאפיין rel של HTMLLinkElement.

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

הכוונה של המאפיין subresource ב-<link> הייתה לשלוף מראש משאב במהלך הזמן שבו הדפדפן לא פעיל. לאחר שדפדפן הוריד דף, הוא יכול היה להוריד מראש משאבים כמו דפים אחרים, כך שכאשר המשתמשים ביקשו אותם, הם יוכלו פשוט לאחזר אותם ממטמון הדפדפן.

לגבי המאפיין subresource היו כמה בעיות. דבר ראשון, זה אף פעם לא עבד כמצופה. הסתיימה ההורדה של המשאבים המקושרים עם עדיפות נמוכה. המאפיין מעולם לא הוטמע באף דפדפן מלבד Chrome. בהטמעה של Chrome היה באג שגרם להורדה כפולה של משאבים.

למפתחים שרוצים לשפר את חוויית המשתמש באמצעות טעינה מראש של תוכן יש כמה אפשרויות, שההתאמה האישית שלהן היא ביותר לבנות קובץ שירות (service worker) כדי לנצל את היתרונות של טעינה מראש ושל ה-API של המטמון. פתרונות נוספים כוללים ערכים אחרים למאפיין rel כולל preconnect, prefetch, preload, prerender. חלק מהאפשרויות האלה הן ניסיוניות, וייתכן שלא תהיה תמיכה בהן באופן נרחב.

הסרת החלופה של גרסת TLS לא מאובטחת

TL;DR: הסרת מנגנון לאילוץ שרתים להחזיר נתונים באמצעות גרסאות TLS (אבטחת שכבת התעבורה) או פחות מאובטחות.

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

ב-Transport Layer Security (TLS) יש תמיכה במנגנון לניהול משא ומתן על גרסאות, כדי שאפשר יהיה להוסיף גרסאות TLS חדשות בלי לפגוע בתאימות. חלק מהשרתים הטמיעו את התכונה הזו כך שדפדפנים נדרשו להשתמש בנקודות קצה (endpoint) לא מאובטחות כחלופה. לכן תוקפים יכולים לאלץ כל אתר, ולא רק אתרים שהוגדרו באופן שגוי, לנהל משא ומתן לגבי גרסאות חלשות יותר של TLS.

האתרים המושפעים לא יוכלו להתחבר אל ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION. האדמינים צריכים לוודא שתוכנת השרת שלהם מעודכנת. אם הבעיה עדיין לא נפתרה, יש לפנות לספק של תוכנת השרת כדי לבדוק אם יש תיקון.

הסרה של מקלדתEvent.prototype.keyLocation

TL;DR: הסרה של כינוי לא נחוץ למאפיין Keyboard.prototype.location.

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

המאפיין הזה הוא פשוט כינוי למאפיין Keyboard.prototype.location, שמאפשר להבחין בין מקשים שנמצאים בכמה מקומות במקלדת. לדוגמה, שני המאפיינים מאפשרים למפתחים להבחין בין שני המקשים Enter במקלדת מורחבת.

רכיבי handler של שגיאות והצלחה שנדרשים בשיטות RTCPeerConnection

TL;DR: ל-WebRTC שיטות RTCPeerConnection createOffer() ו-createAnswer() נדרשים עכשיו handler של שגיאות וגם handler של הצלחה. בעבר אפשר היה להפעיל את השיטות האלה רק עם handler שהצליח. השימוש הזה הוצא משימוש.

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

ב-Chrome 49 הוספנו אזהרה אם תתבצע קריאה ל-setLocalDescription() או ל-setRemoteDescription() בלי לספק מטפל שגיאות. הארגומנט של מטפל השגיאות הוא חובה החל מגרסה 50 של Chrome.

התהליך הזה הוא חלק מפינוי הדרך להוספת הבטחות לשיטות האלה, כפי שנדרש במפרט של WebRTC.

כך תוכלו לראות דוגמה להדגמה של RTCPeerConnection ב-WebRTC (main.js, שורה 126):

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

שימו לב של-setLocalDescription() וגם ל-setRemoteDescription() יש מטפל שגיאות. דפדפנים ישנים יותר המצפים רק handler של הצלחה, פשוט יתעלמו מהארגומנט של מטפל השגיאות אם הוא קיים. הפעלת הקוד הזה בדפדפן ישן לא תגרום לחריגה.

באופן כללי, לאפליקציות WebRTC לייצור, מומלץ להשתמש ב-adapter.js, shim שמתוחזק על ידי הפרויקט של WebRTC, כדי לבודד אפליקציות מפני שינויים במפרטים והפרשי תחילית.

אין יותר תמיכה ב-XMLHttpRequestProgressEvent

TL;DR: ממשק XMLHttpRequestProgressEvent יוסר, יחד עם המאפיינים position ו-totalSize.

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

האירוע הזה קיים כדי לתמוך בנכסי התאימות position ו-totalSize של Gecko. התמיכה בכל השלושה הופסקה ב-Mozilla 22, והפונקציונליות הוחלפה על ידי ProgressEvent.

     var progressBar = document.getElementById("p"),
          client = new XMLHttpRequest()
      client.open("GET", "magical-unicorns")
      client.onprogress = function(pe) {
        if(pe.lengthComputable) {
          progressBar.max = pe.total
          progressBar.value = pe.loaded
        }
      }

הסרה של תוספי מדיה מוצפנים עם קידומת

TL;DR: תוספי מדיה מוצפנים עם קידומת הוסרו לטובת החלפה מבוססת-מפרט ללא קידומת.

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

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

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

הסרת התמיכה במאפייני SVGElement.offset

TL;DR: נכסים של SVGElement הושמטו לטובת נכסים עם תמיכה רחבה יותר ב-HTMLElement.

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

נכסי Offset נתמכים כבר זמן רב על ידי HTMLElement וגם SVGElement, אבל ב-Gecko וב-Edge יש תמיכה בהם רק ב-HTMLElement. כדי לשפר את העקביות בין דפדפנים, המאפיינים האלה הוצאו משימוש ב-Chrome 48 ועכשיו הם מוסרים.

נכסים מקבילים הם חלק מ-HTMLElement, אבל מפתחים שמחפשים חלופה יכולים גם להשתמש ב-getBoundingClientRect()