chrome.mimeHandler

說明

使用 chrome.mimeHandler API 處理第三方擴充功能中的 MIME 類型串流。

可用性

待處理

資訊清單

如要使用這項 API,必須在資訊清單中宣告下列鍵。

"mime_types_handler"

概念和用途

過去,處理特定文件類型 (例如 PDF 檢視器) 的第三方擴充功能會攔截網路要求,以擷取導覽並將使用者重新導向至擴充功能頁面。註冊為 MIME 處理常式可避免該方法的幾項限制:

  • 原始網址會保留在網址列中,不會由 chrome-extension:// 網址取代。
  • 擴充功能會擷取 Chrome 已收到的回應,而不是發出第二個網路要求。透過 POST 要求或單次使用網址傳送的文件可正常運作。
  • 擴充功能可以轉譯 <embed><object><iframe> 元素中載入的文件。
  • 使用者不必在擴充功能設定中手動啟用「允許存取檔案網址」,即可使用本機檔案 (file:// 網址)。

MIME 處理常式只適用於佔用整個框架的文件:頂層導覽和內嵌文件。這類屬性絕不會套用至內嵌子資源 (例如 <audio><img><video> 元素)。

註冊處理常式

如要將擴充功能註冊為 MIME 處理常式,請在資訊清單中宣告 "mime_types_handler" 鍵。每個項目都會將 MIME 類型對應至用於轉譯該類型的擴充功能頁面:

manifest.json:

{
  "name": "My PDF Viewer",
  ...
  "mime_types_handler": {
    "application/pdf": {
      "handler_url": "viewer.html",
      "can_embed": true
    }
  },
  ...
}

"can_embed" 設為 true,即可處理內嵌在 <embed><object><iframe> 元素中的文件。如果省略,處理常式只會收到頂層導覽。自 Chrome 151 起,公開處理常式只能使用 application/pdf MIME 類型;如果宣告不受支援的 MIME 類型,系統會顯示安裝警告。

如果安裝的多個擴充功能註冊了相同的 MIME 類型,系統會由最近安裝的擴充功能處理。如果解除安裝該擴充功能,先前安裝的處理常式就會再次生效。

擷取串流資訊

使用者開啟已註冊 MIME 類型的文件時,Chrome 會載入您的處理常式頁面,取代內建檢視器。從處理常式頁面呼叫 getStreamInfo(),擷取 StreamInfo 物件。這包括使用者前往的 originalUrl、HTTP responseHeaders、文件是否載入 embedded 環境,以及可用於擷取文件內容的 streamUrl

streamUrl 只能擷取一次,且只能從擴充功能的來源擷取。請先完整讀取回應,再進行處理;如果再次擷取相同的 streamUrl,就會失敗。顯示文件位置或標題時,請使用 originalUrl,而非擷取內容,因為原始要求可能無法重複。

改用原生處理常式

處理常式可能會遇到無法轉譯的文件,例如毀損或受密碼保護的檔案。呼叫 abortAndFallbackToNativeHandler() 停止處理文件,並將文件交還給 Chrome 的內建檢視器,而不是讓使用者停留在損毀的頁面上。Chrome 會卸載處理常式頁面做為備援機制的一部分;此呼叫後不會執行任何程式碼。

Chrome 會在處理常式執行時緩衝處理回應。如果您在完整收到回應時呼叫這個方法,Chrome 會從緩衝副本提供內建檢視器,而不會發出新的網路要求。否則,Chrome 會從網路重新載入文件,但這可能會失敗,因為文件是透過 POST 或單次使用的網址傳送。請先完整擷取串流,再決定是否可以轉譯;擷取 streamUrl 完成後,Chrome 就會取得完整的回應。

處理 API 適用性

在 Chrome 151 之前的 Chrome 版本中,宣告 "mime_types_handler" 的擴充功能仍會安裝及執行,但不會註冊為處理常式,且 chrome.mimeHandler 未定義。從網路要求攔截功能遷移的擴充功能可以在啟動時檢查 API,並保留現有的方法做為備援:

service-worker.js:

if (chrome.mimeHandler) {
  // Chrome routes registered MIME types to the handler page
  // declared in the manifest.
} else {
  // Fall back to network request interception.
}

範例

處理串流

以下範例會在資訊清單中宣告的處理常式頁面中執行。這個函式會擷取文件內容,如果無法順利算繪,則會改用 Chrome 的內建檢視器:

viewer.js:

async function loadDocument() {
  const streamInfo = await chrome.mimeHandler.getStreamInfo();

  // The `embedded` property is true if the document is loaded
  // within an <embed>, <object>, or <iframe> element.
  if (streamInfo.embedded) {
    // Adjust the UI (e.g., hide the top navigation bar).
    document.body.classList.add('embedded-view');
  }

  // Fetch the content using the provided streamUrl. The stream can
  // only be consumed once, so read it fully before continuing.
  const response = await fetch(streamInfo.streamUrl);
  const data = await response.arrayBuffer();

  try {
    // Render the document (e.g., using PDF.js).
    await renderDocument(data);
  } catch (e) {
    // Can't render this document. Fall back to Chrome's built-in
    // viewer; the page unloads and no code runs after this call.
    chrome.mimeHandler.abortAndFallbackToNativeHandler();
  }
}

loadDocument();

允許使用者切換處理方式

系統會依 MIME 類型儲存處理常式選項。下列範例使用 getMimeHandlerOptions()setMimeHandlerOptions(),讓使用者在選項頁面中關閉處理功能,不必解除安裝擴充功能。停用處理程序後,系統就不會再將該類型的文件傳送至擴充功能。

options.js:

const checkbox = document.querySelector('#handle-pdfs');

async function initOptions() {
  const options =
      await chrome.mimeHandler.getMimeHandlerOptions('application/pdf');
  // Handling is enabled unless it has been explicitly disabled.
  checkbox.checked = options.enabled !== false;
}

checkbox.addEventListener('change', async () => {
  await chrome.mimeHandler.setMimeHandlerOptions('application/pdf', {
    enabled: checkbox.checked
  });
});

initOptions();

類型

MimeHandlerOptions

屬性

  • 已啟用

    布林值

    這個處理常式是否適用於指定的 MIME 類型。

StreamInfo

屬性

  • 嵌入

    布林值

    如果載入嵌入式環境 (iframe/embed/object),則為 True。

  • mimeType

    字串

    攔截內容的 MIME 類型。

  • originalUrl

    字串

    使用者前往的原始網址。

  • responseHeaders

    物件

    HTTP 回應標頭,以鍵/值組合形式表示。

  • streamUrl

    字串

    要從中擷取串流資料的網址。

  • tabId

    數字

    包含文件的分頁 ID。

方法

abortAndFallbackToNativeHandler()

chrome.mimeHandler.abortAndFallbackToNativeHandler(): Promise<void>

中止目前的串流處理作業,並將內容交給使用者代理程式的原生處理常式。呼叫這個方法後,擴充功能影格就會遭到拆解,呼叫端不應預期後續執行作業。

傳回

  • Promise<void>

getMimeHandlerOptions()

chrome.mimeHandler.getMimeHandlerOptions(
  mimeType: string,
)
: Promise<MimeHandlerOptions>

讀取 MIME 類型的持續性選項。如果沒有儲存任何預設值,則傳回預設值 (enabled=true)。

參數

  • mimeType

    字串

    要讀取選項的 MIME 類型。

傳回

getStreamInfo()

chrome.mimeHandler.getStreamInfo(): Promise<StreamInfo>

擷取目前 MIME 處理常式環境的串流資訊。必須從 MIME 處理常式擴充功能頁面內呼叫。

傳回

setMimeHandlerOptions()

chrome.mimeHandler.setMimeHandlerOptions(
  mimeType: string,
  options: MimeHandlerOptions,
)
: Promise<void>

為指定的 MIME 類型設定設定選項。

參數

  • mimeType

    字串

    要設定的 MIME 類型。

  • 可用的新選項。

傳回

  • Promise<void>

    設定完成後,系統會解析 Promise。