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

Side by Side Diff: Source/devtools/front_end/promises/PromisePane.js

Issue 1173363012: DevTools: Network panel filter bar overlaps after select resource row. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: test fixed Created 5 years, 6 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 * @constructor 6 * @constructor
7 * @extends {WebInspector.VBox} 7 * @extends {WebInspector.VBox}
8 * @implements {WebInspector.TargetManager.Observer} 8 * @implements {WebInspector.TargetManager.Observer}
9 */ 9 */
10 WebInspector.PromisePane = function() 10 WebInspector.PromisePane = function()
11 { 11 {
12 WebInspector.VBox.call(this); 12 WebInspector.VBox.call(this);
13 this.registerRequiredCSS("ui/filter.css"); 13 this.registerRequiredCSS("ui/filter.css");
14 this.registerRequiredCSS("promises/promisePane.css"); 14 this.registerRequiredCSS("promises/promisePane.css");
15 this.element.classList.add("promises"); 15 this.element.classList.add("promises");
16 16
17 var toolbar = new WebInspector.Toolbar(this.element); 17 var toolbar = new WebInspector.Toolbar(this.element);
18 this._recordButton = new WebInspector.ToolbarButton("", "record-toolbar-item "); 18 this._recordButton = new WebInspector.ToolbarButton("", "record-toolbar-item ");
19 this._recordButton.addEventListener("click", this._recordButtonClicked.bind( this)); 19 this._recordButton.addEventListener("click", this._recordButtonClicked.bind( this));
20 toolbar.appendToolbarItem(this._recordButton); 20 toolbar.appendToolbarItem(this._recordButton);
21 21
22 var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString("Clea r"), "clear-toolbar-item"); 22 var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString("Clea r"), "clear-toolbar-item");
23 clearButton.addEventListener("click", this._clearButtonClicked.bind(this)); 23 clearButton.addEventListener("click", this._clearButtonClicked.bind(this));
24 toolbar.appendToolbarItem(clearButton); 24 toolbar.appendToolbarItem(clearButton);
25 toolbar.appendSeparator();
25 26
26 this._filter = new WebInspector.PromisePaneFilter(this._refresh.bind(this)); 27 this._promiseStatusFiltersSetting = WebInspector.settings.createSetting("pro miseStatusFilters", {});
27 toolbar.appendToolbarItem(this._filter.filterButton()); 28 this._hideCollectedPromisesSetting = WebInspector.settings.createSetting("hi deCollectedPromises", false);
29
30 this._createFilterBar();
31 toolbar.appendToolbarItem(this._filterBar.filterButton());
28 32
29 var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIStr ing("Collect garbage"), "garbage-collect-toolbar-item"); 33 var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIStr ing("Collect garbage"), "garbage-collect-toolbar-item");
30 garbageCollectButton.addEventListener("click", this._garbageCollectButtonCli cked, this); 34 garbageCollectButton.addEventListener("click", this._garbageCollectButtonCli cked, this);
31 toolbar.appendToolbarItem(garbageCollectButton); 35 toolbar.appendToolbarItem(garbageCollectButton);
32 36
37 toolbar.appendSeparator();
33 var asyncCheckbox = new WebInspector.ToolbarCheckbox(WebInspector.UIString(" Async"), WebInspector.UIString("Capture async stack traces"), WebInspector.modul eSetting("enableAsyncStackTraces")); 38 var asyncCheckbox = new WebInspector.ToolbarCheckbox(WebInspector.UIString(" Async"), WebInspector.UIString("Capture async stack traces"), WebInspector.modul eSetting("enableAsyncStackTraces"));
34 toolbar.appendToolbarItem(asyncCheckbox); 39 toolbar.appendToolbarItem(asyncCheckbox);
35 40
36 this.element.appendChild(this._filter.filtersContainer()); 41 this.element.appendChild(this._filterBar.filtersElement());
37 42
38 this._hiddenByFilterCount = 0; 43 this._hiddenByFilterCount = 0;
39 this._filterStatusMessageElement = this.element.createChild("div", "promises -filter-status hidden"); 44 this._filterStatusMessageElement = this.element.createChild("div", "promises -filter-status hidden");
40 this._filterStatusTextElement = this._filterStatusMessageElement.createChild ("span"); 45 this._filterStatusTextElement = this._filterStatusMessageElement.createChild ("span");
41 this._filterStatusMessageElement.createTextChild(" "); 46 this._filterStatusMessageElement.createTextChild(" ");
42 var resetFiltersLink = this._filterStatusMessageElement.createChild("span", "link"); 47 var resetFiltersLink = this._filterStatusMessageElement.createChild("span", "link");
43 resetFiltersLink.textContent = WebInspector.UIString("Show all promises."); 48 resetFiltersLink.textContent = WebInspector.UIString("Show all promises.");
44 resetFiltersLink.addEventListener("click", this._resetFilters.bind(this), tr ue); 49 resetFiltersLink.addEventListener("click", this._resetFilters.bind(this), tr ue);
45 50
46 this._dataGridContainer = new WebInspector.VBox(); 51 this._dataGridContainer = new WebInspector.VBox();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 this.asyncCreationStack = details.asyncCreationStack; 119 this.asyncCreationStack = details.asyncCreationStack;
115 if (details.settlementStack) 120 if (details.settlementStack)
116 this.settlementStack = details.settlementStack; 121 this.settlementStack = details.settlementStack;
117 if (details.asyncSettlementStack) 122 if (details.asyncSettlementStack)
118 this.asyncSettlementStack = details.asyncSettlementStack; 123 this.asyncSettlementStack = details.asyncSettlementStack;
119 } 124 }
120 } 125 }
121 126
122 127
123 WebInspector.PromisePane.prototype = { 128 WebInspector.PromisePane.prototype = {
129 _createFilterBar: function()
130 {
131 this._filterBar = new WebInspector.FilterBar("promisePane");
132
133 this._textFilterUI = new WebInspector.TextFilterUI(true);
134 this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterC hanged, this._onFilterChanged, this);
135 this._filterBar.addFilter(this._textFilterUI);
136
137 var statuses = [
138 { name: "pending", label: WebInspector.UIString("Pending") },
139 { name: "resolved", label: WebInspector.UIString("Fulfilled") },
140 { name: "rejected", label: WebInspector.UIString("Rejected") }
141 ];
142 this._statusFilterUI = new WebInspector.NamedBitSetFilterUI(statuses, th is._promiseStatusFiltersSetting);
143 this._statusFilterUI.addEventListener(WebInspector.FilterUI.Events.Filte rChanged, this._onFilterChanged, this);
144 this._filterBar.addFilter(this._statusFilterUI);
145
146 var hideCollectedCheckbox = new WebInspector.CheckboxFilterUI("hide-coll ected-promises", WebInspector.UIString("Hide collected promises"), true, this._h ideCollectedPromisesSetting);
147 hideCollectedCheckbox.addEventListener(WebInspector.FilterUI.Events.Filt erChanged, this._onFilterChanged, this);
148 this._filterBar.addFilter(hideCollectedCheckbox);
149 },
150
151 /**
152 * @param {!WebInspector.PromiseDetails} details
153 * @param {!WebInspector.DataGridNode} node
154 * @return {boolean}
155 */
156 _shouldBeVisible: function(details, node)
157 {
158 if (!this._statusFilterUI.accept(details.status))
159 return false;
160
161 if (this._hideCollectedPromisesSetting.get() && details.isGarbageCollect ed)
162 return false;
163
164 var regex = this._textFilterUI.regex();
165 if (!regex)
166 return true;
167
168 var text = node.dataTextForSearch();
169 regex.lastIndex = 0;
170 return regex.test(text);
171 },
172
173 _onFilterChanged: function()
174 {
175 if (this._filterChangedTimeout)
176 clearTimeout(this._filterChangedTimeout);
177 this._filterChangedTimeout = setTimeout(onTimerFired.bind(this), 100);
178
179 /**
180 * @this {WebInspector.PromisePane}
181 */
182 function onTimerFired()
183 {
184 delete this._filterChangedTimeout;
185 this._refresh();
186 }
187 },
188
124 /** 189 /**
125 * @override 190 * @override
126 * @return {!Array.<!Element>} 191 * @return {!Array.<!Element>}
127 */ 192 */
128 elementsToRestoreScrollPositionsFor: function() 193 elementsToRestoreScrollPositionsFor: function()
129 { 194 {
130 return [this._dataGrid.scrollContainer]; 195 return [this._dataGrid.scrollContainer];
131 }, 196 },
132 197
133 /** 198 /**
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 310
246 _clearButtonClicked: function() 311 _clearButtonClicked: function()
247 { 312 {
248 this._clear(); 313 this._clear();
249 if (this._debuggerModel) 314 if (this._debuggerModel)
250 this._promiseDetailsByDebuggerModel.delete(this._debuggerModel); 315 this._promiseDetailsByDebuggerModel.delete(this._debuggerModel);
251 }, 316 },
252 317
253 _resetFilters: function() 318 _resetFilters: function()
254 { 319 {
255 this._filter.reset(); 320 this._hideCollectedPromisesSetting.set(false);
321 this._promiseStatusFiltersSetting.set({});
322 this._textFilterUI.setValue("");
256 }, 323 },
257 324
258 _updateFilterStatus: function() 325 _updateFilterStatus: function()
259 { 326 {
260 this._filterStatusTextElement.textContent = WebInspector.UIString(this._ hiddenByFilterCount === 1 ? "%d promise is hidden by filters." : "%d promises ar e hidden by filters.", this._hiddenByFilterCount); 327 this._filterStatusTextElement.textContent = WebInspector.UIString(this._ hiddenByFilterCount === 1 ? "%d promise is hidden by filters." : "%d promises ar e hidden by filters.", this._hiddenByFilterCount);
261 this._filterStatusMessageElement.classList.toggle("hidden", !this._hidde nByFilterCount); 328 this._filterStatusMessageElement.classList.toggle("hidden", !this._hidde nByFilterCount);
262 }, 329 },
263 330
264 _garbageCollectButtonClicked: function() 331 _garbageCollectButtonClicked: function()
265 { 332 {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 } 400 }
334 if (truncated || this._refreshIsNeeded) { 401 if (truncated || this._refreshIsNeeded) {
335 this._refresh(); 402 this._refresh();
336 return; 403 return;
337 } 404 }
338 405
339 var node = /** @type {!WebInspector.DataGridNode} */ (this._promiseI dToNode.get(details.id)); 406 var node = /** @type {!WebInspector.DataGridNode} */ (this._promiseI dToNode.get(details.id));
340 var wasVisible = !node || !node._isPromiseHidden; 407 var wasVisible = !node || !node._isPromiseHidden;
341 408
342 // Check for the fast path on GC events. 409 // Check for the fast path on GC events.
343 if (eventType === "gc" && node && node.parent && !this._filter.shoul dHideCollectedPromises()) 410 if (eventType === "gc" && node && node.parent && !this._hideCollecte dPromisesSetting.get())
344 node.update(details); 411 node.update(details);
345 else 412 else
346 this._attachDataGridNode(details); 413 this._attachDataGridNode(details);
347 414
348 var isVisible = this._filter.shouldBeVisible(details, /** @type {!We bInspector.DataGridNode} */(this._promiseIdToNode.get(details.id))); 415 var isVisible = this._shouldBeVisible(details, /** @type {!WebInspec tor.DataGridNode} */(this._promiseIdToNode.get(details.id)));
349 if (wasVisible !== isVisible) { 416 if (wasVisible !== isVisible) {
350 this._hiddenByFilterCount += wasVisible ? 1 : -1; 417 this._hiddenByFilterCount += wasVisible ? 1 : -1;
351 this._updateFilterStatus(); 418 this._updateFilterStatus();
352 } 419 }
353 } 420 }
354 }, 421 },
355 422
356 /** 423 /**
357 * @param {!WebInspector.PromiseDetails} details 424 * @param {!WebInspector.PromiseDetails} details
358 */ 425 */
359 _attachDataGridNode: function(details) 426 _attachDataGridNode: function(details)
360 { 427 {
361 var node = this._createDataGridNode(details); 428 var node = this._createDataGridNode(details);
362 var parentNode = this._findVisibleParentNodeDetails(details); 429 var parentNode = this._findVisibleParentNodeDetails(details);
363 if (parentNode !== node.parent) 430 if (parentNode !== node.parent)
364 parentNode.appendChild(node); 431 parentNode.appendChild(node);
365 if (this._filter.shouldBeVisible(details, node)) 432 if (this._shouldBeVisible(details, node))
366 parentNode.expanded = true; 433 parentNode.expanded = true;
367 else 434 else
368 node.remove(); 435 node.remove();
369 }, 436 },
370 437
371 /** 438 /**
372 * @param {!WebInspector.PromiseDetails} details 439 * @param {!WebInspector.PromiseDetails} details
373 * @return {!WebInspector.DataGridNode} 440 * @return {!WebInspector.DataGridNode}
374 */ 441 */
375 _findVisibleParentNodeDetails: function(details) 442 _findVisibleParentNodeDetails: function(details)
376 { 443 {
377 var promiseIdToDetails = /** @type {!Map.<number, !WebInspector.PromiseD etails>} */ (this._promiseDetailsByDebuggerModel.get(this._debuggerModel)); 444 var promiseIdToDetails = /** @type {!Map.<number, !WebInspector.PromiseD etails>} */ (this._promiseDetailsByDebuggerModel.get(this._debuggerModel));
378 var currentDetails = details; 445 var currentDetails = details;
379 while (currentDetails) { 446 while (currentDetails) {
380 var parentId = currentDetails.parentId; 447 var parentId = currentDetails.parentId;
381 if (typeof parentId !== "number") 448 if (typeof parentId !== "number")
382 break; 449 break;
383 currentDetails = promiseIdToDetails.get(parentId); 450 currentDetails = promiseIdToDetails.get(parentId);
384 if (!currentDetails) 451 if (!currentDetails)
385 break; 452 break;
386 var node = this._promiseIdToNode.get(currentDetails.id); 453 var node = this._promiseIdToNode.get(currentDetails.id);
387 if (node && this._filter.shouldBeVisible(currentDetails, node)) 454 if (node && this._shouldBeVisible(currentDetails, node))
388 return node; 455 return node;
389 } 456 }
390 return this._dataGrid.rootNode(); 457 return this._dataGrid.rootNode();
391 }, 458 },
392 459
393 /** 460 /**
394 * @param {!WebInspector.PromiseDetails} details 461 * @param {!WebInspector.PromiseDetails} details
395 * @return {!WebInspector.DataGridNode} 462 * @return {!WebInspector.DataGridNode}
396 */ 463 */
397 _createDataGridNode: function(details) 464 _createDataGridNode: function(details)
(...skipping 19 matching lines...) Expand all
417 484
418 var rootNode = this._dataGrid.rootNode(); 485 var rootNode = this._dataGrid.rootNode();
419 var promiseIdToDetails = /** @type {!Map.<number, !WebInspector.PromiseD etails>} */ (this._promiseDetailsByDebuggerModel.get(this._debuggerModel)); 486 var promiseIdToDetails = /** @type {!Map.<number, !WebInspector.PromiseD etails>} */ (this._promiseDetailsByDebuggerModel.get(this._debuggerModel));
420 487
421 var nodesToInsert = { __proto__: null }; 488 var nodesToInsert = { __proto__: null };
422 // The for..of loop iterates in insertion order. 489 // The for..of loop iterates in insertion order.
423 for (var pair of promiseIdToDetails) { 490 for (var pair of promiseIdToDetails) {
424 var id = /** @type {number} */ (pair[0]); 491 var id = /** @type {number} */ (pair[0]);
425 var details = /** @type {!WebInspector.PromiseDetails} */ (pair[1]); 492 var details = /** @type {!WebInspector.PromiseDetails} */ (pair[1]);
426 var node = this._createDataGridNode(details); 493 var node = this._createDataGridNode(details);
427 node._isPromiseHidden = !this._filter.shouldBeVisible(details, node) ; 494 node._isPromiseHidden = !this._shouldBeVisible(details, node);
428 if (node._isPromiseHidden) { 495 if (node._isPromiseHidden) {
429 ++this._hiddenByFilterCount; 496 ++this._hiddenByFilterCount;
430 continue; 497 continue;
431 } 498 }
432 nodesToInsert[id] = { details: details, node: node }; 499 nodesToInsert[id] = { details: details, node: node };
433 } 500 }
434 501
435 for (var id in nodesToInsert) { 502 for (var id in nodesToInsert) {
436 var node = nodesToInsert[id].node; 503 var node = nodesToInsert[id].node;
437 var details = nodesToInsert[id].details; 504 var details = nodesToInsert[id].details;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 WebInspector.beautifyFunctionName(details.callFrame ? details.callFr ame.functionName : ""), 788 WebInspector.beautifyFunctionName(details.callFrame ? details.callFr ame.functionName : ""),
722 this._callFrameAnchorTextForSearch(details.callFrame), 789 this._callFrameAnchorTextForSearch(details.callFrame),
723 this._callFrameAnchorTextForSearch(details.settlementStack ? details .settlementStack[0] : null), 790 this._callFrameAnchorTextForSearch(details.settlementStack ? details .settlementStack[0] : null),
724 this._ttsCellText().replace(/\u2009/g, " ") // \u2009 is a thin spac e. 791 this._ttsCellText().replace(/\u2009/g, " ") // \u2009 is a thin spac e.
725 ]; 792 ];
726 return texts.join(" "); 793 return texts.join(" ");
727 }, 794 },
728 795
729 __proto__: WebInspector.ViewportDataGridNode.prototype 796 __proto__: WebInspector.ViewportDataGridNode.prototype
730 } 797 }
731
732 /**
733 * @constructor
734 * @param {function()} filterChanged
735 */
736 WebInspector.PromisePaneFilter = function(filterChanged)
737 {
738 this._filterChangedCallback = filterChanged;
739 this._filterBar = new WebInspector.FilterBar();
740
741 this._filtersContainer = createElementWithClass("div", "promises-filters-hea der hidden");
742 this._filtersContainer.appendChild(this._filterBar.filtersElement());
743 this._filterBar.addEventListener(WebInspector.FilterBar.Events.FiltersToggle d, this._onFiltersToggled, this);
744 this._filterBar.setName("promisePane");
745
746 this._textFilterUI = new WebInspector.TextFilterUI(true);
747 this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChang ed, this._onFilterChanged, this);
748 this._filterBar.addFilter(this._textFilterUI);
749
750 var statuses = [
751 { name: "pending", label: WebInspector.UIString("Pending") },
752 { name: "resolved", label: WebInspector.UIString("Fulfilled") },
753 { name: "rejected", label: WebInspector.UIString("Rejected") }
754 ];
755 this._promiseStatusFiltersSetting = WebInspector.settings.createSetting("pro miseStatusFilters", {});
756 this._statusFilterUI = new WebInspector.NamedBitSetFilterUI(statuses, this._ promiseStatusFiltersSetting);
757 this._statusFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterCha nged, this._onFilterChanged, this);
758 this._filterBar.addFilter(this._statusFilterUI);
759
760 this._hideCollectedPromisesSetting = WebInspector.settings.createSetting("hi deCollectedPromises", false);
761 var hideCollectedCheckbox = new WebInspector.CheckboxFilterUI("hide-collecte d-promises", WebInspector.UIString("Hide collected promises"), true, this._hideC ollectedPromisesSetting);
762 hideCollectedCheckbox.addEventListener(WebInspector.FilterUI.Events.FilterCh anged, this._onFilterChanged, this);
763 this._filterBar.addFilter(hideCollectedCheckbox);
764 }
765
766 WebInspector.PromisePaneFilter.prototype = {
767 /**
768 * @return {!WebInspector.ToolbarButton}
769 */
770 filterButton: function()
771 {
772 return this._filterBar.filterButton();
773 },
774
775 /**
776 * @return {!Element}
777 */
778 filtersContainer: function()
779 {
780 return this._filtersContainer;
781 },
782
783 /**
784 * @return {boolean}
785 */
786 shouldHideCollectedPromises: function()
787 {
788 return this._hideCollectedPromisesSetting.get();
789 },
790
791 /**
792 * @param {!WebInspector.PromiseDetails} details
793 * @param {!WebInspector.DataGridNode} node
794 * @return {boolean}
795 */
796 shouldBeVisible: function(details, node)
797 {
798 if (!this._statusFilterUI.accept(details.status))
799 return false;
800
801 if (this.shouldHideCollectedPromises() && details.isGarbageCollected)
802 return false;
803
804 var regex = this._textFilterUI.regex();
805 if (!regex)
806 return true;
807
808 var text = node.dataTextForSearch();
809 regex.lastIndex = 0;
810 return regex.test(text);
811 },
812
813 /**
814 * @param {!WebInspector.Event} event
815 */
816 _onFiltersToggled: function(event)
817 {
818 var toggled = /** @type {boolean} */ (event.data);
819 this._filtersContainer.classList.toggle("hidden", !toggled);
820 },
821
822 _onFilterChanged: function()
823 {
824 if (this._filterChangedTimeout)
825 clearTimeout(this._filterChangedTimeout);
826 this._filterChangedTimeout = setTimeout(onTimerFired.bind(this), 100);
827
828 /** @this {WebInspector.PromisePaneFilter} */
829 function onTimerFired()
830 {
831 delete this._filterChangedTimeout;
832 this._filterChangedCallback();
833 }
834 },
835
836 reset: function()
837 {
838 this._hideCollectedPromisesSetting.set(false);
839 this._promiseStatusFiltersSetting.set({});
840 this._textFilterUI.setValue("");
841 }
842 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/network/NetworkPanel.js ('k') | Source/devtools/front_end/promises/promisePane.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698