瀏覽器插件開發-manifest文件解讀


瀏覽器插件開發-manifest文件解讀

調研資料

manifest.json 官方文檔

Chrome Extension API

360瀏覽器的插件文檔 中文, 雖然內核差不多但是不一定與 Chrome api 一致, 可以作為參考

Chrome 官方案例庫

案例

如何實現網頁和Chrome插件之間的通信

消息傳遞

manifest.json 配置說明

manifest.json 用於描述 Chrome 插件的源數據,配置信息等,基本內容如下

{
    "name": "名稱",
    "description": "描述",
    "version": "打包完成后用於判斷插件是否需要更新",
    "manifest_version": 2,
    "browser_action": {
        "default_popup": "xxx.html 右上角點擊后的彈窗,可以用一個頁面定義",
        "default_icon": "xxx.png 顯示在右上角的圖標button"
    },
}

配置項簡介

1. manifest_version 必填

清單文件格式的版本, Chrome 18 開發 寫 2 即可

 

2. name 必填

插件名稱

 

3. version 必填

插件版本,發布新版本后,瀏覽器會比較其已安裝的插件的版本,有更新的版本則會自動更新

 

4. description

插件的描述,132個字符限制

 

5. icons

插件的圖標,可以用在 Chrome 商店展示(128 * 128) | 插件管理界面 (48 * 48) | 擴展頁圖標 (16 * 16) 最好是 png 格式

 

6. browser_action

可以用來定義點擊圖標后展示的窗口,對應接口 chrome.browserAction,這項配置與 page_action 是對立的,只能二選一,以下是 browser_action 子項的配置

  default_icon: Object | string 一個或者一組圖標的路徑

  default_title 設置 tooltip

  default_popup 指定彈出的窗口,可以是任意 html

  badges “徽章” 就是小圖標上的一個標記,用來展示一些狀態

 

7. page_action

代表可以在當前頁面執行的操作,不活動時顯示灰色,對應接口 chrome.pageAction

 

  default_icon: Object | string 一個或者一組圖標的路徑

  可用 pageAction.(show|hide) 改變插件活動狀態

  browser_action 和 page_action都用來定義放置在工具欄右上角的圖標點擊情況,但是兩者的活動狀態展示 | 點擊后的展示 | 主要負責場景是不一致的

 

猜測 browser_action 適用於用戶需要點擊圖標后在彈窗中操作的場景 page_action 試用與在后台運行,重要工作是監聽用戶行為的插件

 

官方建議:如果要實現的功能只針對某一個頁面有用則建議使用 page_action 否則使用 browser_action

 

8. background

用來定義后台腳本部分

 

擴展是基於事件的程序,這些事件包括導航到新頁面、刪除書簽、或者關閉選項卡,擴展在他們的后台腳本中監視這些事件,然后用指定的指令進行響應

 

關於后台腳本的狀態

  1、首次下載后或者更新后被加載

  2、后台腳本下載后會處於休眠狀態,直到它偵聽的某個事件被觸發,

  3、偵聽到事件后,會使用指定的指令響應(怎么相應自定義)

 

以下情況會需要調用到后台腳本

  1、擴展首次下載或者版本更新

  2、后台腳本中正在監聽事件,並且這事件被觸發了

  3、content_script 或者其他擴展中調用了 sendMessage

  4、當前擴展中的其他部分,例如彈窗中調用了 runtime.getBackgroundPage

后台腳本定義選項

{
    ...
    "background": {
        "scripts": ["bg1.js", "bg2.js"], // 后台腳本可以注冊多個
        "persistent": false // 是否是持久的,一般為 false, 某些特殊情況需要參考文檔 
    }
}

事件過濾器,有些事件支持事件過濾,比如選項卡的切換可以監聽

// background.js
chrome.webNavigation.onCompleted.addListener(function () {}, {
    url: [{urlMatches: 'http://www.baidu.com'}] // 過濾
});

