谷歌浏览器扩展程序:打开新标签页页面

3

我正在尝试创建一个简单的Chrome扩展程序。 它应该在“Windows系统托盘Chrome图标上下文菜单”中添加一个项目“打开新标签页”(类似于Gmail检查器加号扩展程序所做的方式;请参见下面提供的第二张图片)。

当我点击该选项时,Chrome应该(检查是否有任何窗口处于打开状态。如果有,则应)打开一个新的标签页。如果没有打开的窗口,则应打开一个新的Chrome窗口并显示新的标签页。

到目前为止我所做的:

manifest.json

{  
  "manifest_version": 2,

  "name": "Open New Tab",  
  "description": "This extension open a new tab page",  
  "version": "1.0",  
  "browser_action": {  
      "default_icon": "icon.png"
  },  
  "background":{  
    "scripts":["background.js"],  
    "persistent": false
  },  
  "permissions": [
    "background",
    "activeTab"
  ]
}

background.js

chrome.browserAction.onClicked.addListener(function(tab)   
{  
    chrome.tabs.create({ url: "chrome://newtab" });  
}
);

background.html

<html>
<head>
<script>
chrome.browserAction.onClicked.addListener(function(window)                         
{  
    chrome.windows.create({url: "chrome://newtab", type: "normal"});  
}
);
</script>
</head>
</html>

我已经加载了这个扩展程序。迄今为止,我的扩展程序对Chrome的影响如下:
1)Chrome窗口已经打开。我的图标出现在扩展程序列表中,并且可点击。enter image description here
点击后,在同一窗口中打开了一个“新标签页”。这是正确的。(虽然我现在不需要它,但暂时保留。)

2)Chrome窗口已关闭,并允许Chrome在后台运行。右键单击Chrome托盘图标。我的扩展程序菜单“打开新标签页”出现在菜单中。enter image description here
这也是正确的。单击它后,将创建一个新的Chrome窗口。(目前,我还没有检查窗口是否已存在。这将在以后进行。)

问题在于,在打开的新窗口中,Chrome自动打开“chrome://extensions”URL,而不是“新标签页”。这是错误的,我不明白为什么会打开扩展程序页面。我想打开新标签页,并传递“chrome://newtab”URL。如何让Chrome从这里打开新标签页?当我从桌面图标或Windows开始菜单启动Chrome时,Chrome可以正常工作。因此,问题似乎与我的代码有关。

感谢任何帮助。


看起来您混淆了扩展图标和浏览器操作,“打开新标签页”在您的照片中不是浏览器操作,当您单击“打开新标签页”时,实际上启动的是浏览器而不是执行您的browser action - Haibara Ai
我原本就这样想。我的意思是 'browser_action' 本身意味着你需要有一个浏览器窗口才能点击某些东西...我想要的是,在我单击上下文菜单时,打开 Chrome 窗口并显示“新建标签页”页面,如第二张图片所示。 如果 Chrome 已经打开,我可以使用标签右侧的方形按钮打开新标签页,因此我不需要那个浏览器动作。但是,我该如何在清单中为“SYS_TRAY_ICON_CLICK... something”事件指定操作? - PRinCEKtd
听一下 chrome.windows.onCreated 事件怎么样?当它被触发时,一个新窗口就会被创建,然后你可以调用 chrome.tabs.create 来创建一个新标签页。 - Haibara Ai
嗯...这是个好主意...我会尝试并回报。 - PRinCEKtd
@Haibara Ai 感谢您的想法。最终我让它工作了。chrome.windows.onCreated.addListener(function(tab) { chrome.tabs.update(null, { url: "chrome://newtab" }); }); - PRinCEKtd
现在,我希望它只能工作一次,也就是当没有窗口打开(最大化或最小化),Chrome正在后台运行并且其系统托盘图标可见时。我右键单击图标,然后选择我的菜单。新窗口弹出。到这里为止一切都好,但不知何故,它还会干扰其他网页和站点。 - PRinCEKtd
1个回答

1

监听chrome.windows.onCreated事件,当右键点击Chrome托盘图标时,会启动一个新窗口,然后您可以在事件处理程序中创建一个新选项卡。

chrome.windows.onCreated.addListener(function(window) {
    chrome.windows.getAll(function(windows) {
        if (windows.length === 1) {           
            chrome.tabs.create({windowId: window.id, url: "chrome://newtab"});
        }
    });
});

现在,我希望它只能工作一次,也就是说,在没有窗口打开(最大化或最小化)的情况下,Chrome正在后台运行,并且其系统托盘图标可见。我右键单击图标,然后选择我的菜单。新窗口弹出。到这里为止一切都很好。 - PRinCEKtd
但是不知何故,它也会干扰其他网页和站点。例如,我使用Feedly.com作为我的主要新闻阅读器。当我打开Feedly时,它会要求我登录。登录页面会作为一个新的窗口/选项卡打开。这个新窗口/选项卡创建事件也被我的扩展程序捕获,并将feedly登录页面转换为NewTab页面!!!那么,如何限制我的扩展程序仅在没有Chrome窗口时工作?我应该提出这个问题吗? - PRinCEKtd
@PRinCEKtd,请查看 https://developer.chrome.com/extensions/windows#method-getAll,您可以获取窗口数量并在创建新标签之前进行检查。 - Haibara Ai
谢谢提供链接。 - PRinCEKtd

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