chrome.tabs.update() 重定向到 'chrome-extension://invalid/'

2024-03-06

我编写了一个 chrome 扩展,它根据作为内容脚本注入的计时器的值重定向当前选项卡。后台脚本通过每隔一段时间轮询每个计时器来跟踪所有打开的选项卡的运行时间,如果在特定站点上花费的时间超过给定限制,则将活动选项卡重定向到间隙页面,并提供重置选项卡的选项。计时器并恢复之前的 URL。这是可行的,但是一旦计时器被重置一次,chrome.tabs.update()将活动选项卡重定向到chrome-extension://invalid/。我不知道为什么,甚至不知道如何诊断这里发生的事情。

这是它应该如何工作的,一步一步。首先,一个if时间到时会触发后台脚本中的块:

背景.js:

if (time_elapsed > time_limit) {
                settings.restore_url = tab.url;
                var timeup_url = chrome.extension.getURL('timeup.html');
                update_icon("off");
                chrome.tabs.update({url: timeup_url});
}

这会将当前选项卡的 url 保存到settings对象,获取静态页面的URLtimeup.html从扩展目录,更新工具栏图标,并将当前选项卡重定向到timeup.html.

超时.html:

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="bootstrap.css" type="text/css">
<style>
.hero-unit {
  background-color: #ffffff;
  text-align: center;
}
.icon {
  vertical-align: middle;
}
.xlarge {
  font-size: 20px;
}
</style>
<script src="timeup.js" type="text/javascript"></script>
<title>Tabminder</title>
</head>
<body>
    <div class="container">
        <div class="row-responsive">
            <div class="hero-unit">
                <h1>Don't get distracted!</h1>
                    <p>You've been browsing a timesink site for too long.</p>
                    <p>
                        <a class="btn btn-inverse btn-large xlarge" id="close-tabs"><img src="img/remove.png">
                            <span class="icon"> Close tab</span>
                        </a>
                        <a class="btn btn-danger btn-large xlarge" id="restart-timer"><img src="img/repeat.png">
                            <span class="icon"> Restart timer</span>
                        </a>
                    </p>
            </div>
        </div>
    </div>
</body>
</html>

这很简单。连接到的两个按钮'click'事件侦听器在...

timeup.js:

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById("close-tabs").addEventListener('click', close_tabs);
    document.getElementById("restart-timer").addEventListener('click', restart_timer);
});

var port = chrome.extension.connect();

function close_tabs () {
    port.postMessage({close_tabs: true});
}

function restart_timer () {
    port.postMessage({restart_timer: true});
} 

The #restart-timer按钮呼叫restart_timer(),它将消息发送回内容脚本以重定向选项卡:

背景.js:

// Listen for connections from content scripts
chrome.extension.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(msg) {
        if (msg.name == "update") {
            update_times(msg.update, port.sender.tab);
        }

        // Messages from timeup page:
        if (msg.close_tabs === true) {
            chrome.tabs.remove(port.sender.tab.id);
        }

        if (msg.restart_timer === true) {
            var reset_hostname = get_location(settings.restore_url).hostname;
            settings.elapsed_times[reset_hostname] = 0;
            chrome.tabs.update({url: settings.restore_url});
        }
    });
});

这应该重置存储在中的经过时间settings并将选项卡重定向到settings.restore_url。第一次可以正常工作,但是一旦计时器被重置,似乎会重定向到chrome-extension://invalid/。即使在第一次重置后,正确的值settings.restore_url被传递给chrome.tabs.update(),所以我不确定重定向来自哪里。这里出了什么问题?以后如何诊断此类错误?


正如@RobW 指出的,添加您需要主机页面访问的文件web_accessible_resources https://developer.chrome.com/extensions/manifest/web_accessible_resources:

清单 - Web 可访问资源

一个字符串数组,指定预期可在网页上下文中使用的打包资源的路径。这些路径相对于包根目录,并且可能包含通配符。

...

然后可以通过 URL 在网页中使用这些资源chrome-extension://[PACKAGE ID]/[PATH],可以通过以下方式生成extension.getURL方法。白名单资源由适当的 CORS 标头提供,因此可以通过 XHR 等机制使用它们。

除非资源被列为可通过 Web 访问,否则从 Web 源到扩展资源的导航将被阻止。

(仅摘录)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

chrome.tabs.update() 重定向到 'chrome-extension://invalid/' 的相关文章

