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

Side by Side Diff: chrome/browser/resources/chromeos/login/bubble.js

Issue 9310050: [cros] Error bubble on login is displayed to the left of Gaia frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview Bubble implementation. 6 * @fileoverview Bubble implementation.
7 */ 7 */
8 8
9 // TODO(xiyuan): Move this into shared. 9 // TODO(xiyuan): Move this into shared.
10 cr.define('cr.ui', function() { 10 cr.define('cr.ui', function() {
11 /** 11 /**
12 * Creates a bubble div. 12 * Creates a bubble div.
13 * @constructor 13 * @constructor
14 * @extends {HTMLDivElement} 14 * @extends {HTMLDivElement}
15 */ 15 */
16 var Bubble = cr.ui.define('div'); 16 var Bubble = cr.ui.define('div');
17 17
18 /**
19 * Bubble attachment side.
20 * @enum {string}
21 */
22 Bubble.Attachment = {
23 RIGHT: 'bubble-right',
24 LEFT: 'bubble-left',
25 TOP: 'bubble-top',
26 BOTTOM: 'bubble-bottom'
27 };
28
18 Bubble.prototype = { 29 Bubble.prototype = {
19 __proto__: HTMLDivElement.prototype, 30 __proto__: HTMLDivElement.prototype,
20 31
21 // Anchor element 32 // Anchor element
22 anchor_: undefined, 33 anchor_: undefined,
23 34
24 /** @inheritDoc */ 35 /** @inheritDoc */
25 decorate: function() { 36 decorate: function() {
26 this.ownerDocument.addEventListener('click', 37 this.ownerDocument.addEventListener('click',
27 this.handleDocClick_.bind(this)); 38 this.handleDocClick_.bind(this));
28 this.ownerDocument.addEventListener('keydown', 39 this.ownerDocument.addEventListener('keydown',
29 this.handleDocKeyDown_.bind(this)); 40 this.handleDocKeyDown_.bind(this));
30 this.addEventListener('webkitTransitionEnd', 41 this.addEventListener('webkitTransitionEnd',
31 this.handleTransitionEnd_.bind(this)); 42 this.handleTransitionEnd_.bind(this));
32 }, 43 },
33 44
34 /** 45 /**
46 * Sets the attachment of the bubble.
47 * @param {!Attachment} attachment Bubble attachment.
48 */
49 setAttachment_: function (attachment) {
50 for (var k in Bubble.Attachment) {
51 var v = Bubble.Attachment[k];
52 this.classList[v == attachment ? 'add' : 'remove'](v);
53 }
54 },
55
56 /**
35 * Shows the bubble for given anchor element. 57 * Shows the bubble for given anchor element.
36 * @param {number} x X position of bubble's reference point. 58 * @param {!Object} pos Bubble position (left, top, right, bottom).
37 * @param {number} y Y position of bubble's reference point.
38 * @param {HTMLElement} content Content to show in bubble. 59 * @param {HTMLElement} content Content to show in bubble.
60 * @param {!Attachment} attachment Bubble attachment (on which side of the
61 * specified position it should be displayed).
39 * @public 62 * @public
40 */ 63 */
41 showContentAt: function(x, y, content) { 64 showContentAt: function(pos, content, attachment) {
42 const ARROW_OFFSET = 14; 65 const ARROW_OFFSET = 14;
43 66
44 var anchorX = x - ARROW_OFFSET; 67 // Adjust position so that arrow points exactly at |pos|.
45 var anchorY = y; 68 if (attachment == Bubble.Attachment.TOP ||
69 attachment == Bubble.Attachment.BOTTOM) {
70 if (pos.left)
71 pos.left -= ARROW_OFFSET;
72 } else {
73 if (pos.top)
74 pos.top -= ARROW_OFFSET;
75 }
46 76
47 this.style.left = anchorX + 'px'; 77 for (var k in pos) {
48 this.style.top = anchorY + 'px'; 78 if (typeof pos[k] == 'number')
79 this.style[k] = pos[k] + 'px';
80 }
49 81
50 this.innerHTML = ''; 82 this.innerHTML = '';
51 this.appendChild(content); 83 this.appendChild(content);
84 this.setAttachment_(attachment);
52 this.hidden = false; 85 this.hidden = false;
53 this.classList.remove('faded'); 86 this.classList.remove('faded');
54 }, 87 },
55 88
56 /** 89 /**
57 * Shows the bubble for given anchor element. 90 * Shows the bubble for given anchor element.
58 * @param {!HTMLElement} el Anchor element of the bubble. 91 * @param {!HTMLElement} el Anchor element of the bubble.
59 * @param {HTMLElement} content Content to show in bubble. 92 * @param {HTMLElement} content Content to show in bubble.
93 * @param {!Attachment} attachment Bubble attachment (on which side of the
94 * element it should be displayed).
60 * @public 95 * @public
61 */ 96 */
62 showContentForElement: function(el, content) { 97 showContentForElement: function(el, content, attachment) {
63 const HORIZONTAL_PADDING = 10; 98 const OFFSET = 10;
64 const VERTICAL_PADDING = 5; 99 const PADDING = 5;
65 100
66 var elementOrigin = cr.ui.login.DisplayManager.getOffset(el); 101 var origin = cr.ui.login.DisplayManager.getPosition(el);
67 var anchorX = elementOrigin.left + HORIZONTAL_PADDING; 102
68 var anchorY = elementOrigin.top + el.offsetHeight + VERTICAL_PADDING; 103 // Adjust the side w.r.to document direction.
104 var side = attachment;
105 if (isRTL()) {
106 if (side == Bubble.Attachment.RIGHT)
107 side = Bubble.Attachment.LEFT;
108 else if (side == Bubble.Attachment.LEFT)
109 side = Bubble.Attachment.RIGHT;
110 }
111
112 var pos = {};
113 switch (side) {
114 case Bubble.Attachment.TOP:
115 pos.left = origin.left + OFFSET;
116 pos.bottom = origin.bottom + el.offsetHeight + PADDING;
xiyuan 2012/02/02 22:43:52 Should this be pos.bottom = origin.top - PADDING t
Ivan Korotkov 2012/02/03 10:33:04 This would not do the right thing. Imagine if orig
117 break;
118 case Bubble.Attachment.RIGHT:
119 pos.top = origin.top + OFFSET;
120 pos.left = origin.left + el.offsetWidth + PADDING;
121 break;
122 case Bubble.Attachment.BOTTOM:
123 pos.left = origin.left + OFFSET;
124 pos.top = origin.top + el.offsetHeight + PADDING;
125 break;
126 case Bubble.Attachment.LEFT:
127 pos.top = origin.top + OFFSET;
128 pos.right = origin.right + el.offsetWidth + PADDING;
xiyuan 2012/02/02 22:43:52 pos.right = origin.left - PADDING?
Ivan Korotkov 2012/02/03 10:33:04 Same here.
129 break;
130 }
69 131
70 this.anchor_ = el; 132 this.anchor_ = el;
71 this.showContentAt(anchorX, anchorY, content); 133 this.showContentAt(pos, content, attachment);
72 }, 134 },
73 135
74 /** 136 /**
75 * Shows the bubble for given anchor element. 137 * Shows the bubble for given anchor element.
76 * @param {!HTMLElement} el Anchor element of the bubble. 138 * @param {!HTMLElement} el Anchor element of the bubble.
77 * @param {string} text Text content to show in bubble. 139 * @param {string} text Text content to show in bubble.
140 * @param {!Attachment} attachment Bubble attachment (on which side of the
141 * element it should be displayed).
78 * @public 142 * @public
79 */ 143 */
80 showTextForElement: function(el, text) { 144 showTextForElement: function(el, text, attachment) {
81 var span = this.ownerDocument.createElement('span'); 145 var span = this.ownerDocument.createElement('span');
82 span.textContent = text; 146 span.textContent = text;
83 this.showContentForElement(el, span); 147 this.showContentForElement(el, span, attachment);
84 }, 148 },
85 149
86 /** 150 /**
87 * Hides the bubble. 151 * Hides the bubble.
88 */ 152 */
89 hide: function() { 153 hide: function() {
90 if (!this.classList.contains('faded')) 154 if (!this.classList.contains('faded'))
91 this.classList.add('faded'); 155 this.classList.add('faded');
92 }, 156 },
93 157
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 handleDocKeyDown_: function(e) { 193 handleDocKeyDown_: function(e) {
130 if (!this.hidden) 194 if (!this.hidden)
131 this.hide(); 195 this.hide();
132 } 196 }
133 }; 197 };
134 198
135 return { 199 return {
136 Bubble: Bubble 200 Bubble: Bubble
137 }; 201 };
138 }); 202 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698