Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Intel Inc. All rights reserved. | 3 * Copyright (C) 2012 Intel Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 224 } | 224 } |
| 225 | 225 |
| 226 /** | 226 /** |
| 227 * @param {!WebInspector.TracingModel.Event} traceEvent | 227 * @param {!WebInspector.TracingModel.Event} traceEvent |
| 228 * @param {!RegExp} regExp | 228 * @param {!RegExp} regExp |
| 229 * @return {boolean} | 229 * @return {boolean} |
| 230 */ | 230 */ |
| 231 static testContentMatching(traceEvent, regExp) { | 231 static testContentMatching(traceEvent, regExp) { |
| 232 var title = WebInspector.TimelineUIUtils.eventStyle(traceEvent).title; | 232 var title = WebInspector.TimelineUIUtils.eventStyle(traceEvent).title; |
| 233 var tokens = [title]; | 233 var tokens = [title]; |
| 234 if (traceEvent.url) | 234 var url = WebInspector.TimelineData.forEvent(traceEvent).url; |
| 235 tokens.push(traceEvent.url); | 235 if (url) |
| 236 tokens.push(url); | |
| 236 for (var argName in traceEvent.args) { | 237 for (var argName in traceEvent.args) { |
| 237 var argValue = traceEvent.args[argName]; | 238 var argValue = traceEvent.args[argName]; |
| 238 for (var key in argValue) | 239 for (var key in argValue) |
| 239 tokens.push(argValue[key]); | 240 tokens.push(argValue[key]); |
| 240 } | 241 } |
| 241 return regExp.test(tokens.join('|')); | 242 return regExp.test(tokens.join('|')); |
| 242 } | 243 } |
| 243 | 244 |
| 244 /** | 245 /** |
| 245 * @param {!WebInspector.TimelineModel.Record} record | 246 * @param {!WebInspector.TimelineModel.Record} record |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 return title; | 300 return title; |
| 300 if (event.name === WebInspector.TimelineModel.RecordType.TimeStamp) | 301 if (event.name === WebInspector.TimelineModel.RecordType.TimeStamp) |
| 301 return WebInspector.UIString('%s: %s', title, event.args['data']['message' ]); | 302 return WebInspector.UIString('%s: %s', title, event.args['data']['message' ]); |
| 302 if (event.name === WebInspector.TimelineModel.RecordType.Animation && event. args['data'] && | 303 if (event.name === WebInspector.TimelineModel.RecordType.Animation && event. args['data'] && |
| 303 event.args['data']['name']) | 304 event.args['data']['name']) |
| 304 return WebInspector.UIString('%s: %s', title, event.args['data']['name']); | 305 return WebInspector.UIString('%s: %s', title, event.args['data']['name']); |
| 305 return title; | 306 return title; |
| 306 } | 307 } |
| 307 | 308 |
| 308 /** | 309 /** |
| 309 * @param {!WebInspector.TracingModel.Event} event | |
| 310 * @return {?string} | |
| 311 */ | |
| 312 static eventURL(event) { | |
| 313 if (event.url) | |
| 314 return event.url; | |
| 315 var data = event.args['data'] || event.args['beginData']; | |
| 316 return data && data.url || null; | |
| 317 } | |
| 318 | |
| 319 /** | |
| 320 * !Map<!WebInspector.TimelineIRModel.Phases, !{color: string, label: string}> | 310 * !Map<!WebInspector.TimelineIRModel.Phases, !{color: string, label: string}> |
| 321 */ | 311 */ |
| 322 static _interactionPhaseStyles() { | 312 static _interactionPhaseStyles() { |
| 323 var map = WebInspector.TimelineUIUtils._interactionPhaseStylesMap; | 313 var map = WebInspector.TimelineUIUtils._interactionPhaseStylesMap; |
| 324 if (!map) { | 314 if (!map) { |
| 325 map = new Map([ | 315 map = new Map([ |
| 326 [WebInspector.TimelineIRModel.Phases.Idle, {color: 'white', label: 'Idle '}], | 316 [WebInspector.TimelineIRModel.Phases.Idle, {color: 'white', label: 'Idle '}], |
| 327 [ | 317 [ |
| 328 WebInspector.TimelineIRModel.Phases.Response, | 318 WebInspector.TimelineIRModel.Phases.Response, |
| 329 {color: 'hsl(43, 83%, 64%)', label: WebInspector.UIString('Response')} | 319 {color: 'hsl(43, 83%, 64%)', label: WebInspector.UIString('Response')} |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 | 359 |
| 370 /** | 360 /** |
| 371 * @param {!Protocol.Runtime.CallFrame} frame | 361 * @param {!Protocol.Runtime.CallFrame} frame |
| 372 * @return {boolean} | 362 * @return {boolean} |
| 373 */ | 363 */ |
| 374 static isUserFrame(frame) { | 364 static isUserFrame(frame) { |
| 375 return frame.scriptId !== '0' && !(frame.url && frame.url.startsWith('native ')); | 365 return frame.scriptId !== '0' && !(frame.url && frame.url.startsWith('native ')); |
| 376 } | 366 } |
| 377 | 367 |
| 378 /** | 368 /** |
| 379 * @param {!WebInspector.TracingModel.Event} event | |
| 380 * @return {?Protocol.Runtime.CallFrame} | |
| 381 */ | |
| 382 static topStackFrame(event) { | |
| 383 var stackTrace = event.stackTrace || event.initiator && event.initiator.stac kTrace; | |
| 384 return stackTrace && stackTrace.length ? stackTrace[0] : null; | |
| 385 } | |
| 386 | |
| 387 /** | |
| 388 * @param {!WebInspector.TimelineModel.NetworkRequest} request | 369 * @param {!WebInspector.TimelineModel.NetworkRequest} request |
| 389 * @return {!WebInspector.TimelineUIUtils.NetworkCategory} | 370 * @return {!WebInspector.TimelineUIUtils.NetworkCategory} |
| 390 */ | 371 */ |
| 391 static networkRequestCategory(request) { | 372 static networkRequestCategory(request) { |
| 392 var categories = WebInspector.TimelineUIUtils.NetworkCategory; | 373 var categories = WebInspector.TimelineUIUtils.NetworkCategory; |
| 393 switch (request.mimeType) { | 374 switch (request.mimeType) { |
| 394 case 'text/html': | 375 case 'text/html': |
| 395 return categories.HTML; | 376 return categories.HTML; |
| 396 case 'application/javascript': | 377 case 'application/javascript': |
| 397 case 'application/x-javascript': | 378 case 'application/x-javascript': |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 case recordType.WebSocketReceiveHandshakeResponse: | 478 case recordType.WebSocketReceiveHandshakeResponse: |
| 498 case recordType.WebSocketDestroy: | 479 case recordType.WebSocketDestroy: |
| 499 case recordType.ResourceSendRequest: | 480 case recordType.ResourceSendRequest: |
| 500 case recordType.ResourceReceivedData: | 481 case recordType.ResourceReceivedData: |
| 501 case recordType.ResourceReceiveResponse: | 482 case recordType.ResourceReceiveResponse: |
| 502 case recordType.ResourceFinish: | 483 case recordType.ResourceFinish: |
| 503 case recordType.PaintImage: | 484 case recordType.PaintImage: |
| 504 case recordType.DecodeImage: | 485 case recordType.DecodeImage: |
| 505 case recordType.ResizeImage: | 486 case recordType.ResizeImage: |
| 506 case recordType.DecodeLazyPixelRef: | 487 case recordType.DecodeLazyPixelRef: |
| 507 if (event.url) | 488 var url = WebInspector.TimelineData.forEvent(event).url; |
| 508 detailsText = WebInspector.displayNameForURL(event.url); | 489 if (url) |
| 490 detailsText = WebInspector.displayNameForURL(url); | |
| 509 break; | 491 break; |
| 510 | 492 |
| 511 case recordType.EmbedderCallback: | 493 case recordType.EmbedderCallback: |
| 512 detailsText = eventData['callbackName']; | 494 detailsText = eventData['callbackName']; |
| 513 break; | 495 break; |
| 514 | 496 |
| 515 case recordType.Animation: | 497 case recordType.Animation: |
| 516 detailsText = eventData && eventData['name']; | 498 detailsText = eventData && eventData['name']; |
| 517 break; | 499 break; |
| 518 | 500 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 if (!rawLocation) | 534 if (!rawLocation) |
| 553 return null; | 535 return null; |
| 554 var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILoca tion(rawLocation); | 536 var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILoca tion(rawLocation); |
| 555 return uiLocation.linkText(); | 537 return uiLocation.linkText(); |
| 556 } | 538 } |
| 557 | 539 |
| 558 /** | 540 /** |
| 559 * @return {?string} | 541 * @return {?string} |
| 560 */ | 542 */ |
| 561 function linkifyTopCallFrameAsText() { | 543 function linkifyTopCallFrameAsText() { |
| 562 var frame = WebInspector.TimelineUIUtils.topStackFrame(event); | 544 var frame = WebInspector.TimelineData.forEvent(event).topFrame(); |
| 563 if (!frame) | 545 if (!frame) |
| 564 return null; | 546 return null; |
| 565 var text = linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame.c olumnNumber); | 547 var text = linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame.c olumnNumber); |
| 566 if (!text) { | 548 if (!text) { |
| 567 text = frame.url; | 549 text = frame.url; |
| 568 if (typeof frame.lineNumber === 'number') | 550 if (typeof frame.lineNumber === 'number') |
| 569 text += ':' + (frame.lineNumber + 1); | 551 text += ':' + (frame.lineNumber + 1); |
| 570 } | 552 } |
| 571 return text; | 553 return text; |
| 572 } | 554 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 604 case recordType.PaintImage: | 586 case recordType.PaintImage: |
| 605 case recordType.DecodeImage: | 587 case recordType.DecodeImage: |
| 606 case recordType.ResizeImage: | 588 case recordType.ResizeImage: |
| 607 case recordType.DecodeLazyPixelRef: | 589 case recordType.DecodeLazyPixelRef: |
| 608 case recordType.XHRReadyStateChange: | 590 case recordType.XHRReadyStateChange: |
| 609 case recordType.XHRLoad: | 591 case recordType.XHRLoad: |
| 610 case recordType.ResourceSendRequest: | 592 case recordType.ResourceSendRequest: |
| 611 case recordType.ResourceReceivedData: | 593 case recordType.ResourceReceivedData: |
| 612 case recordType.ResourceReceiveResponse: | 594 case recordType.ResourceReceiveResponse: |
| 613 case recordType.ResourceFinish: | 595 case recordType.ResourceFinish: |
| 614 if (event.url) | 596 var url = WebInspector.TimelineData.forEvent(event).url; |
| 615 details = WebInspector.linkifyResourceAsNode(event.url); | 597 if (url) |
| 598 details = WebInspector.linkifyResourceAsNode(url); | |
| 616 break; | 599 break; |
| 617 case recordType.FunctionCall: | 600 case recordType.FunctionCall: |
| 618 case recordType.JSFrame: | 601 case recordType.JSFrame: |
| 619 details = createElement('span'); | 602 details = createElement('span'); |
| 620 details.createTextChild(WebInspector.beautifyFunctionName(eventData['fun ctionName'])); | 603 details.createTextChild(WebInspector.beautifyFunctionName(eventData['fun ctionName'])); |
| 621 var location = linkifyLocation( | 604 var location = linkifyLocation( |
| 622 eventData['scriptId'], eventData['url'], eventData['lineNumber'], ev entData['columnNumber']); | 605 eventData['scriptId'], eventData['url'], eventData['lineNumber'], ev entData['columnNumber']); |
| 623 if (location) { | 606 if (location) { |
| 624 details.createTextChild(' @ '); | 607 details.createTextChild(' @ '); |
| 625 details.appendChild(location); | 608 details.appendChild(location); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 656 * @return {?Element} | 639 * @return {?Element} |
| 657 */ | 640 */ |
| 658 function linkifyLocation(scriptId, url, lineNumber, columnNumber) { | 641 function linkifyLocation(scriptId, url, lineNumber, columnNumber) { |
| 659 return linkifier.linkifyScriptLocation(target, scriptId, url, lineNumber, columnNumber, 'timeline-details'); | 642 return linkifier.linkifyScriptLocation(target, scriptId, url, lineNumber, columnNumber, 'timeline-details'); |
| 660 } | 643 } |
| 661 | 644 |
| 662 /** | 645 /** |
| 663 * @return {?Element} | 646 * @return {?Element} |
| 664 */ | 647 */ |
| 665 function linkifyTopCallFrame() { | 648 function linkifyTopCallFrame() { |
| 666 var frame = WebInspector.TimelineUIUtils.topStackFrame(event); | 649 var frame = WebInspector.TimelineData.forEvent(event).topFrame(); |
| 667 return frame ? linkifier.maybeLinkifyConsoleCallFrame(target, frame, 'time line-details') : null; | 650 return frame ? linkifier.maybeLinkifyConsoleCallFrame(target, frame, 'time line-details') : null; |
| 668 } | 651 } |
| 669 } | 652 } |
| 670 | 653 |
| 671 /** | 654 /** |
| 672 * @param {!WebInspector.TracingModel.Event} event | 655 * @param {!WebInspector.TracingModel.Event} event |
| 673 * @param {!WebInspector.TimelineModel} model | 656 * @param {!WebInspector.TimelineModel} model |
| 674 * @param {!WebInspector.Linkifier} linkifier | 657 * @param {!WebInspector.Linkifier} linkifier |
| 675 * @param {boolean} detailed | 658 * @param {boolean} detailed |
| 676 * @param {function(!DocumentFragment)} callback | 659 * @param {function(!DocumentFragment)} callback |
| 677 */ | 660 */ |
| 678 static buildTraceEventDetails(event, model, linkifier, detailed, callback) { | 661 static buildTraceEventDetails(event, model, linkifier, detailed, callback) { |
| 679 var target = model.targetByEvent(event); | 662 var target = model.targetByEvent(event); |
| 680 if (!target) { | 663 if (!target) { |
| 681 callbackWrapper(); | 664 callbackWrapper(); |
| 682 return; | 665 return; |
| 683 } | 666 } |
| 684 var relatedNodes = null; | 667 var relatedNodes = null; |
| 685 var barrier = new CallbackBarrier(); | 668 var barrier = new CallbackBarrier(); |
| 686 if (!event.previewElement) { | 669 if (!event[WebInspector.TimelineUIUtils._previewElementSymbol]) { |
| 687 if (event.url) | 670 var url = WebInspector.TimelineData.forEvent(event).url; |
| 671 if (url) { | |
| 688 WebInspector.DOMPresentationUtils.buildImagePreviewContents( | 672 WebInspector.DOMPresentationUtils.buildImagePreviewContents( |
| 689 target, event.url, false, barrier.createCallback(saveImage)); | 673 target, url, false, barrier.createCallback(saveImage)); |
| 690 else if (event.picture) | 674 } else if (WebInspector.TimelineData.forEvent(event).picture) |
|
alph
2016/11/09 00:46:22
need {}
| |
| 691 WebInspector.TimelineUIUtils.buildPicturePreviewContent(event, target, b arrier.createCallback(saveImage)); | 675 WebInspector.TimelineUIUtils.buildPicturePreviewContent(event, target, b arrier.createCallback(saveImage)); |
| 692 } | 676 } |
| 693 var nodeIdsToResolve = new Set(); | 677 var nodeIdsToResolve = new Set(); |
| 694 if (event.backendNodeId) | 678 var timelineData = WebInspector.TimelineData.forEvent(event); |
| 695 nodeIdsToResolve.add(event.backendNodeId); | 679 if (timelineData.backendNodeId) |
| 696 if (event.invalidationTrackingEvents) | 680 nodeIdsToResolve.add(timelineData.backendNodeId); |
| 697 WebInspector.TimelineUIUtils._collectInvalidationNodeIds(nodeIdsToResolve, event.invalidationTrackingEvents); | 681 var invalidationTrackingEvents = WebInspector.InvalidationTracker.invalidati onEventsFor(event); |
| 682 if (invalidationTrackingEvents) | |
| 683 WebInspector.TimelineUIUtils._collectInvalidationNodeIds(nodeIdsToResolve, invalidationTrackingEvents); | |
| 698 if (nodeIdsToResolve.size) { | 684 if (nodeIdsToResolve.size) { |
| 699 var domModel = WebInspector.DOMModel.fromTarget(target); | 685 var domModel = WebInspector.DOMModel.fromTarget(target); |
| 700 if (domModel) | 686 if (domModel) |
| 701 domModel.pushNodesByBackendIdsToFrontend(nodeIdsToResolve, barrier.creat eCallback(setRelatedNodeMap)); | 687 domModel.pushNodesByBackendIdsToFrontend(nodeIdsToResolve, barrier.creat eCallback(setRelatedNodeMap)); |
| 702 } | 688 } |
| 703 barrier.callWhenDone(callbackWrapper); | 689 barrier.callWhenDone(callbackWrapper); |
| 704 | 690 |
| 705 /** | 691 /** |
| 706 * @param {!Element=} element | 692 * @param {!Element=} element |
| 707 */ | 693 */ |
| 708 function saveImage(element) { | 694 function saveImage(element) { |
| 709 event.previewElement = element || null; | 695 event[WebInspector.TimelineUIUtils._previewElementSymbol] = element || nul l; |
| 710 } | 696 } |
| 711 | 697 |
| 712 /** | 698 /** |
| 713 * @param {?Map<number, ?WebInspector.DOMNode>} nodeMap | 699 * @param {?Map<number, ?WebInspector.DOMNode>} nodeMap |
| 714 */ | 700 */ |
| 715 function setRelatedNodeMap(nodeMap) { | 701 function setRelatedNodeMap(nodeMap) { |
| 716 relatedNodes = nodeMap; | 702 relatedNodes = nodeMap; |
| 717 } | 703 } |
| 718 | 704 |
| 719 function callbackWrapper() { | 705 function callbackWrapper() { |
| 720 callback(WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously ( | 706 callback(WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously ( |
| 721 event, model, linkifier, detailed, relatedNodes)); | 707 event, model, linkifier, detailed, relatedNodes)); |
| 722 } | 708 } |
| 723 } | 709 } |
| 724 | 710 |
| 725 /** | 711 /** |
| 726 * @param {!WebInspector.TracingModel.Event} event | 712 * @param {!WebInspector.TracingModel.Event} event |
| 727 * @param {!WebInspector.TimelineModel} model | 713 * @param {!WebInspector.TimelineModel} model |
| 728 * @param {!WebInspector.Linkifier} linkifier | 714 * @param {!WebInspector.Linkifier} linkifier |
| 729 * @param {boolean} detailed | 715 * @param {boolean} detailed |
| 730 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap | 716 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap |
| 731 * @return {!DocumentFragment} | 717 * @return {!DocumentFragment} |
| 732 */ | 718 */ |
| 733 static _buildTraceEventDetailsSynchronously(event, model, linkifier, detailed, relatedNodesMap) { | 719 static _buildTraceEventDetailsSynchronously(event, model, linkifier, detailed, relatedNodesMap) { |
| 734 var stats = {}; | |
| 735 var recordTypes = WebInspector.TimelineModel.RecordType; | 720 var recordTypes = WebInspector.TimelineModel.RecordType; |
| 736 | |
| 737 // This message may vary per event.name; | 721 // This message may vary per event.name; |
| 738 var relatedNodeLabel; | 722 var relatedNodeLabel; |
| 739 | 723 |
| 740 var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.targ etByEvent(event), linkifier); | 724 var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.targ etByEvent(event), linkifier); |
| 741 contentHelper.addSection( | 725 contentHelper.addSection( |
| 742 WebInspector.TimelineUIUtils.eventTitle(event), WebInspector.TimelineUIU tils.eventStyle(event).category); | 726 WebInspector.TimelineUIUtils.eventTitle(event), WebInspector.TimelineUIU tils.eventStyle(event).category); |
| 743 | 727 |
| 744 var eventData = event.args['data']; | 728 var eventData = event.args['data']; |
| 745 var initiator = event.initiator; | 729 var timelineData = WebInspector.TimelineData.forEvent(event); |
| 730 var initiator = timelineData.initiator(); | |
| 746 | 731 |
| 747 if (event.warning) | 732 if (timelineData.warning) |
| 748 contentHelper.appendWarningRow(event); | 733 contentHelper.appendWarningRow(event); |
| 749 if (event.name === recordTypes.JSFrame && eventData['deoptReason']) | 734 if (event.name === recordTypes.JSFrame && eventData['deoptReason']) |
| 750 contentHelper.appendWarningRow(event, WebInspector.TimelineModel.WarningTy pe.V8Deopt); | 735 contentHelper.appendWarningRow(event, WebInspector.TimelineModel.WarningTy pe.V8Deopt); |
| 751 | 736 |
| 752 if (detailed) { | 737 if (detailed) { |
| 753 contentHelper.appendTextRow(WebInspector.UIString('Self Time'), Number.mil lisToString(event.selfTime, true)); | 738 contentHelper.appendTextRow(WebInspector.UIString('Self Time'), Number.mil lisToString(event.selfTime, true)); |
| 754 contentHelper.appendTextRow( | 739 contentHelper.appendTextRow( |
| 755 WebInspector.UIString('Total Time'), Number.millisToString(event.durat ion || 0, true)); | 740 WebInspector.UIString('Total Time'), Number.millisToString(event.durat ion || 0, true)); |
| 756 } | 741 } |
| 757 | 742 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 778 contentHelper.appendTextRow(WebInspector.UIString('Repeats'), !eventDa ta['singleShot']); | 763 contentHelper.appendTextRow(WebInspector.UIString('Repeats'), !eventDa ta['singleShot']); |
| 779 } | 764 } |
| 780 break; | 765 break; |
| 781 case recordTypes.FireAnimationFrame: | 766 case recordTypes.FireAnimationFrame: |
| 782 contentHelper.appendTextRow(WebInspector.UIString('Callback ID'), eventD ata['id']); | 767 contentHelper.appendTextRow(WebInspector.UIString('Callback ID'), eventD ata['id']); |
| 783 break; | 768 break; |
| 784 case recordTypes.ResourceSendRequest: | 769 case recordTypes.ResourceSendRequest: |
| 785 case recordTypes.ResourceReceiveResponse: | 770 case recordTypes.ResourceReceiveResponse: |
| 786 case recordTypes.ResourceReceivedData: | 771 case recordTypes.ResourceReceivedData: |
| 787 case recordTypes.ResourceFinish: | 772 case recordTypes.ResourceFinish: |
| 788 var url = (event.name === recordTypes.ResourceSendRequest) ? eventData[' url'] : | 773 var url = timelineData.url; |
| 789 initiator & & initiator.args['data']['url']; | |
| 790 if (url) | 774 if (url) |
| 791 contentHelper.appendElementRow(WebInspector.UIString('Resource'), WebI nspector.linkifyResourceAsNode(url)); | 775 contentHelper.appendElementRow(WebInspector.UIString('Resource'), WebI nspector.linkifyResourceAsNode(url)); |
| 792 if (eventData['requestMethod']) | 776 if (eventData['requestMethod']) |
| 793 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), e ventData['requestMethod']); | 777 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), e ventData['requestMethod']); |
| 794 if (typeof eventData['statusCode'] === 'number') | 778 if (typeof eventData['statusCode'] === 'number') |
| 795 contentHelper.appendTextRow(WebInspector.UIString('Status Code'), even tData['statusCode']); | 779 contentHelper.appendTextRow(WebInspector.UIString('Status Code'), even tData['statusCode']); |
| 796 if (eventData['mimeType']) | 780 if (eventData['mimeType']) |
| 797 contentHelper.appendTextRow(WebInspector.UIString('MIME Type'), eventD ata['mimeType']); | 781 contentHelper.appendTextRow(WebInspector.UIString('MIME Type'), eventD ata['mimeType']); |
| 798 if ('priority' in eventData) { | 782 if ('priority' in eventData) { |
| 799 var priority = WebInspector.uiLabelForPriority(eventData['priority']); | 783 var priority = WebInspector.uiLabelForPriority(eventData['priority']); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 825 case recordTypes.Rasterize: | 809 case recordTypes.Rasterize: |
| 826 case recordTypes.ScrollLayer: | 810 case recordTypes.ScrollLayer: |
| 827 relatedNodeLabel = WebInspector.UIString('Layer Root'); | 811 relatedNodeLabel = WebInspector.UIString('Layer Root'); |
| 828 break; | 812 break; |
| 829 case recordTypes.PaintImage: | 813 case recordTypes.PaintImage: |
| 830 case recordTypes.DecodeLazyPixelRef: | 814 case recordTypes.DecodeLazyPixelRef: |
| 831 case recordTypes.DecodeImage: | 815 case recordTypes.DecodeImage: |
| 832 case recordTypes.ResizeImage: | 816 case recordTypes.ResizeImage: |
| 833 case recordTypes.DrawLazyPixelRef: | 817 case recordTypes.DrawLazyPixelRef: |
| 834 relatedNodeLabel = WebInspector.UIString('Owner Element'); | 818 relatedNodeLabel = WebInspector.UIString('Owner Element'); |
| 835 if (event.url) | 819 if (timelineData.url) |
| 836 contentHelper.appendElementRow( | 820 contentHelper.appendElementRow( |
| 837 WebInspector.UIString('Image URL'), WebInspector.linkifyResourceAs Node(event.url)); | 821 WebInspector.UIString('Image URL'), WebInspector.linkifyResourceAs Node(timelineData.url)); |
| 838 break; | 822 break; |
| 839 case recordTypes.ParseAuthorStyleSheet: | 823 case recordTypes.ParseAuthorStyleSheet: |
| 840 var url = eventData['styleSheetUrl']; | 824 var url = eventData['styleSheetUrl']; |
| 841 if (url) | 825 if (url) |
| 842 contentHelper.appendElementRow( | 826 contentHelper.appendElementRow( |
| 843 WebInspector.UIString('Stylesheet URL'), WebInspector.linkifyResou rceAsNode(url)); | 827 WebInspector.UIString('Stylesheet URL'), WebInspector.linkifyResou rceAsNode(url)); |
| 844 break; | 828 break; |
| 845 case recordTypes.UpdateLayoutTree: // We don't want to see default detail s. | 829 case recordTypes.UpdateLayoutTree: // We don't want to see default detail s. |
| 846 case recordTypes.RecalculateStyles: | 830 case recordTypes.RecalculateStyles: |
| 847 contentHelper.appendTextRow(WebInspector.UIString('Elements Affected'), event.args['elementCount']); | 831 contentHelper.appendTextRow(WebInspector.UIString('Elements Affected'), event.args['elementCount']); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 899 break; | 883 break; |
| 900 | 884 |
| 901 default: | 885 default: |
| 902 var detailsNode = | 886 var detailsNode = |
| 903 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, mo del.targetByEvent(event), linkifier); | 887 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, mo del.targetByEvent(event), linkifier); |
| 904 if (detailsNode) | 888 if (detailsNode) |
| 905 contentHelper.appendElementRow(WebInspector.UIString('Details'), detai lsNode); | 889 contentHelper.appendElementRow(WebInspector.UIString('Details'), detai lsNode); |
| 906 break; | 890 break; |
| 907 } | 891 } |
| 908 | 892 |
| 909 if (event.timeWaitingForMainThread) | 893 if (timelineData.timeWaitingForMainThread) |
| 910 contentHelper.appendTextRow( | 894 contentHelper.appendTextRow( |
| 911 WebInspector.UIString('Time Waiting for Main Thread'), | 895 WebInspector.UIString('Time Waiting for Main Thread'), |
| 912 Number.millisToString(event.timeWaitingForMainThread, true)); | 896 Number.millisToString(timelineData.timeWaitingForMainThread, true)); |
| 913 | 897 |
| 914 var relatedNode = relatedNodesMap && relatedNodesMap.get(event.backendNodeId ); | 898 var relatedNode = relatedNodesMap && relatedNodesMap.get(timelineData.backen dNodeId); |
| 915 if (relatedNode) | 899 if (relatedNode) |
| 916 contentHelper.appendElementRow( | 900 contentHelper.appendElementRow( |
| 917 relatedNodeLabel || WebInspector.UIString('Related Node'), | 901 relatedNodeLabel || WebInspector.UIString('Related Node'), |
| 918 WebInspector.DOMPresentationUtils.linkifyNodeReference(relatedNode)); | 902 WebInspector.DOMPresentationUtils.linkifyNodeReference(relatedNode)); |
| 919 | 903 |
| 920 if (event.previewElement) { | 904 if (event[WebInspector.TimelineUIUtils._previewElementSymbol]) { |
| 921 contentHelper.addSection(WebInspector.UIString('Preview')); | 905 contentHelper.addSection(WebInspector.UIString('Preview')); |
| 922 contentHelper.appendElementRow('', event.previewElement); | 906 contentHelper.appendElementRow('', event[WebInspector.TimelineUIUtils._pre viewElementSymbol]); |
| 923 } | 907 } |
| 924 | 908 |
| 925 if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || e vent.invalidationTrackingEvents) | 909 if (timelineData.stackTraceForSelfOrInitiator() || WebInspector.Invalidation Tracker.invalidationEventsFor(event)) |
| 926 WebInspector.TimelineUIUtils._generateCauses(event, model.targetByEvent(ev ent), relatedNodesMap, contentHelper); | 910 WebInspector.TimelineUIUtils._generateCauses(event, model.targetByEvent(ev ent), relatedNodesMap, contentHelper); |
| 927 | 911 |
| 912 var stats = {}; | |
| 928 var showPieChart = detailed && WebInspector.TimelineUIUtils._aggregatedStats ForTraceEvent(stats, model, event); | 913 var showPieChart = detailed && WebInspector.TimelineUIUtils._aggregatedStats ForTraceEvent(stats, model, event); |
| 929 if (showPieChart) { | 914 if (showPieChart) { |
| 930 contentHelper.addSection(WebInspector.UIString('Aggregated Time')); | 915 contentHelper.addSection(WebInspector.UIString('Aggregated Time')); |
| 931 var pieChart = WebInspector.TimelineUIUtils.generatePieChart( | 916 var pieChart = WebInspector.TimelineUIUtils.generatePieChart( |
| 932 stats, WebInspector.TimelineUIUtils.eventStyle(event).category, event. selfTime); | 917 stats, WebInspector.TimelineUIUtils.eventStyle(event).category, event. selfTime); |
| 933 contentHelper.appendElementRow('', pieChart); | 918 contentHelper.appendElementRow('', pieChart); |
| 934 } | 919 } |
| 935 | 920 |
| 936 return contentHelper.fragment; | 921 return contentHelper.fragment; |
| 937 } | 922 } |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1036 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), reque st.requestMethod); | 1021 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), reque st.requestMethod); |
| 1037 if (typeof request.priority === 'string') { | 1022 if (typeof request.priority === 'string') { |
| 1038 var priority = WebInspector.uiLabelForPriority(/** @type {!Protocol.Networ k.ResourcePriority} */ (request.priority)); | 1023 var priority = WebInspector.uiLabelForPriority(/** @type {!Protocol.Networ k.ResourcePriority} */ (request.priority)); |
| 1039 contentHelper.appendTextRow(WebInspector.UIString('Priority'), priority); | 1024 contentHelper.appendTextRow(WebInspector.UIString('Priority'), priority); |
| 1040 } | 1025 } |
| 1041 if (request.mimeType) | 1026 if (request.mimeType) |
| 1042 contentHelper.appendTextRow(WebInspector.UIString('Mime Type'), request.mi meType); | 1027 contentHelper.appendTextRow(WebInspector.UIString('Mime Type'), request.mi meType); |
| 1043 | 1028 |
| 1044 var title = WebInspector.UIString('Initiator'); | 1029 var title = WebInspector.UIString('Initiator'); |
| 1045 var sendRequest = request.children[0]; | 1030 var sendRequest = request.children[0]; |
| 1046 var topFrame = WebInspector.TimelineUIUtils.topStackFrame(sendRequest); | 1031 var topFrame = WebInspector.TimelineData.forEvent(sendRequest).topFrame(); |
| 1047 if (topFrame) { | 1032 if (topFrame) { |
| 1048 var link = linkifier.maybeLinkifyConsoleCallFrame(target, topFrame); | 1033 var link = linkifier.maybeLinkifyConsoleCallFrame(target, topFrame); |
| 1049 if (link) | 1034 if (link) |
| 1050 contentHelper.appendElementRow(title, link); | 1035 contentHelper.appendElementRow(title, link); |
| 1051 } else if (sendRequest.initiator) { | 1036 } else { |
| 1052 var initiatorURL = WebInspector.TimelineUIUtils.eventURL(sendRequest.initi ator); | 1037 var initiator = WebInspector.TimelineData.forEvent(sendRequest); |
| 1053 if (initiatorURL) { | 1038 if (initiator) { |
| 1054 var link = linkifier.maybeLinkifyScriptLocation(target, null, initiatorU RL, 0); | 1039 var initiatorURL = WebInspector.TimelineData.forEvent(initiator).url; |
| 1055 if (link) | 1040 if (initiatorURL) { |
| 1056 contentHelper.appendElementRow(title, link); | 1041 var link = linkifier.maybeLinkifyScriptLocation(target, null, initiato rURL, 0); |
| 1042 if (link) | |
| 1043 contentHelper.appendElementRow(title, link); | |
| 1044 } | |
| 1057 } | 1045 } |
| 1058 } | 1046 } |
| 1059 | 1047 |
| 1060 /** | 1048 /** |
| 1061 * @param {function(?Element)} fulfill | 1049 * @param {function(?Element)} fulfill |
| 1062 */ | 1050 */ |
| 1063 function action(fulfill) { | 1051 function action(fulfill) { |
| 1064 WebInspector.DOMPresentationUtils.buildImagePreviewContents( | 1052 WebInspector.DOMPresentationUtils.buildImagePreviewContents( |
| 1065 /** @type {!WebInspector.Target} */ (target), request.url, false, save Image); | 1053 /** @type {!WebInspector.Target} */ (target), request.url, false, save Image); |
| 1066 /** | 1054 /** |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1100 * @param {!WebInspector.TracingModel.Event} event | 1088 * @param {!WebInspector.TracingModel.Event} event |
| 1101 * @param {?WebInspector.Target} target | 1089 * @param {?WebInspector.Target} target |
| 1102 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap | 1090 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap |
| 1103 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper | 1091 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper |
| 1104 */ | 1092 */ |
| 1105 static _generateCauses(event, target, relatedNodesMap, contentHelper) { | 1093 static _generateCauses(event, target, relatedNodesMap, contentHelper) { |
| 1106 var recordTypes = WebInspector.TimelineModel.RecordType; | 1094 var recordTypes = WebInspector.TimelineModel.RecordType; |
| 1107 | 1095 |
| 1108 var callSiteStackLabel; | 1096 var callSiteStackLabel; |
| 1109 var stackLabel; | 1097 var stackLabel; |
| 1110 var initiator = event.initiator; | |
| 1111 | 1098 |
| 1112 switch (event.name) { | 1099 switch (event.name) { |
| 1113 case recordTypes.TimerFire: | 1100 case recordTypes.TimerFire: |
| 1114 callSiteStackLabel = WebInspector.UIString('Timer Installed'); | 1101 callSiteStackLabel = WebInspector.UIString('Timer Installed'); |
| 1115 break; | 1102 break; |
| 1116 case recordTypes.FireAnimationFrame: | 1103 case recordTypes.FireAnimationFrame: |
| 1117 callSiteStackLabel = WebInspector.UIString('Animation Frame Requested'); | 1104 callSiteStackLabel = WebInspector.UIString('Animation Frame Requested'); |
| 1118 break; | 1105 break; |
| 1119 case recordTypes.FireIdleCallback: | 1106 case recordTypes.FireIdleCallback: |
| 1120 callSiteStackLabel = WebInspector.UIString('Idle Callback Requested'); | 1107 callSiteStackLabel = WebInspector.UIString('Idle Callback Requested'); |
| 1121 break; | 1108 break; |
| 1122 case recordTypes.UpdateLayoutTree: | 1109 case recordTypes.UpdateLayoutTree: |
| 1123 case recordTypes.RecalculateStyles: | 1110 case recordTypes.RecalculateStyles: |
| 1124 stackLabel = WebInspector.UIString('Recalculation Forced'); | 1111 stackLabel = WebInspector.UIString('Recalculation Forced'); |
| 1125 break; | 1112 break; |
| 1126 case recordTypes.Layout: | 1113 case recordTypes.Layout: |
| 1127 callSiteStackLabel = WebInspector.UIString('First Layout Invalidation'); | 1114 callSiteStackLabel = WebInspector.UIString('First Layout Invalidation'); |
| 1128 stackLabel = WebInspector.UIString('Layout Forced'); | 1115 stackLabel = WebInspector.UIString('Layout Forced'); |
| 1129 break; | 1116 break; |
| 1130 } | 1117 } |
| 1131 | 1118 |
| 1119 var timelineData = WebInspector.TimelineData.forEvent(event); | |
| 1132 // Direct cause. | 1120 // Direct cause. |
| 1133 if (event.stackTrace && event.stackTrace.length) { | 1121 if (timelineData.stackTrace && timelineData.stackTrace.length) { |
| 1134 contentHelper.addSection(WebInspector.UIString('Call Stacks')); | 1122 contentHelper.addSection(WebInspector.UIString('Call Stacks')); |
| 1135 contentHelper.appendStackTrace( | 1123 contentHelper.appendStackTrace( |
| 1136 stackLabel || WebInspector.UIString('Stack Trace'), | 1124 stackLabel || WebInspector.UIString('Stack Trace'), |
| 1137 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(event.stackTrac e)); | 1125 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(timelineData.st ackTrace)); |
| 1138 } | 1126 } |
| 1139 | 1127 |
| 1128 var initiator = WebInspector.TimelineData.forEvent(event).initiator(); | |
| 1140 // Indirect causes. | 1129 // Indirect causes. |
| 1141 if (event.invalidationTrackingEvents && target) { // Full invalidation trac king (experimental). | 1130 if (WebInspector.InvalidationTracker.invalidationEventsFor(event) && target) { // Full invalidation tracking (experimental). |
| 1142 contentHelper.addSection(WebInspector.UIString('Invalidations')); | 1131 contentHelper.addSection(WebInspector.UIString('Invalidations')); |
| 1143 WebInspector.TimelineUIUtils._generateInvalidations(event, target, related NodesMap, contentHelper); | 1132 WebInspector.TimelineUIUtils._generateInvalidations(event, target, related NodesMap, contentHelper); |
| 1144 } else if (initiator && initiator.stackTrace) { // Partial invalidation tra cking. | 1133 } else if (initiator) { // Partial invalidation tracking. |
| 1145 contentHelper.appendStackTrace( | 1134 var initiatorStackTrace = WebInspector.TimelineData.forEvent(initiator).st ackTrace; |
| 1146 callSiteStackLabel || WebInspector.UIString('First Invalidated'), | 1135 if (initiatorStackTrace) { |
| 1147 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(initiator.stack Trace)); | 1136 contentHelper.appendStackTrace( |
| 1137 callSiteStackLabel || WebInspector.UIString('First Invalidated'), | |
| 1138 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(initiatorStac kTrace)); | |
| 1139 } | |
| 1148 } | 1140 } |
| 1149 } | 1141 } |
| 1150 | 1142 |
| 1151 /** | 1143 /** |
| 1152 * @param {!WebInspector.TracingModel.Event} event | 1144 * @param {!WebInspector.TracingModel.Event} event |
| 1153 * @param {!WebInspector.Target} target | 1145 * @param {!WebInspector.Target} target |
| 1154 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap | 1146 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap |
| 1155 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper | 1147 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper |
| 1156 */ | 1148 */ |
| 1157 static _generateInvalidations(event, target, relatedNodesMap, contentHelper) { | 1149 static _generateInvalidations(event, target, relatedNodesMap, contentHelper) { |
| 1158 if (!event.invalidationTrackingEvents) | 1150 var invalidationTrackingEvents = WebInspector.InvalidationTracker.invalidati onEventsFor(event); |
| 1159 return; | |
| 1160 | |
| 1161 var invalidations = {}; | 1151 var invalidations = {}; |
| 1162 event.invalidationTrackingEvents.forEach(function(invalidation) { | 1152 invalidationTrackingEvents.forEach(function(invalidation) { |
| 1163 if (!invalidations[invalidation.type]) | 1153 if (!invalidations[invalidation.type]) |
| 1164 invalidations[invalidation.type] = [invalidation]; | 1154 invalidations[invalidation.type] = [invalidation]; |
| 1165 else | 1155 else |
| 1166 invalidations[invalidation.type].push(invalidation); | 1156 invalidations[invalidation.type].push(invalidation); |
| 1167 }); | 1157 }); |
| 1168 | 1158 |
| 1169 Object.keys(invalidations).forEach(function(type) { | 1159 Object.keys(invalidations).forEach(function(type) { |
| 1170 WebInspector.TimelineUIUtils._generateInvalidationsForType( | 1160 WebInspector.TimelineUIUtils._generateInvalidationsForType( |
| 1171 type, target, invalidations[type], relatedNodesMap, contentHelper); | 1161 type, target, invalidations[type], relatedNodesMap, contentHelper); |
| 1172 }); | 1162 }); |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1708 } | 1698 } |
| 1709 return WebInspector.TimelineUIUtils.colorForURL._colorGenerator.colorForID(u rl); | 1699 return WebInspector.TimelineUIUtils.colorForURL._colorGenerator.colorForID(u rl); |
| 1710 } | 1700 } |
| 1711 | 1701 |
| 1712 /** | 1702 /** |
| 1713 * @param {!WebInspector.TracingModel.Event} event | 1703 * @param {!WebInspector.TracingModel.Event} event |
| 1714 * @param {string=} warningType | 1704 * @param {string=} warningType |
| 1715 * @return {?Element} | 1705 * @return {?Element} |
| 1716 */ | 1706 */ |
| 1717 static eventWarning(event, warningType) { | 1707 static eventWarning(event, warningType) { |
| 1718 var warning = warningType || event.warning; | 1708 var timelineData = WebInspector.TimelineData.forEvent(event); |
| 1709 var warning = warningType || timelineData.warning; | |
| 1719 if (!warning) | 1710 if (!warning) |
| 1720 return null; | 1711 return null; |
| 1721 var warnings = WebInspector.TimelineModel.WarningType; | 1712 var warnings = WebInspector.TimelineModel.WarningType; |
| 1722 var span = createElement('span'); | 1713 var span = createElement('span'); |
| 1723 var eventData = event.args['data']; | 1714 var eventData = event.args['data']; |
| 1724 | 1715 |
| 1725 switch (warning) { | 1716 switch (warning) { |
| 1726 case warnings.ForcedStyle: | 1717 case warnings.ForcedStyle: |
| 1727 case warnings.ForcedLayout: | 1718 case warnings.ForcedLayout: |
| 1728 span.appendChild(WebInspector.linkifyDocumentationURLAsNode( | 1719 span.appendChild(WebInspector.linkifyDocumentationURLAsNode( |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1928 nodeSpan.textContent = WebInspector.UIString('[ %s ]', invalidation.nodeNa me); | 1919 nodeSpan.textContent = WebInspector.UIString('[ %s ]', invalidation.nodeNa me); |
| 1929 return nodeSpan; | 1920 return nodeSpan; |
| 1930 } | 1921 } |
| 1931 if (showUnknownNodes) { | 1922 if (showUnknownNodes) { |
| 1932 var nodeSpan = createElement('span'); | 1923 var nodeSpan = createElement('span'); |
| 1933 return nodeSpan.createTextChild(WebInspector.UIString('[ unknown node ]')) ; | 1924 return nodeSpan.createTextChild(WebInspector.UIString('[ unknown node ]')) ; |
| 1934 } | 1925 } |
| 1935 } | 1926 } |
| 1936 }; | 1927 }; |
| 1937 | 1928 |
| 1929 WebInspector.TimelineUIUtils._previewElementSymbol = Symbol('previewElement'); | |
| 1938 | 1930 |
| 1939 /** | 1931 /** |
| 1940 * @unrestricted | 1932 * @unrestricted |
| 1941 */ | 1933 */ |
| 1942 WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor = class { | 1934 WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor = class { |
| 1943 /** | 1935 /** |
| 1944 * @param {number} priority | 1936 * @param {number} priority |
| 1945 * @param {string} color | 1937 * @param {string} color |
| 1946 * @param {!Array.<string>} eventTypes | 1938 * @param {!Array.<string>} eventTypes |
| 1947 */ | 1939 */ |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2220 /** | 2212 /** |
| 2221 * @param {!WebInspector.TracingModel.Event} event | 2213 * @param {!WebInspector.TracingModel.Event} event |
| 2222 * @param {string=} warningType | 2214 * @param {string=} warningType |
| 2223 */ | 2215 */ |
| 2224 appendWarningRow(event, warningType) { | 2216 appendWarningRow(event, warningType) { |
| 2225 var warning = WebInspector.TimelineUIUtils.eventWarning(event, warningType); | 2217 var warning = WebInspector.TimelineUIUtils.eventWarning(event, warningType); |
| 2226 if (warning) | 2218 if (warning) |
| 2227 this.appendElementRow(WebInspector.UIString('Warning'), warning, true); | 2219 this.appendElementRow(WebInspector.UIString('Warning'), warning, true); |
| 2228 } | 2220 } |
| 2229 }; | 2221 }; |
| OLD | NEW |