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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/ui/GlassPane.js

Issue 2889693008: DevTools: fix popover's account for scrollbar size when measuring content (Closed)
Patch Set: Created 3 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 UI.GlassPane = class { 5 UI.GlassPane = class {
6 constructor() { 6 constructor() {
7 this._widget = new UI.Widget(true); 7 this._widget = new UI.Widget(true);
8 this._widget.markAsRoot(); 8 this._widget.markAsRoot();
9 this.element = this._widget.element; 9 this.element = this._widget.element;
10 this.contentElement = this._widget.contentElement; 10 this.contentElement = this._widget.contentElement;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 var width = containerWidth - gutterSize * 2; 177 var width = containerWidth - gutterSize * 2;
178 var height = containerHeight - gutterSize * 2; 178 var height = containerHeight - gutterSize * 2;
179 var positionX = gutterSize; 179 var positionX = gutterSize;
180 var positionY = gutterSize; 180 var positionY = gutterSize;
181 181
182 if (this._maxSize) { 182 if (this._maxSize) {
183 width = Math.min(width, this._maxSize.width); 183 width = Math.min(width, this._maxSize.width);
184 height = Math.min(height, this._maxSize.height); 184 height = Math.min(height, this._maxSize.height);
185 } 185 }
186 186
187 var measuredWidth = 0;
188 var measuredHeight = 0;
189 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) { 187 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
190 measuredWidth = this.contentElement.offsetWidth; 188 var measuredWidth = this.contentElement.offsetWidth;
191 measuredHeight = this.contentElement.offsetHeight; 189 var measuredHeight = this.contentElement.offsetHeight;
192 width = Math.min(width, measuredWidth); 190 var widthOverflow = height < measuredHeight ? scrollbarSize : 0;
193 height = Math.min(height, measuredHeight); 191 var heightOverflow = width < measuredWidth ? scrollbarSize : 0;
192 width = Math.min(width, measuredWidth + widthOverflow);
193 height = Math.min(height, measuredHeight + heightOverflow);
194 } 194 }
195 195
196 if (this._anchorBox) { 196 if (this._anchorBox) {
197 var anchorBox = this._anchorBox.relativeToElement(container); 197 var anchorBox = this._anchorBox.relativeToElement(container);
198 var behavior = this._anchorBehavior; 198 var behavior = this._anchorBehavior;
199 this._arrowElement.classList.remove('arrow-none', 'arrow-top', 'arrow-bott om', 'arrow-left', 'arrow-right'); 199 this._arrowElement.classList.remove('arrow-none', 'arrow-top', 'arrow-bott om', 'arrow-left', 'arrow-right');
200 200
201 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop || behavior === UI. GlassPane.AnchorBehavior.PreferBottom) { 201 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop || behavior === UI. GlassPane.AnchorBehavior.PreferBottom) {
202 var top = anchorBox.y - 2 * gutterSize; 202 var top = anchorBox.y - 2 * gutterSize;
203 var bottom = containerHeight - anchorBox.y - anchorBox.height - 2 * gutt erSize; 203 var bottom = containerHeight - anchorBox.y - anchorBox.height - 2 * gutt erSize;
204 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop && top < height & & bottom > top) 204 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop && top < height & & bottom > top)
205 behavior = UI.GlassPane.AnchorBehavior.PreferBottom; 205 behavior = UI.GlassPane.AnchorBehavior.PreferBottom;
206 if (behavior === UI.GlassPane.AnchorBehavior.PreferBottom && bottom < he ight && top > bottom) 206 if (behavior === UI.GlassPane.AnchorBehavior.PreferBottom && bottom < he ight && top > bottom)
207 behavior = UI.GlassPane.AnchorBehavior.PreferTop; 207 behavior = UI.GlassPane.AnchorBehavior.PreferTop;
208 208
209 var arrowY; 209 var arrowY;
210 var enoughHeight = true; 210 var enoughHeight = true;
211 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop) { 211 if (behavior === UI.GlassPane.AnchorBehavior.PreferTop) {
212 positionY = Math.max(gutterSize, anchorBox.y - height - gutterSize); 212 positionY = Math.max(gutterSize, anchorBox.y - height - gutterSize);
213 var spaceTop = anchorBox.y - positionY - gutterSize; 213 var spaceTop = anchorBox.y - positionY - gutterSize;
214 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) { 214 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
215 if (height < measuredHeight)
216 width += scrollbarSize;
217 if (height > spaceTop) { 215 if (height > spaceTop) {
218 this._arrowElement.classList.add('arrow-none'); 216 this._arrowElement.classList.add('arrow-none');
219 enoughHeight = false; 217 enoughHeight = false;
220 } 218 }
221 } else { 219 } else {
222 height = Math.min(height, spaceTop); 220 height = Math.min(height, spaceTop);
223 } 221 }
224 this._arrowElement.setIconType('mediumicon-arrow-bottom'); 222 this._arrowElement.setIconType('mediumicon-arrow-bottom');
225 this._arrowElement.classList.add('arrow-bottom'); 223 this._arrowElement.classList.add('arrow-bottom');
226 arrowY = anchorBox.y - gutterSize; 224 arrowY = anchorBox.y - gutterSize;
227 } else { 225 } else {
228 positionY = anchorBox.y + anchorBox.height + gutterSize; 226 positionY = anchorBox.y + anchorBox.height + gutterSize;
229 var spaceBottom = containerHeight - positionY - gutterSize; 227 var spaceBottom = containerHeight - positionY - gutterSize;
230 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) { 228 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
231 if (height < measuredHeight)
232 width += scrollbarSize;
233 if (height > spaceBottom) { 229 if (height > spaceBottom) {
234 this._arrowElement.classList.add('arrow-none'); 230 this._arrowElement.classList.add('arrow-none');
235 positionY = containerHeight - gutterSize - height; 231 positionY = containerHeight - gutterSize - height;
236 enoughHeight = false; 232 enoughHeight = false;
237 } 233 }
238 } else { 234 } else {
239 height = Math.min(height, spaceBottom); 235 height = Math.min(height, spaceBottom);
240 } 236 }
241 this._arrowElement.setIconType('mediumicon-arrow-top'); 237 this._arrowElement.setIconType('mediumicon-arrow-top');
242 this._arrowElement.classList.add('arrow-top'); 238 this._arrowElement.classList.add('arrow-top');
(...skipping 20 matching lines...) Expand all
263 behavior = UI.GlassPane.AnchorBehavior.PreferRight; 259 behavior = UI.GlassPane.AnchorBehavior.PreferRight;
264 if (behavior === UI.GlassPane.AnchorBehavior.PreferRight && right < widt h && left > right) 260 if (behavior === UI.GlassPane.AnchorBehavior.PreferRight && right < widt h && left > right)
265 behavior = UI.GlassPane.AnchorBehavior.PreferLeft; 261 behavior = UI.GlassPane.AnchorBehavior.PreferLeft;
266 262
267 var arrowX; 263 var arrowX;
268 var enoughWidth = true; 264 var enoughWidth = true;
269 if (behavior === UI.GlassPane.AnchorBehavior.PreferLeft) { 265 if (behavior === UI.GlassPane.AnchorBehavior.PreferLeft) {
270 positionX = Math.max(gutterSize, anchorBox.x - width - gutterSize); 266 positionX = Math.max(gutterSize, anchorBox.x - width - gutterSize);
271 var spaceLeft = anchorBox.x - positionX - gutterSize; 267 var spaceLeft = anchorBox.x - positionX - gutterSize;
272 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) { 268 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
273 if (width < measuredWidth)
274 height += scrollbarSize;
275 if (width > spaceLeft) { 269 if (width > spaceLeft) {
276 this._arrowElement.classList.add('arrow-none'); 270 this._arrowElement.classList.add('arrow-none');
277 enoughWidth = false; 271 enoughWidth = false;
278 } 272 }
279 } else { 273 } else {
280 width = Math.min(width, spaceLeft); 274 width = Math.min(width, spaceLeft);
281 } 275 }
282 this._arrowElement.setIconType('mediumicon-arrow-right'); 276 this._arrowElement.setIconType('mediumicon-arrow-right');
283 this._arrowElement.classList.add('arrow-right'); 277 this._arrowElement.classList.add('arrow-right');
284 arrowX = anchorBox.x - gutterSize; 278 arrowX = anchorBox.x - gutterSize;
285 } else { 279 } else {
286 positionX = anchorBox.x + anchorBox.width + gutterSize; 280 positionX = anchorBox.x + anchorBox.width + gutterSize;
287 var spaceRight = containerWidth - positionX - gutterSize; 281 var spaceRight = containerWidth - positionX - gutterSize;
288 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) { 282 if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
289 if (width < measuredWidth)
290 height += scrollbarSize;
291 if (width > spaceRight) { 283 if (width > spaceRight) {
292 this._arrowElement.classList.add('arrow-none'); 284 this._arrowElement.classList.add('arrow-none');
293 positionX = containerWidth - gutterSize - width; 285 positionX = containerWidth - gutterSize - width;
294 enoughWidth = false; 286 enoughWidth = false;
295 } 287 }
296 } else { 288 } else {
297 width = Math.min(width, spaceRight); 289 width = Math.min(width, spaceRight);
298 } 290 }
299 this._arrowElement.setIconType('mediumicon-arrow-left'); 291 this._arrowElement.setIconType('mediumicon-arrow-left');
300 this._arrowElement.classList.add('arrow-left'); 292 this._arrowElement.classList.add('arrow-left');
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 UI.GlassPane.MarginBehavior = { 386 UI.GlassPane.MarginBehavior = {
395 Arrow: Symbol('Arrow'), 387 Arrow: Symbol('Arrow'),
396 DefaultMargin: Symbol('DefaultMargin'), 388 DefaultMargin: Symbol('DefaultMargin'),
397 NoMargin: Symbol('NoMargin') 389 NoMargin: Symbol('NoMargin')
398 }; 390 };
399 391
400 /** @type {!Map<!Document, !Element>} */ 392 /** @type {!Map<!Document, !Element>} */
401 UI.GlassPane._containers = new Map(); 393 UI.GlassPane._containers = new Map();
402 /** @type {!Set<!UI.GlassPane>} */ 394 /** @type {!Set<!UI.GlassPane>} */
403 UI.GlassPane._panes = new Set(); 395 UI.GlassPane._panes = new Set();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698