javascript - 如何在 iframe 中运行由 Angular 制作的 chrome 扩展
问题描述
我正在尝试实现一个简单的 Chrome 扩展,它不会在默认弹出窗口上呈现其内容,而是在侧边栏上呈现。我已经意识到要做到这一点,我必须使用 iframe,因为它的默认行为是 chrome 扩展弹出样式。(它的最大宽度大小为 800 像素,高度为 600 像素。并且也无法设置其位置的样式)。
链接上方是 Angular Chrome 扩展脚手架项目的 github 存储库,我正在尝试使用 Angular 构建 chrome 扩展。
{
"manifest_version": 2,
"name": "extension test",
"short_name": "extension test",
"version": "1.0.0",
"description": "extension test",
"permissions": [
"tabs",
"downloads",
"storage",
"activeTab",
"declarativeContent"
],
"browser_action": {
"default_popup": "index.html",
"default_title": "extension test",
"default_icon": {
"16": "assets/images/favicon-16.png",
"32": "assets/images/favicon-32.png",
"48": "assets/images/favicon-48.png",
"128": "assets/images/favicon-128.png"
}
},
"options_ui": {
"page": "index.html#/option",
"open_in_tab": false
},
"content_scripts": [
{
"js": ["contentPage.js"],
"matches": ["<all_urls>"]
}
],
"background": {
"scripts": ["backgroundPage.js"],
"persistent": false
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"default_icon": {
"16": "assets/images/favicon-16.png",
"32": "assets/images/favicon-32.png",
"48": "assets/images/favicon-48.png",
"128": "assets/images/favicon-128.png"
}
}
以上是我的 manifest.json 文件。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Falcon Image Crawler</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
这就是 index.html 的样子。
最后是我的 App.component.ts 的样子
export class PopupComponent implements OnInit {
constructor() {
}
public ngOnInit(): void {
chrome.tabs.executeScript({
code: `
(function(){
const iframe = document.createElement('iframe');
iframe.src = chrome.runtime.getURL('index.html');
iframe.style.cssText = 'position:fixed;top:0;left:0;display:block;' +
'width:300px;height:100%;z-index:1000;';
document.body.appendChild(iframe);
})(); `
});
}
}
当我单击我的 chrome 扩展程序的图标时,Iframe 元素会显示在浏览器的左侧,但无法加载 index.html 并出现“未检查的 runtime.lastError:无法访问 chrome:// URL”错误,并且还会出现弹出窗口。
有没有正确的方法来运行 chrome 扩展,而不是在其默认弹出窗口上,而是在 iframe 上,我可以不受任何限制地设置它的样式?
解决方案
您需要将您添加到Web 可访问资源index.html
数组中,如下所示:
{
"manifest_version": 2,
"name": "extension test",
"short_name": "extension test",
"version": "1.0.0",
"description": "extension test",
"web_accessible_resources": [
"index.html"
],
"permissions": [
"tabs",
"downloads",
"storage",
"activeTab",
"declarativeContent"
],
"browser_action": {
"default_popup": "index.html",
"default_title": "extension test",
"default_icon": {
"16": "assets/images/favicon-16.png",
"32": "assets/images/favicon-32.png",
"48": "assets/images/favicon-48.png",
"128": "assets/images/favicon-128.png"
}
},
"options_ui": {
"page": "index.html#/option",
"open_in_tab": false
},
"content_scripts": [
{
"js": ["contentPage.js"],
"matches": ["<all_urls>"]
}
],
"background": {
"scripts": ["backgroundPage.js"],
"persistent": false
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"default_icon": {
"16": "assets/images/favicon-16.png",
"32": "assets/images/favicon-32.png",
"48": "assets/images/favicon-48.png",
"128": "assets/images/favicon-128.png"
}
}
chrome.tabs.executeScript
此外,如果您想在任何页面中包含脚本,则不需要使用,而是使用清单语法。
推荐阅读
- typescript - Vincit/Objection.js 在使用 .withGraphFetched() 时返回“无法读取未定义的属性 '$relation'”
- pip - pip install 创建一个真正的目录
- azure-devops - 如何在 Yaml Bash 步骤中存储从 CLI 创建的 Databricks 令牌
- ruby-on-rails - ActiveRecord 存储文档不清楚附件过程
- powerbi - PowerBi 中的旭日图帮助
- selenium - 如何使用 xpath 定位上部子元素
- javascript - 在 React 中动态添加背景 url
- c++ - 等效于 C 程序中的 emplace 和 reserve 函数
- excel - 如果在 A、B 和 C 列中同时发现 #N/A,则 VBA 代码删除整行
- c# - C# PhantomJS 驱动程序阻止 Angular 应用程序加载