This is to force all platforms to match the same behavior in GTK+.
command_id);
}
+void Menu::MenuWillShow(ui::SimpleMenuModel* source) {
+ v8::Locker locker(node_isolate);
+ v8::HandleScope handle_scope(node_isolate);
+ CallDelegate(v8::False(), GetWrapper(node_isolate), "menuWillShow", -1);
+}
+
void Menu::InsertItemAt(
int index, int command_id, const base::string16& label) {
model_->InsertItemAt(index, command_id, label);
#if defined(OS_WIN) || defined(TOOLKIT_GTK)
.SetMethod("attachToWindow", &Menu::AttachToWindow)
#endif
- .SetMethod("popup", &Menu::Popup);
+ .SetMethod("_popup", &Menu::Popup);
}
} // namespace api
virtual string16 GetLabelForCommandId(int command_id) const OVERRIDE;
virtual string16 GetSublabelForCommandId(int command_id) const OVERRIDE;
virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
+ virtual void MenuWillShow(ui::SimpleMenuModel* source) OVERRIDE;
virtual void Popup(Window* window) = 0;
@checked = @checked ? false
@submenu = @submenu ? null
- throw new Error('Unknown menu type') if MenuItem.types.indexOf(@type) is -1
+ throw new Error("Unknown menu type #{@type}") if MenuItem.types.indexOf(@type) is -1
@commandId = ++nextCommandId
@click = =>
Menu = bindings.Menu
Menu::__proto__ = EventEmitter.prototype
-popup = Menu::popup
Menu::popup = (window) ->
throw new TypeError('Invalid window') unless window?.constructor is BrowserWindow
-
- popup.call this, window
+ @_popup window
Menu::append = (item) ->
@insert @getItemCount(), item
if activeItem.type in ['checkbox', 'radio']
activeItem.checked = !activeItem.checked
activeItem.click()
+ menuWillShow: =>
+ # Make sure radio groups have at least one menu item seleted.
+ for id, group of @groupsMap
+ checked = false
+ for radioItem in group when radioItem.checked
+ checked = true
+ break
+ v8Util.setHiddenValue group[0], 'checked', true unless checked
switch item.type
when 'normal' then @insertItem pos, item.commandId, item.label
menu.delegate.executeCommand menu.items[0].commandId
assert.equal menu.items[0].checked, true
+ it 'at least have one item checked in each group', ->
+ template = []
+ template.push label: "#{i}", type: 'radio' for i in [0..10]
+ template.push type: 'separator'
+ template.push label: "#{i}", type: 'radio' for i in [12..20]
+ menu = Menu.buildFromTemplate template
+ menu.delegate.menuWillShow()
+ assert.equal menu.items[0].checked, true
+ assert.equal menu.items[12].checked, true
+
it 'should assign groupId automatically', ->
template = []
template.push label: "#{i}", type: 'radio' for i in [0..10]