Changeset 237644 in webkit
- Timestamp:
- Oct 31, 2018, 11:25:54 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/inspector/model/auditTestCaseResult-expected.txt (modified) (1 diff)
-
LayoutTests/inspector/model/auditTestCaseResult.html (modified) (3 diffs)
-
LayoutTests/inspector/model/auditTestGroupResult-expected.txt (modified) (3 diffs)
-
LayoutTests/inspector/model/auditTestGroupResult.html (modified) (4 diffs)
-
LayoutTests/inspector/unit-tests/string-utilities-expected.txt (modified) (2 diffs)
-
LayoutTests/inspector/unit-tests/string-utilities.html (modified) (2 diffs)
-
Source/WebInspectorUI/ChangeLog (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Base/Utilities.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Models/AuditTestCase.js (modified) (4 diffs)
-
Source/WebInspectorUI/UserInterface/Models/AuditTestCaseResult.js (modified) (6 diffs)
-
Source/WebInspectorUI/UserInterface/Views/AuditTestCaseContentView.css (modified) (2 diffs)
-
Source/WebInspectorUI/UserInterface/Views/AuditTestCaseContentView.js (modified) (4 diffs)
-
Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.css (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/AuditTestGroupContentView.css (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r237643 r237644 1 2018-10-31 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Audit: show metadata for results 4 https://bugs.webkit.org/show_bug.cgi?id=190853 5 <rdar://problem/45527623> 6 7 Reviewed by Brian Burg. 8 9 * inspector/model/auditTestCaseResult-expected.txt: 10 * inspector/model/auditTestCaseResult.html: 11 * inspector/model/auditTestGroupResult-expected.txt: 12 * inspector/model/auditTestGroupResult.html: 13 * inspector/unit-tests/string-utilities-expected.txt: 14 * inspector/unit-tests/string-utilities.html: 15 1 16 2018-10-31 Eric Carlson <eric.carlson@apple.com> 2 17 -
trunk/LayoutTests/inspector/model/auditTestCaseResult-expected.txt
r237613 r237644 53 53 "validWithValidSubOptionals test result error" 54 54 ] 55 }, 56 "metadata": { 57 "startTimestamp": "0001-01-01T00:00:00.000Z", 58 "endTimestamp": "0002-01-01T00:00:00.000Z", 59 "url": "validWithValidSubOptionals test result url" 55 60 } 56 61 } -
trunk/LayoutTests/inspector/model/auditTestCaseResult.html
r237613 r237644 55 55 level: WI.AuditTestCaseResult.Level.Pass, 56 56 data: null, 57 metadata: null, 57 58 }, 58 59 }, … … 68 69 domAttributes: null, 69 70 errors: null, 71 }, 72 metadata: { 73 startTimestamp: null, 74 endTimestamp: null, 75 url: null, 70 76 }, 71 77 }, … … 83 89 errors: ["validWithValidSubOptionals test result error"], 84 90 }, 91 metadata: { 92 startTimestamp: "1", 93 endTimestamp: "2", 94 url: "validWithValidSubOptionals test result url", 95 }, 85 96 }, 86 97 }, -
trunk/LayoutTests/inspector/model/auditTestGroupResult-expected.txt
r237613 r237644 68 68 "validWithValidOptionals test result error" 69 69 ] 70 }, 71 "metadata": { 72 "startTimestamp": "0001-01-01T00:00:00.000Z", 73 "endTimestamp": "0002-01-01T00:00:00.000Z", 74 "url": "validWithValidOptionals test result url" 70 75 } 71 76 } … … 99 104 "validNested nested test result error" 100 105 ] 106 }, 107 "metadata": { 108 "startTimestamp": "0001-01-01T00:00:00.000Z", 109 "endTimestamp": "0002-01-01T00:00:00.000Z", 110 "url": "validNested nested test result url" 101 111 } 102 112 } … … 118 128 "validNested test result error" 119 129 ] 130 }, 131 "metadata": { 132 "startTimestamp": "0003-01-01T00:00:00.000Z", 133 "endTimestamp": "0004-01-01T00:00:00.000Z", 134 "url": "validNested test result url" 120 135 } 121 136 } -
trunk/LayoutTests/inspector/model/auditTestGroupResult.html
r237613 r237644 84 84 level: WI.AuditTestCaseResult.Level.Pass, 85 85 data: null, 86 metadata: null, 86 87 }, 87 88 ], … … 104 105 domAttributes: ["validWithValidOptionals test result domAttribute"], 105 106 errors: ["validWithValidOptionals test result error"], 107 }, 108 metadata: { 109 startTimestamp: "1", 110 endTimestamp: "2", 111 url: "validWithValidOptionals test result url", 106 112 }, 107 113 }, … … 131 137 errors: ["validNested nested test result error"], 132 138 }, 139 metadata: { 140 startTimestamp: "1", 141 endTimestamp: "2", 142 url: "validNested nested test result url", 143 }, 133 144 }, 134 145 ], … … 143 154 domAttributes: ["validNested test result domAttribute"], 144 155 errors: ["validNested test result error"], 156 }, 157 metadata: { 158 startTimestamp: "3", 159 endTimestamp: "4", 160 url: "validNested test result url", 145 161 }, 146 162 }, -
trunk/LayoutTests/inspector/unit-tests/string-utilities-expected.txt
r230021 r237644 47 47 PASS: Last line of an empty string is the same empty string. 48 48 49 -- Running test case: String.prototype.truncateStart 50 PASS: String stays the same. 51 PASS: Ellipsis is inserted before the third character. 52 PASS: Ellipsis is inserted before the fourth character. 53 49 54 -- Running test case: String.prototype.truncateMiddle 50 55 PASS: String stays the same. … … 54 59 -- Running test case: String.prototype.truncateEnd 55 60 PASS: String stays the same. 56 PASS: Ellipsis is inserted in the middle.61 PASS: Ellipsis is inserted after the fourth character. 57 62 PASS: Ellipsis is inserted after the third character. 58 63 -
trunk/LayoutTests/inspector/unit-tests/string-utilities.html
r230021 r237644 80 80 81 81 suite.addTestCase({ 82 name: "String.prototype.truncateStart", 83 test() { 84 const ellipsis = "\u2026"; 85 InspectorTest.expectEqual("abcdef".truncateStart(6), "abcdef", "String stays the same."); 86 InspectorTest.expectEqual("abcdef".truncateStart(5), ellipsis + "cdef", "Ellipsis is inserted before the third character."); 87 InspectorTest.expectEqual("abcdef".truncateStart(4), ellipsis + "def", "Ellipsis is inserted before the fourth character."); 88 return true; 89 } 90 }); 91 92 suite.addTestCase({ 82 93 name: "String.prototype.truncateMiddle", 83 94 test() { … … 95 106 const ellipsis = "\u2026"; 96 107 InspectorTest.expectEqual("abcdef".truncateEnd(6), "abcdef", "String stays the same."); 97 InspectorTest.expectEqual("abcdef".truncateEnd(5), "abcd" + ellipsis, "Ellipsis is inserted in the middle.");108 InspectorTest.expectEqual("abcdef".truncateEnd(5), "abcd" + ellipsis, "Ellipsis is inserted after the fourth character."); 98 109 InspectorTest.expectEqual("abcdef".truncateEnd(4), "abc" + ellipsis, "Ellipsis is inserted after the third character."); 99 110 return true; -
trunk/Source/WebInspectorUI/ChangeLog
r237613 r237644 1 2018-10-31 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Audit: show metadata for results 4 https://bugs.webkit.org/show_bug.cgi?id=190853 5 <rdar://problem/45527623> 6 7 Reviewed by Brian Burg. 8 9 * UserInterface/Models/AuditTestCase.js: 10 (WI.AuditTestCase.prototype.async run): 11 Capture timestamps around the `RunetimeAgent.evaluate` call, as well as the URL of the page. 12 13 * UserInterface/Models/AuditTestCaseResult.js: 14 (WI.AuditTestCaseResult): 15 (WI.AuditTestCaseResult.fromPayload): 16 (WI.AuditTestCaseResult.prototype.get metadata): Added. 17 (WI.AuditTestCaseResult.prototype.toJSON): 18 19 * UserInterface/Views/AuditTestCaseContentView.js: 20 (WI.AuditTestCaseContentView.prototype.initialLayout): 21 (WI.AuditTestCaseContentView.prototype.layout): 22 * UserInterface/Views/AuditTestCaseContentView.css: 23 (.content-view.audit-test-case > header h1): Added. 24 (.content-view.audit-test-case > header h1 > img): Added. 25 (.content-view.audit-test-case > header > .metadata): Added. 26 (.content-view.audit-test-case > header > .metadata > .source > time): Added. 27 (.content-view.audit-test-case > header > .metadata > .source > a): Added. 28 (.content-view.audit-test-case > header > .metadata > .duration): Added. 29 (.content-view.audit-test-case > header > h1): Deleted. 30 (.content-view.audit-test-case > header > h1 > img): Deleted. 31 Display any metadata information where the `WI.ScopeBar` is for `WI.AuditTestGroupContentView`s. 32 33 * UserInterface/Views/AuditTestContentView.css: 34 (.content-view.audit-test > header): 35 (.content-view.audit-test > header > .information): Added. 36 * UserInterface/Views/AuditTestGroupContentView.css: 37 (.content-view.audit-test-group > header): 38 (.content-view.audit-test-group > header > .percentage-pass): 39 (.content-view.audit-test-group > header > .information): Deleted. 40 Move common CSS rules to common parent class. 41 42 * UserInterface/Base/Utilities.js: 43 1 44 2018-10-30 Devin Rousso <drousso@apple.com> 2 45 -
trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js
r237613 r237644 583 583 }); 584 584 585 Object.defineProperty(String.prototype, "truncateStart", 586 { 587 value(maxLength) 588 { 589 "use strict"; 590 591 if (this.length <= maxLength) 592 return this; 593 return ellipsis + this.substr(this.length - maxLength + 1); 594 } 595 }); 596 585 597 Object.defineProperty(String.prototype, "truncateMiddle", 586 598 { -
trunk/Source/WebInspectorUI/UserInterface/Models/AuditTestCase.js
r237613 r237644 78 78 let level = null; 79 79 let data = {}; 80 let metadata = { 81 url: WI.networkManager.mainFrame.url, 82 startTimestamp: null, 83 endTimestamp: null, 84 }; 80 85 81 86 function setLevel(newLevel) { … … 101 106 } 102 107 108 let evaluateArguments = { 109 expression: `(function() { "use strict"; return eval(${this._test})(); })()`, 110 objectGroup: "audit", 111 doNotPauseOnExceptionsAndMuteConsole: true, 112 }; 113 103 114 try { 104 let {result, wasThrown} = await RuntimeAgent.evaluate.invoke({ 105 expression: `(function() { "use strict"; return eval(${this._test})(); })()`, 106 objectGroup: "audit", 107 doNotPauseOnExceptionsAndMuteConsole: true, 108 }); 109 let remoteObject = WI.RemoteObject.fromPayload(result, WI.mainTarget); 110 111 if (wasThrown || (remoteObject.type === "object" && remoteObject.subtype === "error")) 115 metadata.startTimestamp = new Date; 116 let evaluateResponse = await RuntimeAgent.evaluate.invoke(evaluateArguments); 117 metadata.endTimestamp = new Date; 118 119 let remoteObject = WI.RemoteObject.fromPayload(evaluateResponse.result, WI.mainTarget); 120 if (evaluateResponse.wasThrown || (remoteObject.type === "object" && remoteObject.subtype === "error")) 112 121 addError(remoteObject.description); 113 122 else if (remoteObject.type === "boolean") … … 222 231 addError(WI.UIString("Return value is not an object, string, or boolean")); 223 232 } catch (error) { 233 metadata.endTimestamp = new Date; 224 234 addError(error.message); 225 235 } … … 230 240 let options = { 231 241 description: this.description, 242 metadata, 232 243 }; 233 244 if (!isEmptyObject(data)) -
trunk/Source/WebInspectorUI/UserInterface/Models/AuditTestCaseResult.js
r237613 r237644 26 26 WI.AuditTestCaseResult = class AuditTestCaseResult extends WI.AuditTestResultBase 27 27 { 28 constructor(name, level, {d ata, description} = {})28 constructor(name, level, {description, data, metadata} = {}) 29 29 { 30 30 console.assert(Object.values(WI.AuditTestCaseResult.Level).includes(level)); 31 31 console.assert(!data || typeof data === "object"); 32 console.assert(!metadata || typeof metadata === "object"); 32 33 33 34 super(name, {description}); … … 35 36 this._level = level; 36 37 this._data = data || {}; 38 this._metadata = metadata || {}; 37 39 } 38 40 … … 44 46 return null; 45 47 46 let {type, name, description, level, data } = payload;48 let {type, name, description, level, data, metadata} = payload; 47 49 48 50 if (type !== WI.AuditTestCaseResult.TypeIdentifier) … … 57 59 if (typeof data !== "object" || data === null) 58 60 data = {}; 61 else { 62 function checkArray(key) { 63 if (!data[key]) 64 return; 59 65 60 function checkArray(key) { 61 if (!data[key]) 62 return; 66 if (!Array.isArray(data[key])) 67 data[key] = []; 63 68 64 if (!Array.isArray(data[key])) 65 data[key] = []; 69 data[key] = data[key].filter((item) => typeof item === "string"); 70 } 71 checkArray("domNodes"); 72 checkArray("domAttributes"); 73 checkArray("errors"); 74 } 66 75 67 data[key] = data[key].filter((item) => typeof item === "string"); 76 if (typeof metadata !== "object" || metadata === null) 77 metadata = {}; 78 else { 79 metadata.startTimestamp = typeof metadata.startTimestamp === "string" ? new Date(metadata.startTimestamp) : null; 80 metadata.endTimestamp = typeof metadata.endTimestamp === "string" ? new Date(metadata.endTimestamp) : null; 81 metadata.url = typeof metadata.url === "string" ? metadata.url : null; 68 82 } 69 checkArray("domNodes");70 checkArray("domAttributes");71 checkArray("errors");72 83 73 84 let options = {}; 74 85 if (typeof description === "string") 75 86 options.description = description; 76 if (!isEmptyObject(data)) 77 options.data = data; 87 if (!isEmptyObject(data)) { 88 options.data = {}; 89 if (data.domNodes && data.domNodes.length) 90 options.data.domNodes = data.domNodes; 91 if (data.domAttributes && data.domAttributes.length) 92 options.data.domAttributes = data.domAttributes; 93 if (data.errors && data.errors.length) 94 options.data.errors = data.errors; 95 } 96 if (!isEmptyObject(metadata)) { 97 options.metadata = {}; 98 if (metadata.startTimestamp && !isNaN(metadata.startTimestamp)) 99 options.metadata.startTimestamp = metadata.startTimestamp; 100 if (metadata.endTimestamp && !isNaN(metadata.endTimestamp)) 101 options.metadata.endTimestamp = metadata.endTimestamp; 102 if (metadata.url) 103 options.metadata.url = metadata.url; 104 } 78 105 return new WI.AuditTestCaseResult(name, level, options); 79 106 } … … 83 110 get level() { return this._level; } 84 111 get data() { return this._data; } 112 get metadata() { return this._metadata; } 85 113 86 114 get result() … … 130 158 json.data = data; 131 159 160 let metadata = {}; 161 if (this._metadata.startTimestamp && !isNaN(this._metadata.startTimestamp)) 162 metadata.startTimestamp = this._metadata.startTimestamp; 163 if (this._metadata.endTimestamp && !isNaN(this._metadata.endTimestamp)) 164 metadata.endTimestamp = this._metadata.endTimestamp; 165 if (this._metadata.url) 166 metadata.url = this._metadata.url; 167 if (!isEmptyObject(metadata)) 168 json.metadata = metadata; 169 132 170 return json; 133 171 } -
trunk/Source/WebInspectorUI/UserInterface/Views/AuditTestCaseContentView.css
r237613 r237644 38 38 } 39 39 40 .content-view.audit-test-case > header >h1 {40 .content-view.audit-test-case > header h1 { 41 41 display: flex; 42 42 align-items: center; 43 43 } 44 44 45 .content-view.audit-test-case > header >h1 > img {45 .content-view.audit-test-case > header h1 > img { 46 46 width: 1em; 47 47 height: 1em; … … 49 49 min-height: 16px; 50 50 -webkit-margin-end: 4px; 51 } 52 53 .content-view.audit-test-case > header > .metadata { 54 display: flex; 55 align-items: center; 56 text-align: end; 57 } 58 59 .content-view.audit-test-case > header > .metadata > .source > time { 60 display: block; 61 font-style: italic; 62 white-space: nowrap; 63 } 64 65 .content-view.audit-test-case > header > .metadata > .source > a { 66 display: block; 67 } 68 69 .content-view.audit-test-case > header > .metadata > .duration { 70 display: inline-block; 71 width: var(--metadata-width); 72 -webkit-margin-start: var(--audit-test-horizontal-space); 73 font-size: 12px; 74 font-weight: bold; 51 75 } 52 76 -
trunk/Source/WebInspectorUI/UserInterface/Views/AuditTestCaseContentView.js
r237613 r237644 41 41 super.initialLayout(); 42 42 43 let nameElement = this.headerView.element.appendChild(document.createElement("h1")); 43 let informationContainer = this.headerView.element.appendChild(document.createElement("div")); 44 informationContainer.classList.add("information"); 45 46 let nameElement = informationContainer.appendChild(document.createElement("h1")); 44 47 45 48 this._resultImageElement = nameElement.appendChild(document.createElement("img")); … … 48 51 49 52 if (this.representedObject.description) { 50 let descriptionElement = this.headerView.element.appendChild(document.createElement("p"));53 let descriptionElement = informationContainer.appendChild(document.createElement("p")); 51 54 descriptionElement.textContent = this.representedObject.description; 52 55 } 56 57 this._metadataElement = this.headerView.element.appendChild(document.createElement("div")); 58 this._metadataElement.classList.add("metadata"); 53 59 } 54 60 … … 61 67 62 68 this._resultImageElement.src = "Images/AuditTestNoResult.svg"; 69 this._metadataElement.removeChildren(); 63 70 64 71 this.contentView.element.removeChildren(); … … 87 94 this._resultImageElement.src = "Images/AuditTestUnsupported.svg"; 88 95 96 let metadata = result.metadata; 97 if (metadata) { 98 let sourceContainer = this._metadataElement.appendChild(document.createElement("div")); 99 sourceContainer.classList.add("source"); 100 101 if (metadata.startTimestamp) { 102 let timeElement = sourceContainer.appendChild(document.createElement("time")); 103 timeElement.datetime = metadata.startTimestamp.toISOString(); 104 timeElement.textContent = metadata.startTimestamp.toLocaleString(); 105 106 if (metadata.endTimestamp) { 107 let durationElement = this._metadataElement.appendChild(document.createElement("span")); 108 durationElement.classList.add("duration"); 109 durationElement.textContent = Number.secondsToString((metadata.endTimestamp - metadata.startTimestamp) / 1000); 110 } 111 } 112 113 if (metadata.url && metadata.url !== WI.networkManager.mainFrame.url) { 114 let url = new URL(metadata.url); 115 let origin = url.origin; 116 if (url.pathname.startsWith("/")) 117 origin += "/"; 118 let linkElement = WI.linkifyURLAsNode(url.href, origin + url.href.substring(origin.length).truncateStart(20)); 119 linkElement.title = url.href; 120 sourceContainer.appendChild(linkElement); 121 } 122 } 123 89 124 let resultData = result.data; 90 125 -
trunk/Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.css
r237613 r237644 53 53 54 54 .content-view.audit-test > header { 55 display: flex; 56 align-items: center; 55 57 padding: var(--audit-test-vertical-space) var(--audit-test-horizontal-space); 58 59 --metadata-width: 60px; 60 } 61 62 .content-view.audit-test > header > .information { 63 flex-grow: 1; 56 64 } 57 65 -
trunk/Source/WebInspectorUI/UserInterface/Views/AuditTestGroupContentView.css
r237613 r237644 29 29 30 30 .content-view.audit-test-group > header { 31 display: flex;32 align-items: center;33 31 margin-top: -1px; 34 32 border-top: 1px solid var(--border-color); … … 60 58 padding-right: calc(var(--audit-test-horizontal-space) / 2); 61 59 padding-left: calc(var(--audit-test-horizontal-space) / 2); 62 }63 64 .content-view.audit-test-group > header > .information {65 flex-grow: 1;66 60 } 67 61 … … 126 120 127 121 .content-view.audit-test-group > header > .percentage-pass { 122 width: var(--metadata-width); 128 123 -webkit-margin-start: var(--audit-test-horizontal-space); 129 width: 60px;130 124 font-size: 24px; 131 125 text-align: center;
Note:
See TracChangeset
for help on using the changeset viewer.