Google chrome extension 为什么要通过扩展交换机帐户重新加载google chrome选项卡?

Google chrome extension 为什么要通过扩展交换机帐户重新加载google chrome选项卡?,google-chrome-extension,Google Chrome Extension,我有一个如下示例性扩展,如果用户访问“www.ru”,它将终止tab进程并重新加载页面: manifest.json { "manifest_version" : 2, "name" : "test extension", "version" : "1.0.0", "permissions" : [ "tabs", "experimental" ], "background" : { "scripts" : [ "extension.js" ], "persistent" :

我有一个如下示例性扩展,如果用户访问“www.ru”,它将终止tab进程并重新加载页面:

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 );
函数重载(){
chrome.tabs.query({},函数(tabs){
对于(变量i=0;i
我启动最新的google chrome(26.0.1410.64 m 32位,适用于几分钟前从chrome.google.com下载的windows),创建第二个chrome用户,切换到该用户,安装扩展,打开“www.ru”,切换到第一个用户,10秒后chrome强制将我切换回第二个用户,以演示如何重新加载选项卡

只有进程kill+tab重载才会产生这种奇怪的行为(它们之间的停顿可以是任意长度)。如果终止或重新加载零件被注释掉,则执行相应的操作,但用户帐户被切换


这是我面临的chrome bug还是有记录的行为?是否可以防止强制帐户切换?这是非常不愉快的,我被打断在中间的东西只是为了显示一些网络爬虫扩展在网络爬虫帐户发现标签没有响应,并重新加载它:(.

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

如果这是真的,那么您可以这样做,而不是在结束其进程后重新加载选项卡:

  • 记住“即将被杀死”选项卡的URL
  • 终止进程并关闭选项卡,或者干脆关闭选项卡
  • create({url:savedUrl,active:false})
  • 这可能还有其他一些不希望的副作用,比如丢失会话cookie。但是在不了解更多用例的情况下,这似乎是一种与您尝试做的事情等效的方法

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