מדריך: העברה למניפסט מגרסה V2

גרסה 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. ניתן לעשות זאת בשתי דרכים:

  1. מורידים את הספרייה הרלוונטית באופן מקומי (כמו jQuery) ואריזתם אותה יחד עם התוסף.
  2. אפשר להרגיע את ה-CSP באופן מוגבל על ידי הוספה של מקורות HTTPS לרשימת ההיתרים ב &quot;content_security_policy&quot; במניפסט. כדי לכלול ספרייה כמו 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() ובשירותים דומים במסגרת המדיניות החדשה בנושא אבטחת תוכן:

  1. יוצרים רשומת Sandbox בקובץ המניפסט.
  2. ברשומה של ה-Sandbox, מציינים את הדפים שרוצים להריץ ב-Sandbox.
  3. יש להשתמש בהעברת הודעות דרך postMessage() כדי לתקשר עם הדף שבארגז החול.

לפרטים נוספים, אפשר לעיין במסמכי התיעוד של Sandboxing Eval.

קריאה נוספת

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