0

我有以下说明性扩展,如果用户访问“www.ru”,它将终止选项卡进程并重新加载页面:

manifest.json

{
  "manifest_version" : 2,
  "name" : "test extension",
  "version" : "1.0.0",
  "permissions" : [ "tabs", "experimental" ],
  "background" : { "scripts" : [ "extension.js" ], "persistent" : true }
}

extension.js

function reload() {
    chrome.tabs.query( {}, function( tabs ) {
        for( var i = 0; i < tabs.length; i ++ ) {
            if( tabs[ i ].url.match( /www\.ru/ ) ) {
                window.setTimeout( function() {
                    chrome.experimental.processes.getProcessIdForTab( tabs[ i ].id, function( id ) {
                        chrome.experimental.processes.terminate( id );
                    })
                }, 5000);
                window.setTimeout( function() {
                    chrome.tabs.reload( tabs[ i ].id );
                }, 10000);
                return;
            }
        }
        window.setTimeout( reload, 1000 );
    });
}
window.setTimeout( reload, 1000 );

我启动最新的 google chrome(26.0.1410.64 m 32 位,用于几分钟前从 chrome.google.com 下载的 windows),创建第二个 chrome 用户,切换到该用户,安装扩展程序,打开“www.ru”,切换到第一个用户- 10 秒后,chrome 强行将我切换回第二个用户,以演示标签重新加载!

只有 process kill + tab reload 会产生这种奇怪的行为(它们之间的暂停可以是任意长度)。如果终止或重新加载部分被注释掉,则执行相应的操作,但用户帐户被更新。

是我面临的一些 chrome 错误还是记录在案的行为?是否可以防止强制切换帐户?对我来说,在某些事情中被打断只是为了显示网络爬虫帐户上的某些网络爬虫扩展发现没有响应的选项卡并重新加载它,这让我非常不愉快:(。

4

1 回答 1

1

地狱之眼,这个答案是有根据的猜测。Chrome 可能会使用启发式方法来确定标签在加载或重新加载期间是否应成为活动标签。启发式可能是选项卡进程的第一次加载/重新加载应使其成为活动选项卡,除非该选项卡是使用 createProperties active: false 显式创建的。如果您认为新选项卡的默认活动状态是有意义的,并且了解在进程创建时(包括终止/重新加载后的进程创建),该选项卡可能设置为该默认值。

如果这是真的,那么不要在终止其进程后重新加载选项卡,也许您可​​以这样做:

  1. 记住即将被杀死的标签的 URL。
  2. 终止进程并关闭选项卡或仅关闭选项卡。
  3. chrome.tabs.create({url: savedUrl, active: false})。

这可能会产生一些其他不良副作用,例如丢失会话 cookie。但是在不了解您的用例的情况下,这似乎是您尝试做的等效方法。

顺便说一句,您的恢复过程可能会更快。您可以在终止函数的回调中链接重新加载(或创建)操作,而不是设置 5 秒和 10 秒的超时来序列化 kill/reload 操作。然后保证在终止完成后调用它,并且不会浪费挂钟时间等待额外的五秒钟。

于 2013-04-26T01:02:31.663 回答