故意崩溃Chrome选项卡的Chrome扩展程序

7

你好,我正在编写一个谷歌浏览器扩展程序,旨在故意崩溃一个Chrome选项卡。我的方法并不像我想要的那样有效。我正在尝试:

chrome.tabs.update({url: "about:crash"});
chrome.tabs.update({url: "chrome://crash"});
window.location = 'about:crash';
window.location = 'chrome://crash';

这些都不起作用。

但是,如果我将URL替换为像“about:blank”或“http://google.com”之类的内容,它就可以工作!

Chrome是否有某种安全措施,如果有的话…是否有解决方法?

如果可能的话,我想避免使用无限循环来过载内存。


1
我很好奇你为什么想要这样做 :) - Mitya
2
请在您的(后台)页面中检查控制台。出现以下错误消息:““在 tabs.update 过程中发生错误:对不起,我害怕我不能这样做。””。 - Rob W
1
是的,我收到了“不允许加载本地资源:chrome://crash/”和“tabs.update期间出错:对不起。我恐怕做不到。”制作这个扩展的原因是我想强制关闭所有标签以释放未使用的内存。目前我不得不在Chrome任务管理器中手动强制关闭它们。 - Andy
1
不错的《太空漫游》参考,以前从没注意到过... - Dagg Nabbit
@Andy,你完成编写那个Chrome扩展程序了吗?我发现使用chrome://crash关闭标签页(比chrome://kill更好),是唯一有效释放RAM的解决方案... - Costin Gușă
可能是如何使用JavaScript强制Chrome页面/选项卡崩溃?的重复问题。 - Camilo Martin
5个回答

7

在标签页上加载chrome://kill

例如,要关闭Chrome上的此标签页,请在URL栏中输入chrome://kill,然后按Enter键。

从Chrome 20开始,还有额外的有趣功能:chrome://favicon/size/1/http://gonna.crash.you/


这对我非常有效。有什么想法可以用按键使其“转到”chrome://kill页面吗?手写它对我来说不够快。 - Szymon Jeż
@Jeznet 好吧,除了制作一个用户脚本或Chrome扩展连接到一个键组合,你可以创建一个书签到 chrome://kill。我以为它不起作用,但它却起作用了 :) 但是...你为什么要关闭这么多页面? - Camilo Martin
由于与此评论中的原因相同:https://dev59.com/LmbWa4cB1Zd3GeqPTRx2#11588312?noredirect=1#comment15185975_11489337,@CamiloMartin这样做。 - Szymon Jeż
@Jeznet 嗯,你知道的,能救我一命的就是书签。当我有一个标签页停留太久时,我会想:“你知道吗?是时候将其加入书签并忘记它了。” - Camilo Martin
这可以从后台脚本执行。但是有一个问题。选项卡的URL会更改为chrome://kill。这意味着崩溃的选项卡无法加入书签。人们希望URL保持不变... 一种繁琐的解决方案是复制选项卡,希望新选项卡也在同一进程中启动,然后杀死该新选项卡,并在之后将其删除。 - Roland Pihlakas
显示剩余11条评论

4
我已经将其制作成了一个扩展程序,以下是相关代码:


// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
  queryInfo = new Object();
  chrome.tabs.query(queryInfo, function(result) {
    var i;
    for (i=0; i < result.length; i += 1) {
        chrome.experimental.processes.getProcessIdForTab(result[i].id, function(processId) {
            chrome.experimental.processes.terminate(processId);
        });
    }
  });
});

1
太好了!插件可以使用。你知道我怎么能让它在Chrome启动时运行,以关闭所有新标签页吗?我的目标是在Chrome启动时防止我的许多标签页占用所有系统资源,这样它们可以在需要时加载。 - Eliot
@Eliot,非常感谢您的反馈,谢谢。我搜索了“chrome扩展程序在chrome启动时运行”,但没有找到太多信息。当我经常使用它时,通常会在启动期间重复单击它。 - funroll
@funroll,提到的扩展程序对我无效。在Chrome dev版本36.0.1941.0 dev-m上尝试过了。你在Chrome dev或Canary构建中是否能正常使用它?(尝试Canary,因为它会创建一个单独的配置文件,不会干扰现有的配置文件) - Costin Gușă
@CostinGușă 好久没更新这个扩展了——如果你想让它能够与最新的Chrome一起使用,我很乐意合并拉取请求。 - funroll
@funroll,我不确定我应该做什么。我们是否可以在GitHub的问题页面上继续讨论,我可以提出一个问题吗? - Costin Gușă

4
使用实验性进程API,您可以结束进程,包括属于选项卡的进程。
我曾想过这个确切的用例 - 如果你完成了你的扩展程序,我想试试它!
虽然现在也许更好的想法是让您的后台页面根据页面将选项卡重定向到基于数据的URI。
data:text/html,<a href="http://www.google.com/">click here to restore</a>

或者是一个根据查询参数生成页面的扩展页面:
my_extension_page.html?url=http://www.google.com/

我认为这是最好的答案。虽然公共稳定版本的Chrome没有这个API,但如果该进程API进入稳定版本,则可能需要注意它。 - Andy

0

1
抱歉,那不是我要找的。那会完全关闭选项卡。我想要一种崩溃选项卡的方法。 - Andy
这将释放和释放未使用的内存,符合您想要的原因吗? - tomdemuyt
7
是的,但我希望能保留标签页,但不要占用内存。很多人会将一些标签页保持打开状态数天/数周/数月,这样会浪费大量的内存空间。我发现通过结束进程或使用about:crash使它们闪退,可以清除内存中的标签页,但稍后可以刷新标签页以重新加载之前关闭的页面。我知道这是一个奇怪的请求,但我的做法有一定的道理,真的 :)我之前忘了说,谢谢你的建议! - Andy

-2

按照这里的描述使用以下FUN FUN LOOP!

txt = "a";
while(1)
{
    txt = txt += "a";    //add as much as the browser can handle
}
//<i>[evil laugh]</i> BOOM! All memory used up, and it is now <b>CRASHED</b>!

1
如果可能的话,我想要避免用无限循环来过载内存。 - gengkev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接