@@ -49,6 +49,12 @@ Item {
50 ApplicationMenuDataLoader { id: menuData }
50 ApplicationMenuDataLoader { id: menuData }
54+ modelData: menuData.generateTestData(5, 3, 3, "menu")
55+ onActivated: log.text = "Activated " + action + "\n" + log.text
52 Rectangle {
58 Rectangle {
54 left: parent.left
60 left: parent.left
@@ -68,29 +74,45 @@ Item {
71− WindowDecoration {
77+ MouseArea {
72− id: decoration
78+ id: clickThroughTester
80+ acceptedButtons: Qt.AllButtons
73 anchors { left: parent.left; right: parent.right; top: parent.top }
86 anchors { left: parent.left; right: parent.right; top: parent.top }
74 anchors.margins: units.gu(1)
87 anchors.margins: units.gu(1)
76− title: "TestTitle - Doing something"
78 height: units.gu(3)
88 height: units.gu(3)
82− modelData: menuData.generateTestData(5, 3, 3, "menu")
83− onActivated: log.text = "Activated " + action + "\n" + log.text
90+ property bool itemDestroyed: false
91+ sourceComponent: WindowDecoration {
94+ title: "TestTitle - Doing something"
86− onCloseClicked: { log.text = "Close\n" + log.text }
98+ onCloseClicked: { log.text = "Close\n" + log.text }
87− onMinimizeClicked: { log.text = "Minimize\n" + log.text }
99+ onMinimizeClicked: { log.text = "Minimize\n" + log.text }
88− onMaximizeClicked: { log.text = "Maximize\n" + log.text }
100+ onMaximizeClicked: { log.text = "Maximize\n" + log.text }
102+ Component.onDestruction: {
103+ decorationLoader.itemDestroyed = true;
91 SignalSpy {
108 SignalSpy {
92 id: signalSpy
109 id: signalSpy
93− target: decoration
110+ target: decorationLoader.item
115+ target: clickThroughTester
96 UnityTestCase {
118 UnityTestCase {
@@ -98,9 +120,30 @@ Item {
98 name: "WindowDecoration"
120 name: "WindowDecoration"
99 when: windowShown
121 when: windowShown
123+ property Item decoration: decorationLoader.status === Loader.Ready ? decorationLoader.item : null
101 function init() {
125 function init() {
126+ tryCompareFunction(function() { return decoration !== null }, true);
102 decoration.menu = menuBackend;
127 decoration.menu = menuBackend;
130+ function cleanup() {
131+ decorationLoader.itemDestroyed = false;
132+ decorationLoader.active = false;
134+ tryCompare(decorationLoader, "status", Loader.Null);
135+ tryCompare(decorationLoader, "item", null);
136+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
137+ // actually took place. Likely because Loader waits until the next event loop
138+ // iteration to do its work. So to ensure the reload, we will wait until the
139+ // Shell instance gets destroyed.
140+ tryCompare(decorationLoader, "itemDestroyed", true);
142+ decorationLoader.active = true;
143+ tryCompare(decorationLoader, "status", Loader.Ready);
103 signalSpy.clear();
145 signalSpy.clear();
146+ mouseEaterSpy.clear();
106 function test_windowControlButtons_data() {
149 function test_windowControlButtons_data() {
@@ -168,5 +211,29 @@ Item {
168 tryCompare(menuLoader, "opacity", 0);
211 tryCompare(menuLoader, "opacity", 0);
169 tryCompare(titleLabel, "opacity", 1);
212 tryCompare(titleLabel, "opacity", 1);
215+ function test_eatMouseEvents_data() {
217+ {tag: "left mouse click", signalName: "clicked", button: Qt.LeftButton },
218+ {tag: "right mouse click", signalName: "clicked", button: Qt.RightButton },
219+ {tag: "middle mouse click", signalName: "clicked", button: Qt.MiddleButton },
220+ {tag: "mouse wheel", signalName: "wheel", button: Qt.MiddleButton },
221+ {tag: "double click (LMB)", signalName: "doubleClicked", button: Qt.LeftButton },
222+ {tag: "double click (RMB)", signalName: "doubleClicked", button: Qt.RightButton },
226+ function test_eatMouseEvents(data) {
227+ mouseEaterSpy.signalName = data.signalName;
228+ if (data.signalName === "wheel") {
229+ mouseWheel(decoration, decoration.width/2, decoration.height/2, 20, 20);
230+ } else if (data.signalName === "clicked") {
231+ mouseClick(decoration, decoration.width/2, decoration.height/2, data.button);
233+ mouseDoubleClick(decoration, decoration.width/2, decoration.height/2, data.button);
236+ tryCompare(mouseEaterSpy, "count", 0);