Changeset 238199 in webkit
- Timestamp:
- Nov 14, 2018 2:03:14 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r238194 r238199 1 2018-11-14 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Canvas: send a call stack with each action instead of an array of call frames 4 https://bugs.webkit.org/show_bug.cgi?id=191628 5 6 Reviewed by Dean Jackson. 7 8 * inspector/model/recording.html: 9 1 10 2018-11-14 Ryan Haddad <ryanhaddad@apple.com> 2 11 -
trunk/LayoutTests/inspector/model/recording-expected.txt
r237198 r238199 161 161 0 162 162 ], 163 [ 164 0 165 ] 163 0 166 164 ] 167 165 ], -
trunk/LayoutTests/inspector/model/recording.html
r237198 r238199 169 169 [0], 170 170 [0], 171 [0],171 0, 172 172 ], 173 173 ], -
trunk/Source/WebCore/ChangeLog
r238196 r238199 1 2018-11-14 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Canvas: send a call stack with each action instead of an array of call frames 4 https://bugs.webkit.org/show_bug.cgi?id=191628 5 6 Reviewed by Dean Jackson. 7 8 Updated existing test: inspector/model/recording.html 9 10 * inspector/InspectorCanvas.h: 11 * inspector/InspectorCanvas.cpp: 12 (WebCore::InspectorCanvas::indexForData): 13 (WebCore::InspectorCanvas::buildInitialState): 14 (WebCore::InspectorCanvas::buildAction): 15 Drive-by: prevent de-duplicated objects from being destroyed while recording. 16 1 17 2018-11-14 Stephan Szabo <stephan.szabo@sony.com> 2 18 -
trunk/Source/WebCore/inspector/InspectorCanvas.cpp
r237670 r238199 68 68 #endif 69 69 #include <JavaScriptCore/IdentifiersFactory.h> 70 #include <JavaScriptCore/ScriptCallStack.h>71 70 #include <JavaScriptCore/ScriptCallStackFactory.h> 72 73 71 74 72 namespace WebCore { … … 344 342 int InspectorCanvas::indexForData(DuplicateDataVariant data) 345 343 { 346 size_t index = m_indexedDuplicateData.find(data); 344 size_t index = m_indexedDuplicateData.findMatching([&] (auto item) { 345 if (data == item) 346 return true; 347 348 auto traceA = WTF::get_if<RefPtr<ScriptCallStack>>(data); 349 auto traceB = WTF::get_if<RefPtr<ScriptCallStack>>(item); 350 if (traceA && *traceA && traceB && *traceB) 351 return (*traceA)->isEqual((*traceB).get()); 352 353 return false; 354 }); 347 355 if (index != notFound) { 348 356 ASSERT(index < std::numeric_limits<int>::max()); … … 355 363 RefPtr<JSON::Value> item; 356 364 WTF::switchOn(data, 357 [&] (const HTMLImageElement*imageElement) {365 [&] (const RefPtr<HTMLImageElement>& imageElement) { 358 366 String dataURL = "data:,"_s; 359 367 … … 370 378 }, 371 379 #if ENABLE(VIDEO) 372 [&] ( HTMLVideoElement*videoElement) {380 [&] (RefPtr<HTMLVideoElement>& videoElement) { 373 381 String dataURL = "data:,"_s; 374 382 … … 384 392 }, 385 393 #endif 386 [&] ( HTMLCanvasElement*canvasElement) {394 [&] (RefPtr<HTMLCanvasElement>& canvasElement) { 387 395 String dataURL = "data:,"_s; 388 396 … … 393 401 index = indexForData(dataURL); 394 402 }, 395 [&] (const CanvasGradient*canvasGradient) { item = buildArrayForCanvasGradient(*canvasGradient); },396 [&] (const CanvasPattern*canvasPattern) { item = buildArrayForCanvasPattern(*canvasPattern); },397 [&] (const ImageData*imageData) { item = buildArrayForImageData(*imageData); },398 [&] ( ImageBitmap*imageBitmap) {403 [&] (const RefPtr<CanvasGradient>& canvasGradient) { item = buildArrayForCanvasGradient(*canvasGradient); }, 404 [&] (const RefPtr<CanvasPattern>& canvasPattern) { item = buildArrayForCanvasPattern(*canvasPattern); }, 405 [&] (const RefPtr<ImageData>& imageData) { item = buildArrayForImageData(*imageData); }, 406 [&] (RefPtr<ImageBitmap>& imageBitmap) { 399 407 index = indexForData(imageBitmap->buffer()->toDataURL("image/png")); 408 }, 409 [&] (const RefPtr<ScriptCallStack>& scriptCallStack) { 410 auto array = JSON::ArrayOf<double>::create(); 411 for (size_t i = 0; i < scriptCallStack->size(); ++i) 412 array->addItem(indexForData(scriptCallStack->at(i))); 413 item = WTFMove(array); 400 414 }, 401 415 [&] (const ScriptCallFrame& scriptCallFrame) { … … 490 504 int strokeStyleIndex; 491 505 if (auto canvasGradient = state.strokeStyle.canvasGradient()) 492 strokeStyleIndex = indexForData(canvasGradient .get());506 strokeStyleIndex = indexForData(canvasGradient); 493 507 else if (auto canvasPattern = state.strokeStyle.canvasPattern()) 494 strokeStyleIndex = indexForData(canvasPattern .get());508 strokeStyleIndex = indexForData(canvasPattern); 495 509 else 496 510 strokeStyleIndex = indexForData(state.strokeStyle.color()); … … 499 513 int fillStyleIndex; 500 514 if (auto canvasGradient = state.fillStyle.canvasGradient()) 501 fillStyleIndex = indexForData(canvasGradient .get());515 fillStyleIndex = indexForData(canvasGradient); 502 516 else if (auto canvasPattern = state.fillStyle.canvasPattern()) 503 fillStyleIndex = indexForData(canvasPattern .get());517 fillStyleIndex = indexForData(canvasPattern); 504 518 else 505 519 fillStyleIndex = indexForData(state.fillStyle.color()); … … 599 613 [&] (const RefPtr<ArrayBuffer>&) { addParameter(0, RecordingSwizzleTypes::TypedArray); }, 600 614 [&] (const RefPtr<ArrayBufferView>&) { addParameter(0, RecordingSwizzleTypes::TypedArray); }, 601 [&] (const RefPtr<CanvasGradient>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::CanvasGradient); },602 [&] (const RefPtr<CanvasPattern>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::CanvasPattern); },615 [&] (const RefPtr<CanvasGradient>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::CanvasGradient); }, 616 [&] (const RefPtr<CanvasPattern>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::CanvasPattern); }, 603 617 [&] (const RefPtr<Float32Array>&) { addParameter(0, RecordingSwizzleTypes::TypedArray); }, 604 [&] (const RefPtr<HTMLCanvasElement>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::Image); },605 [&] (const RefPtr<HTMLImageElement>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::Image); },618 [&] (const RefPtr<HTMLCanvasElement>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::Image); }, 619 [&] (const RefPtr<HTMLImageElement>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::Image); }, 606 620 #if ENABLE(VIDEO) 607 [&] (const RefPtr<HTMLVideoElement>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::Image); },608 #endif 609 [&] (const RefPtr<ImageBitmap>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::ImageBitmap); },610 [&] (const RefPtr<ImageData>& value) { addParameter(indexForData(value .get()), RecordingSwizzleTypes::ImageData); },621 [&] (const RefPtr<HTMLVideoElement>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::Image); }, 622 #endif 623 [&] (const RefPtr<ImageBitmap>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::ImageBitmap); }, 624 [&] (const RefPtr<ImageData>& value) { addParameter(indexForData(value), RecordingSwizzleTypes::ImageData); }, 611 625 [&] (const RefPtr<Int32Array>&) { addParameter(0, RecordingSwizzleTypes::TypedArray); }, 612 626 [&] (const Vector<float>& value) { addParameter(buildArrayForVector(value).ptr(), RecordingSwizzleTypes::Array); }, … … 626 640 action->addItem(WTFMove(swizzleTypes)); 627 641 628 auto trace = JSON::ArrayOf<double>::create(); 629 auto stackTrace = Inspector::createScriptCallStack(JSExecState::currentState(), Inspector::ScriptCallStack::maxCallStackSizeToCapture); 630 for (size_t i = 0; i < stackTrace->size(); ++i) 631 trace->addItem(indexForData(stackTrace->at(i))); 632 action->addItem(WTFMove(trace)); 642 RefPtr<ScriptCallStack> trace = Inspector::createScriptCallStack(JSExecState::currentState(), Inspector::ScriptCallStack::maxCallStackSizeToCapture); 643 action->addItem(indexForData(WTFMove(trace))); 633 644 634 645 return action; -
trunk/Source/WebCore/inspector/InspectorCanvas.h
r237670 r238199 29 29 #include <JavaScriptCore/InspectorProtocolObjects.h> 30 30 #include <JavaScriptCore/ScriptCallFrame.h> 31 #include <JavaScriptCore/ScriptCallStack.h> 31 32 #include <wtf/Variant.h> 32 33 #include <wtf/Vector.h> … … 83 84 84 85 using DuplicateDataVariant = Variant< 85 CanvasGradient*,86 CanvasPattern*,87 HTMLCanvasElement*,88 HTMLImageElement*,86 RefPtr<CanvasGradient>, 87 RefPtr<CanvasPattern>, 88 RefPtr<HTMLCanvasElement>, 89 RefPtr<HTMLImageElement>, 89 90 #if ENABLE(VIDEO) 90 HTMLVideoElement*,91 RefPtr<HTMLVideoElement>, 91 92 #endif 92 ImageData*, 93 ImageBitmap*, 93 RefPtr<ImageData>, 94 RefPtr<ImageBitmap>, 95 RefPtr<Inspector::ScriptCallStack>, 94 96 Inspector::ScriptCallFrame, 95 97 String -
trunk/Source/WebInspectorUI/ChangeLog
r238198 r238199 1 2018-11-14 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Canvas: send a call stack with each action instead of an array of call frames 4 https://bugs.webkit.org/show_bug.cgi?id=191628 5 6 Reviewed by Dean Jackson. 7 8 * UserInterface/Models/Recording.js: 9 (WI.Recording.prototype.async swizzle): 10 11 * UserInterface/Models/RecordingAction.js: 12 (WI.RecordingAction.fromPayload): 13 (WI.RecordingAction.prototype.async swizzle): 14 1 15 2018-11-14 Devin Rousso <drousso@apple.com> 2 16 -
trunk/Source/WebInspectorUI/UserInterface/Models/Recording.js
r237808 r238199 313 313 this._swizzle[index][type] = await createImageBitmap(image); 314 314 break; 315 316 case WI.Recording.Swizzle.CallStack: { 317 let array = await this.swizzle(data, WI.Recording.Swizzle.Array); 318 this._swizzle[index][type] = await Promise.all(array.map((item) => this.swizzle(item, WI.Recording.Swizzle.CallFrame))); 319 break; 320 } 321 322 case WI.Recording.Swizzle.CallFrame: { 323 let array = await this.swizzle(data, WI.Recording.Swizzle.Array); 324 let [functionName, url] = await Promise.all([ 325 this.swizzle(array[0], WI.Recording.Swizzle.String), 326 this.swizzle(array[1], WI.Recording.Swizzle.String), 327 ]); 328 this._swizzle[index][type] = WI.CallFrame.fromPayload(WI.assumingMainTarget(), { 329 functionName, 330 url, 331 lineNumber: array[2], 332 columnNumber: array[3], 333 }); 334 break; 335 } 315 336 } 316 337 } catch { } … … 489 510 WebGLUniformLocation: 18, 490 511 ImageBitmap: 19, 512 513 // Special frontend-only swizzle types. 514 CallStack: Symbol("CallStack"), 515 CallFrame: Symbol("CallFrame"), 491 516 }; -
trunk/Source/WebInspectorUI/UserInterface/Models/RecordingAction.js
r237808 r238199 58 58 // Static 59 59 60 // Payload format: [name, parameters, swizzleTypes, trace, [snapshot]]60 // Payload format: (name, parameters, swizzleTypes, [trace, [snapshot]]) 61 61 static fromPayload(payload) 62 62 { … … 73 73 payload[2] = []; 74 74 75 if (!Array.isArray(payload[3])) 76 payload[3] = []; 75 if (isNaN(payload[3]) || (!payload[3] && payload[3] !== 0)) { 76 // COMPATIBILITY (iOS 12.1): "trace" was sent as an array of call frames instead of a single call stack 77 if (!Array.isArray(payload[3])) 78 payload[3] = []; 79 } 77 80 78 81 if (payload.length >= 5 && isNaN(payload[4])) … … 263 266 }; 264 267 265 let swizzleCallFrame = async (item, index) => {266 let array = await recording.swizzle(item, WI.Recording.Swizzle.None);267 let [functionName, url] = await Promise.all([268 recording.swizzle(array[0], WI.Recording.Swizzle.String),269 recording.swizzle(array[1], WI.Recording.Swizzle.String),270 ]);271 return WI.CallFrame.fromPayload(WI.mainTarget, {272 functionName,273 url,274 lineNumber: array[2],275 columnNumber: array[3],276 });277 };278 279 268 let swizzlePromises = [ 280 269 recording.swizzle(this._payloadName, WI.Recording.Swizzle.String), 281 270 Promise.all(this._payloadParameters.map(swizzleParameter)), 282 Promise.all(this._payloadTrace.map(swizzleCallFrame)),283 271 ]; 272 273 if (!isNaN(this._payloadTrace)) 274 swizzlePromises.push(recording.swizzle(this._payloadTrace, WI.Recording.Swizzle.CallStack)) 275 else { 276 // COMPATIBILITY (iOS 12.1): "trace" was sent as an array of call frames instead of a single call stack 277 swizzlePromises.push(Promise.all(this._payloadTrace.map((item) => recording.swizzle(item, WI.Recording.Swizzle.CallFrame)))); 278 } 279 284 280 if (this._payloadSnapshot >= 0) 285 281 swizzlePromises.push(recording.swizzle(this._payloadSnapshot, WI.Recording.Swizzle.String));
Note: See TracChangeset
for help on using the changeset viewer.