为什么要通过扩展交换机帐户重新加载Google Chrome标签?

时间:2013-04-25 17:07:22

标签: google-chrome-extension

我有以下说明性扩展,如果用户访问“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 );

我启动最新的谷歌浏览器(26.0.1410.64米32位从Chrome.google.com分钟前下载的Windows),创建第二个chrome用户,切换到该用户,安装扩展,打开'www.ru',切换第一个用户 - 在10秒后,chrome强行将我切换回第二个用户,以演示标签重新加载!

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

这是我面临的一些铬虫还是记录在案的行为?是否可以防止强行帐户切换?对于我来说,在某些内容中被打断只是为了显示网络抓取工具帐户中的某些网络抓取工具扩展程序没有响应并重新加载它是非常不愉快的:(。

1 个答案:

答案 0 :(得分:1)

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

如果这是真的,那么不是在杀死其过程后重新加载标签,也许你可以这样做:

  1. 记住即将被杀死的标签的网址。
  2. 终止进程并关闭标签或关闭标签。
  3. chrome.tabs.create({url:savedUrl,active:false})。
  4. 这可能会产生一些其他不良副作用,例如丢失会话cookie。但是在不了解您的用例的情况下,这似乎是您尝试做的事情的等效方法。

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