相关疑难解决方法(0)

Chrome扩展程序错误:"运行browserAction.setIcon时未选中runtime.lastError:没有带标识的选项卡"

我正在编写我的Google Chrome扩展程序,我在后台脚本中设置了应用程序的图标:

try
{
    objIcon = {
        "19": "images/icon19.png",
        "38": "images/icon38.png"
    };

    chrome.browserAction.setIcon({
        path: objIcon,
        tabId: nTabID

    });
}
catch(e)
{
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在try/catch块中包装了调用.

不过,有时我在控制台日志中收到以下消息:

运行browserAction.setIcon时未选中runtime.lastError:没有标识为:11618的选项卡.

调试此错误很难,因为它似乎只在我关闭或重新加载Chrome标签时出现,它没有行号或任何信息供我跟踪,而且通过调试器运行并不容易(即我不能在发生错误时设置断点,但如果我在线上盲目设置断点chrome.browserAction.setIcon(),我就不再在日志中看到该消息了.)

所以我很好奇是否有人可以建议如何解决这个错误?

编辑:只是发布更新.我仍然无法解决此问题.@abraham在下面提出的建议提供了一种有点工作的方法,但它并非失败安全.例如,在标签关闭的情况下,我可以调用他的建议chrome.browserAction.setIcon(),如果标签尚未关闭,可能会成功,但在其回调函数中,标签最终可能会关闭,因此任何连续调用其他API需要相同的标签ID,说setBadgeBackgroundColor()可能仍然给我相同的No tab with id例外.换句话说,对于那些了解本土编程的人来说,这是一种典型的竞争条件.而且我不确定它是否是Chrome中的一个错误,因为很明显JS不提供任何线程同步方法......

在进行测试时,我已经多次目睹了这种行为.它并不经常发生,因为我们谈论的是非常精确的时序情况,但它确实发生了.因此,如果有人找到解决方案,请在下面发布.

javascript google-chrome race-condition google-chrome-extension

21
推荐指数
1
解决办法
1万
查看次数

无法在browserAction.setBadgeText期间检查runtime.lastError

chrome.browserAction.setBadgeText(object details)用于设置Chrome扩展程序的徽章文本.但是,如果tabId不存在,Chrome会使用以下错误产生以下错误console.error():

运行browserAction.setBadgeText时未经检查的runtime.lastError:没有带id的选项卡:####.

在页面加载期间设置徽章文本时,这会成为问题.如果选项卡最初存在但被用户关闭,则setBadgeText最终使用不存在的选项进行调用tabId.

通常,这可以通过检查chrome.runtime.lastError问题函数的回调参数来防止,如另一个问题所回答的那样.但是,由于browserAction.setBadgeText()没有回调参数,似乎无法阻止错误.

如果tabId是不表示任何选项卡的整数,则以下代码仍会产生错误,即使它尝试...

  • 捕获错误try...catch (由于console.error()没有抛出,它不起作用).
  • lastError调用后检查setBadgeText (由于函数是异步的,因此不起作用).
  • 在呼叫后使用各种setTimeout间隔进行检查(这不起作用,可能不可靠).lastErrorsetBadgeText
  • 添加一个回调参数setBadgeText (已被注释掉,因为chrome在使用时会产生另一个错误,因为没有第二个参数).
var tabId = 5000;
function clearError () {
    console.log(chrome.runtime.lastError);
}
try {
    chrome.browserAction.setBadgeText({
        text: 'text',
        tabId: tabId
    }/*, clearError*/);
    clearError();
    setTimeout(clearError, 0);
    setTimeout(clearError, 50);
    setTimeout(clearError, 500);
}
catch (e) {
    console.log('Caught', e);
    clearError();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法正确检查chrome.runtime.lastError以防止发生此错误?

javascript google-chrome google-chrome-extension

3
推荐指数
1
解决办法
447
查看次数

运行tabs.executeScript时未经检查的runtime.lastError?

我设法构建了Ripple Emulator开源软件(https://github.com/apache/incubator-ripple).

我根据说明(Jake构建)构建了它,它创建了Chrome扩展目标,允许我通过我内置的chrome扩展测试我的网络应用程序,按照https://github.com/apache/incubator-ripple/blob /master/doc/chrome_extension.md.

我成功地将解压缩的扩展加载到chrome上,但是当我启用它时没有任何反应,虽然页面重新加载扩展不起作用,而是我得到2个错误:

  1. 未捕获的ReferenceError:未定义webkitNotifications

    webkitNotifications.createHTMLNotification('/views/update.html').show();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行tabs.executeScript时未经检查的runtime.lastError:无法访问chrome:// URL

    chrome.tabs.executeScript(tabId, {
    
    Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?


完整的background.js:

if (!window.tinyHippos) {
window.tinyHippos = {};
}

tinyHippos.Background = (function () {
var _wasJustInstalled = false,
    _self;

function isLocalRequest(uri) {
    return !!uri.match(/^https?:\/\/(127\.0\.0\.1|localhost)|^file:\/\//);
}

function initialize() {
    // check version info for showing welcome/update views
    var version = window.localStorage["ripple-version"],
        xhr = new window.XMLHttpRequest(),
        userAgent,
        requestUri = chrome.extension.getURL("manifest.json");

    _self.bindContextMenu();

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            var manifest = JSON.parse(xhr.responseText),
                currentVersion = …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome google-chrome-extension ripple

2
推荐指数
1
解决办法
9513
查看次数