зеркало из https://github.com/mozilla/gecko-dev.git
Bug 952456 - Part 2: Support copy image in BrowserElement. r=kchen
Add a new context menu option, copy image. --HG-- extra : histedit_source : 5af95cb5fa11727ad1034fcbe5fb855d914b2b62
This commit is contained in:
Родитель
23d97dce8d
Коммит
e10bf5f2e9
|
@ -63,6 +63,7 @@ const OBSERVED_EVENTS = [
|
||||||
const COMMAND_MAP = {
|
const COMMAND_MAP = {
|
||||||
'cut': 'cmd_cut',
|
'cut': 'cmd_cut',
|
||||||
'copy': 'cmd_copyAndCollapseToEnd',
|
'copy': 'cmd_copyAndCollapseToEnd',
|
||||||
|
'copyImage': 'cmd_copyImage',
|
||||||
'paste': 'cmd_paste',
|
'paste': 'cmd_paste',
|
||||||
'selectall': 'cmd_selectAll'
|
'selectall': 'cmd_selectAll'
|
||||||
};
|
};
|
||||||
|
@ -855,6 +856,11 @@ BrowserElementChild.prototype = {
|
||||||
var elem = e.target;
|
var elem = e.target;
|
||||||
var menuData = {systemTargets: [], contextmenu: null};
|
var menuData = {systemTargets: [], contextmenu: null};
|
||||||
var ctxMenuId = 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) {
|
while (elem && elem.parentNode) {
|
||||||
var ctxData = this._getSystemCtxMenuData(elem);
|
var ctxData = this._getSystemCtxMenuData(elem);
|
||||||
|
@ -868,14 +874,21 @@ BrowserElementChild.prototype = {
|
||||||
if (!ctxMenuId && 'hasAttribute' in elem && elem.hasAttribute('contextmenu')) {
|
if (!ctxMenuId && 'hasAttribute' in elem && elem.hasAttribute('contextmenu')) {
|
||||||
ctxMenuId = elem.getAttribute('contextmenu');
|
ctxMenuId = elem.getAttribute('contextmenu');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable copy image option
|
||||||
|
if (elem.nodeName == 'IMG') {
|
||||||
|
hasImgElement = true;
|
||||||
|
}
|
||||||
|
|
||||||
elem = elem.parentNode;
|
elem = elem.parentNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctxMenuId || hasImgElement) {
|
||||||
|
var menu = null;
|
||||||
if (ctxMenuId) {
|
if (ctxMenuId) {
|
||||||
var menu = e.target.ownerDocument.getElementById(ctxMenuId);
|
menu = e.target.ownerDocument.getElementById(ctxMenuId);
|
||||||
if (menu) {
|
|
||||||
menuData.contextmenu = this._buildMenuObj(menu, '');
|
|
||||||
}
|
}
|
||||||
|
menuData.contextmenu = this._buildMenuObj(menu, '', hasImgElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass along the position where the context menu should be located
|
// Pass along the position where the context menu should be located
|
||||||
|
@ -1208,22 +1221,29 @@ BrowserElementChild.prototype = {
|
||||||
|
|
||||||
_recvFireCtxCallback: function(data) {
|
_recvFireCtxCallback: function(data) {
|
||||||
debug("Received fireCtxCallback message: (" + data.json.menuitem + ")");
|
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[data.json.menuitem].click();
|
||||||
this._ctxHandlers = {};
|
this._ctxHandlers = {};
|
||||||
} else {
|
} else {
|
||||||
|
// We silently ignore if the embedder uses an incorrect id in the callback
|
||||||
debug("Ignored invalid contextmenu invocation");
|
debug("Ignored invalid contextmenu invocation");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildMenuObj: function(menu, idPrefix) {
|
_buildMenuObj: function(menu, idPrefix, hasImgElement) {
|
||||||
var menuObj = {type: 'menu', items: []};
|
var menuObj = {type: 'menu', items: []};
|
||||||
|
// Customized context menu
|
||||||
|
if (menu) {
|
||||||
this._maybeCopyAttribute(menu, menuObj, 'label');
|
this._maybeCopyAttribute(menu, menuObj, 'label');
|
||||||
|
|
||||||
for (var i = 0, child; child = menu.children[i++];) {
|
for (var i = 0, child; child = menu.children[i++];) {
|
||||||
if (child.nodeName === 'MENU') {
|
if (child.nodeName === 'MENU') {
|
||||||
menuObj.items.push(this._buildMenuObj(child, idPrefix + i + '_'));
|
menuObj.items.push(this._buildMenuObj(child, idPrefix + i + '_', false));
|
||||||
} else if (child.nodeName === 'MENUITEM') {
|
} else if (child.nodeName === 'MENUITEM') {
|
||||||
var id = this._ctxCounter + '_' + idPrefix + i;
|
var id = this._ctxCounter + '_' + idPrefix + i;
|
||||||
var menuitem = {id: id, type: 'menuitem'};
|
var menuitem = {id: id, type: 'menuitem'};
|
||||||
|
@ -1233,6 +1253,12 @@ BrowserElementChild.prototype = {
|
||||||
menuObj.items.push(menuitem);
|
menuObj.items.push(menuitem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// "Copy Image" menu item
|
||||||
|
if (hasImgElement) {
|
||||||
|
menuObj.items.push({id: 'copy-image'});
|
||||||
|
}
|
||||||
|
|
||||||
return menuObj;
|
return menuObj;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче