Index: third_party/WebKit/Source/devtools/front_end/ui/ContextMenu.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/ContextMenu.js b/third_party/WebKit/Source/devtools/front_end/ui/ContextMenu.js |
index 979c8ef911efcd41e757159a936aa3807eda950a..a59ca5669f3eb8962f39f95ad05d902e69a30f88 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/ui/ContextMenu.js |
+++ b/third_party/WebKit/Source/devtools/front_end/ui/ContextMenu.js |
@@ -27,281 +27,263 @@ |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
- |
/** |
- * @constructor |
- * @param {?WebInspector.ContextMenu} topLevelMenu |
- * @param {string} type |
- * @param {string=} label |
- * @param {boolean=} disabled |
- * @param {boolean=} checked |
+ * @unrestricted |
*/ |
-WebInspector.ContextMenuItem = function(topLevelMenu, type, label, disabled, checked) |
-{ |
+WebInspector.ContextMenuItem = class { |
+ /** |
+ * @param {?WebInspector.ContextMenu} topLevelMenu |
+ * @param {string} type |
+ * @param {string=} label |
+ * @param {boolean=} disabled |
+ * @param {boolean=} checked |
+ */ |
+ constructor(topLevelMenu, type, label, disabled, checked) { |
this._type = type; |
this._label = label; |
this._disabled = disabled; |
this._checked = checked; |
this._contextMenu = topLevelMenu; |
- if (type === "item" || type === "checkbox") |
- this._id = topLevelMenu ? topLevelMenu._nextId() : 0; |
-}; |
- |
-WebInspector.ContextMenuItem.prototype = { |
- /** |
- * @return {number} |
- */ |
- id: function() |
- { |
- return this._id; |
- }, |
- |
- /** |
- * @return {string} |
- */ |
- type: function() |
- { |
- return this._type; |
- }, |
- |
- /** |
- * @return {boolean} |
- */ |
- isEnabled: function() |
- { |
- return !this._disabled; |
- }, |
- |
- /** |
- * @param {boolean} enabled |
- */ |
- setEnabled: function(enabled) |
- { |
- this._disabled = !enabled; |
- }, |
- |
- /** |
- * @return {!InspectorFrontendHostAPI.ContextMenuDescriptor} |
- */ |
- _buildDescriptor: function() |
- { |
- switch (this._type) { |
- case "item": |
- var result = { type: "item", id: this._id, label: this._label, enabled: !this._disabled }; |
- if (this._customElement) |
- result.element = this._customElement; |
- if (this._shortcut) |
- result.shortcut = this._shortcut; |
- return result; |
- case "separator": |
- return { type: "separator" }; |
- case "checkbox": |
- return { type: "checkbox", id: this._id, label: this._label, checked: !!this._checked, enabled: !this._disabled }; |
- } |
- throw new Error("Invalid item type:" + this._type); |
- }, |
- |
- /** |
- * @param {string} shortcut |
- */ |
- setShortcut: function(shortcut) |
- { |
- this._shortcut = shortcut; |
+ if (type === 'item' || type === 'checkbox') |
+ this._id = topLevelMenu ? topLevelMenu._nextId() : 0; |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ id() { |
+ return this._id; |
+ } |
+ |
+ /** |
+ * @return {string} |
+ */ |
+ type() { |
+ return this._type; |
+ } |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ isEnabled() { |
+ return !this._disabled; |
+ } |
+ |
+ /** |
+ * @param {boolean} enabled |
+ */ |
+ setEnabled(enabled) { |
+ this._disabled = !enabled; |
+ } |
+ |
+ /** |
+ * @return {!InspectorFrontendHostAPI.ContextMenuDescriptor} |
+ */ |
+ _buildDescriptor() { |
+ switch (this._type) { |
+ case 'item': |
+ var result = {type: 'item', id: this._id, label: this._label, enabled: !this._disabled}; |
+ if (this._customElement) |
+ result.element = this._customElement; |
+ if (this._shortcut) |
+ result.shortcut = this._shortcut; |
+ return result; |
+ case 'separator': |
+ return {type: 'separator'}; |
+ case 'checkbox': |
+ return {type: 'checkbox', id: this._id, label: this._label, checked: !!this._checked, enabled: !this._disabled}; |
} |
+ throw new Error('Invalid item type:' + this._type); |
+ } |
+ |
+ /** |
+ * @param {string} shortcut |
+ */ |
+ setShortcut(shortcut) { |
+ this._shortcut = shortcut; |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.ContextMenuItem} |
- * @param {?WebInspector.ContextMenu} topLevelMenu |
- * @param {string=} label |
- * @param {boolean=} disabled |
+ * @unrestricted |
*/ |
-WebInspector.ContextSubMenuItem = function(topLevelMenu, label, disabled) |
-{ |
- WebInspector.ContextMenuItem.call(this, topLevelMenu, "subMenu", label, disabled); |
+WebInspector.ContextSubMenuItem = class extends WebInspector.ContextMenuItem { |
+ /** |
+ * @param {?WebInspector.ContextMenu} topLevelMenu |
+ * @param {string=} label |
+ * @param {boolean=} disabled |
+ */ |
+ constructor(topLevelMenu, label, disabled) { |
+ super(topLevelMenu, 'subMenu', label, disabled); |
/** @type {!Array.<!WebInspector.ContextMenuItem>} */ |
this._items = []; |
-}; |
- |
-WebInspector.ContextSubMenuItem.prototype = { |
- /** |
- * @param {string} label |
- * @param {function(?)} handler |
- * @param {boolean=} disabled |
- * @return {!WebInspector.ContextMenuItem} |
- */ |
- appendItem: function(label, handler, disabled) |
- { |
- var item = new WebInspector.ContextMenuItem(this._contextMenu, "item", label, disabled); |
- this._pushItem(item); |
- this._contextMenu._setHandler(item.id(), handler); |
- return item; |
- }, |
- |
- /** |
- * @param {!Element} element |
- * @return {!WebInspector.ContextMenuItem} |
- */ |
- appendCustomItem: function(element) |
- { |
- var item = new WebInspector.ContextMenuItem(this._contextMenu, "item", "<custom>"); |
- item._customElement = element; |
- this._pushItem(item); |
- return item; |
- }, |
- |
- /** |
- * @param {string} actionId |
- * @param {string=} label |
- * @return {!WebInspector.ContextMenuItem} |
- */ |
- appendAction: function(actionId, label) |
- { |
- var action = WebInspector.actionRegistry.action(actionId); |
- if (!label) |
- label = action.title(); |
- var result = this.appendItem(label, action.execute.bind(action)); |
- var shortcut = WebInspector.shortcutRegistry.shortcutTitleForAction(actionId); |
- if (shortcut) |
- result.setShortcut(shortcut); |
- return result; |
- }, |
- |
- /** |
- * @param {string} label |
- * @param {boolean=} disabled |
- * @param {string=} subMenuId |
- * @return {!WebInspector.ContextSubMenuItem} |
- */ |
- appendSubMenuItem: function(label, disabled, subMenuId) |
- { |
- var item = new WebInspector.ContextSubMenuItem(this._contextMenu, label, disabled); |
- if (subMenuId) |
- this._contextMenu._namedSubMenus.set(subMenuId, item); |
- this._pushItem(item); |
- return item; |
- }, |
- |
- /** |
- * @param {string} label |
- * @param {function()} handler |
- * @param {boolean=} checked |
- * @param {boolean=} disabled |
- * @return {!WebInspector.ContextMenuItem} |
- */ |
- appendCheckboxItem: function(label, handler, checked, disabled) |
- { |
- var item = new WebInspector.ContextMenuItem(this._contextMenu, "checkbox", label, disabled, checked); |
- this._pushItem(item); |
- this._contextMenu._setHandler(item.id(), handler); |
- return item; |
- }, |
- |
- appendSeparator: function() |
- { |
- if (this._items.length) |
- this._pendingSeparator = true; |
- }, |
- |
- /** |
- * @param {!WebInspector.ContextMenuItem} item |
- */ |
- _pushItem: function(item) |
- { |
- if (this._pendingSeparator) { |
- this._items.push(new WebInspector.ContextMenuItem(this._contextMenu, "separator")); |
- delete this._pendingSeparator; |
- } |
- this._items.push(item); |
- }, |
- |
- /** |
- * @return {boolean} |
- */ |
- isEmpty: function() |
- { |
- return !this._items.length; |
- }, |
- |
- /** |
- * @override |
- * @return {!InspectorFrontendHostAPI.ContextMenuDescriptor} |
- */ |
- _buildDescriptor: function() |
- { |
- var result = { type: "subMenu", label: this._label, enabled: !this._disabled, subItems: [] }; |
- for (var i = 0; i < this._items.length; ++i) |
- result.subItems.push(this._items[i]._buildDescriptor()); |
- return result; |
- }, |
- |
+ } |
+ |
+ /** |
+ * @param {string} label |
+ * @param {function(?)} handler |
+ * @param {boolean=} disabled |
+ * @return {!WebInspector.ContextMenuItem} |
+ */ |
+ appendItem(label, handler, disabled) { |
+ var item = new WebInspector.ContextMenuItem(this._contextMenu, 'item', label, disabled); |
+ this._pushItem(item); |
+ this._contextMenu._setHandler(item.id(), handler); |
+ return item; |
+ } |
+ |
+ /** |
+ * @param {!Element} element |
+ * @return {!WebInspector.ContextMenuItem} |
+ */ |
+ appendCustomItem(element) { |
+ var item = new WebInspector.ContextMenuItem(this._contextMenu, 'item', '<custom>'); |
+ item._customElement = element; |
+ this._pushItem(item); |
+ return item; |
+ } |
+ |
+ /** |
+ * @param {string} actionId |
+ * @param {string=} label |
+ * @return {!WebInspector.ContextMenuItem} |
+ */ |
+ appendAction(actionId, label) { |
+ var action = WebInspector.actionRegistry.action(actionId); |
+ if (!label) |
+ label = action.title(); |
+ var result = this.appendItem(label, action.execute.bind(action)); |
+ var shortcut = WebInspector.shortcutRegistry.shortcutTitleForAction(actionId); |
+ if (shortcut) |
+ result.setShortcut(shortcut); |
+ return result; |
+ } |
+ |
+ /** |
+ * @param {string} label |
+ * @param {boolean=} disabled |
+ * @param {string=} subMenuId |
+ * @return {!WebInspector.ContextSubMenuItem} |
+ */ |
+ appendSubMenuItem(label, disabled, subMenuId) { |
+ var item = new WebInspector.ContextSubMenuItem(this._contextMenu, label, disabled); |
+ if (subMenuId) |
+ this._contextMenu._namedSubMenus.set(subMenuId, item); |
+ this._pushItem(item); |
+ return item; |
+ } |
+ |
+ /** |
+ * @param {string} label |
+ * @param {function()} handler |
+ * @param {boolean=} checked |
+ * @param {boolean=} disabled |
+ * @return {!WebInspector.ContextMenuItem} |
+ */ |
+ appendCheckboxItem(label, handler, checked, disabled) { |
+ var item = new WebInspector.ContextMenuItem(this._contextMenu, 'checkbox', label, disabled, checked); |
+ this._pushItem(item); |
+ this._contextMenu._setHandler(item.id(), handler); |
+ return item; |
+ } |
+ |
+ appendSeparator() { |
+ if (this._items.length) |
+ this._pendingSeparator = true; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.ContextMenuItem} item |
+ */ |
+ _pushItem(item) { |
+ if (this._pendingSeparator) { |
+ this._items.push(new WebInspector.ContextMenuItem(this._contextMenu, 'separator')); |
+ delete this._pendingSeparator; |
+ } |
+ this._items.push(item); |
+ } |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ isEmpty() { |
+ return !this._items.length; |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {!InspectorFrontendHostAPI.ContextMenuDescriptor} |
+ */ |
+ _buildDescriptor() { |
+ var result = {type: 'subMenu', label: this._label, enabled: !this._disabled, subItems: []}; |
+ for (var i = 0; i < this._items.length; ++i) |
+ result.subItems.push(this._items[i]._buildDescriptor()); |
+ return result; |
+ } |
+ |
+ /** |
+ * @param {string} location |
+ */ |
+ appendItemsAtLocation(location) { |
/** |
- * @param {string} location |
+ * @param {!WebInspector.ContextSubMenuItem} menu |
+ * @param {!Runtime.Extension} extension |
*/ |
- appendItemsAtLocation: function(location) |
- { |
- /** |
- * @param {!WebInspector.ContextSubMenuItem} menu |
- * @param {!Runtime.Extension} extension |
- */ |
- function appendExtension(menu, extension) |
- { |
- var subMenuId = extension.descriptor()["subMenuId"]; |
- if (subMenuId) { |
- var subMenuItem = menu.appendSubMenuItem(extension.title(), false, subMenuId); |
- subMenuItem.appendItemsAtLocation(subMenuId); |
- } else { |
- menu.appendAction(extension.descriptor()["actionId"]); |
- } |
- } |
- |
- // Hard-coded named groups for elements to maintain generic order. |
- var groupWeights = ["new", "open", "clipboard", "navigate", "footer"]; |
- |
- /** @type {!Map.<string, !Array.<!Runtime.Extension>>} */ |
- var groups = new Map(); |
- var extensions = self.runtime.extensions("context-menu-item"); |
- for (var extension of extensions) { |
- var itemLocation = extension.descriptor()["location"] || ""; |
- if (!itemLocation.startsWith(location + "/")) |
- continue; |
- |
- var itemGroup = itemLocation.substr(location.length + 1); |
- if (!itemGroup || itemGroup.includes("/")) |
- continue; |
- var group = groups.get(itemGroup); |
- if (!group) { |
- group = []; |
- groups.set(itemGroup, group); |
- if (groupWeights.indexOf(itemGroup) === -1) |
- groupWeights.splice(4, 0, itemGroup); |
- } |
- group.push(extension); |
- } |
- for (var groupName of groupWeights) { |
- var group = groups.get(groupName); |
- if (!group) |
- continue; |
- group.forEach(appendExtension.bind(null, this)); |
- this.appendSeparator(); |
- } |
- }, |
+ function appendExtension(menu, extension) { |
+ var subMenuId = extension.descriptor()['subMenuId']; |
+ if (subMenuId) { |
+ var subMenuItem = menu.appendSubMenuItem(extension.title(), false, subMenuId); |
+ subMenuItem.appendItemsAtLocation(subMenuId); |
+ } else { |
+ menu.appendAction(extension.descriptor()['actionId']); |
+ } |
+ } |
- __proto__: WebInspector.ContextMenuItem.prototype |
+ // Hard-coded named groups for elements to maintain generic order. |
+ var groupWeights = ['new', 'open', 'clipboard', 'navigate', 'footer']; |
+ |
+ /** @type {!Map.<string, !Array.<!Runtime.Extension>>} */ |
+ var groups = new Map(); |
+ var extensions = self.runtime.extensions('context-menu-item'); |
+ for (var extension of extensions) { |
+ var itemLocation = extension.descriptor()['location'] || ''; |
+ if (!itemLocation.startsWith(location + '/')) |
+ continue; |
+ |
+ var itemGroup = itemLocation.substr(location.length + 1); |
+ if (!itemGroup || itemGroup.includes('/')) |
+ continue; |
+ var group = groups.get(itemGroup); |
+ if (!group) { |
+ group = []; |
+ groups.set(itemGroup, group); |
+ if (groupWeights.indexOf(itemGroup) === -1) |
+ groupWeights.splice(4, 0, itemGroup); |
+ } |
+ group.push(extension); |
+ } |
+ for (var groupName of groupWeights) { |
+ var group = groups.get(groupName); |
+ if (!group) |
+ continue; |
+ group.forEach(appendExtension.bind(null, this)); |
+ this.appendSeparator(); |
+ } |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.ContextSubMenuItem} |
- * @param {!Event} event |
- * @param {boolean=} useSoftMenu |
- * @param {number=} x |
- * @param {number=} y |
+ * @unrestricted |
*/ |
-WebInspector.ContextMenu = function(event, useSoftMenu, x, y) |
-{ |
- WebInspector.ContextSubMenuItem.call(this, null, ""); |
+WebInspector.ContextMenu = class extends WebInspector.ContextSubMenuItem { |
+ /** |
+ * @param {!Event} event |
+ * @param {boolean=} useSoftMenu |
+ * @param {number=} x |
+ * @param {number=} y |
+ */ |
+ constructor(event, useSoftMenu, x, y) { |
+ super(null, ''); |
this._contextMenu = this; |
/** @type {!Array.<!Promise.<!Array.<!WebInspector.ContextMenu.Provider>>>} */ |
this._pendingPromises = []; |
@@ -315,203 +297,186 @@ WebInspector.ContextMenu = function(event, useSoftMenu, x, y) |
this._id = 0; |
/** @type {!Map<string, !WebInspector.ContextSubMenuItem>} */ |
this._namedSubMenus = new Map(); |
-}; |
+ } |
-WebInspector.ContextMenu.initialize = function() |
-{ |
+ static initialize() { |
InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SetUseSoftMenu, setUseSoftMenu); |
/** |
* @param {!WebInspector.Event} event |
*/ |
- function setUseSoftMenu(event) |
- { |
- WebInspector.ContextMenu._useSoftMenu = /** @type {boolean} */ (event.data); |
+ function setUseSoftMenu(event) { |
+ WebInspector.ContextMenu._useSoftMenu = /** @type {boolean} */ (event.data); |
} |
-}; |
+ } |
-/** |
- * @param {!Document} doc |
- */ |
-WebInspector.ContextMenu.installHandler = function(doc) |
-{ |
- doc.body.addEventListener("contextmenu", handler, false); |
+ /** |
+ * @param {!Document} doc |
+ */ |
+ static installHandler(doc) { |
+ doc.body.addEventListener('contextmenu', handler, false); |
/** |
* @param {!Event} event |
*/ |
- function handler(event) |
- { |
- var contextMenu = new WebInspector.ContextMenu(event); |
- contextMenu.appendApplicableItems(/** @type {!Object} */ (event.deepElementFromPoint())); |
- contextMenu.show(); |
+ function handler(event) { |
+ var contextMenu = new WebInspector.ContextMenu(event); |
+ contextMenu.appendApplicableItems(/** @type {!Object} */ (event.deepElementFromPoint())); |
+ contextMenu.show(); |
} |
-}; |
- |
-WebInspector.ContextMenu.prototype = { |
- /** |
- * @return {number} |
- */ |
- _nextId: function() |
- { |
- return this._id++; |
- }, |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ _nextId() { |
+ return this._id++; |
+ } |
+ |
+ /** |
+ * @param {function()} callback |
+ */ |
+ beforeShow(callback) { |
+ this._beforeShow = callback; |
+ } |
+ |
+ show() { |
+ Promise.all(this._pendingPromises).then(populate.bind(this)).then(this._innerShow.bind(this)); |
+ WebInspector.ContextMenu._pendingMenu = this; |
/** |
- * @param {function()} callback |
+ * @param {!Array.<!Array.<!WebInspector.ContextMenu.Provider>>} appendCallResults |
+ * @this {WebInspector.ContextMenu} |
*/ |
- beforeShow: function(callback) |
- { |
- this._beforeShow = callback; |
- }, |
- |
- show: function() |
- { |
- Promise.all(this._pendingPromises).then(populate.bind(this)).then(this._innerShow.bind(this)); |
- WebInspector.ContextMenu._pendingMenu = this; |
- |
- /** |
- * @param {!Array.<!Array.<!WebInspector.ContextMenu.Provider>>} appendCallResults |
- * @this {WebInspector.ContextMenu} |
- */ |
- function populate(appendCallResults) |
- { |
- if (WebInspector.ContextMenu._pendingMenu !== this) |
- return; |
- delete WebInspector.ContextMenu._pendingMenu; |
- |
- for (var i = 0; i < appendCallResults.length; ++i) { |
- var providers = appendCallResults[i]; |
- var target = this._pendingTargets[i]; |
- |
- for (var j = 0; j < providers.length; ++j) { |
- var provider = /** @type {!WebInspector.ContextMenu.Provider} */ (providers[j]); |
- this.appendSeparator(); |
- provider.appendApplicableItems(this._event, this, target); |
- this.appendSeparator(); |
- } |
- } |
- |
- this._pendingPromises = []; |
- this._pendingTargets = []; |
- } |
- |
- this._event.consume(true); |
- }, |
- |
- discard: function() |
- { |
- if (this._softMenu) |
- this._softMenu.discard(); |
- }, |
- |
- _innerShow: function() |
- { |
- if (typeof this._beforeShow === "function") { |
- this._beforeShow(); |
- delete this._beforeShow; |
- } |
- |
- var menuObject = this._buildDescriptors(); |
- |
- WebInspector._contextMenu = this; |
- if (this._useSoftMenu || WebInspector.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode()) { |
- this._softMenu = new WebInspector.SoftContextMenu(menuObject, this._itemSelected.bind(this)); |
- this._softMenu.show(this._event.target.ownerDocument, this._x, this._y); |
- } else { |
- InspectorFrontendHost.showContextMenuAtPoint(this._x, this._y, menuObject, this._event.target.ownerDocument); |
- |
- /** |
- * @this {WebInspector.ContextMenu} |
- */ |
- function listenToEvents() |
- { |
- InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this); |
- InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this); |
- } |
- |
- // showContextMenuAtPoint call above synchronously issues a clear event for previous context menu (if any), |
- // so we skip it before subscribing to the clear event. |
- setImmediate(listenToEvents.bind(this)); |
+ function populate(appendCallResults) { |
+ if (WebInspector.ContextMenu._pendingMenu !== this) |
+ return; |
+ delete WebInspector.ContextMenu._pendingMenu; |
+ |
+ for (var i = 0; i < appendCallResults.length; ++i) { |
+ var providers = appendCallResults[i]; |
+ var target = this._pendingTargets[i]; |
+ |
+ for (var j = 0; j < providers.length; ++j) { |
+ var provider = /** @type {!WebInspector.ContextMenu.Provider} */ (providers[j]); |
+ this.appendSeparator(); |
+ provider.appendApplicableItems(this._event, this, target); |
+ this.appendSeparator(); |
} |
- }, |
+ } |
- /** |
- * @param {number} id |
- * @param {function(?)} handler |
- */ |
- _setHandler: function(id, handler) |
- { |
- if (handler) |
- this._handlers[id] = handler; |
- }, |
- |
- /** |
- * @return {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} |
- */ |
- _buildDescriptors: function() |
- { |
- var result = []; |
- for (var i = 0; i < this._items.length; ++i) |
- result.push(this._items[i]._buildDescriptor()); |
- return result; |
- }, |
- |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _onItemSelected: function(event) |
- { |
- this._itemSelected(/** @type {string} */ (event.data)); |
- }, |
+ this._pendingPromises = []; |
+ this._pendingTargets = []; |
+ } |
- /** |
- * @param {string} id |
- */ |
- _itemSelected: function(id) |
- { |
- if (this._handlers[id]) |
- this._handlers[id].call(this); |
- this._menuCleared(); |
- }, |
- |
- _menuCleared: function() |
- { |
- InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this); |
- InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this); |
- }, |
+ this._event.consume(true); |
+ } |
- /** |
- * @param {!Object} target |
- */ |
- appendApplicableItems: function(target) |
- { |
- this._pendingPromises.push(self.runtime.allInstances(WebInspector.ContextMenu.Provider, target)); |
- this._pendingTargets.push(target); |
- }, |
+ discard() { |
+ if (this._softMenu) |
+ this._softMenu.discard(); |
+ } |
- /** |
- * @param {string} name |
- * @return {?WebInspector.ContextSubMenuItem} |
- */ |
- namedSubMenu: function(name) |
- { |
- return this._namedSubMenus.get(name) || null; |
- }, |
+ _innerShow() { |
+ if (typeof this._beforeShow === 'function') { |
+ this._beforeShow(); |
+ delete this._beforeShow; |
+ } |
- __proto__: WebInspector.ContextSubMenuItem.prototype |
+ var menuObject = this._buildDescriptors(); |
+ |
+ WebInspector._contextMenu = this; |
+ if (this._useSoftMenu || WebInspector.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode()) { |
+ this._softMenu = new WebInspector.SoftContextMenu(menuObject, this._itemSelected.bind(this)); |
+ this._softMenu.show(this._event.target.ownerDocument, this._x, this._y); |
+ } else { |
+ InspectorFrontendHost.showContextMenuAtPoint(this._x, this._y, menuObject, this._event.target.ownerDocument); |
+ |
+ /** |
+ * @this {WebInspector.ContextMenu} |
+ */ |
+ function listenToEvents() { |
+ InspectorFrontendHost.events.addEventListener( |
+ InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this); |
+ InspectorFrontendHost.events.addEventListener( |
+ InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this); |
+ } |
+ |
+ // showContextMenuAtPoint call above synchronously issues a clear event for previous context menu (if any), |
+ // so we skip it before subscribing to the clear event. |
+ setImmediate(listenToEvents.bind(this)); |
+ } |
+ } |
+ |
+ /** |
+ * @param {number} id |
+ * @param {function(?)} handler |
+ */ |
+ _setHandler(id, handler) { |
+ if (handler) |
+ this._handlers[id] = handler; |
+ } |
+ |
+ /** |
+ * @return {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} |
+ */ |
+ _buildDescriptors() { |
+ var result = []; |
+ for (var i = 0; i < this._items.length; ++i) |
+ result.push(this._items[i]._buildDescriptor()); |
+ return result; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _onItemSelected(event) { |
+ this._itemSelected(/** @type {string} */ (event.data)); |
+ } |
+ |
+ /** |
+ * @param {string} id |
+ */ |
+ _itemSelected(id) { |
+ if (this._handlers[id]) |
+ this._handlers[id].call(this); |
+ this._menuCleared(); |
+ } |
+ |
+ _menuCleared() { |
+ InspectorFrontendHost.events.removeEventListener( |
+ InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this); |
+ InspectorFrontendHost.events.removeEventListener( |
+ InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this); |
+ } |
+ |
+ /** |
+ * @param {!Object} target |
+ */ |
+ appendApplicableItems(target) { |
+ this._pendingPromises.push(self.runtime.allInstances(WebInspector.ContextMenu.Provider, target)); |
+ this._pendingTargets.push(target); |
+ } |
+ |
+ /** |
+ * @param {string} name |
+ * @return {?WebInspector.ContextSubMenuItem} |
+ */ |
+ namedSubMenu(name) { |
+ return this._namedSubMenus.get(name) || null; |
+ } |
}; |
+ |
/** |
* @interface |
*/ |
-WebInspector.ContextMenu.Provider = function() { |
-}; |
+WebInspector.ContextMenu.Provider = function() {}; |
WebInspector.ContextMenu.Provider.prototype = { |
- /** |
- * @param {!Event} event |
- * @param {!WebInspector.ContextMenu} contextMenu |
- * @param {!Object} target |
- */ |
- appendApplicableItems: function(event, contextMenu, target) { } |
+ /** |
+ * @param {!Event} event |
+ * @param {!WebInspector.ContextMenu} contextMenu |
+ * @param {!Object} target |
+ */ |
+ appendApplicableItems: function(event, contextMenu, target) {} |
}; |