Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/filterComposer.js

Issue 29894584: Issue 6948 - Begun simplifying the "block element" context menu logic (Closed)
Patch Set: Created Sept. 28, 2018, 3:21 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ext/background.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/filterComposer.js
diff --git a/lib/filterComposer.js b/lib/filterComposer.js
index b12a56b6e9bff4c57875506d0e889f2b84ebe1e2..fe5dcdf3071e1762e31cfb4e4bd461a67bbcac23 100644
--- a/lib/filterComposer.js
+++ b/lib/filterComposer.js
@@ -28,19 +28,6 @@ const {getKey, checkWhitelisted} = require("./whitelisting");
const {port} = require("./messaging");
const info = require("info");
-let readyPages = new ext.PageMap();
-
-/**
- * Checks whether the given page is ready to use the filter composer
- *
- * @param {Page} page
- * @return {boolean}
- */
-exports.isPageReady = page =>
kzar 2018/09/28 15:37:34 I coudln't see where `isPageReady` was being used
-{
- return readyPages.has(page);
-};
-
function isValidString(s)
{
return s && s.indexOf("\0") == -1;
@@ -164,53 +151,6 @@ function composeFilters(details)
return {filters, selectors};
}
-let contextMenuItem = {
- title: browser.i18n.getMessage("block_element"),
- contexts: ["image", "video", "audio"],
- onclick(page)
- {
- page.sendMessage({type: "composer.content.contextMenuClicked"});
- }
-};
-
-function updateContextMenu(page, filter)
-{
- page.contextMenus.remove(contextMenuItem);
-
- if (typeof filter == "undefined")
- filter = checkWhitelisted(page);
-
- // We don't support the filter composer on Firefox for Android, because the
- // user experience on mobile is quite different.
- if (info.application != "fennec" &&
- !filter && Prefs.shouldShowBlockElementMenu && readyPages.has(page))
- {
- page.contextMenus.create(contextMenuItem);
- }
-}
-
-filterNotifier.on("page.WhitelistingStateRevalidate", updateContextMenu);
-
-Prefs.on("shouldShowBlockElementMenu", () =>
-{
- browser.tabs.query({}, tabs =>
- {
- for (let tab of tabs)
- updateContextMenu(new ext.Page(tab));
- });
-});
-
-port.on("composer.isPageReady", (message, sender) =>
-{
- return readyPages.has(new ext.Page({id: message.pageId}));
-});
-
-port.on("composer.ready", (message, sender) =>
-{
- readyPages.set(sender.page, null);
- updateContextMenu(sender.page);
-});
-
port.on("composer.openDialog", (message, sender) =>
{
return browser.windows.create({
@@ -338,3 +278,90 @@ ext.pages.onLoading.addListener(page =>
page.id, {type: "composer.content.finished"}
).catch(() => {});
});
+
+
+/* Context menu and popup button */
+
+let readyActivePages = new ext.PageMap();
+let showingContextMenu = false;
+
+function showOrHideContextMenu(activePage)
+{
+ // Firefox for Android does not support browser.contextMenus.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1269062
+ if (!("contextMenus" in browser))
+ return;
+
+ let shouldShowContextMenu = Prefs.shouldShowBlockElementMenu &&
+ readyActivePages.get(activePage);
+
+ if (shouldShowContextMenu && !showingContextMenu)
kzar 2018/09/28 15:37:34 The previous logic wasn't great, I noticed it was
+ {
+ browser.contextMenus.create({
kzar 2018/09/28 15:37:34 I originally kept the `contextMenuItem` variable,
+ id: "block_element",
+ title: browser.i18n.getMessage("block_element"),
+ contexts: ["image", "video", "audio"],
+ onclick(itemInfo, tab)
+ {
+ let page = new ext.Page(tab);
+ page.sendMessage({type: "composer.content.contextMenuClicked"});
+ }
+ });
+ showingContextMenu = true;
+ }
+ else if (!shouldShowContextMenu && showingContextMenu)
+ {
+ browser.contextMenus.remove("block_element");
+ showingContextMenu = false;
+ }
+}
+
+function updateContextMenu(updatedPage)
+{
+ browser.tabs.query({active: true, lastFocusedWindow: true}).then(tabs =>
+ {
+ if (tabs.length > 0 && (!updatedPage || updatedPage.id == tabs[0].id))
+ showOrHideContextMenu(updatedPage || new ext.Page(tabs[0]));
+ });
+}
+
+browser.tabs.onActivated.addListener(activeInfo =>
+{
+ showOrHideContextMenu(new ext.Page({id: activeInfo.tabId}));
+});
+
+// Firefox for Android does not support browser.windows.
kzar 2018/09/28 15:37:34 Like we discussed, it's kind of pointless to worry
+// https://issues.adblockplus.org/ticket/5347
+if ("windows" in browser)
+{
+ browser.windows.onFocusChanged.addListener(windowId =>
+ {
+ if (windowId != browser.windows.WINDOW_ID_NONE)
+ updateContextMenu();
+ });
+}
+
+filterNotifier.on("page.WhitelistingStateRevalidate", (page, filter) =>
+{
+ if (readyActivePages.has(page))
+ {
+ readyActivePages.set(page, !filter);
+ updateContextMenu(page);
+ }
+});
+
+Prefs.on("shouldShowBlockElementMenu", () =>
+{
+ updateContextMenu();
+});
+
+port.on("composer.isPageReady", (message, sender) =>
+{
+ return readyActivePages.has(new ext.Page({id: message.pageId}));
+});
+
+port.on("composer.ready", (message, sender) =>
+{
+ readyActivePages.set(sender.page, !checkWhitelisted(sender.page));
+ updateContextMenu(sender.page);
+});
« no previous file with comments | « ext/background.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld