גרסה 1 של המניפסט הוצאה משימוש ב-Chrome 18, והתמיכה תופסק בהדרגתיות בהתאם לוח הזמנים לתמיכה בגרסה 1 של המניפסט. השינויים בין גרסה 1 לגרסה 2 הם פחות משני קטגוריות רחבות: שינויים בממשק API ושינויים באבטחה.
במסמך הזה מפורטות רשימות של משימות להעברת תוספי Chrome מגרסה 1 של המניפסט אל גרסה 2, ולאחר מכן סיכומים מפורטים יותר של המשמעות של השינויים האלו והסיבה לכך שהם בוצעו.
רשימת משימות לשינויים ב-API
האם השתמשת בנכס
browser_actions
או ב-API שלchrome.browserActions
?מחליפים את
browser_actions
במאפיין היחידbrowser_action
.מחליפים את
chrome.browserActions
ב-chrome.browserAction
.מחליפים את המאפיין
icons
בערךdefault_icon
.מחליפים את המאפיין
name
בערךdefault_title
.מחליפים את המאפיין
popup
ב-default_popup
(ועכשיו הוא חייב להיות מחרוזת).האם השתמשת בנכס
page_actions
או ב-API שלchrome.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
.האם השתמשת ב-
chrome.extension.getTabContentses()
או ב-chrome.extension.getExtensionTabs()
ממשקי API?החלפה עם
chrome.extension.getViews( { "type" : "tab" } )
.האם התוסף משתמש בדף רקע?
מחליפים את המאפיין
background_page
בנכסbackground
.מוסיפים מאפיין
scripts
אוpage
שמכיל את קוד הדף.צריך להוסיף נכס
persistent
ולהגדיר אותו לערךfalse
כדי להמיר את דף הרקע לאירוע דף
רשימת משימות לשינויי אבטחה
האם אתם משתמשים בבלוקים של סקריפטים מוטבעים בדפי HTML?
צריך להסיר קוד JS שנכלל בתגי
<script>
ולמקם אותו בקובץ JS חיצוני.האם השתמשת ברכיבי handler של אירועים מוטבעים (כמו onclick וכו')?
מסירים אותן מקוד ה-HTML, מעבירים אותם לקובץ JS חיצוני ומשתמשים ב-
addEventListener()
במקום זאת.האם התוסף מחדיר סקריפטים של תוכן לדפי אינטרנט שצריכים גישה למשאבים (כמו (תמונות וסקריפטים) שנכללים בחבילת התוסף?
מגדירים את המאפיין web_accessible_resources ורושמים את המשאבים (אופציונלי). מדיניות אבטחת תוכן נפרדת למשאבים האלה).
האם בתוסף שלך מוטמע דפי אינטרנט חיצוניים?
מגדירים את הנכס Sandbox.
האם הקוד או הספרייה שלך מכילים את
eval()
,Function()
,innerHTML
,setTimeout()
או אחרת, מעבירים מחרוזות של קוד JS שעוברות הערכה באופן דינמי?משתמשים ב-
JSON.parse()
כשמנתחים קוד JSON לאובייקט.כדאי להשתמש בספרייה ידידותית ל-CSP, למשל AngularJS.
ליצור רשומת Sandbox במניפסט ולהריץ את הקוד המושפע ב-Sandbox, באמצעות
postMessage()
כדי לתקשר עם הדף שבארגז החול.האם אתם טוענים קוד חיצוני, כמו jQuery או Google Analytics?
כדאי להוריד את הספרייה לארוז אותה בתוסף שלך, ולאחר מכן לטעון אותה חבילה מקומית.
להוסיף לרשימת ההיתרים את דומיין ה-HTTPS שמציג את המשאב ב-'content_security_policy' חלק .
סיכום השינויים ב-API
המניפסט בגרסה 2 כולל כמה שינויים בממשקי ה-API של פעולות הדפדפן ושל הפעולות בדפים, ומחליף את מספר ממשקי 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
הוחלף ברקע. - הנכס
chrome.self
הוסר, צריך להשתמש ב-chrome.extension
. - המאפיין
Port.tab
הוחלף במאפייןPort.sender
. - ממשקי ה-API של
chrome.extension.getTabContentses()
ו-chrome.extension.getExtensionTabs()
הוחלף על ידיchrome.extension.getViews( { "type" : "tab" } )
.
סיכום שינויי האבטחה
יש כמה שינויים הקשורים לאבטחה שנלווים למעבר מגרסה 1 של המניפסט אל גרסה 2. רבים מהשינויים האלה נובעים משימוש ב-Content Security Policy על ידי Chrome; עבורך לקרוא עוד על המדיניות הזו כדי להבין את ההשלכות שלה.
סקריפטים וגורמים מטפלים באירועים בתוך השורה אסורים
בגלל השימוש ב-Content Security Policy, אי אפשר יותר להשתמש בתגי <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">
הגרסאות האלה לא יפעלו בתוספי המניפסט מגרסה 2. להסיר את הגורמים המטפלים באירועים המוטבעים, ולמקם אותם
את קובץ 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"
],
...
}
הטמעת תוכן חיצוני: Content Security Policy מאפשרת רק לסקריפט מקומי ולאובייקטים להיטען מהחבילה שלך, מונעת לתוקפים חיצוניים להכניס קוד לא מוכר לתוסף שלך. אבל יש מקרים שבהם מקרים שבהם רוצים לטעון משאבים שמוצגים באופן חיצוני, כמו 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'", ... }
שימוש בהערכת סקריפטים דינמיים
אחד מהשינויים הגדולים ביותר בסכמה החדשה של המניפסט החדש הוא שתוספים לא יכולים יותר
משתמשים בשיטות להערכת סקריפטים דינמיים כמו eval()
או Function()
חדש, או מעבירים מחרוזות של JS
לפונקציות שיגרמו לשימוש ב-eval()
, כמו setTimeout()
. בנוסף, בחלק
ספריות JavaScript נפוצות, כגון מפות Google וספריות מסוימות של תבניות, ידועות
להשתמש בחלק מהטכניקות האלה.
Chrome מספק ארגז חול (Sandbox) לדפים שיכולים לפעול במקור שלהם, שהגישה ל-Chrome נדחתה.*
ממשקי API. כדי להשתמש ב-eval()
ובשירותים דומים במסגרת המדיניות החדשה בנושא אבטחת תוכן:
- יוצרים רשומת Sandbox בקובץ המניפסט.
- ברשומה של ה-Sandbox, מציינים את הדפים שרוצים להריץ ב-Sandbox.
- יש להשתמש בהעברת הודעות דרך
postMessage()
כדי לתקשר עם הדף שבארגז החול.
לפרטים נוספים, אפשר לעיין במסמכי התיעוד של Sandboxing Eval.
קריאה נוספת
השינויים בגרסת המניפסט 2 נועדו להנחות מפתחים לגבי תהליך הבנייה תוספים ואפליקציות שהארכיטקטורה שלהם מבוססת עליהם. כדי לראות רשימה מלאה של השינויים מגרסה 1 של המניפסט לגרסה 2, ראו את מסמכי התיעוד של קובץ המניפסט. למידע נוסף על השימוש בארגז חול (sandboxing) כדי לבודד קוד לא בטוח, קוראים את המאמר בנושא הערכה של ארגז חול (sandboxing). מידע נוסף על תוכן למדיניות האבטחה, אפשר לקרוא את המדריך שלנו בנושא תוספים ומבוא טוב בנושא HTML5Rocks.