Bug 1454627 - Run "onclick" event of menu with user input draft
authorRob Wu <rob@robwu.nl>
Fri, 27 Jul 2018 19:06:00 +0200
changeset 823588 d6615b72024bc50895196cf89ae932ef24daf171
parent 823587 4b259c8ce29699000ef607494cbb1d32d194c252
child 824659 b9523b730c5bda5e77ede416b19db8df0fa20e2d
child 825037 0c622646c0bf5827ffcb459d316cded0177a4dc3
push id117739
push userbmo:rob@robwu.nl
push dateFri, 27 Jul 2018 17:14:40 +0000
bugs1454627
milestone63.0a1
Bug 1454627 - Run "onclick" event of menu with user input MozReview-Commit-ID: r1URJfOKUB
browser/components/extensions/child/ext-menus.js
browser/components/extensions/test/browser/browser_ext_user_events.js
--- a/browser/components/extensions/child/ext-menus.js
+++ b/browser/components/extensions/child/ext-menus.js
@@ -27,17 +27,17 @@ class ContextMenusClickPropHandler {
   // A listener on contextMenus.onClicked that forwards the event to the only
   // listener, if any.
   dispatchEvent(info, tab) {
     let onclick = this.onclickMap.get(info.menuItemId);
     if (onclick) {
       // No need for runSafe or anything because we are already being run inside
       // an event handler -- the event is just being forwarded to the actual
       // handler.
-      onclick(info, tab);
+      withHandlingUserInput(this.context.contentWindow, () => onclick(info, tab));
     }
   }
 
   // Sets the `onclick` handler for the given menu item.
   // The `onclick` function MUST be owned by `this.context`.
   setListener(id, onclick) {
     if (this.onclickMap.size === 0) {
       this.context.childManager.getParentEvent("menusInternal.onClicked").addListener(this.dispatchEvent);
--- a/browser/components/extensions/test/browser/browser_ext_user_events.js
+++ b/browser/components/extensions/test/browser/browser_ext_user_events.js
@@ -42,28 +42,37 @@ add_task(async function testSources() {
         }
       }
 
       let tabs = await browser.tabs.query({active: true, currentWindow: true});
       await browser.pageAction.show(tabs[0].id);
 
       browser.pageAction.onClicked.addListener(() => request("bookmarks"));
       browser.browserAction.onClicked.addListener(() => request("tabs"));
-      browser.contextMenus.onClicked.addListener(() => request("webNavigation"));
 
       browser.test.onMessage.addListener(msg => {
+        if (msg === "contextMenus.update") {
+          browser.contextMenus.onClicked.addListener(() => request("webNavigation"));
+          browser.contextMenus.update("menu", {
+            title: "test user events in onClicked",
+            onclick: null,
+          }, () => browser.test.sendMessage("contextMenus.update-done"));
+        }
         if (msg === "openOptionsPage") {
           browser.runtime.openOptionsPage();
         }
       });
 
       browser.contextMenus.create({
         id: "menu",
-        title: "test user events",
+        title: "test user events in onclick",
         contexts: ["page"],
+        onclick() {
+          request("cookies");
+        },
       }, () => {
         browser.test.sendMessage("actions-ready");
       });
     },
 
     files: {
       "options.html": `<!DOCTYPE html>
         <html lang="en">
@@ -106,17 +115,17 @@ add_task(async function testSources() {
         }, {once: true});
       },
     },
 
     manifest: {
       browser_action: {default_title: "test"},
       page_action: {default_title: "test"},
       permissions: ["contextMenus"],
-      optional_permissions: ["bookmarks", "tabs", "webNavigation", "webRequest"],
+      optional_permissions: ["bookmarks", "tabs", "webNavigation", "webRequest", "cookies"],
       options_ui: {page: "options.html"},
       content_security_policy: "script-src 'self' https://example.com; object-src 'none';",
     },
 
     useAddonManager: "temporary",
   });
 
   async function check(what) {
@@ -148,20 +157,28 @@ add_task(async function testSources() {
   promisePopupNotificationShown("addon-webext-permissions").then(panel => {
     panel.button.click();
   });
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
   gBrowser.selectedTab = tab;
 
   let menu = await openContextMenu("body");
-  let items = menu.getElementsByAttribute("label", "test user events");
+  let items = menu.getElementsByAttribute("label", "test user events in onclick");
   is(items.length, 1, "Found context menu item");
   EventUtils.synthesizeMouseAtCenter(items[0], {});
-  await check("context menu click");
+  await check("context menu in onclick");
+
+  extension.sendMessage("contextMenus.update");
+  await extension.awaitMessage("contextMenus.update-done");
+  menu = await openContextMenu("body");
+  items = menu.getElementsByAttribute("label", "test user events in onClicked");
+  is(items.length, 1, "Found context menu item again");
+  EventUtils.synthesizeMouseAtCenter(items[0], {});
+  await check("context menu in onClicked");
 
   extension.sendMessage("openOptionsPage");
   promisePopupNotificationShown("addon-webext-permissions").then(panel => {
     panel.button.click();
   });
   await check("options page link click");
 
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);