9. chrome setting 修改 | chrome 用戶界面展示修改 | chrome 一些內置頁面的替換

  1、setting 使用 chrome_settings_overrides 配置,詳細配置查看文檔

  2、用戶界面 使用 chrome_ui_overrides 配置,詳細配置查看文檔,可以設置一些書簽方面的規則

  3、內置頁面替換 使用 chrome_url_overrides 配置,詳細配置查看文檔,標簽頁、歷史頁、新 tab 都可替換

10. commands

可以通過 commands 選項定義觸發擴展事件的快捷鍵

{
    ...,
    commands: {
        "xxx": {
            "suggested_key": {
                "default": "Ctrl+X",
                "mac": "Command+X",
                "windows": "Ctrl+X"
            }
        },
        "_execute_browser_action": {...},
        "_execute_page_action": {...}
    }
}

操作快捷鍵后,插件后台會監聽到對應的事件

// background.js
chrome.commands.onCommand.addListener(function(command) {});

注意:\ _execute_browser_action \ _execute_page_action 這兩個命令不會被監聽,他們是觸發 popup 彈出的,要監聽 窗口彈出事件可以使用 popup_page 的onDomReady

 

11. content_scripts

content_script 在一個特殊的環境中運行,可以稱之為隔離環境,在這里可以訪問所注入頁面的DOM,但是不能訪問里邊的任何 javascript 變量和函數,反之,頁面中的js 也不能訪問 content_script 中的變量和函數

 

訪問目標網站的 DOM ,可以用來進行通信

 

分為兩種情況,一種是聲明型注入腳本,使用 content_scripts 配置項,另一種是編程方式注入使用 permissions: ["activeTab"] 選項,

1、聲明型注入腳本 content_scripts 值可以是一個數組,設置不同站點的不同注入文件

  1)需要設置 matches: ["http://"] 指定匹配的網址,

  2)js 設置注入腳本

  3)css 設置注入樣式

  4)run_at 定義注入要本的時機 document_idle 表示瀏覽器幫你把握時機,會在 DOM 完成 與 window.onload 之后注入;document_start 在 CSS 注入之后,其他任何腳本或者      DOM 之前注入;document.end DOM 完成之后立即注入,但是在圖像等資源之前

2、編程方式注入,不需要指定可訪問的域名,可以針對當前活動的選項卡運行,獲取臨時訪問權限 permissions: ["tabs"] 編程方式注入會在 chrome.tabs.executeScript(tabId,   details, callback) 接口中詳細介紹

通信案例,通過 content_script 與頁面 共享 DOM,來實現頁面與擴展間的通信

// page.js 頁面中觸發一個postMessage

document.getElementById('btn').addEventListener('click', () => {
    window.postMessage({type: 'TO_CONNECT_EXTERNAL', data: 'data'});
})

// content_script.js 中做中轉

var port = chrome.runtime.connect();

window.addEventListener('message', (e) => {
    if (e.source !== window) {return};

    if (event.data.type && (event.data.type == "FROM_PAGE")) {
        port.postMessage(event.data.data); // 發消息給擴展
    }
}, false);

12. externally_connectable

這項配置直接實現網站與插件間通信,但是需要在 manifest.json 中作出如下配置

{
    "externally_connectable": {
        "matches": ["http://*.xx.com"] // 只有匹配的網站才可以通信
    }
}
// page.js 中發出請求

var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";

chrome.runtime.sendMessage(
    editorExtensionId, 
    {type: 'MsgFromPage', msg: 'Hello, I am page~'}, 
    function(response) {
      console.log(response);
    }
);

// background.js

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {
  // 可以針對sender做一些白名單檢查
  // sendResponse返回響應
  if (request.type == 'MsgFromPage') {
    sendResponse({tyep: 'MsgFromChrome', msg: 'Hello, I am chrome extension~'});
  }
});

