@@ -29,6 +29,7 @@ import ".." // For EdgeBarrierControls
2929import "../../../qml/Stage"
3030import "../../../qml/Components"
3131import "../../../qml/Components/PanelState"
32+import "../../../qml/ApplicationMenus"
3233
3334Item {
3435 id: root
@@ -44,6 +45,8 @@ Item {
4445 }
4546
4647 Component.onCompleted: {
48+ ApplicationMenusLimits.screenWidth = Qt.binding( function() { return stageLoader.width; } );
49+ ApplicationMenusLimits.screenHeight = Qt.binding( function() { return stageLoader.height; } );
4750 QuickUtils.keyboardAttached = true;
4851 theme.name = "Ubuntu.Components.Themes.SuruDark";
4952 resetGeometry();
@@ -830,5 +833,102 @@ Item {
830833 mouseRelease(decoration);
831834 tryCompare(Mir, "cursorName", "");
832835 }
836+
837+ function test_menuPositioning_data() {
838+ return [
839+ {tag: "good",
840+ windowPosition: Qt.point(units.gu(10), units.gu(10))
841+ },
842+ {tag: "collides right",
843+ windowPosition: Qt.point(units.gu(100), units.gu(10)),
844+ minimumXDifference: units.gu(8)
845+ },
846+ {tag: "collides bottom",
847+ windowPosition: Qt.point(units.gu(10), units.gu(80)),
848+ minimumYDifference: units.gu(7)
849+ },
850+ ]
851+ }
852+
853+ function test_menuPositioning(data) {
854+ var appDelegate = startApplication("dialer-app");
855+ appDelegate.windowedX = data.windowPosition.x;
856+ appDelegate.windowedY = data.windowPosition.y;
857+
858+ var menuItem = findChild(appDelegate, "menuBar-item3");
859+ menuItem.show();
860+
861+ var menu = findChild(appDelegate, "menuBar-item3-menu");
862+ tryCompare(menu, "visible", true);
863+
864+ var normalPositioningX = menuItem.x - units.gu(1);
865+ var normalPositioningY = menuItem.height;
866+
867+ // We do this fuzzy checking because otherwise we would be duplicating the code
868+ // that calculates the coordinates and any bug it may have, what we want is really
869+ // to check that on collision with the border the menu is shifted substantially
870+ if (data.minimumXDifference) {
871+ verify(menu.x < normalPositioningX - data.minimumXDifference);
872+ } else {
873+ compare(menu.x, normalPositioningX);
874+ }
875+
876+ if (data.minimumYDifference) {
877+ verify(menu.y < normalPositioningY - data.minimumYDifference);
878+ } else {
879+ compare(menu.y, normalPositioningY);
880+ }
881+ }
882+
883+ function test_submenuPositioning_data() {
884+ return [
885+ {tag: "good",
886+ windowPosition: Qt.point(units.gu(10), units.gu(10))
887+ },
888+ {tag: "collides right",
889+ windowPosition: Qt.point(units.gu(100), units.gu(10)),
890+ minimumXDifference: units.gu(35)
891+ },
892+ {tag: "collides bottom",
893+ windowPosition: Qt.point(units.gu(10), units.gu(80)),
894+ minimumYDifference: units.gu(8)
895+ },
896+ ]
897+ }
898+
899+ function test_submenuPositioning(data) {
900+ var appDelegate = startApplication("dialer-app");
901+ appDelegate.windowedX = data.windowPosition.x;
902+ appDelegate.windowedY = data.windowPosition.y;
903+
904+ var menuItem = findChild(appDelegate, "menuBar-item3");
905+ menuItem.show();
906+
907+ var menu = findChild(appDelegate, "menuBar-item3-menu");
908+ menuItem = findChild(menu, "menuBar-item3-menu-item3-actionItem");
909+ tryCompare(menuItem, "visible", true);
910+ mouseMove(menuItem);
911+ mouseClick(menuItem);
912+
913+ menu = findChild(appDelegate, "menuBar-item3-menu-item3-menu");
914+
915+ var normalPositioningX = menuItem.width;
916+ var normalPositioningY = menuItem.parent.y;
917+
918+ // We do this fuzzy checking because otherwise we would be duplicating the code
919+ // that calculates the coordinates and any bug it may have, what we want is really
920+ // to check that on collision with the border the menu is shifted substantially
921+ if (data.minimumXDifference) {
922+ verify(menu.x < normalPositioningX - data.minimumXDifference);
923+ } else {
924+ compare(menu.x, normalPositioningX);
925+ }
926+
927+ if (data.minimumYDifference) {
928+ verify(menu.y < normalPositioningY - data.minimumYDifference);
929+ } else {
930+ compare(menu.y, normalPositioningY);
931+ }
932+ }
833933 }
834934}