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

Side by Side Diff: Source/devtools/front_end/console/ConsoleViewMessage.js

Issue 512003003: DevTools: Show preview in console of ES6 Map, Set, WeakMap and WeakSet entries. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fixed dbg tests Created 6 years, 3 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 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 this._nestingLevel = nestingLevel; 44 this._nestingLevel = nestingLevel;
45 45
46 /** @type {!Array.<!WebInspector.DataGrid>} */ 46 /** @type {!Array.<!WebInspector.DataGrid>} */
47 this._dataGrids = []; 47 this._dataGrids = [];
48 /** @type {!Map.<!WebInspector.DataGrid, ?Element>} */ 48 /** @type {!Map.<!WebInspector.DataGrid, ?Element>} */
49 this._dataGridParents = new Map(); 49 this._dataGridParents = new Map();
50 50
51 /** @type {!Object.<string, function(!WebInspector.RemoteObject, !Element, b oolean=)>} */ 51 /** @type {!Object.<string, function(!WebInspector.RemoteObject, !Element, b oolean=)>} */
52 this._customFormatters = { 52 this._customFormatters = {
53 "object": this._formatParameterAsObject, 53 "object": this._formatParameterAsObject,
54 "array": this._formatParameterAsArray, 54 "array": this._formatParameterAsArray,
55 "node": this._formatParameterAsNode, 55 "node": this._formatParameterAsNode,
56 "map": this._formatParameterAsObject,
57 "set": this._formatParameterAsObject,
56 "string": this._formatParameterAsString 58 "string": this._formatParameterAsString
57 }; 59 };
58 } 60 }
59 61
60 WebInspector.ConsoleViewMessage.prototype = { 62 WebInspector.ConsoleViewMessage.prototype = {
61 /** 63 /**
62 * @return {?WebInspector.Target} 64 * @return {?WebInspector.Target}
63 */ 65 */
64 _target: function() 66 _target: function()
65 { 67 {
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 elem.addEventListener("contextmenu", this._contextMenuEventFired.bin d(this, obj), false); 425 elem.addEventListener("contextmenu", this._contextMenuEventFired.bin d(this, obj), false);
424 }, 426 },
425 427
426 /** 428 /**
427 * @param {!WebInspector.RemoteObject} obj 429 * @param {!WebInspector.RemoteObject} obj
428 * @param {!Element} elem 430 * @param {!Element} elem
429 * @param {boolean=} includePreview 431 * @param {boolean=} includePreview
430 */ 432 */
431 _formatParameterAsObject: function(obj, elem, includePreview) 433 _formatParameterAsObject: function(obj, elem, includePreview)
432 { 434 {
433 this._formatParameterAsArrayOrObject(obj, obj.description || "", elem, i ncludePreview); 435 this._formatParameterAsArrayOrObject(obj, elem, includePreview);
434 }, 436 },
435 437
436 /** 438 /**
437 * @param {!WebInspector.RemoteObject} obj 439 * @param {!WebInspector.RemoteObject} obj
438 * @param {string} description
439 * @param {!Element} elem 440 * @param {!Element} elem
440 * @param {boolean=} includePreview 441 * @param {boolean=} includePreview
441 */ 442 */
442 _formatParameterAsArrayOrObject: function(obj, description, elem, includePre view) 443 _formatParameterAsArrayOrObject: function(obj, elem, includePreview)
443 { 444 {
444 var titleElement = document.createElement("span"); 445 var titleElement = document.createElement("span");
445 if (description)
446 titleElement.createTextChild(description);
447 if (includePreview && obj.preview) { 446 if (includePreview && obj.preview) {
448 titleElement.classList.add("console-object-preview"); 447 titleElement.classList.add("console-object-preview");
449 var lossless = this._appendObjectPreview(obj, description, titleElem ent); 448 var lossless = this._appendObjectPreview(titleElement, obj.preview, obj);
450 if (lossless) { 449 if (lossless) {
451 elem.appendChild(titleElement); 450 elem.appendChild(titleElement);
452 titleElement.addEventListener("contextmenu", this._contextMenuEv entFired.bind(this, obj), false); 451 titleElement.addEventListener("contextmenu", this._contextMenuEv entFired.bind(this, obj), false);
453 return; 452 return;
454 } 453 }
454 } else {
455 titleElement.createTextChild(obj.description || "");
455 } 456 }
456 var section = new WebInspector.ObjectPropertiesSection(obj, titleElement ); 457 var section = new WebInspector.ObjectPropertiesSection(obj, titleElement );
457 section.enableContextMenu(); 458 section.enableContextMenu();
458 elem.appendChild(section.element); 459 elem.appendChild(section.element);
459 460
460 var note = section.titleElement.createChild("span", "object-info-state-n ote"); 461 var note = section.titleElement.createChild("span", "object-info-state-n ote");
461 note.title = WebInspector.UIString("Object state below is captured upon first expansion"); 462 note.title = WebInspector.UIString("Object state below is captured upon first expansion");
462 }, 463 },
463 464
464 /** 465 /**
465 * @param {!WebInspector.RemoteObject} obj 466 * @param {!WebInspector.RemoteObject} obj
466 * @param {!Event} event 467 * @param {!Event} event
467 */ 468 */
468 _contextMenuEventFired: function(obj, event) 469 _contextMenuEventFired: function(obj, event)
469 { 470 {
470 var contextMenu = new WebInspector.ContextMenu(event); 471 var contextMenu = new WebInspector.ContextMenu(event);
471 contextMenu.appendApplicableItems(obj); 472 contextMenu.appendApplicableItems(obj);
472 contextMenu.show(); 473 contextMenu.show();
473 }, 474 },
474 475
475 /** 476 /**
476 * @param {!WebInspector.RemoteObject} obj 477 * @param {!Element} parentElement
477 * @param {string} description 478 * @param {!RuntimeAgent.ObjectPreview} preview
478 * @param {!Element} titleElement 479 * @param {?WebInspector.RemoteObject} object
479 * @return {boolean} true iff preview captured all information. 480 * @return {boolean} true iff preview captured all information.
480 */ 481 */
481 _appendObjectPreview: function(obj, description, titleElement) 482 _appendObjectPreview: function(parentElement, preview, object)
482 { 483 {
483 var preview = obj.preview; 484 var description = preview.description;
484 var isArray = obj.subtype === "array"; 485 if (preview.type !== "object" || preview.subtype === "null") {
486 parentElement.appendChild(this._renderPropertyPreview(preview.type, preview.subtype, description));
487 return true;
488 }
489 if (description && preview.subtype !== "array")
490 parentElement.createTextChildren(description, " ");
491 if (preview.entries)
492 return this._appendEntriesPreview(parentElement, preview);
493 return this._appendPropertiesPreview(parentElement, preview, object);
494 },
485 495
486 if (description) 496 /**
487 titleElement.createTextChild(" "); 497 * @param {!Element} parentElement
488 titleElement.createTextChild(isArray ? "[" : "{"); 498 * @param {!RuntimeAgent.ObjectPreview} preview
499 * @param {?WebInspector.RemoteObject} object
500 * @return {boolean} true iff preview captured all information.
501 */
502 _appendPropertiesPreview: function(parentElement, preview, object)
503 {
504 var isArray = preview.subtype === "array";
505 parentElement.createTextChild(isArray ? "[" : "{");
489 for (var i = 0; i < preview.properties.length; ++i) { 506 for (var i = 0; i < preview.properties.length; ++i) {
490 if (i > 0) 507 if (i > 0)
491 titleElement.createTextChild(", "); 508 parentElement.createTextChild(", ");
492 509
493 var property = preview.properties[i]; 510 var property = preview.properties[i];
494 var name = property.name; 511 var name = property.name;
495 if (!isArray || name != i) { 512 if (!isArray || name != i) {
496 if (/^\s|\s$|^$|\n/.test(name)) 513 if (/^\s|\s$|^$|\n/.test(name))
497 titleElement.createChild("span", "name").createTextChildren( "\"", name.replace(/\n/g, "\u21B5"), "\""); 514 parentElement.createChild("span", "name").createTextChildren ("\"", name.replace(/\n/g, "\u21B5"), "\"");
498 else 515 else
499 titleElement.createChild("span", "name").textContent = name; 516 parentElement.createChild("span", "name").textContent = name ;
500 titleElement.createTextChild(": "); 517 parentElement.createTextChild(": ");
501 } 518 }
502 519
503 titleElement.appendChild(this._renderPropertyPreviewOrAccessor(obj, [property])); 520 parentElement.appendChild(this._renderPropertyPreviewOrAccessor(obje ct, [property]));
504 } 521 }
505 if (preview.overflow) 522 if (preview.overflow)
506 titleElement.createChild("span").textContent = "\u2026"; 523 parentElement.createChild("span").textContent = "\u2026";
507 titleElement.createTextChild(isArray ? "]" : "}"); 524 parentElement.createTextChild(isArray ? "]" : "}");
508 return preview.lossless; 525 return preview.lossless;
509 }, 526 },
510 527
511 /** 528 /**
512 * @param {!WebInspector.RemoteObject} object 529 * @param {!Element} parentElement
530 * @param {!RuntimeAgent.ObjectPreview} preview
531 * @return {boolean} true iff preview captured all information.
532 */
533 _appendEntriesPreview: function(parentElement, preview)
534 {
535 var lossless = preview.lossless && !preview.properties.length;
536 parentElement.createTextChild("{");
537 for (var i = 0; i < preview.entries.length; ++i) {
538 if (i > 0)
539 parentElement.createTextChild(", ");
540
541 var entry = preview.entries[i];
542 if (entry.key) {
543 this._appendObjectPreview(parentElement, entry.key, null);
544 parentElement.createTextChild(" => ");
545 }
546 this._appendObjectPreview(parentElement, entry.value, null);
547 }
548 if (preview.overflow)
549 parentElement.createChild("span").textContent = "\u2026";
550 parentElement.createTextChild("}");
551 return lossless;
552 },
553
554 /**
555 * @param {?WebInspector.RemoteObject} object
513 * @param {!Array.<!RuntimeAgent.PropertyPreview>} propertyPath 556 * @param {!Array.<!RuntimeAgent.PropertyPreview>} propertyPath
514 * @return {!Element} 557 * @return {!Element}
515 */ 558 */
516 _renderPropertyPreviewOrAccessor: function(object, propertyPath) 559 _renderPropertyPreviewOrAccessor: function(object, propertyPath)
517 { 560 {
518 var property = propertyPath.peekLast(); 561 var property = propertyPath.peekLast();
519 if (property.type === "accessor") 562 if (property.type === "accessor")
520 return this._formatAsAccessorProperty(object, propertyPath.select("n ame"), false); 563 return this._formatAsAccessorProperty(object, propertyPath.select("n ame"), false);
521 return this._renderPropertyPreview(property.type, /** @type {string} */ (property.subtype), property.value); 564 return this._renderPropertyPreview(property.type, /** @type {string} */ (property.subtype), property.value);
522 }, 565 },
523 566
524 /** 567 /**
525 * @param {string} type 568 * @param {string} type
526 * @param {string=} subtype 569 * @param {string=} subtype
527 * @param {string=} description 570 * @param {string=} description
528 * @return {!Element} 571 * @return {!Element}
529 */ 572 */
530 _renderPropertyPreview: function(type, subtype, description) 573 _renderPropertyPreview: function(type, subtype, description)
531 { 574 {
532 var span = document.createElementWithClass("span", "console-formatted-" + (subtype || type)); 575 var span = document.createElementWithClass("span", "console-formatted-" + (subtype || type));
576 description = description || "";
533 577
534 if (type === "function") { 578 if (type === "function") {
535 span.textContent = "function"; 579 span.textContent = "function";
536 return span; 580 return span;
537 } 581 }
538 582
539 if (type === "object" && subtype === "regexp") {
540 span.textContent = description;
541 return span;
542 }
543
544 if (type === "object" && subtype === "node" && description) { 583 if (type === "object" && subtype === "node" && description) {
545 span.classList.add("console-formatted-preview-node"); 584 span.classList.add("console-formatted-preview-node");
546 WebInspector.DOMPresentationUtils.createSpansForNodeTitle(span, desc ription); 585 WebInspector.DOMPresentationUtils.createSpansForNodeTitle(span, desc ription);
547 return span; 586 return span;
548 } 587 }
549 588
550 if (type === "string") { 589 if (type === "string") {
551 span.createTextChildren("\"", description.replace(/\n/g, "\u21B5"), "\""); 590 span.createTextChildren("\"", description.replace(/\n/g, "\u21B5"), "\"");
552 return span; 591 return span;
553 } 592 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 return this._message.type !== WebInspector.ConsoleMessage.MessageType.Di rXML && !!array.preview; 631 return this._message.type !== WebInspector.ConsoleMessage.MessageType.Di rXML && !!array.preview;
593 }, 632 },
594 633
595 /** 634 /**
596 * @param {!WebInspector.RemoteObject} array 635 * @param {!WebInspector.RemoteObject} array
597 * @param {!Element} elem 636 * @param {!Element} elem
598 */ 637 */
599 _formatParameterAsArray: function(array, elem) 638 _formatParameterAsArray: function(array, elem)
600 { 639 {
601 if (this.useArrayPreviewInFormatter(array)) { 640 if (this.useArrayPreviewInFormatter(array)) {
602 this._formatParameterAsArrayOrObject(array, "", elem, true); 641 this._formatParameterAsArrayOrObject(array, elem, true);
603 return; 642 return;
604 } 643 }
605 644
606 const maxFlatArrayLength = 100; 645 const maxFlatArrayLength = 100;
607 if (this._message.isOutdated || array.arrayLength() > maxFlatArrayLength ) 646 if (this._message.isOutdated || array.arrayLength() > maxFlatArrayLength )
608 this._formatParameterAsObject(array, elem, false); 647 this._formatParameterAsObject(array, elem, false);
609 else 648 else
610 array.getOwnProperties(this._printArray.bind(this, array, elem)); 649 array.getOwnProperties(this._printArray.bind(this, array, elem));
611 }, 650 },
612 651
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 * @param {!WebInspector.RemoteObject} output 790 * @param {!WebInspector.RemoteObject} output
752 * @return {!Element} 791 * @return {!Element}
753 */ 792 */
754 _formatAsArrayEntry: function(output) 793 _formatAsArrayEntry: function(output)
755 { 794 {
756 // Prevent infinite expansion of cross-referencing arrays. 795 // Prevent infinite expansion of cross-referencing arrays.
757 return this._formatParameter(output, output.subtype === "array", false); 796 return this._formatParameter(output, output.subtype === "array", false);
758 }, 797 },
759 798
760 /** 799 /**
761 * @param {!WebInspector.RemoteObject} object 800 * @param {?WebInspector.RemoteObject} object
762 * @param {!Array.<string>} propertyPath 801 * @param {!Array.<string>} propertyPath
763 * @param {boolean} isArrayEntry 802 * @param {boolean} isArrayEntry
764 * @return {!Element} 803 * @return {!Element}
765 */ 804 */
766 _formatAsAccessorProperty: function(object, propertyPath, isArrayEntry) 805 _formatAsAccessorProperty: function(object, propertyPath, isArrayEntry)
767 { 806 {
768 var rootElement = WebInspector.ObjectPropertyTreeElement.createRemoteObj ectAccessorPropertySpan(object, propertyPath, onInvokeGetterClick.bind(this)); 807 var rootElement = WebInspector.ObjectPropertyTreeElement.createRemoteObj ectAccessorPropertySpan(object, propertyPath, onInvokeGetterClick.bind(this));
769 808
770 /** 809 /**
771 * @param {?WebInspector.RemoteObject} result 810 * @param {?WebInspector.RemoteObject} result
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1281 { 1320 {
1282 if (!this._wrapperElement) { 1321 if (!this._wrapperElement) {
1283 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this ); 1322 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this );
1284 this._wrapperElement.classList.toggle("collapsed", this._collapsed); 1323 this._wrapperElement.classList.toggle("collapsed", this._collapsed);
1285 } 1324 }
1286 return this._wrapperElement; 1325 return this._wrapperElement;
1287 }, 1326 },
1288 1327
1289 __proto__: WebInspector.ConsoleViewMessage.prototype 1328 __proto__: WebInspector.ConsoleViewMessage.prototype
1290 } 1329 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/components/ObjectPropertiesSection.js ('k') | Source/devtools/front_end/inspectorStyle.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698