☠☠ backed out by 3ef1a1856a3f ☠ ☠ | |
author | Boris Chiou <boris.chiou@gmail.com> |
Mon, 17 Aug 2015 15:49:20 -0700 | |
changeset 258190 | 3e5d45dcd5c6f088b9be5188736d259c9cca7f4a |
parent 258189 | e00a383520f6f414ca595d5e3dff8be5da4dfe7f |
child 258191 | df6e7f025c654258e800ff50acb66d0a4bfc8f8f |
push id | 63843 |
push user | ryanvm@gmail.com |
push date | Tue, 18 Aug 2015 14:58:06 +0000 |
treeherder | mozilla-inbound@d55e24c983aa [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | kchen |
bugs | 952456 |
milestone | 43.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/browser-element/BrowserElementChildPreload.js +++ b/dom/browser-element/BrowserElementChildPreload.js @@ -58,16 +58,17 @@ const OBSERVED_EVENTS = [ 'audio-playback', 'activity-done', 'invalid-widget' ]; const COMMAND_MAP = { 'cut': 'cmd_cut', 'copy': 'cmd_copyAndCollapseToEnd', + 'copyImage': 'cmd_copyImage', 'paste': 'cmd_paste', 'selectall': 'cmd_selectAll' }; /** * The BrowserElementChild implements one half of <iframe mozbrowser>. * (The other half is, unsurprisingly, BrowserElementParent.) * @@ -850,37 +851,49 @@ BrowserElementChild.prototype = { } this._ctxCounter++; this._ctxHandlers = {}; var elem = e.target; var menuData = {systemTargets: [], contextmenu: null}; var ctxMenuId = null; + var hasImgElement = false; + + // Set the event target as the copy image command needs it to + // determine what was context-clicked on. + docShell.contentViewer.QueryInterface(Ci.nsIContentViewerEdit).setCommandNode(elem); while (elem && elem.parentNode) { var ctxData = this._getSystemCtxMenuData(elem); if (ctxData) { menuData.systemTargets.push({ nodeName: elem.nodeName, data: ctxData }); } if (!ctxMenuId && 'hasAttribute' in elem && elem.hasAttribute('contextmenu')) { ctxMenuId = elem.getAttribute('contextmenu'); } + + // Enable copy image option + if (elem.nodeName == 'IMG') { + hasImgElement = true; + } + elem = elem.parentNode; } - if (ctxMenuId) { - var menu = e.target.ownerDocument.getElementById(ctxMenuId); - if (menu) { - menuData.contextmenu = this._buildMenuObj(menu, ''); + if (ctxMenuId || hasImgElement) { + var menu = null; + if (ctxMenuId) { + menu = e.target.ownerDocument.getElementById(ctxMenuId); } + menuData.contextmenu = this._buildMenuObj(menu, '', hasImgElement); } // Pass along the position where the context menu should be located menuData.clientX = e.clientX; menuData.clientY = e.clientY; // The value returned by the contextmenu sync call is true if the embedder // called preventDefault() on its contextmenu event. @@ -1203,41 +1216,54 @@ BrowserElementChild.prototype = { id: domRequestID, successRv: blob }); }, mimeType); }, _recvFireCtxCallback: function(data) { debug("Received fireCtxCallback message: (" + data.json.menuitem + ")"); - // We silently ignore if the embedder uses an incorrect id in the callback - if (data.json.menuitem in this._ctxHandlers) { + + if (data.json.menuitem == 'copy-image') { + // Set command + data.json.command = 'copyImage'; + this._recvDoCommand(data); + } else if (data.json.menuitem in this._ctxHandlers) { this._ctxHandlers[data.json.menuitem].click(); this._ctxHandlers = {}; } else { + // We silently ignore if the embedder uses an incorrect id in the callback debug("Ignored invalid contextmenu invocation"); } }, - _buildMenuObj: function(menu, idPrefix) { + _buildMenuObj: function(menu, idPrefix, hasImgElement) { var menuObj = {type: 'menu', items: []}; - this._maybeCopyAttribute(menu, menuObj, 'label'); + // Customized context menu + if (menu) { + this._maybeCopyAttribute(menu, menuObj, 'label'); - for (var i = 0, child; child = menu.children[i++];) { - if (child.nodeName === 'MENU') { - menuObj.items.push(this._buildMenuObj(child, idPrefix + i + '_')); - } else if (child.nodeName === 'MENUITEM') { - var id = this._ctxCounter + '_' + idPrefix + i; - var menuitem = {id: id, type: 'menuitem'}; - this._maybeCopyAttribute(child, menuitem, 'label'); - this._maybeCopyAttribute(child, menuitem, 'icon'); - this._ctxHandlers[id] = child; - menuObj.items.push(menuitem); + for (var i = 0, child; child = menu.children[i++];) { + if (child.nodeName === 'MENU') { + menuObj.items.push(this._buildMenuObj(child, idPrefix + i + '_', false)); + } else if (child.nodeName === 'MENUITEM') { + var id = this._ctxCounter + '_' + idPrefix + i; + var menuitem = {id: id, type: 'menuitem'}; + this._maybeCopyAttribute(child, menuitem, 'label'); + this._maybeCopyAttribute(child, menuitem, 'icon'); + this._ctxHandlers[id] = child; + menuObj.items.push(menuitem); + } } } + // "Copy Image" menu item + if (hasImgElement) { + menuObj.items.push({id: 'copy-image'}); + } + return menuObj; }, _recvSetVisible: function(data) { debug("Received setVisible message: (" + data.json.visible + ")"); if (this._forcedVisible == data.json.visible) { return; }