[PlasmaComponents Menu] Don't crash on null action
You can assign a QAction as "action", this way you can just pass it e.g. plasmoid.action("configure"). However, when assigning a null action as can happen with kiosk restrictions, it would crash as it assigns m_action the nullptr but never checks for that. This patch ensures we always have a QAction, creating a new empty one, if neccessary. Also deletes our own action if an external one is assigned Differential Revision: https://phabricator.kde.org/D6608
This commit is contained in:
parent
c00069c43d
commit
21f954d94d
@ -38,8 +38,24 @@ void QMenuItem::setAction(QAction *a)
|
||||
if (m_action != a) {
|
||||
if (m_action) {
|
||||
disconnect(m_action, 0, this, 0);
|
||||
|
||||
if (m_action->parent() == this) {
|
||||
delete m_action;
|
||||
m_action = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
if (a) {
|
||||
m_action = a;
|
||||
} else {
|
||||
// don't end up with no action, create an invisible one instead
|
||||
m_action = new QAction(this);
|
||||
m_action->setVisible(false);
|
||||
}
|
||||
|
||||
setVisible(m_action->isVisible());
|
||||
setEnabled(m_action->isEnabled());
|
||||
|
||||
connect(m_action, &QAction::changed, this, &QMenuItem::textChanged);
|
||||
connect(m_action, &QAction::changed, this, &QMenuItem::checkableChanged);
|
||||
connect(m_action, SIGNAL(toggled(bool)), this, SIGNAL(toggled(bool)));
|
||||
|
@ -3,7 +3,7 @@ import org.kde.plasma.components 2.0 as PlasmaComponents
|
||||
|
||||
Rectangle {
|
||||
width: 600
|
||||
height: 200
|
||||
height: 250
|
||||
color: "white"
|
||||
|
||||
Flow {
|
||||
@ -99,5 +99,19 @@ Rectangle {
|
||||
checked: true
|
||||
}
|
||||
}
|
||||
|
||||
PlasmaComponents.Button {
|
||||
text: "Don't crash on null MenuItem action"
|
||||
onClicked: noActionCrashMenu.open(0, height)
|
||||
|
||||
PlasmaComponents.Menu {
|
||||
id: noActionCrashMenu
|
||||
|
||||
PlasmaComponents.MenuItem { text: "This is an item" }
|
||||
PlasmaComponents.MenuItem { text: "Below me should NOT be an empty item"}
|
||||
PlasmaComponents.MenuItem { action: null }
|
||||
PlasmaComponents.MenuItem { text: "I am not empty" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user