Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js

Issue 2814743007: [cr-action-menu] Allow configurable anchors. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/data/webui/cr_elements/cr_action_menu_test.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
index 9a94cfa6204e750ccfec46c635eadf1e7ce077f2..2a5e00c76b7e28ef830d6bb018bd703352272416 100644
--- a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
+++ b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
@@ -151,7 +151,9 @@ Polymer({
// Removing 'resize' and 'popstate' listeners when dialog is closed.
this.removeListeners_();
HTMLDialogElement.prototype.close.call(this);
- this.anchorElement_.focus();
+ if (this.anchorElement_)
+ this.anchorElement_.focus();
+
this.anchorElement_ = null;
},
@@ -161,6 +163,54 @@ Polymer({
*/
showAt: function(anchorElement) {
this.anchorElement_ = anchorElement;
+ var rect = this.anchorElement_.getBoundingClientRect();
+
+ this.showAtPosition({
+ top: rect.top,
+ left: rect.left,
+ height: rect.height,
+ width: rect.width,
+ anchorPositionX: -1,
dpapad 2017/04/12 17:12:32 Please explain this with a comment.
calamity 2017/04/13 04:34:24 Done.
+ });
+ },
+
+ /**
+ * Shows the menu anchored to the given box.
+ * @param {{
+ * top: number,
+ * left: number,
+ * bottom: (number| undefined),
dpapad 2017/04/12 17:12:32 Where is config.bottom and config.right used?
calamity 2017/04/13 04:34:22 Oops, these were supposed to change to width/heigh
+ * right: (number| undefined),
+ * anchorPositionX: (number| undefined),
+ * anchorPositionY: (number| undefined),
+ * minX: (number| undefined),
+ * minY: (number| undefined),
+ * maxX: (number| undefined),
+ * maxY: (number| undefined),
+ * }} config
+ */
dpapad 2017/04/12 17:12:32 Can we make a typedef for this? Such that clients
calamity 2017/04/13 04:34:23 Done.
+ showAtPosition: function(config) {
+ /**
+ * @param {number|undefined} value
+ * @param {number} defaultValue
+ * @return {number}
+ */
+ var defaultIfUndefined =
+ function(value, defaultValue) {
dpapad 2017/04/12 17:12:32 Can fit in previous line?
calamity 2017/04/13 04:34:23 Done.
+ return value == undefined ? defaultValue : value;
+ }
+
+ var top = config.top;
+ var left = config.left;
+ var bottom = top + defaultIfUndefined(config.height, 0);
+ var right = left + defaultIfUndefined(config.width, 0);
+ var anchorPositionX = defaultIfUndefined(config.anchorPositionX, 1);
+ var anchorPositionY = defaultIfUndefined(config.anchorPositionY, 1);
+ var minX = defaultIfUndefined(config.minX, 0);
+ var maxX = defaultIfUndefined(config.maxX, window.innerWidth);
+ var minY = defaultIfUndefined(config.minY, 0);
+ var maxY = defaultIfUndefined(config.maxY, window.innerHeight);
+
this.boundClose_ = this.boundClose_ || function() {
if (this.open)
this.close();
@@ -175,22 +225,34 @@ Polymer({
this.showModal();
- var rect = this.anchorElement_.getBoundingClientRect();
- if (getComputedStyle(this.anchorElement_).direction == 'rtl') {
- var right = window.innerWidth - rect.left - this.offsetWidth;
- this.style.right = right + 'px';
- } else {
- var left = rect.right - this.offsetWidth;
- this.style.left = left + 'px';
+ function getStartPointWithAnchor(
dpapad 2017/04/12 17:12:32 @param annotations missing for this function. Also
calamity 2017/04/13 04:34:22 Done.
+ start, end, length, anchorPosition, min, max) {
+ var startPoint = (start + end - length) / 2 +
+ (start - end + length) * anchorPosition / 2;
+ if (startPoint + length > max)
+ startPoint = end - length;
+ if (startPoint < min)
+ startPoint = start;
+ return startPoint;
}
- // Attempt to show the menu starting from the top of the rectangle and
dpapad 2017/04/12 17:12:32 Has this logic been preserved in the new code? It
calamity 2017/04/13 04:34:22 Yes, this behavior is what getStartPointWithAnchor
- // extending downwards. If that does not fit within the window, fallback to
- // starting from the bottom and extending upwards.
- var top = rect.top + this.offsetHeight <= window.innerHeight ? rect.top :
- rect.bottom -
- this.offsetHeight - Math.max(rect.bottom - window.innerHeight, 0);
+ // Flip the X anchor in RTL.
+ var rtl = getComputedStyle(this).direction == 'rtl';
+ if (rtl)
+ anchorPositionX *= -1;
+
+ var menuLeft = getStartPointWithAnchor(
+ left, right, this.offsetWidth, anchorPositionX, minX, maxX);
+
+ if (rtl) {
+ var menuRight = window.innerWidth - menuLeft - this.offsetWidth;
+ this.style.right = menuRight + 'px';
+ } else {
+ this.style.left = menuLeft + 'px';
+ }
- this.style.top = top + 'px';
+ var menuTop = getStartPointWithAnchor(
+ top, bottom, this.offsetHeight, anchorPositionY, minY, maxY);
+ this.style.top = menuTop + 'px';
},
});
« no previous file with comments | « chrome/test/data/webui/cr_elements/cr_action_menu_test.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698