גרסת המניפסט 1 הוצאה משימוש ב-Chrome 18, והתמיכה בה תופסק בהדרגה בהתאם ללוח הזמנים של התמיכה בגרסת המניפסט 1. השינויים מגרסה 1 לגרסה 2 נכללים בשתי קטגוריות רחבות: שינויים ב-API ושינויים באבטחה.
במסמך הזה מפורטות רשימות משימות להעברת התוספים ל-Chrome מגרסה 1 של המניפסט לגרסה 2, ולאחר מכן סיכומים מפורטים יותר של המשמעות של השינויים האלה והסיבה שבגללה הם בוצעו.
רשימת משימות לשינויים ב-API
האם אתם משתמשים בנכס
browser_actions
או ב-APIchrome.browserActions
?מחליפים את
browser_actions
בנכסbrowser_action
היחיד.מחליפים את
chrome.browserActions
ב-chrome.browserAction
.מחליפים את המאפיין
icons
ב-default_icon
.מחליפים את המאפיין
name
ב-default_title
.מחליפים את המאפיין
popup
ב-default_popup
(ועכשיו הוא חייב להיות מחרוזת).האם אתם משתמשים בנכס
page_actions
או ב-APIchrome.pageActions
?מחליפים את
page_actions
ב-page_action
.מחליפים את
chrome.pageActions
ב-chrome.pageAction
.מחליפים את המאפיין
icons
ב-default_icon
.מחליפים את המאפיין
name
ב-default_title
.מחליפים את המאפיין
popup
ב-default_popup
(ועכשיו הוא חייב להיות מחרוזת).האם אתם משתמשים במאפיין
chrome.self
?מחליפים ב-
chrome.extension
.האם הנכס
Port.tab
נמצא בשימוש?מחליפים ב-
Port.sender
.האם אתם משתמשים בממשקי ה-API של
chrome.extension.getTabContentses()
או שלchrome.extension.getExtensionTabs()
?מחליפים ב-
chrome.extension.getViews( { "type" : "tab" } )
.האם התוסף שלך משתמש בדף רקע?
מחליפים את הנכס
background_page
בנכסbackground
.מוסיפים נכס
scripts
אוpage
שמכיל את הקוד של הדף.מוסיפים נכס
persistent
ומגדירים אותו כ-false
כדי להפוך את דף הרקע לדף אירוע
רשימת משימות לשינויים באבטחה
האם אתם משתמשים בקטעי סקריפט מוטמעים בדפי HTML?
מסירים את קוד ה-JS שנמצא בתגי
<script>
ומציבים אותו בקובץ JS חיצוני.האם משתמשים בקוד של גורמים שמטפלים באירועים (כמו onclick וכו')?
מסירים אותם מקובץ ה-HTML, מעבירים אותם לקובץ JS חיצוני ומשתמשים ב-
addEventListener()
במקום זאת.האם התוסף מזין סקריפטים של תוכן לדפי אינטרנט שצריכים לגשת למשאבים (כמו תמונות וסקריפטים) שנכללים בחבילת התוסף?
מגדירים את המאפיין web_accessible_resources ומפרטים את המשאבים (ואם רוצים, גם מדיניות אבטחת תוכן נפרדת למשאבים האלה).
האם התוסף מטמיע דפי אינטרנט חיצוניים?
מגדירים את המאפיין sandbox.
האם הקוד או הספרייה שלכם משתמשים ב-
eval()
, ב-Function()
חדש, ב-innerHTML
, ב-setTimeout()
או מעבירים מחרוזות אחרות של קוד JS שמתבצעת להן הערכה דינמית?משתמשים ב-
JSON.parse()
אם מנתחים קוד JSON לאובייקט.משתמשים בספרייה שתואמת ל-CSP, למשל AngularJS.
יוצרים רשומה של ארגז חול במניפסט ומריצים את הקוד המושפע בארגז החול, באמצעות
postMessage()
כדי לתקשר עם הדף בארגז החול.האם אתם טוענים קוד חיצוני, כמו jQuery או Google Analytics?
מומלץ להוריד את הספרייה ולארוז אותה בתוסף, ואז לטעון אותה מהחבילה המקומית.
מוסיפים את דומיין ה-HTTPS שמציג את המשאב לרשימת ההיתרים בקטע 'content_security_policy' במניפסט.
סיכום השינויים ב-API
בגרסה 2 של המניפסט יש כמה שינויים בממשקי ה-API של פעולות הדפדפן ושל פעולות הדף, וחלק מממשקי ה-API הישנים הוחלפו בממשקים חדשים.
שינויים בפעולות בדפדפן
בממשק API של פעולות בדפדפן יש כמה שינויים בשמות:
- המאפיינים
browser_actions
ו-chrome.browserActions
הוחלפו בגרסת היחיד שלהם,browser_action
ו-chrome.browserAction
. בנכס הישן
browser_actions
היו נכסים מסוגicons
,name
ו-popup
. הם הוחלפו באפשרויות הבאות:default_icon
לסמל התג של פעולת הדפדפןdefault_name
לטקסט שמופיע בתיאור כשמעבירים את העכבר מעל התגdefault_popup
לדף ה-HTML שמייצג את ממשק המשתמש של הפעולה בדפדפן (ועכשיו זה חייב להיות מחרוזת, ולא אובייקט)
שינויים בפעולות בדף
בדומה לשינויים בפעולות הדפדפן, גם ממשק ה-API של פעולות הדף השתנה:
- המאפיינים
page_actions
ו-chrome.pageActions
הוחלפו בגרסת היחיד שלהם,page_action
ו-chrome.pageAction
. בנכס הישן
page_actions
היו נכסים מסוגicons
,name
ו-popup
. הם הוחלפו באפשרויות הבאות:default_icon
לסמל התג של פעולת הדףdefault_name
לטקסט שמופיע בתיאור כשמעבירים את העכבר מעל התגdefault_popup
לדף ה-HTML שמייצג את ממשק המשתמש של פעולת הדף (ועכשיו זה חייב להיות מחרוזת, ולא אובייקט)
ממשקי API שהוסרו ושונו
הסרנו כמה ממשקי API של תוספים והחלפנו אותם ברכיבים מקבילים חדשים:
- המאפיין
background_page
הוחלף במאפיין background. - המאפיין
chrome.self
הוסר. צריך להשתמש ב-chrome.extension
. - המאפיין
Port.tab
הוחלף ב-Port.sender
. - ממשקי ה-API של
chrome.extension.getTabContentses()
ושלchrome.extension.getExtensionTabs()
הוחלפו ב-chrome.extension.getViews( { "type" : "tab" } )
.
סיכום השינויים באבטחה
יש כמה שינויים שקשורים לאבטחה שמלווים את המעבר מגרסה 1 של המניפסט לגרסה 2. רבים מהשינויים האלה נובעים מהטמעת מדיניות אבטחת התוכן ב-Chrome. מומלץ לקרוא מידע נוסף על המדיניות הזו כדי להבין את ההשלכות שלה.
אסור להשתמש בסקריפטים ובגורמים שמטפלים באירועים שמוטמעים בקוד
בגלל השימוש במדיניות אבטחת התוכן, אי אפשר יותר להשתמש בתגי <script>
שמוטמעים בתוך תוכן ה-HTML. צריך להעביר אותם לקובצי JS חיצוניים. בנוסף, אין תמיכה גם בטיפול באירועים בתוך שורות קוד. לדוגמה, נניח שהקוד הבא נמצא בתוסף שלכם:
<html>
<head>
<script>
function myFunc() { ... }
</script>
</head>
</html>
הקוד הזה יגרום לשגיאה בזמן הריצה. כדי לפתור את הבעיה, צריך להעביר את תוכן התג <script>
לקבצים חיצוניים ולהפנות אליהם באמצעות מאפיין src='path_to_file.js'
.
באופן דומה, פונקציות טיפול באירועים בקוד, שהן תופעה נפוצה ותכונת נוחות שמשמשת מפתחי אינטרנט רבים, לא יפעלו. לדוגמה, כדאי לשקול מקרים נפוצים כמו:
<body onload="initialize()">
<button onclick="handleClick()" id="button1">
הם לא יפעלו בתוספי Manifest V2. מסירים את הגורמים שמטפלים באירועים בקוד, מניחים אותם בקובץ ה-JS החיצוני ומשתמשים ב-addEventListener()
כדי לרשום להם גורמים שמטפלים באירועים. לדוגמה, בקוד ה-JS, משתמשים בקוד הבא:
window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);
זוהי דרך נקייה יותר להפריד בין התנהגות התוסף לבין הרכיבים של ממשק המשתמש שלו.
הטמעת תוכן
יש תרחישים מסוימים שבהם התוסף עשוי להטמיע תוכן שאפשר להשתמש בו באופן חיצוני או תוכן שמגיע ממקור חיצוני.
תוכן התוסף בדפי אינטרנט: אם התוסף שלכם מטמיע משאבים (כמו תמונות, סקריפט, סגנונות CSS וכו') שמשמשים בסקריפטים של תוכן שמוזנים לדפי אינטרנט, עליכם להשתמש במאפיין web_accessible_resources כדי להוסיף את המשאבים האלה לרשימת ההיתרים, כדי שדפי אינטרנט חיצוניים יוכלו להשתמש בהם:
{
...
"web_accessible_resources": [
"images/image1.png",
"script/myscript.js"
],
...
}
הטמעת תוכן חיצוני: מדיניות האבטחה של התוכן מאפשרת לטעון רק סקריפטים ואובייקטים מקומיים מהחבילה, וכך למנוע מתוקפים חיצוניים להוסיף קוד לא ידוע לתוסף. עם זאת, יש מקרים שבהם רוצים לטעון משאבים שמוצגים באופן חיצוני, כמו jQuery או קוד של Google Analytics. ניתן לעשות זאת בשתי דרכים:
- מורידים את הספרייה הרלוונטית באופן מקומי (כמו jQuery) ומארזים אותה עם התוסף.
אפשר להקל על ההגבלות של CSP באופן מוגבל על ידי הוספת מקורות HTTPS לרשימת ההיתרים בקטע 'content_security_policy' במניפסט. כדי לכלול ספרייה כמו Google Analytics, צריך לפעול לפי השלבים הבאים:
{ ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
שימוש בהערכה דינמית של סקריפטים
אחד מהשינויים הגדולים ביותר בסכמה החדשה של Manifest v2 הוא שתוספים לא יכולים יותר להשתמש בשיטות של הערכת סקריפטים דינמיים כמו eval()
או Function()
החדש, או להעביר מחרוזות של קוד JS לפונקציות שיגרמו לשימוש ב-eval()
, כמו setTimeout()
. בנוסף, ידוע שספריות JavaScript מסוימות שנמצאות בשימוש נפוץ, כמו מפות Google וספריות מסוימות של תבניות, משתמשות בחלק מהטכניקות האלה.
Chrome מספק ארגז חול לדפים שפועלים במקור שלהם, בלי גישה ל-Chrome.*
ממשקי API. כדי להשתמש ב-eval()
ובתכונות דומות במסגרת מדיניות האבטחה החדשה של התוכן:
- יוצרים רשומה בסביבת חול בקובץ המניפסט.
- ברשומה של ארגז החול, מציינים את הדפים שרוצים להריץ בארגז החול.
- משתמשים בהעברת הודעות דרך
postMessage()
כדי לתקשר עם הדף ב-sandbox.
מידע נוסף על כך זמין במסמכי התיעוד של Sandboxing Eval.
קריאה נוספת
השינויים בגרסה 2 של המניפסט נועדו לעזור למפתחים ליצור תוספים ואפליקציות מאובטחים יותר עם ארכיטקטורה חזקה יותר. כדי לראות רשימה מלאה של השינויים מגרסה 1 של המניפסט לגרסה 2, אפשר לעיין במסמכי העזרה בנושא קובץ מניפסט. למידע נוסף על שימוש בארגז חול כדי לבודד קוד לא בטוח, אפשר לקרוא את המאמר sandboxing eval. מידע נוסף על מדיניות אבטחת התוכן זמין במדריך שלנו בנושא תוספים ובמבוא טוב ב-HTML5Rocks.