תיאור
אפשר להשתמש ב-chrome.action API כדי לשלוט בסמל התוסף בסרגל הכלים של Google Chrome.
זמינות
מניפסט
כדי להשתמש ב-browser.action API, צריך לציין "manifest_version" של 3 ולכלול את המפתח "action" בקובץ המניפסט.
{
"name": "Action Extension",
...
"action": {
"default_icon": { // optional
"16": "images/icon16.png", // optional
"24": "images/icon24.png", // optional
"32": "images/icon32.png" // optional
},
"default_title": "Click Me", // optional, shown in tooltip
"default_popup": "popup.html" // optional
},
...
}
המפתח "action" (יחד עם רכיבי הצאצא שלו) הוא אופציונלי. גם אם התוסף לא נכלל, הוא עדיין מוצג בסרגל הכלים כדי לאפשר גישה לתפריט של התוסף. לכן מומלץ תמיד לכלול לפחות את המפתחות "action" ו-"default_icon".
מושגים ושימוש
חלקי ממשק המשתמש
סמל
הסמל הוא התמונה הראשית בסרגל הכלים של התוסף, והוא מוגדר על ידי המפתח "default_icon" במפתח "action" של המניפסט. הסמלים צריכים להיות ברוחב ובגובה של 16 פיקסלים עצמאיים ממכשיר (DIP).
המפתח "default_icon" הוא מילון של גדלים ונתיבי תמונות. Chrome משתמש בסמלים האלה כדי לבחור את קנה המידה של התמונה שבה ישתמש. אם לא נמצאה התאמה מדויקת, Chrome בוחר את ההתאמה הקרובה ביותר שזמינה ומשנה את הגודל שלה כך שתתאים לתמונה, מה שעשוי להשפיע על איכות התמונה.
מכשירים עם גורמי קנה מידה פחות נפוצים כמו 1.5x או 1.2x הופכים לנפוצים יותר, ולכן מומלץ לספק כמה גדלים של סמלים. הפעולה הזו גם מבטיחה שהתוסף ימשיך לפעול גם אם יהיו שינויים בגודל התצוגה של הסמלים. עם זאת, אם מספקים רק גודל אחד, אפשר להגדיר את המפתח "default_icon" גם כמחרוזת עם הנתיב לסמל יחיד במקום מילון.
אפשר גם להתקשר אל action.setIcon() כדי להגדיר את סמל התוסף באופן פרוגרמטי על ידי ציון נתיב תמונה שונה או על ידי מתן סמל שנוצר באופן דינמי באמצעות רכיב HTML canvas, או, אם ההגדרה מתבצעת מתוך קובץ שירות (service worker) של תוסף, באמצעות offscreen canvas API.
const canvas = new OffscreenCanvas(16, 16);
const context = canvas.getContext('2d');
context.clearRect(0, 0, 16, 16);
context.fillStyle = '#00FF00'; // Green
context.fillRect(0, 0, 16, 16);
const imageData = context.getImageData(0, 0, 16, 16);
browser.action.setIcon({imageData: imageData}, () => { /* ... */ });
בתוספים ארוזים (שמותקנים מקובץ .crx), התמונות יכולות להיות ברוב הפורמטים שמנוע העיבוד של Blink יכול להציג, כולל PNG, JPEG, BMP, ICO ועוד. אין תמיכה ב-SVG. תוספים לא ארוזים חייבים להשתמש בתמונות PNG.
הסבר קצר (שם)
ההסבר הקצר או הכותרת מופיעים כשמשתמשים מעבירים את סמן העכבר מעל סמל התוסף בסרגל הכלים. הוא גם נכלל בטקסט הנגיש שמוקרא על ידי קוראי מסך כשהלחצן מקבל מיקוד.
הטקסט שמוצג בתיבת הטיפ מוגדר באמצעות השדה "default_title" של המפתח "action" ב-manifest.json.
אפשר גם להגדיר אותו באופן פרוגרמטי באמצעות קריאה ל-action.setTitle().
תג
אפשר להציג 'תג' עם הפעולות – קטע טקסט שמוצג מעל הסמל. כך תוכלו לעדכן את הפעולה כדי להציג כמות קטנה של מידע על מצב התוסף, כמו מונה. התג כולל רכיב טקסט וצבע רקע. מכיוון שהמקום מוגבל, מומלץ להשתמש בטקסט של התג בארבעה תווים או פחות.
כדי ליצור תג, צריך להגדיר אותו באופן פרוגרמטי על ידי שליחת קריאה אל action.setBadgeBackgroundColor() ו-action.setBadgeText(). אין הגדרת תג ברירת מחדל במניפסט. ערכי הצבע של התג יכולים להיות מערך של ארבעה מספרים שלמים בין 0 ל-255 שמרכיבים את צבע ה-RGBA של התג, או מחרוזת עם ערך של צבע CSS.
browser.action.setBadgeBackgroundColor(
{color: [0, 255, 0, 0]}, // Green
() => { /* ... */ },
);
browser.action.setBadgeBackgroundColor(
{color: '#00FF00'}, // Also green
() => { /* ... */ },
);
browser.action.setBadgeBackgroundColor(
{color: 'green'}, // Also, also green
() => { /* ... */ },
);
חלון קופץ
החלון הקופץ של פעולה מוצג כשמשתמש לוחץ על כפתור הפעולה של התוסף בסרגל הכלים. החלון הקופץ יכול להכיל כל תוכן HTML שרוצים, והגודל שלו יותאם אוטומטית לתוכן. הגודל של החלון הקופץ צריך להיות בין 25x25 ל-800x600 פיקסלים.
הערך של החלון הקופץ מוגדר בהתחלה על ידי המאפיין במפתח בקובץ manifest.json."default_popup""action" אם המאפיין הזה קיים, הוא צריך להפנות לנתיב יחסי בספריית התוסף. אפשר גם לעדכן אותו באופן דינמי כך שיצביע על נתיב יחסי אחר באמצעות השיטה action.setPopup().
תרחישים לדוגמה
מצב לכל כרטיסייה
לפעולות של תוספים יכולים להיות מצבים שונים בכל כרטיסייה. כדי להגדיר ערך לכרטיסייה ספציפית, משתמשים במאפיין tabId בשיטות ההגדרה של action API. לדוגמה, כדי להגדיר את הטקסט של התג לכרטיסייה ספציפית, אפשר לעשות משהו כזה:
function getTabId() { /* ... */}
function getTabBadge() { /* ... */}
browser.action.setBadgeText(
{
text: getTabBadge(tabId),
tabId: getTabId(),
},
() => { ... }
);
אם לא מציינים את המאפיין tabId, ההגדרה נחשבת להגדרה גלובלית. הגדרות ספציפיות לכרטיסייה מקבלות עדיפות על פני הגדרות גלובליות.
מצב מופעל
כברירת מחדל, הפעולות בסרגל הכלים מופעלות (אפשר ללחוץ עליהן) בכל כרטיסייה. אפשר לשנות את ברירת המחדל הזו על ידי הגדרת המאפיין default_state במפתח action של קובץ המניפסט. אם default_state מוגדר כ-"disabled", הפעולה מושבתת כברירת מחדל וצריך להפעיל אותה באופן פרוגרמטי כדי שיהיה אפשר ללחוץ עליה. אם default_state מוגדר כ-"enabled" (ברירת המחדל), הפעולה מופעלת וניתן ללחוץ עליה כברירת מחדל.
אפשר לשלוט במצב באופן פרוגרמטי באמצעות ה-methods action.enable() ו-action.disable(). ההגדרה הזו משפיעה רק על השאלה אם החלון הקופץ (אם יש כזה) או אירוע action.onClicked יישלחו לתוסף, ולא על השאלה אם הפעולה תופיע בסרגל הכלים.
דוגמאות
בדוגמאות הבאות אפשר לראות כמה דרכים נפוצות לשימוש בפעולות בתוספים. כדי לנסות את ממשק ה-API הזה, צריך להתקין את הדוגמה של Action API ממאגר chrome-extension-samples.
הצגת חלון קופץ
בדרך כלל, תוסף מציג חלון קופץ כשהמשתמש לוחץ על הפעולה של התוסף. כדי להטמיע את זה בתוסף שלכם, צריך להצהיר על החלון הקופץ בקובץ manifest.json ולציין את התוכן ש-Chrome צריך להציג בחלון הקופץ.
// manifest.json
{
"name": "Action popup demo",
"version": "1.0",
"manifest_version": 3,
"action": {
"default_title": "Click to view a popup",
"default_popup": "popup.html"
}
}
<!-- popup.html -->
<!DOCTYPE html>
<html>
<head>
<style>
html {
min-height: 5em;
min-width: 10em;
background: salmon;
}
</style>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
החדרת סקריפט תוכן בלחיצה
דפוס נפוץ של תוספים הוא לחשוף את התכונה העיקרית שלהם באמצעות הפעולה של התוסף. בדוגמה הבאה אפשר לראות את התבנית הזו. כשהמשתמש לוחץ על הפעולה, התוסף מזריק סקריפט תוכן לדף הנוכחי. לאחר מכן, סקריפט התוכן מציג התראה כדי לוודא שהכול פעל כמו שצריך.
// manifest.json
{
"name": "Action script injection demo",
"version": "1.0",
"manifest_version": 3,
"action": {
"default_title": "Click to show an alert"
},
"permissions": ["activeTab", "scripting"],
"background": {
"service_worker": "background.js"
}
}
// background.js
browser.action.onClicked.addListener((tab) => {
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['content.js']
});
});
// content.js
alert('Hello, world!');
הדמיית פעולות באמצעות declarativeContent
בדוגמה הזו אפשר לראות איך הלוגיקה של הרקע של תוסף יכולה (א) להשבית פעולה כברירת מחדל ו-(ב) להשתמש ב-declarativeContent כדי להפעיל את הפעולה באתרים ספציפיים.
// service-worker.js
// Wrap in an onInstalled callback to avoid unnecessary work
// every time the service worker is run
browser.runtime.onInstalled.addListener(() => {
// Page actions are disabled by default and enabled on select tabs
browser.action.disable();
// Clear all rules to ensure only our expected rules are set
browser.declarativeContent.onPageChanged.removeRules(undefined, () => {
// Declare a rule to enable the action on example.com pages
let exampleRule = {
conditions: [
new browser.declarativeContent.PageStateMatcher({
pageUrl: {hostSuffix: '.example.com'},
})
],
actions: [new browser.declarativeContent.ShowAction()],
};
// Finally, apply our new array of rules
let rules = [exampleRule];
browser.declarativeContent.onPageChanged.addRules(rules);
});
});
סוגים
OpenPopupOptions
מאפיינים
-
windowId
מספר אופציונלי
המזהה של החלון שבו ייפתח החלון הקופץ של הפעולה. אם לא מציינים ערך, ברירת המחדל היא החלון הפעיל הנוכחי.
TabDetails
מאפיינים
-
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לשאול לגבי המצב שלה. אם לא מציינים כרטיסייה, מוחזר המצב שלא ספציפי לכרטיסייה.
UserSettings
אוסף ההגדרות שהמשתמש מציין לגבי הפעולה של התוסף.
מאפיינים
-
isOnToolbar
בוליאני
האם סמל הפעולה של התוסף גלוי בסרגל הכלים ברמה העליונה של חלונות הדפדפן (כלומר, האם המשתמש 'הצמיד' את התוסף).
UserSettingsChange
מאפיינים
-
isOnToolbar
boolean אופציונלי
האם סמל הפעולה של התוסף גלוי בסרגל הכלים ברמה העליונה של חלונות הדפדפן (כלומר, האם המשתמש 'הצמיד' את התוסף).
Methods
disable()
chrome.action.disable(
tabId?: number,
): Promise<void>
משבית את הפעולה בכרטיסייה.
פרמטרים
-
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לשנות את הפעולה שלה.
החזרות
-
Promise<void>
enable()
chrome.action.enable(
tabId?: number,
): Promise<void>
ההרשאה מאפשרת לבצע פעולה בכרטיסייה. הפעולות מופעלות כברירת מחדל.
פרמטרים
-
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לשנות את הפעולה שלה.
החזרות
-
Promise<void>
getBadgeBackgroundColor()
chrome.action.getBadgeBackgroundColor(
details: TabDetails,
): Promise<extensionTypes.ColorArray>
מחזירה את צבע הרקע של הפעולה.
פרמטרים
-
פרטים
החזרות
-
Promise<extensionTypes.ColorArray>
getBadgeText()
chrome.action.getBadgeText(
details: TabDetails,
): Promise<string>
מקבל את הטקסט של התג של הפעולה. אם לא מציינים כרטיסייה, מוחזר טקסט התג שלא ספציפי לכרטיסייה. אם האפשרות displayActionCountAsBadgeText מופעלת, יוחזר טקסט placeholder אלא אם ההרשאה declarativeNetRequestFeedback קיימת או שסופק טקסט ספציפי לתג לכרטיסייה.
פרמטרים
-
פרטים
החזרות
-
Promise<string>
getBadgeTextColor()
chrome.action.getBadgeTextColor(
details: TabDetails,
): Promise<extensionTypes.ColorArray>
מקבל את צבע הטקסט של הפעולה.
פרמטרים
-
פרטים
החזרות
-
Promise<extensionTypes.ColorArray>
getPopup()
chrome.action.getPopup(
details: TabDetails,
): Promise<string>
הפונקציה מחזירה את מסמך ה-HTML שהוגדר כחלון הקופץ לפעולה הזו.
פרמטרים
-
פרטים
החזרות
-
Promise<string>
פרמטרים
-
פרטים
החזרות
-
Promise<string>
getUserSettings()
chrome.action.getUserSettings(): Promise<UserSettings>
הפונקציה מחזירה את ההגדרות שצוינו על ידי המשתמש שקשורות לפעולה של תוסף.
החזרות
-
Promise<UserSettings>
isEnabled()
chrome.action.isEnabled(
tabId?: number,
): Promise<boolean>
התנאי מציין אם פעולת התוסף מופעלת בכרטיסייה (או באופן גלובלי אם לא צוין tabId). פעולות שמופעלות באמצעות declarativeContent בלבד תמיד מחזירות false.
פרמטרים
-
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לבדוק את הסטטוס שלה.
החזרות
-
Promise<boolean>
openPopup()
chrome.action.openPopup(
options?: OpenPopupOptions,
): Promise<void>
פתיחת החלון הקופץ של התוסף. בין גרסה Chrome 118 לגרסה Chrome 126, האפשרות הזו זמינה רק לתוספים שמותקנים באמצעות מדיניות.
פרמטרים
-
options
OpenPopupOptions אופציונלי
מציינים את האפשרויות לפתיחת החלון הקופץ.
החזרות
-
Promise<void>
setBadgeBackgroundColor()
chrome.action.setBadgeBackgroundColor(
details: object,
): Promise<void>
הגדרת צבע הרקע של התג.
פרמטרים
-
פרטים
אובייקט
-
צבע
מחרוזת | ColorArray
מערך של ארבעה מספרים שלמים בטווח [0,255] שמרכיבים את צבע ה-RGBA של התג. לדוגמה, אדום אטום הוא
[255, 0, 0, 255]. יכול להיות גם מחרוזת עם ערך CSS, כאשר אדום אטום הוא#FF0000או#F00. -
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
החזרות
-
Promise<void>
setBadgeText()
chrome.action.setBadgeText(
details: object,
): Promise<void>
הגדרת הטקסט של התג לפעולה. התג מוצג מעל הסמל.
פרמטרים
-
פרטים
אובייקט
-
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
text
מחרוזת אופציונלי
אפשר להעביר כל מספר של תווים, אבל רק ארבעה בערך יכולים להיכנס למרחב. אם מעבירים מחרוזת ריקה (
''), הטקסט בתג נמחק. אם מציינים אתtabIdו-textהוא null, הטקסט של הכרטיסייה שצוינה נמחק ומוגדר כברירת מחדל לטקסט התג הגלובלי.
-
החזרות
-
Promise<void>
setBadgeTextColor()
chrome.action.setBadgeTextColor(
details: object,
): Promise<void>
מגדיר את צבע הטקסט של התג.
פרמטרים
-
פרטים
אובייקט
-
צבע
מחרוזת | ColorArray
מערך של ארבעה מספרים שלמים בטווח [0,255] שמרכיבים את צבע ה-RGBA של התג. לדוגמה, אדום אטום הוא
[255, 0, 0, 255]. יכול להיות גם מחרוזת עם ערך CSS, כאשר אדום אטום הוא#FF0000או#F00. אם לא מגדירים את הערך הזה, המערכת בוחרת באופן אוטומטי צבע שיהיה בניגוד לצבע הרקע של התג, כדי שהטקסט יהיה גלוי. צבעים עם ערכי אלפא ששווים ל-0 לא יוגדרו ותוחזר שגיאה. -
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
החזרות
-
Promise<void>
setIcon()
chrome.action.setIcon(
details: object,
): Promise<void>
הגדרת הסמל של הפעולה. אפשר לציין את הסמל כנתיב לקובץ תמונה, כנתוני פיקסלים מרכיב canvas או כמילון של אחד מהם. צריך לציין את המאפיין path או את המאפיין imageData.
פרמטרים
-
פרטים
אובייקט
-
imageData
ImageData | object optional
אובייקט ImageData או מילון {גודל -> ImageData} שמייצג את הסמל שרוצים להגדיר. אם הסמל מוגדר כמילון, התמונה שבה יש להשתמש נבחרת בהתאם לצפיפות הפיקסלים של המסך. אם מספר הפיקסלים של התמונה שנכנסים ליחידת שטח אחת במסך שווה ל-
scale, התמונה בגודלscale* n תיבחר, כאשר n הוא גודל הסמל בממשק המשתמש. צריך לציין לפחות תמונה אחת. הערה: המחרוזת 'details.imageData = foo' שקולה למחרוזת 'details.imageData = {'16': foo}' -
נתיב
מחרוזת | אובייקט אופציונלי
נתיב יחסי לתמונה או מילון {גודל -> נתיב יחסי לתמונה} שמצביע על הסמל שרוצים להגדיר. אם הסמל מוגדר כמילון, התמונה בפועל שבה ישתמשו תיבחר בהתאם לצפיפות הפיקסלים של המסך. אם מספר הפיקסלים של התמונה שנכנסים ליחידת שטח אחת במסך שווה ל-
scale, התמונה בגודלscale* n תיבחר, כאשר n הוא גודל הסמל בממשק המשתמש. צריך לציין לפחות תמונה אחת. הערה: המחרוזת details.path = foo שקולה למחרוזת details.path = {'16': foo} -
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
החזרות
-
Promise<void>
Chrome 96 ואילך
setPopup()
chrome.action.setPopup(
details: object,
): Promise<void>
מגדיר את מסמך ה-HTML שייפתח כחלון קופץ כשהמשתמש ילחץ על סמל הפעולה.
פרמטרים
-
פרטים
אובייקט
-
מודעה קופצת
מחרוזת
הנתיב היחסי לקובץ ה-HTML שיוצג בחלון קופץ. אם המדיניות מוגדרת למחרוזת ריקה (
''), לא מוצג חלון קופץ. -
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
החזרות
-
Promise<void>
setTitle()
chrome.action.setTitle(
details: object,
): Promise<void>
הגדרת השם של הפעולה. ההסבר הקצר הזה יופיע כשמעבירים את העכבר מעל התמונה.
פרמטרים
-
פרטים
אובייקט
-
tabId
מספר אופציונלי
השינוי יחול רק כשהכרטיסייה הספציפית הזו תהיה פתוחה. ההגדרה הזו מתאפסת אוטומטית כשסוגרים את הכרטיסייה.
-
title
מחרוזת
המחרוזת שהפעולה צריכה להציג כשמעבירים מעליה את העכבר.
-
החזרות
-
Promise<void>
אירועים
onClicked
chrome.action.onClicked.addListener(
callback: function,
)
מופעל כשלוחצים על סמל של פעולה. האירוע הזה לא יופעל אם הפעולה כוללת חלון קופץ.
onUserSettingsChanged
chrome.action.onUserSettingsChanged.addListener(
callback: function,
)
האירוע מופעל כשמשתנה הגדרה שמשתמש הגדיר שקשור לפעולה של תוסף.
פרמטרים
-
callback
פונקציה
הפרמטר
callbackנראה כך:(change: UserSettingsChange) => void
-
שינוי
-