【问题标题】:TypeError: [API] is undefined in content script or Why can't I do this in a content script?TypeError:[API] 在内容脚本中未定义或为什么我不能在内容脚本中执行此操作?
【发布时间】:2017-04-21 03:07:59
【问题描述】:

我试图在 Firefox 中编写一个简单的扩展,其中我修改了 X-Frame-Allow 标头。

我简要查看了文档,发现它们支持webRequest.onHeadersReceived.addListener()。但是,当收到标头时,我无法让我的代码运行。

ma​​nifest.json

{
  "manifest_version": 2,
  "name": "xframeoptions",
  "version": "1.0",
  "description": "Set X-Frame-Options to ALLOW",
  "icons": {
    "48": "icons/icon.png"
  },
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "<all_urls>"
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["xframeoptions.js"]
    }
  ]
}

xframeoptions.js

function rewriteHeader(e) {
  console.log(e.responseHeaders);

  for (var header of e.responseHeaders) {
    console.log(header.name + ":" + header.value);
    if (header.name == "X-Frame-Options") {
      header.value = 'ALLOW';
      modified = true;
      break;
    }
  }
  return {responseHeaders: e.responseHeaders};
}

console.log("Initializing xframeoptions extension ...test");


browser.webRequest.onHeadersReceived.addListener(
  rewriteHeader,
  {urls: ['<all_urls>']},
  ["blocking", "responseHeaders"]
);

如何通过 Firefox 的 WebExtensions 修改响应标头?

【问题讨论】:

  • 当您尝试安装扩展程序和然后加载或重新加载网页?
  • 我建议您阅读Anatomy of a WebExtension 页面(也许通过阅读从那里链接的页面)。它包含整体架构信息,有助于您了解事物的一般组织/完成方式。

标签: javascript firefox firefox-addon firefox-addon-webextensions


【解决方案1】:

内容脚本无权访问您正在使用的 API

您正试图通过content script 执行此操作。您需要通过background script 执行此操作。内容脚本可以访问 WebExtensions API 的一小部分。可用的 API 包括(来自MDN Content Scripts page):

来自extension

来自runtime

来自i18n

来自storage的所有内容。

这不包括您尝试使用的 API(例如 webRequest)。

更改您的 manifest.json 以使用 background 页面

您应该将您的 manifest.json 更改为,而不是为您的 xframeoptions.js 使用 content_scripts 键,而是使用类似 background 的脚本运行它:

"background": {
    "scripts": [
        "xframeoptions.js"
    ]
},

扩展分为后台脚本和内容脚本

如果您需要在内容脚本中调用 API 的信息,则需要使用 message passing to communicate between the content script and your background script。但是,通常您可以将完整的逻辑移动到在后台上下文中运行的脚本(后台脚本、弹出脚本、选项页面脚本等)。确切地说,需要什么取决于您希望使用脚本完成什么。

在后台上下文中可用的所有特权 API 与对内容脚本中可用的网页内容的访问(对特权 API 的访问非常有限)之间的功能分离以及它们之间的异步消息传递是 extensions are architected .您将需要围绕此架构设计您的扩展。

可能由该问题引起的一些错误

此问题可能导致许多可能的错误。以下是可能的错误的不完整列表:

