capture
Wrap around an object and capture sets on its properties and calls on its methods.
usage
node
const capture = ;
browser
deferring
// assume we have a canvas on a webpagevar ctx = ; // call and set on the capture object, will not execute immediatelyctx;ctxlineWidth = 5;ctx;ctx;ctx; // examine queued commandsconsole; // modify queued command argumentsctxqueue1args1 += 10; // now becomes ctx.moveTo(5, 20) // execute all queued commandsctx; // execute a specific one in the queuectxqueue3; // clear queued commands (won't clear automatically after executing)ctx;
indirect wrapping
If you don't have access to object creation (for example if it's done in a library), then you can patch its creation function.
// wrap around with canvas drawingvar oldGetContext = HTMLCanvasElementprototypegetContext;HTMLCanvasElementprototype { return ;};
It's not recommended to try wrapping the CanvasRenderingContext2D's prototype directly because it contains native calls.
immediate execution
If you don't actually to defer anything, but instead capture them, then that is available via the immediatelyExecute option:
var ctx = ;
This and other options can be configured by directly modifying the captured object:
ctxoptsexecuteImmediately = false;
pause/start capturing
You can suspend capture and execute commands immediately by calling
ctx;// immediately executed commands on ctx...ctx;