13. offline_enabled

擴展是否需要離線工作,默認為 true, 當chrome 檢測到離線時,程序會被高亮顯示

 

14. permissions | optional_permissions

聲明 權限(插件實現基礎功能所需要的) | 可選權限 (插件中可選的特性所需要的),兩者的子配置項是一樣的

選項的值是一個數組,代表每一個權限,權限可以是已知的權限字符串 也可以是一個主機的匹配模式
權限字符串大多都對應着一個同名的 chrome[permissionName] API,全部的權限字符串可以點擊上邊鏈接查看,一下列出常用的權限

activeTab 允許用戶在調用擴展時臨時訪問當前活動的選項卡,
background 后台權限,可以用來增加Chrome 運行時間,即開機即運行(雖然是不可見的)
bookmarks 書簽操作權限
browsingData 瀏覽器數據操作權限,主要用來清除瀏覽器數據 cookie storage 等
contentSettings 瀏覽器設置權限
contextMenus 上下文菜單添加權限
cookies cookie 的查詢、修改、onChange 監聽
history 瀏覽器歷史記錄操作權限
storage chrome.storage 的使用權限(注意不是瀏覽器的 localStorage)
tabs 選項卡權限,允許創建、修改、重新排列選項卡
webNavigation 請求進行過程中的操作權限
webRequest | webRequestBlocking 開放 正在運行請求的 攔截、阻塞、或修改的權限

15. web_accessible_resources

指定打包資源的的路徑字符串數組,這些資源是在擴展中是可用了,例如 content_script會用到的資源等,

 

16. content_security_policy

內容安全策略, 默認的安全策略為 script-src 'self'; object-src 'self' 他會有如下限制

 

  1\禁止 eval 及相關函數

  2\禁止內聯<script>塊和內聯事件處理程序(例如,<button onclick="…">)

  3\只有擴展包內的腳本和資源才會被加載!通過Web即時下載的將不會被加載

可以通過 白名單 使用通配符設置哪些外部資源是可以訪問的(僅支持 https),如下

 

"content_security_policy": "script-src 'self' https://*.xxx.com; object-src 'self'"

 

 

 

