שינויים בהתנהגות BFcache עם יציאות של הודעות בתוסף

'מטמון לדף הקודם/הבא' (או BFCache) הוא אופטימיזציה של דפדפן שמאפשרת ניווט מיידי אחורה וקדימה. אנחנו מבצעים שינויים במטמון לדף הקודם/הבא של Chrome, שעשויים להשפיע על תוספים שמשתמשים ביציאות של הודעות. אם יש לכם תוסף ל-Chrome המשתמש בהעברת הודעות כדי לתקשר בין סקריפטים של תוכן לבין התוסף, המשיכו לקרוא כדי ללמוד איך לבדוק את התוסף ולהתאים אותו.

יציאת הודעה בתוסף

תוספים מתקשרים עם סקריפט התוכן או עם תוספים אחרים באמצעות העברת הודעות. ניתן לשלוח הודעות באמצעות בקשות חד-פעמיות על ידי חיוג למספר runtime.sendMessage() ול-tabs.sendMessage(), או באמצעות יציאת הודעות לשימוש חוזר. כל עוד היציאה פעילה, גם סקריפט התוכן וגם סקריפט הרקע של התוסף יכולים לעשות שימוש חוזר ביציאה כדי לפרסם הודעות זה לזה.

מידע נוסף זמין במאמר העברת הודעה.

מטמון לדף הקודם/הבא

כשיוצאים מדף שעומד בדרישות לשימוש במטמון BFcache, הדפדפן מאפשר לדף שכל המצבים שלו נשארים בזיכרון, אבל במצב לא פעיל באופן מלא. אם המשתמש מבצע ניווט דרך ההיסטוריה (הקודם או קדימה) לדף ששמור במטמון, הדפדפן ינסה לשחזר את הדף ממטמון BFCache. כך הניווט מהיר יותר וחוויית הגלישה של המשתמש תשתפר.

כשהדף נמצא במטמון BFCache, הוא במצב קפוא ולכן לא ניתן להפעיל JavaScript. המשמעות היא שהוא לא יכול לעבד את ההודעות שהוא מקבל.

למידע נוסף, אפשר לעיין במאמר בנושא מטמון לדף הקודם/הבא.

ההשפעה של יציאות של הודעות בתוסף על BFcache

בקצרה, שליחת הודעות של תוסף לדף שב-BFCache עלולה לגרום לניקוי המטמון ולהשפיע על הביצועים.

כשדף עם יציאת הודעה פתוחה בתוסף מאוחסן ב-BFcache, היציאה נשארת פתוחה. לאחר שחזור הדף מ-BFCache, ה-Service Workers של שירותי התוסף עדיין יוכלו להשתמש בהפניה הישנה של יציאת ההודעות כדי לפרסם הודעות בסקריפט התוכן.

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

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

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

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

התנהגות חדשה: סגירת ערוץ ההודעות כשהדף מאוחסן ב-BFCache

החל מגרסה 123 של Chrome, כשדף עם יציאת הודעה פתוחה בתוסף מאוחסן ב-BFCache, ערוץ ההודעות שבבסיס ההודעה נסגר באופן יזום מהצד של סקריפט התוכן. כתוצאה מכך, כל יציאות ההודעות ייסגרו והתוסף יקבל אירוע onDisconnect.

מאחר שהערוץ סגור, לא יישלחו הודעות לדף בזמן שהוא נמצא במטמון BFCache. לכן, הדף לא יוסר בגלל התוסף.

גם אחרי שהדף ישוחזר מ-BFcache, ערוץ ההודעות הסגורות לא ייפתח מחדש. השיטה המומלצת עבור מחברי תוספים היא להאזין לאירועים במחזור החיים של הדף ולהגדיר חיבור חדש כשהדף ישוחזר ממטמון BFcache, כפי שמוצג בדוגמה הבאה.

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

מידע נוסף על השיחה של WECG מנציגי דפדפנים שונים (סעיף 474).

האם זה ישפיע עליי?

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

  1. חשוב לוודא שגרסת Chrome היא 123 לפחות. מומלץ להשתמש ב-Chrome Canary, שכולל אזהרה נוספת כדי להקל על הבדיקה.
  2. מפעילים את Chrome עם הדגל הבא:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. עוברים לדף שאפשר לשמור במטמון BFCache בלי התוסף פועל (לדוגמה, אתר פשוט כמו https://example.com/). פועלים לפי המדריך של BFcache כדי לוודא שהקובץ ישוחזר ממטמון BFCache.

  4. מתקינים, מפעילים את התוסף ובודקים שוב אם הוא עומד בדרישות של BFCache. אפשר לנווט באופן ידני למקום אחר, להמתין פרק זמן מסוים שיהיה ארוך מספיק כדי שהתוסף יפרסם הודעה בדף BFCached, ולנווט חזרה.

  5. אם היה צורך לטעון את הדף מחדש במקום מ-BFCache עקב ניקוי, והבעיה שמונעת את השחזור היא "ExtensionSentMessageToCachedFrame", ייתכן שהתוסף יושפע מהשינוי הזה.

    ב-Chrome Canary 124.0.6315.0 ואילך תופיע גם האזהרה הבאה בדף:

    אזהרה מוצגת כאשר דף לא שוחזר מ-BFCache.
    מוצגת אזהרה כאשר דף לא שוחזר ממטמון BFcache.

אחרי שמוודאים שהתוסף מפרסם הודעות בדף BFCache, אפשר לבצע את השלבים הבאים כדי לאלץ את הפעלת הניסוי ולבדוק אם יש שיבושים בלוגיקה.

  1. מפעילים את Chrome עם הדגל הבא:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. עוברים לדף שלא שוחזר מ-BFCache בגלל השגיאה ExtensionSentMessageToCachedFrame.

  3. ניווט החוצה וחזרה. הדף ישוחזר עכשיו, אבל ערוץ ההודעות בין סקריפט התוכן לבין ה-Service Worker צריך להיות מנותק.

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

ציר הזמן להשקה

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

תאריך אבן דרך מתוכננת
15 בפברואר מתחילים את הניסוי להתנהגות החדשה ב-Chrome Canary וב-Dev channel ב-Chrome.
1 במרץ מתחילים את הניסוי להתנהגות החדשה ב-Chrome בטא.
18 במרץ פרסום ההתנהגות החדשה ל-4 אחוזים מהמשתמשים בגרסה היציבה של Chrome.
25 במרץ פרסום ההתנהגות החדשה ל-50 אחוזים מהמשתמשים בגרסה היציבה של Chrome.
2 באפריל הניסוי מסתיים, וההתנהגות החדשה מוגדרת כברירת מחדל.