随机推荐

  • 从母版页调用 Html.RenderPartial

    这是一个场景 假设我的网站有两个控制器 负责显示不同类型的内容 页面和文章 我需要将部分视图嵌入到我的母版页中 该母版页将列出按某些条件过滤的页面和文章 并显示在每个页面上 我无法在我的主页上设置模型 我是对的吗 如何使用 Html Ren
  • iPhone 应用程序在设备上崩溃,找不到文件

    我看到这个错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport 4 3 2 8H7 Symbols Developer usr lib libXcodeDebuggerSup
  • 无符号整数增量会导致未定义的已定义行为吗?

    读完后64 位上的 32 位无符号乘法会导致未定义的行为吗 https stackoverflow com q 27001604 1806289在 StackOverflow 上的问题中 我开始思考小型无符号类型上的典型算术运算是否会导致根
  • 如何正确使用九块图像

    我想创建某种看起来像这样的行图像 但我希望它能够随着屏幕尺寸和密度而缩放 所以读这篇文章http developer android com guide developing tools draw9patch html http devel
  • python virtualenv 未使用正确版本的 python

    我正在创建一个 Django 应用程序 需要我使用 python2 7 6 我的系统安装了 python3 4 1 所以我必须使用安装了 python2 7 的 virtualenv 我使用 Pycharm 安装了这样一个 virtuale
  • Rails 3:如何用英语以外的语言格式化日期?

    格式化一个Date用英语我做 Date today to s long ordinal gt September 28th 2011 如何用俄语 或任何其他语言 格式化日期 有的是Rails 中的国际化 API http guides ru
  • django-allauth - 使用 Gmail 帐户发送电子邮件验证

    我已经设置 allauth 为每个新注册用户发送一封电子邮件 以便可以验证他们的电子邮件 现在我使用 email backend 以便将电子邮件发送到终端 一切正常 但现在我想可以将其全部设置好 以便发送电子邮件 并且因为我 可能 在主机服
  • 如何使用 jQuery 在带有动画的表格中添加新行?

    这就是我正在做的在表中添加新行的操作 function expandAll myTableID gt tbody gt tr gt td nth child 2 gt div nth child 2 each function html t
  • android同时显示SIM卡和手机联系人

    在我的代码中 我应该只显示电话联系人 我遵循了之前的帖子 但仍然显示电话和 SIM 卡联系人 这是我的代码 Uri uri ContactsContract CommonDataKinds Phone CONTENT URI String
  • DateTime 为空字符串或 null?如何检查?

    Q 我想检查日期时间null value如果日期时间为空 则清空报告中的单元格 但我不知道如何执行此操作 它看起来像这样1 1 0001如果它是空的 我希望它是空单元格 这是我的数据集中的数据类型 这是我的列的表达式值 FormatDate
  • 是否有 IntelliJ Java Profiler [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 IntelliJ 是否有像 Matlab 那样的 Profiler 假设你有这个代码 a true i 0 while a if a i
  • ORA-04084: 无法更改此触发器类型的新值

    我正在尝试打开 pl sql 触发器 该触发器在故事更改时计算表中某些单元格的总数 这是代码 ALTER session SET nls date format dd mm yyyy CREATE OR REPLACE TRIGGER TO
  • Go 中可以有函数指针吗?

    我正在学习 Go 中的指针 并设法写出类似的东西 func hello fmt Println Hello World func main pfunc hello pfunc is a pointer to the function hel
  • 2 轴 Reportlab 图

    我通过重叠条形图和线罐 成功在 ReportLab 中创建了一个 2 轴图 对于对类似内容感兴趣的任何人来说 这里是代码 from reportlab graphics shapes import Drawing colors from r
  • 让 htmlParse 与希伯来语一起工作?

    我希望 htmlParse 能够很好地处理希伯来语 但它不断地扰乱我输入的页面中的希伯来语文本 例如 why can t I parse the Hebrew correctly library RCurl library XML u ht
  • 如何使用 Codeigniter PHP 将 CSV 导入数据库?

    我正在尝试使用 csv 插入记录 我想将 csv 上传到我的应用程序并希望将其导入数据库 现在我有一个用户表 所以我想通过导入用户的 csv 文件来创建用户 我对文件上传了解一点 但对将其导入数据库一无所知 请帮助 请参阅我已使用以下命令完
  • Jetpack compose - 当应用程序返回前台时如何刷新屏幕

    当应用程序返回前台时 我需要自动刷新 Android Compose 屏幕 我有一个需要权限和位置服务的 如果用户关闭了其中任何一项 则会绘制一个需要更改的项目列表 当用户转到 设置 并且应用程序返回前台时 我希望刷新列表以反映更改 我正在
  • Android WebView 硬件加速 Artefact 解决方法

    Android 中的 WebView 硬件加速存在一个已知的错误 例如 请参见此处 https code google com p android issues detail id 17352 https code google com p
  • 每次 React 向 Express 发送请求时,都会生成一个新的会话

    I use React作为客户端发送请求Express with proxy and express session设置 但每次 React 向 Express 服务器发出请求时 都会创建一个新会话 因此 我通过手动访问相同的 api ur
  • chrome.tabs.update() 重定向到 'chrome-extension://invalid/'

    我编写了一个 chrome 扩展 它根据作为内容脚本注入的计时器的值重定向当前选项卡 后台脚本通过每隔一段时间轮询每个计时器来跟踪所有打开的选项卡的运行时间 如果在特定站点上花费的时间超过给定限制 则将活动选项卡重定向到间隙页面 并提供重置