TypeError: browser.alarms is undefined
TypeError: browser.bookmarks is undefined
TypeError: browser.browserAction is undefined
TypeError: browser.browsingData is undefined
TypeError: browser.commands is undefined
TypeError: browser.contextMenus is undefined
TypeError: browser.contextualIdentities is undefined
TypeError: browser.cookies is undefined
TypeError: browser.devtools.inspectedWindow is undefined
TypeError: browser.downloads is undefined
TypeError: browser.events is undefined
TypeError: browser.extension.getBackgroundPage is undefined
TypeError: browser.extension.getExtensionTabs is undefined
TypeError: browser.extension.getViews is undefined
TypeError: browser.extension.isAllowedFileSchemeAccess is undefined
TypeError: browser.extension.isAllowedIncognitoAccess is undefined
TypeError: browser.extension.lastError is undefined
TypeError: browser.extension.onRequest is undefined
TypeError: browser.extension.onRequestExternal is undefined
TypeError: browser.extension.sendRequest is undefined
TypeError: browser.extension.setUpdateUrlData is undefined
TypeError: browser.extension.ViewType is undefined
TypeError: browser.extensionTypes is undefined
TypeError: browser.history is undefined
TypeError: browser.i18n.LanguageCode is undefined
TypeError: browser.identity is undefined
TypeError: browser.idle is undefined
TypeError: browser.management is undefined
TypeError: browser.notifications is undefined
TypeError: browser.omnibox is undefined
TypeError: browser.pageAction is undefined
TypeError: browser.privacy is undefined
TypeError: browser.runtime.connectNative is undefined
TypeError: browser.runtime.getBackgroundPage is undefined
TypeError: browser.runtime.getBrowserInfo is undefined
TypeError: browser.runtime.getPackageDirectoryEntry is undefined
TypeError: browser.runtime.getPlatformInfo is undefined
TypeError: browser.runtime.id is undefined
TypeError: browser.runtime.lastError is undefined
TypeError: browser.runtime.MessageSender is undefined
TypeError: browser.runtime.onBrowserUpdateAvailable is undefined
TypeError: browser.runtime.onConnectExternal is undefined
TypeError: browser.runtime.onInstalled is undefined
TypeError: browser.runtime.OnInstalledReason is undefined
TypeError: browser.runtime.onMessageExternal is undefined
TypeError: browser.runtime.onRestartRequired is undefined
TypeError: browser.runtime.OnRestartRequiredReason is undefined
TypeError: browser.runtime.onStartup is undefined
TypeError: browser.runtime.onSuspend is undefined
TypeError: browser.runtime.onSuspendCanceled is undefined
TypeError: browser.runtime.onUpdateAvailable is undefined
TypeError: browser.runtime.openOptionsPage is undefined
TypeError: browser.runtime.PlatformArch is undefined
TypeError: browser.runtime.PlatformInfo is undefined
TypeError: browser.runtime.PlatformNaclArch is undefined
TypeError: browser.runtime.PlatformOs is undefined
TypeError: browser.runtime.Port is undefined
TypeError: browser.runtime.reload is undefined
TypeError: browser.runtime.requestUpdateCheck is undefined
TypeError: browser.runtime.RequestUpdateCheckStatus is undefined
TypeError: browser.runtime.sendNativeMessage is undefined
TypeError: browser.runtime.setUninstallURL is undefined
TypeError: browser.sessions is undefined
TypeError: browser.sidebarAction is undefined
TypeError: browser.tabs is undefined
TypeError: browser.thing is undefined
TypeError: browser.topSites is undefined
TypeError: browser.webNavigation is undefined
TypeError: browser.webRequest is undefined
TypeError: browser.windows is undefined
TypeError: chrome.alarms is undefined
TypeError: chrome.bookmarks is undefined
TypeError: chrome.browserAction is undefined
TypeError: chrome.browsingData is undefined
TypeError: chrome.commands is undefined
TypeError: chrome.contextMenus is undefined
TypeError: chrome.contextualIdentities is undefined
TypeError: chrome.cookies is undefined
TypeError: chrome.devtools.inspectedWindow is undefined
TypeError: chrome.downloads is undefined
TypeError: chrome.events is undefined
TypeError: chrome.extension.getBackgroundPage is undefined
TypeError: chrome.extension.getExtensionTabs is undefined
TypeError: chrome.extension.getViews is undefined
TypeError: chrome.extension.isAllowedFileSchemeAccess is undefined
TypeError: chrome.extension.isAllowedIncognitoAccess is undefined
TypeError: chrome.extension.lastError is undefined
TypeError: chrome.extension.onRequest is undefined
TypeError: chrome.extension.onRequestExternal is undefined
TypeError: chrome.extension.sendRequest is undefined
TypeError: chrome.extension.setUpdateUrlData is undefined
TypeError: chrome.extension.ViewType is undefined
TypeError: chrome.extensionTypes is undefined
TypeError: chrome.history is undefined
TypeError: chrome.i18n.LanguageCode is undefined
TypeError: chrome.identity is undefined
TypeError: chrome.idle is undefined
TypeError: chrome.management is undefined
TypeError: chrome.notifications is undefined
TypeError: chrome.omnibox is undefined
TypeError: chrome.pageAction is undefined
TypeError: chrome.privacy is undefined
TypeError: chrome.runtime.connectNative is undefined
TypeError: chrome.runtime.getBackgroundPage is undefined
TypeError: chrome.runtime.getBrowserInfo is undefined
TypeError: chrome.runtime.getPackageDirectoryEntry is undefined
TypeError: chrome.runtime.getPlatformInfo is undefined
TypeError: chrome.runtime.id is undefined
TypeError: chrome.runtime.lastError is undefined
TypeError: chrome.runtime.MessageSender is undefined
TypeError: chrome.runtime.onBrowserUpdateAvailable is undefined
TypeError: chrome.runtime.onConnectExternal is undefined
TypeError: chrome.runtime.onInstalled is undefined
TypeError: chrome.runtime.OnInstalledReason is undefined
TypeError: chrome.runtime.onMessageExternal is undefined
TypeError: chrome.runtime.onRestartRequired is undefined
TypeError: chrome.runtime.OnRestartRequiredReason is undefined
TypeError: chrome.runtime.onStartup is undefined
TypeError: chrome.runtime.onSuspend is undefined
TypeError: chrome.runtime.onSuspendCanceled is undefined
TypeError: chrome.runtime.onUpdateAvailable is undefined
TypeError: chrome.runtime.openOptionsPage is undefined
TypeError: chrome.runtime.PlatformArch is undefined
TypeError: chrome.runtime.PlatformInfo is undefined
TypeError: chrome.runtime.PlatformNaclArch is undefined
TypeError: chrome.runtime.PlatformOs is undefined
TypeError: chrome.runtime.Port is undefined
TypeError: chrome.runtime.reload is undefined
TypeError: chrome.runtime.requestUpdateCheck is undefined
TypeError: chrome.runtime.RequestUpdateCheckStatus is undefined
TypeError: chrome.runtime.sendNativeMessage is undefined
TypeError: chrome.runtime.setUninstallURL is undefined
TypeError: chrome.sessions is undefined
TypeError: chrome.sidebarAction is undefined
TypeError: chrome.tabs is undefined
TypeError: chrome.thing is undefined
TypeError: chrome.topSites is undefined
TypeError: chrome.webNavigation is undefined
TypeError: chrome.webRequest is undefined
TypeError: chrome.windows is undefined

【讨论】:

  • 这是出乎意料的。 background 的文档中没有任何地方说我需要这个才能使用 webRequest API。事实上,它所谈论的大部分内容都是让我远离它的原因。
【解决方案2】:

This question 带我到这里。我的浏览器操作有问题。此行在我的 background.js 中,用于处理对我的扩展程序图标的点击:

browser.browserAction.onClicked.addListener(handleClick);

那行给了我这个错误:

TypeError: browser.browserAction 未定义

出了什么问题?我只是忘了在 manifest.json 中定义一个 browser_action

"browser_action": {
    "default_icon": "my-icon.png"
}

也许这个提示可能对其他人有所帮助...... ;-)

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2012-09-03
    相关资源
    最近更新 更多