瀏覽器插件開發-manifest文件解讀調研資料manifest.json 官方文檔Chrome Extension API360瀏覽器的插件文檔 中文, 雖然內核差不多但是不一定與 Chrome api 一致, 可以作為參考Chrome 官方案例庫案例如何實現網頁和Chrome插件之間的通信消息傳遞manifest.json 配置說明manifest.json 用於描述 Chrome 插件的源數據,配置信息等,基本內容如下
{    "name": "名稱",    "description": "描述",    "version": "打包完成后用於判斷插件是否需要更新",    "manifest_version": 2,    "browser_action": {        "default_popup": "xxx.html 右上角點擊后的彈窗,可以用一個頁面定義",        "default_icon": "xxx.png 顯示在右上角的圖標button"    },}12345678910配置項簡介1. manifest_version 必填清單文件格式的版本, Chrome 18 開發 寫 2 即可
2. name 必填插件名稱
3. version 必填插件版本,發布新版本后,瀏覽器會比較其已安裝的插件的版本,有更新的版本則會自動更新
4. description插件的描述,132個字符限制
5. icons插件的圖標,可以用在 Chrome 商店展示(128 * 128) | 插件管理界面 (48 * 48) | 擴展頁圖標 (16 * 16) 最好是 png 格式
6. browser_action可以用來定義點擊圖標后展示的窗口,對應接口 chrome.browserAction,這項配置與 page_action 是對立的,只能二選一,以下是 browser_action 子項的配置
default_icon: Object | string 一個或者一組圖標的路徑default_title 設置 tooltipdefault_popup 指定彈出的窗口,可以是任意 htmlbadges “徽章” 就是小圖標上的一個標記,用來展示一些狀態7. page_action代表可以在當前頁面執行的操作,不活動時顯示灰色,對應接口 chrome.pageAction
default_icon: Object | string 一個或者一組圖標的路徑可用 pageAction.(show|hide) 改變插件活動狀態browser_action 和 page_action都用來定義放置在工具欄右上角的圖標點擊情況,但是兩者的活動狀態展示 | 點擊后的展示 | 主要負責場景是不一致的
猜測 browser_action 適用於用戶需要點擊圖標后在彈窗中操作的場景 page_action 試用與在后台運行,重要工作是監聽用戶行為的插件
官方建議:如果要實現的功能只針對某一個頁面有用則建議使用 page_action 否則使用 browser_action
8. background用來定義后台腳本部分
擴展是基於事件的程序,這些事件包括導航到新頁面、刪除書簽、或者關閉選項卡,擴展在他們的后台腳本中監視這些事件,然后用指定的指令進行響應
關於后台腳本的狀態
首次下載后或者更新后被加載后台腳本下載后會處於休眠狀態,直到它偵聽的某個事件被觸發,偵聽到事件后,會使用指定的指令響應(怎么相應自定義)以下情況會需要調用到后台腳本
擴展首次下載或者版本更新后台腳本中正在監聽事件,並且這事件被觸發了content_script 或者其他擴展中調用了 sendMessage當前擴展中的其他部分,例如彈窗中調用了 runtime.getBackgroundPage后台腳本定義選項
{    ...    "background": {        "scripts": ["bg1.js", "bg2.js"], // 后台腳本可以注冊多個        "persistent": false // 是否是持久的,一般為 false, 某些特殊情況需要參考文檔     }}
12345678事件過濾器,有些事件支持事件過濾,比如選項卡的切換可以監聽
// background.jschrome.webNavigation.onCompleted.addListener(function () {}, {    url: [{urlMatches: 'http://www.baidu.com'}] // 過濾});12349. chrome setting 修改 | chrome 用戶界面展示修改 | chrome 一些內置頁面的替換setting 使用 chrome_settings_overrides 配置,詳細配置查看文檔用戶界面 使用 chrome_ui_overrides 配置,詳細配置查看文檔,可以設置一些書簽方面的規則內置頁面替換 使用 chrome_url_overrides 配置,詳細配置查看文檔,標簽頁、歷史頁、新 tab 都可替換10. commands可以通過 commands 選項定義觸發擴展事件的快捷鍵
{    ...,    commands: {        "xxx": {            "suggested_key": {                "default": "Ctrl+X",                "mac": "Command+X",                "windows": "Ctrl+X"            }        },        "_execute_browser_action": {...},        "_execute_page_action": {...}    }}1234567891011121314操作快捷鍵后,插件后台會監聽到對應的事件
// background.jschrome.commands.onCommand.addListener(function(command) {});12注意:\ _execute_browser_action \ _execute_page_action 這兩個命令不會被監聽,他們是觸發 popup 彈出的,要監聽 窗口彈出事件可以使用 popup_page 的onDomReady
11. content_scriptscontent_script 在一個特殊的環境中運行,可以稱之為隔離環境,在這里可以訪問所注入頁面的DOM,但是不能訪問里邊的任何 javascript 變量和函數,反之,頁面中的js 也不能訪問 content_script 中的變量和函數
訪問目標網站的 DOM ,可以用來進行通信
分為兩種情況,一種是聲明型注入腳本,使用 content_scripts 配置項,另一種是編程方式注入使用 permissions: ["activeTab"] 選項,
聲明型注入腳本 content_scripts 值可以是一個數組,設置不同站點的不同注入文件需要設置 matches: ["http://"] 指定匹配的網址,js 設置注入腳本css 設置注入樣式run_at 定義注入要本的時機 document_idle 表示瀏覽器幫你把握時機,會在 DOM 完成 與 window.onload 之后注入;document_start 在 CSS 注入之后,其他任何腳本或者 DOM 之前注入;document.end DOM 完成之后立即注入,但是在圖像等資源之前編程方式注入,不需要指定可訪問的域名,可以針對當前活動的選項卡運行,獲取臨時訪問權限 permissions: ["tabs"] 編程方式注入會在 chrome.tabs.executeScript(tabId, details, callback) 接口中詳細介紹通信案例,通過 content_script 與頁面 共享 DOM,來實現頁面與擴展間的通信
// page.js 頁面中觸發一個postMessage
document.getElementById('btn').addEventListener('click', () => {    window.postMessage({type: 'TO_CONNECT_EXTERNAL', data: 'data'});})
// content_script.js 中做中轉
var port = chrome.runtime.connect();
window.addEventListener('message', (e) => {    if (e.source !== window) {return};
    if (event.data.type && (event.data.type == "FROM_PAGE")) {        port.postMessage(event.data.data); // 發消息給擴展    }}, false);
12345678910111213141516171812. externally_connectable這項配置直接實現網站與插件間通信,但是需要在 manifest.json 中作出如下配置
{    "externally_connectable": {        "matches": ["http://*.xx.com"] // 只有匹配的網站才可以通信    }}12345// page.js 中發出請求
var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";
chrome.runtime.sendMessage(    editorExtensionId,     {type: 'MsgFromPage', msg: 'Hello, I am page~'},     function(response) {      console.log(response);    });
// background.js
chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {  // 可以針對sender做一些白名單檢查  // sendResponse返回響應  if (request.type == 'MsgFromPage') {    sendResponse({tyep: 'MsgFromChrome', msg: 'Hello, I am chrome extension~'});  }});
1234567891011121314151617181920212213. offline_enabled擴展是否需要離線工作,默認為 true, 當chrome 檢測到離線時,程序會被高亮顯示
14. permissions | optional_permissions聲明 權限(插件實現基礎功能所需要的) | 可選權限 (插件中可選的特性所需要的),兩者的子配置項是一樣的
選項的值是一個數組,代表每一個權限,權限可以是已知的權限字符串 也可以是一個主機的匹配模式權限字符串大多都對應着一個同名的 chrome[permissionName] API,全部的權限字符串可以點擊上邊鏈接查看,一下列出常用的權限
activeTab 允許用戶在調用擴展時臨時訪問當前活動的選項卡,background 后台權限,可以用來增加Chrome 運行時間,即開機即運行(雖然是不可見的)bookmarks 書簽操作權限browsingData 瀏覽器數據操作權限,主要用來清除瀏覽器數據 cookie storage 等contentSettings 瀏覽器設置權限contextMenus 上下文菜單添加權限cookies cookie 的查詢、修改、onChange 監聽history 瀏覽器歷史記錄操作權限storage chrome.storage 的使用權限(注意不是瀏覽器的 localStorage)tabs 選項卡權限,允許創建、修改、重新排列選項卡webNavigation 請求進行過程中的操作權限webRequest | webRequestBlocking 開放 正在運行請求的 攔截、阻塞、或修改的權限15. web_accessible_resources指定打包資源的的路徑字符串數組,這些資源是在擴展中是可用了,例如 content_script會用到的資源等,
16. content_security_policy內容安全策略, 默認的安全策略為 script-src 'self'; object-src 'self' 他會有如下限制
禁止 eval 及相關函數禁止內聯<script>塊和內聯事件處理程序(例如,<button onclick="…">)只有擴展包內的腳本和資源才會被加載!通過Web即時下載的將不會被加載可以通過 白名單 使用通配符設置哪些外部資源是可以訪問的(僅支持 https),如下
"content_security_policy": "script-src 'self' https://*.xxx.com; object-src 'self'"
點贊收藏分享
————————————————版權聲明:本文為CSDN博主「mjzhang1993」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/mjzhang1993/article/details/84848899


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM