| Index: chrome/ext/background.js |
| =================================================================== |
| --- a/chrome/ext/background.js |
| +++ b/chrome/ext/background.js |
| @@ -25,6 +25,7 @@ |
| this._url = tab.url; |
| this.browserAction = new BrowserAction(tab.id); |
| + this.contextMenus = new ContextMenus(this); |
| }; |
| Page.prototype = { |
| get url() |
| @@ -167,6 +168,74 @@ |
| }; |
| + /* Context menus */ |
| + |
| + var contextMenuItems = new ext.PageMap(); |
| + var contextMenuUpdating = false; |
| + |
| + var updateContextMenu = function() |
| + { |
| + if (contextMenuUpdating) |
| + return; |
| + |
| + contextMenuUpdating = true; |
| + |
| + chrome.tabs.query({active: true, lastFocusedWindow: true}, function(tabs) |
| + { |
| + chrome.contextMenus.removeAll(function() |
| + { |
| + contextMenuUpdating = false; |
| + |
| + if (tabs.length == 0) |
| + return; |
| + |
| + var items = contextMenuItems.get({_id: tabs[0].id}); |
| + |
| + if (!items) |
| + return; |
| + |
| + for (var i = 0; i < items.length; i++) |
| + { |
| + chrome.contextMenus.create({ |
| + title: items[i].title, |
| + contexts: items[i].contexts, |
| + onclick: items[i].onclick |
| + }); |
| + } |
| + }); |
| + }); |
| + }; |
| + |
| + var ContextMenus = function(page) |
| + { |
| + this._page = page; |
| + }; |
| + ContextMenus.prototype = { |
| + create: function(item) |
| + { |
| + var items = contextMenuItems.get(this._page); |
| + if (!items) |
| + contextMenuItems.set(this._page, items = []); |
| + |
| + items.push(item); |
| + updateContextMenu(); |
|
Wladimir Palant
2014/04/25 11:35:50
How many unnecessary updates will this trigger whe
Sebastian Noack
2014/04/25 11:48:03
This was considered and addressed by baling out in
|
| + }, |
| + removeAll: function() |
| + { |
| + contextMenuItems.delete(this._page); |
| + updateContextMenu(); |
| + } |
| + }; |
| + |
| + chrome.tabs.onActivated.addListener(updateContextMenu); |
| + |
| + chrome.windows.onFocusChanged.addListener(function(windowId) |
| + { |
| + if (windowId != chrome.windows.WINDOW_ID_NONE) |
| + updateContextMenu(); |
| + }); |
| + |
| + |
| /* Web requests */ |
| var framesOfTabs = {__proto__: null}; |
| @@ -260,59 +329,6 @@ |
| }, {urls: ["<all_urls>"]}, ["blocking"]); |
| - /* Context menus */ |
| - |
| - var contextMenuItems = []; |
| - var isContextMenuHidden = true; |
| - |
| - ext.contextMenus = { |
| - addMenuItem: function(title, contexts, onclick) |
| - { |
| - contextMenuItems.push({ |
| - title: title, |
| - contexts: contexts, |
| - onclick: function(info, tab) |
| - { |
| - onclick(info.srcUrl, new Page(tab)); |
| - } |
| - }); |
| - this.showMenuItems(); |
| - }, |
| - removeMenuItems: function() |
| - { |
| - contextMenuItems = []; |
| - this.hideMenuItems(); |
| - }, |
| - showMenuItems: function() |
| - { |
| - if (!isContextMenuHidden) |
| - return; |
| - |
| - chrome.contextMenus.removeAll(function() |
| - { |
| - for (var i = 0; i < contextMenuItems.length; i++) |
| - { |
| - var item = contextMenuItems[i]; |
| - chrome.contextMenus.create({ |
| - title: item.title, |
| - contexts: item.contexts, |
| - onclick: item.onclick |
| - }); |
| - } |
| - }); |
| - isContextMenuHidden = false; |
| - }, |
| - hideMenuItems: function() |
| - { |
| - if (isContextMenuHidden) |
| - return; |
| - |
| - chrome.contextMenus.removeAll(); |
| - isContextMenuHidden = true; |
| - } |
| - }; |
| - |
| - |
| /* Message passing */ |
| chrome.runtime.onMessage.addListener(function(message, rawSender, sendResponse) |