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

Side by Side Diff: Source/devtools/front_end/ElementsPanel.js

Issue 208843006: DevTools: limit number of crumbs strip layouts during the update to 3. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/devtools/front_end/elementsPanel.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 WebInspector.ElementsPanel.prototype = { 120 WebInspector.ElementsPanel.prototype = {
121 _updateTreeOutlineVisibleWidth: function() 121 _updateTreeOutlineVisibleWidth: function()
122 { 122 {
123 if (!this.treeOutline) 123 if (!this.treeOutline)
124 return; 124 return;
125 125
126 var width = this._splitView.element.offsetWidth; 126 var width = this._splitView.element.offsetWidth;
127 if (this._splitView.isVertical()) 127 if (this._splitView.isVertical())
128 width -= this._splitView.sidebarSize(); 128 width -= this._splitView.sidebarSize();
129 this.treeOutline.setVisibleWidth(width); 129 this.treeOutline.setVisibleWidth(width);
130 this.treeOutline.updateSelection();
130 this.updateBreadcrumbSizes(); 131 this.updateBreadcrumbSizes();
131 this.treeOutline.updateSelection();
132 }, 132 },
133 133
134 /** 134 /**
135 * @return {!Element} 135 * @return {!Element}
136 */ 136 */
137 defaultFocusedElement: function() 137 defaultFocusedElement: function()
138 { 138 {
139 return this.treeOutline.element; 139 return this.treeOutline.element;
140 }, 140 },
141 141
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 748
749 if (!crumb.childNodes.length) { 749 if (!crumb.childNodes.length) {
750 var nameElement = document.createElement("span"); 750 var nameElement = document.createElement("span");
751 nameElement.textContent = crumbTitle; 751 nameElement.textContent = crumbTitle;
752 crumb.appendChild(nameElement); 752 crumb.appendChild(nameElement);
753 crumb.title = crumbTitle; 753 crumb.title = crumbTitle;
754 } 754 }
755 755
756 if (current === this.selectedDOMNode()) 756 if (current === this.selectedDOMNode())
757 crumb.classList.add("selected"); 757 crumb.classList.add("selected");
758 if (!crumbs.childNodes.length)
759 crumb.classList.add("end");
760
761 crumbs.insertBefore(crumb, crumbs.firstChild); 758 crumbs.insertBefore(crumb, crumbs.firstChild);
762 } 759 }
763 760
764 if (crumbs.hasChildNodes())
765 crumbs.lastChild.classList.add("start");
766
767 this.updateBreadcrumbSizes(); 761 this.updateBreadcrumbSizes();
768 }, 762 },
769 763
770 /** 764 /**
771 * @param {!Element=} focusedCrumb 765 * @param {!Element=} focusedCrumb
772 */ 766 */
773 updateBreadcrumbSizes: function(focusedCrumb) 767 updateBreadcrumbSizes: function(focusedCrumb)
774 { 768 {
775 if (!this.isShowing()) 769 if (!this.isShowing())
776 return; 770 return;
777 771
778 if (document.body.offsetWidth <= 0) { 772 var crumbs = this.crumbsElement;
779 // The stylesheet hasn't loaded yet or the window is closed, 773 if (!crumbs.firstChild)
780 // so we can't calculate what is need. Return early.
781 return; 774 return;
782 }
783 775
784 var crumbs = this.crumbsElement;
785 if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)
786 return; // No crumbs, do nothing.
787
788 // A Zero index is the right most child crumb in the breadcrumb.
789 var selectedIndex = 0; 776 var selectedIndex = 0;
790 var focusedIndex = 0; 777 var focusedIndex = 0;
791 var selectedCrumb; 778 var selectedCrumb;
792 779
793 var i = 0; 780 // Reset crumb styles.
794 var crumb = crumbs.firstChild; 781 for (var i = 0; i < crumbs.childNodes.length; ++i) {
795 while (crumb) { 782 var crumb = crumbs.childNodes[i];
796 // Find the selected crumb and index. 783 // Find the selected crumb and index.
797 if (!selectedCrumb && crumb.classList.contains("selected")) { 784 if (!selectedCrumb && crumb.classList.contains("selected")) {
798 selectedCrumb = crumb; 785 selectedCrumb = crumb;
799 selectedIndex = i; 786 selectedIndex = i;
800 } 787 }
801 788
802 // Find the focused crumb index. 789 // Find the focused crumb index.
803 if (crumb === focusedCrumb) 790 if (crumb === focusedCrumb)
804 focusedIndex = i; 791 focusedIndex = i;
805 792
806 // Remove any styles that affect size before 793 crumb.classList.remove("compact", "collapsed", "hidden");
807 // deciding to shorten any crumbs.
808 if (crumb !== crumbs.lastChild)
809 crumb.classList.remove("start");
810 if (crumb !== crumbs.firstChild)
811 crumb.classList.remove("end");
812
813 crumb.classList.remove("compact");
814 crumb.classList.remove("collapsed");
815 crumb.classList.remove("hidden");
816
817 crumb = crumb.nextSibling;
818 ++i;
819 } 794 }
820 795
821 // Restore the start and end crumb classes in case they got removed in c oalesceCollapsedCrumbs(). 796 // Layout 1: Measure total and normal crumb sizes
822 // The order of the crumbs in the document is opposite of the visual ord er. 797 var contentElementWidth = this.contentElement.offsetWidth;
823 crumbs.firstChild.classList.add("end"); 798 var normalSizes = [];
824 crumbs.lastChild.classList.add("start"); 799 for (var i = 0; i < crumbs.childNodes.length; ++i) {
800 var crumb = crumbs.childNodes[i];
801 normalSizes[i] = crumb.offsetWidth;
802 }
825 803
826 var contentElement = this.contentElement; 804 // Layout 2: Measure collapsed crumb sizes
805 var compactSizes = [];
806 for (var i = 0; i < crumbs.childNodes.length; ++i) {
807 var crumb = crumbs.childNodes[i];
808 crumb.classList.add("compact");
809 }
810 for (var i = 0; i < crumbs.childNodes.length; ++i) {
811 var crumb = crumbs.childNodes[i];
812 compactSizes[i] = crumb.offsetWidth;
813 }
814
815 // Layout 3: Measure collapsed crumb size
816 crumbs.firstChild.classList.add("collapsed");
817 var collapsedSize = crumbs.firstChild.offsetWidth;
818
819 // Clean up.
820 for (var i = 0; i < crumbs.childNodes.length; ++i) {
821 var crumb = crumbs.childNodes[i];
822 crumb.classList.remove("compact", "collapsed");
823 }
824
827 function crumbsAreSmallerThanContainer() 825 function crumbsAreSmallerThanContainer()
828 { 826 {
827 var totalSize = 0;
828 for (var i = 0; i < crumbs.childNodes.length; ++i) {
829 var crumb = crumbs.childNodes[i];
830 if (crumb.classList.contains("hidden"))
831 continue;
832 if (crumb.classList.contains("collapsed")) {
833 totalSize += collapsedSize;
834 continue;
835 }
836 totalSize += crumb.classList.contains("compact") ? compactSizes[ i] : normalSizes[i];
837 }
829 const rightPadding = 10; 838 const rightPadding = 10;
830 return crumbs.offsetWidth + rightPadding < contentElement.offsetWidt h; 839 return totalSize + rightPadding < contentElementWidth;
831 } 840 }
832 841
833 if (crumbsAreSmallerThanContainer()) 842 if (crumbsAreSmallerThanContainer())
834 return; // No need to compact the crumbs, they all fit at full size. 843 return; // No need to compact the crumbs, they all fit at full size.
835 844
836 var BothSides = 0; 845 var BothSides = 0;
837 var AncestorSide = -1; 846 var AncestorSide = -1;
838 var ChildSide = 1; 847 var ChildSide = 1;
839 848
840 /** 849 /**
841 * @param {boolean=} significantCrumb 850 * @param {function(!Element)} shrinkingFunction
851 * @param {number} direction
842 */ 852 */
843 function makeCrumbsSmaller(shrinkingFunction, direction, significantCrum b) 853 function makeCrumbsSmaller(shrinkingFunction, direction)
844 { 854 {
845 if (!significantCrumb) 855 var significantCrumb = focusedCrumb || selectedCrumb;
846 significantCrumb = (focusedCrumb || selectedCrumb); 856 var significantIndex = significantCrumb === selectedCrumb ? selected Index : focusedIndex;
847
848 if (significantCrumb === selectedCrumb)
849 var significantIndex = selectedIndex;
850 else if (significantCrumb === focusedCrumb)
851 var significantIndex = focusedIndex;
852 else {
853 var significantIndex = 0;
854 for (var i = 0; i < crumbs.childNodes.length; ++i) {
855 if (crumbs.childNodes[i] === significantCrumb) {
856 significantIndex = i;
857 break;
858 }
859 }
860 }
861 857
862 function shrinkCrumbAtIndex(index) 858 function shrinkCrumbAtIndex(index)
863 { 859 {
864 var shrinkCrumb = crumbs.childNodes[index]; 860 var shrinkCrumb = crumbs.childNodes[index];
865 if (shrinkCrumb && shrinkCrumb !== significantCrumb) 861 if (shrinkCrumb && shrinkCrumb !== significantCrumb)
866 shrinkingFunction(shrinkCrumb); 862 shrinkingFunction(shrinkCrumb);
867 if (crumbsAreSmallerThanContainer()) 863 if (crumbsAreSmallerThanContainer())
868 return true; // No need to compact the crumbs more. 864 return true; // No need to compact the crumbs more.
869 return false; 865 return false;
870 } 866 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 while (crumb) { 940 while (crumb) {
945 if (!crumb.classList.contains("hidden")) { 941 if (!crumb.classList.contains("hidden")) {
946 crumb.classList.add("start"); 942 crumb.classList.add("start");
947 break; 943 break;
948 } 944 }
949 crumb = crumb.previousSibling; 945 crumb = crumb.previousSibling;
950 } 946 }
951 } 947 }
952 } 948 }
953 949
950 /**
951 * @param {!Element} crumb
952 */
954 function compact(crumb) 953 function compact(crumb)
955 { 954 {
956 if (crumb.classList.contains("hidden")) 955 if (crumb.classList.contains("hidden"))
957 return; 956 return;
958 crumb.classList.add("compact"); 957 crumb.classList.add("compact");
959 } 958 }
960 959
960 /**
961 * @param {!Element} crumb
962 * @param {boolean=} dontCoalesce
963 */
961 function collapse(crumb, dontCoalesce) 964 function collapse(crumb, dontCoalesce)
962 { 965 {
963 if (crumb.classList.contains("hidden")) 966 if (crumb.classList.contains("hidden"))
964 return; 967 return;
965 crumb.classList.add("collapsed"); 968 crumb.classList.add("collapsed");
966 crumb.classList.remove("compact"); 969 crumb.classList.remove("compact");
967 if (!dontCoalesce) 970 if (!dontCoalesce)
968 coalesceCollapsedCrumbs(); 971 coalesceCollapsedCrumbs();
969 } 972 }
970 973
971 if (!focusedCrumb) { 974 if (!focusedCrumb) {
972 // When not focused on a crumb we can be biased and collapse less im portant 975 // When not focused on a crumb we can be biased and collapse less im portant
973 // crumbs that the user might not care much about. 976 // crumbs that the user might not care much about.
974 977
975 // Compact child crumbs. 978 // Compact child crumbs.
976 if (makeCrumbsSmaller(compact, ChildSide)) 979 if (makeCrumbsSmaller(compact, ChildSide))
977 return; 980 return;
978 981
979 // Collapse child crumbs. 982 // Collapse child crumbs.
980 if (makeCrumbsSmaller(collapse, ChildSide)) 983 if (makeCrumbsSmaller(collapse, ChildSide))
981 return; 984 return;
982 } 985 }
983 986
984 // Compact ancestor crumbs, or from both sides if focused. 987 // Compact ancestor crumbs, or from both sides if focused.
985 if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide) )) 988 if (makeCrumbsSmaller(compact, focusedCrumb ? BothSides : AncestorSide))
986 return; 989 return;
987 990
988 // Collapse ancestor crumbs, or from both sides if focused. 991 // Collapse ancestor crumbs, or from both sides if focused.
989 if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide ))) 992 if (makeCrumbsSmaller(collapse, focusedCrumb ? BothSides : AncestorSide) )
990 return; 993 return;
991 994
992 if (!selectedCrumb) 995 if (!selectedCrumb)
993 return; 996 return;
994 997
995 // Compact the selected crumb. 998 // Compact the selected crumb.
996 compact(selectedCrumb); 999 compact(selectedCrumb);
997 if (crumbsAreSmallerThanContainer()) 1000 if (crumbsAreSmallerThanContainer())
998 return; 1001 return;
999 1002
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 return; 1349 return;
1347 1350
1348 if (WebInspector.inspectElementModeController && WebInspector.inspectEle mentModeController.enabled()) { 1351 if (WebInspector.inspectElementModeController && WebInspector.inspectEle mentModeController.enabled()) {
1349 InspectorFrontendHost.bringToFront(); 1352 InspectorFrontendHost.bringToFront();
1350 WebInspector.inspectElementModeController.disable(); 1353 WebInspector.inspectElementModeController.disable();
1351 } 1354 }
1352 1355
1353 /** @type {!WebInspector.ElementsPanel} */ (WebInspector.inspectorView.p anel("elements")).revealAndSelectNode(node.id); 1356 /** @type {!WebInspector.ElementsPanel} */ (WebInspector.inspectorView.p anel("elements")).revealAndSelectNode(node.id);
1354 } 1357 }
1355 } 1358 }
OLDNEW
« no previous file with comments | « no previous file | Source/devtools/front_end/elementsPanel.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698