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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeOutline.js

Issue 2747553002: [DevTools] Rework Popover API (Closed)
Patch Set: rebased Created 3 years, 9 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> 3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4 * Copyright (C) 2009 Joseph Pecoraro 4 * Copyright (C) 2009 Joseph Pecoraro
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 68
69 this._includeRootDOMNode = !omitRootDOMNode; 69 this._includeRootDOMNode = !omitRootDOMNode;
70 this._selectEnabled = selectEnabled; 70 this._selectEnabled = selectEnabled;
71 /** @type {?SDK.DOMNode} */ 71 /** @type {?SDK.DOMNode} */
72 this._rootDOMNode = null; 72 this._rootDOMNode = null;
73 /** @type {?SDK.DOMNode} */ 73 /** @type {?SDK.DOMNode} */
74 this._selectedDOMNode = null; 74 this._selectedDOMNode = null;
75 75
76 this._visible = false; 76 this._visible = false;
77 77
78 this._popoverHelper = new UI.PopoverHelper(this._element); 78 this._popoverHelper = new UI.PopoverHelper(this._element, this._getPopoverRe quest.bind(this));
79 this._popoverHelper.initializeCallbacks(this._getPopoverAnchor.bind(this), t his._showPopover.bind(this));
80 this._popoverHelper.setHasPadding(true); 79 this._popoverHelper.setHasPadding(true);
81 this._popoverHelper.setTimeout(0, 100); 80 this._popoverHelper.setTimeout(0, 100);
82 81
83 /** @type {!Map<!SDK.DOMNode, !Elements.ElementsTreeOutline.UpdateRecord>} * / 82 /** @type {!Map<!SDK.DOMNode, !Elements.ElementsTreeOutline.UpdateRecord>} * /
84 this._updateRecords = new Map(); 83 this._updateRecords = new Map();
85 /** @type {!Set<!Elements.ElementsTreeElement>} */ 84 /** @type {!Set<!Elements.ElementsTreeElement>} */
86 this._treeElementsBeingUpdated = new Set(); 85 this._treeElementsBeingUpdated = new Set();
87 86
88 this._domModel.addEventListener(SDK.DOMModel.Events.MarkersChanged, this._ma rkersChanged, this); 87 this._domModel.addEventListener(SDK.DOMModel.Events.MarkersChanged, this._ma rkersChanged, this);
89 this._showHTMLCommentsSetting = Common.moduleSetting('showHTMLComments'); 88 this._showHTMLCommentsSetting = Common.moduleSetting('showHTMLComments');
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 var element; 514 var element;
516 if (elementUnderMouse === elementAboveMouse) 515 if (elementUnderMouse === elementAboveMouse)
517 element = elementUnderMouse; 516 element = elementUnderMouse;
518 else 517 else
519 element = this.treeElementFromPoint(x, y + 2); 518 element = this.treeElementFromPoint(x, y + 2);
520 519
521 return element; 520 return element;
522 } 521 }
523 522
524 /** 523 /**
525 * @param {!Element} element
526 * @param {!Event} event 524 * @param {!Event} event
527 * @return {!Element|!AnchorBox|undefined} 525 * @return {?UI.PopoverRequest}
528 */ 526 */
529 _getPopoverAnchor(element, event) { 527 _getPopoverRequest(event) {
530 var link = element; 528 var link = event.target;
531 while (link && !link[Elements.ElementsTreeElement.HrefSymbol]) 529 while (link && !link[Elements.ElementsTreeElement.HrefSymbol])
532 link = link.parentElementOrShadowHost(); 530 link = link.parentElementOrShadowHost();
533 return link ? link : undefined; 531 if (!link)
532 return null;
533
534 return {
535 box: link.boxInWindow(),
536 show: async popover => {
537 var listItem = link.enclosingNodeOrSelfWithNodeName('li');
538 var node = /** @type {!Elements.ElementsTreeElement} */ (listItem.treeEl ement).node();
539 var precomputedFeatures = await this._loadDimensionsForNode(node);
540 var preview = await Components.DOMPresentationUtils.buildImagePreviewCon tents(
541 node.target(), link[Elements.ElementsTreeElement.HrefSymbol], true, precomputedFeatures);
542 if (preview)
543 popover.contentElement.appendChild(preview);
544 return !!preview;
545 }
546 };
534 } 547 }
535 548
536 /** 549 /**
537 * @param {!SDK.DOMNode} node 550 * @param {!SDK.DOMNode} node
538 * @param {function()} callback 551 * @return {!Promise<!Object|undefined>}
539 */ 552 */
540 _loadDimensionsForNode(node, callback) { 553 _loadDimensionsForNode(node) {
541 if (!node.nodeName() || node.nodeName().toLowerCase() !== 'img') { 554 if (!node.nodeName() || node.nodeName().toLowerCase() !== 'img')
542 callback(); 555 return Promise.resolve();
543 return;
544 }
545 556
557 var fulfill;
558 var promise = new Promise(x => fulfill = x);
546 node.resolveToObject('', resolvedNode); 559 node.resolveToObject('', resolvedNode);
560 return promise;
547 561
548 function resolvedNode(object) { 562 function resolvedNode(object) {
549 if (!object) { 563 if (!object) {
550 callback(); 564 fulfill();
551 return; 565 return;
552 } 566 }
553 567
554 object.callFunctionJSON(features, undefined, callback); 568 object.callFunctionJSON(features, undefined, fulfill);
555 object.release(); 569 object.release();
556 570
557 /** 571 /**
558 * @return {!{offsetWidth: number, offsetHeight: number, naturalWidth: num ber, naturalHeight: number, currentSrc: (string|undefined)}} 572 * @return {!{offsetWidth: number, offsetHeight: number, naturalWidth: num ber, naturalHeight: number, currentSrc: (string|undefined)}}
559 * @suppressReceiverCheck 573 * @suppressReceiverCheck
560 * @this {!Element} 574 * @this {!Element}
561 */ 575 */
562 function features() { 576 function features() {
563 return { 577 return {
564 offsetWidth: this.offsetWidth, 578 offsetWidth: this.offsetWidth,
565 offsetHeight: this.offsetHeight, 579 offsetHeight: this.offsetHeight,
566 naturalWidth: this.naturalWidth, 580 naturalWidth: this.naturalWidth,
567 naturalHeight: this.naturalHeight, 581 naturalHeight: this.naturalHeight,
568 currentSrc: this.currentSrc 582 currentSrc: this.currentSrc
569 }; 583 };
570 } 584 }
571 } 585 }
572 } 586 }
573 587
574 /**
575 * @param {!Element|!AnchorBox} link
576 * @param {!UI.GlassPane} popover
577 * @return {!Promise<boolean>}
578 */
579 _showPopover(link, popover) {
580 var fulfill;
581 var promise = new Promise(x => fulfill = x);
582 var listItem = link.enclosingNodeOrSelfWithNodeName('li');
583 var node = /** @type {!Elements.ElementsTreeElement} */ (listItem.treeElemen t).node();
584 this._loadDimensionsForNode(
585 node, Components.DOMPresentationUtils.buildImagePreviewContents.bind(
586 Components.DOMPresentationUtils, node.target(), link[Elements. ElementsTreeElement.HrefSymbol], true,
587 showPopover));
588 return promise;
589
590 /**
591 * @param {!Element=} contents
592 */
593 function showPopover(contents) {
594 if (contents)
595 popover.contentElement.appendChild(contents);
596 fulfill(!!contents);
597 }
598 }
599
600 _onmousedown(event) { 588 _onmousedown(event) {
601 var element = this._treeElementFromEvent(event); 589 var element = this._treeElementFromEvent(event);
602 590
603 if (!element || element.isEventWithinDisclosureTriangle(event)) 591 if (!element || element.isEventWithinDisclosureTriangle(event))
604 return; 592 return;
605 593
606 element.select(); 594 element.select();
607 } 595 }
608 596
609 /** 597 /**
(...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 */ 1681 */
1694 function resolved(node) { 1682 function resolved(node) {
1695 if (node) { 1683 if (node) {
1696 this.treeOutline._selectedDOMNode = node; 1684 this.treeOutline._selectedDOMNode = node;
1697 this.treeOutline._selectedNodeChanged(); 1685 this.treeOutline._selectedNodeChanged();
1698 } 1686 }
1699 } 1687 }
1700 return true; 1688 return true;
1701 } 1689 }
1702 }; 1690 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698