Repository: fabricjs/fabric.js
Pull request #9186 (2023-08-30 07:58:06)

fix(): regression of `getPointer` usages + BREAKING: drop event data
<!--
        Hi there!
        Thanks for taking the time and putting the effort into making fabric better! 💖
        Take a look at /CONTRIBUTING.md for crucial instructions regarding local setup, testing etc.
        https://github.com/fabricjs/fabric.js/blob/master/CONTRIBUTING.md

        Adding tests that verify your fix and safeguard it from unwanted loss and changes is a MUST.

        Pull Requests are not always simple. Don't hesitate to ask for help (beware of [gotchas](http://fabricjs.com/fabric-gotchas) 😓).
        We appreciate your effort and would like the process to be productive and enjoyable.
        A strong community means a strong and better product for everyone.
-->

## Motivation

<!-- Why you are proposing -->
<!-- You can use the @closes notation to mark issues that will be resolved by this PR -->

prepare for #9175 

fixes bug from https://github.com/fabricjs/fabric.js/commit/b6f076cc0c817cd7f70abc7028c9d04295d121a8

## Description

Somewehre in v6 `_pointer` and `_abolutePointer` were changed to `getPointer` and many ~done WRONG~ were swapped in values.
Not a single test catch it so I have added tests

`pointer` => `getPointer(e, true)`
`absolutePointer`  => `getPointer(e)` 

## Changes

<!-- before the fix vs. after -->

## Gist

<!-- Technical stuff if necessary -->

## In Action

<!-- Show case your accomplishment -->
<!-- Upload screenshots, screencasts and live examples showing your fix in contrast to the current state -->


github-actions[bot]: <!-- BUILD STATS COMMENT -->
**Build Stats**

 | file / KB (diff) | bundled | minified | 
 | --- | --- | --- | 
 | fabric | 915.075 (**+0.024**) | 305.557 (**+0.013**) | 

github-actions[bot]: 

Coverage after merging <b>fix-getPointer-usages</b> into <b>master</b> will be<table><tbody><tr><th>82.98%</th></tr></tbody></table>

<details><summary>Coverage Report</summary><table><tbody><tr><th>File</th><th>Stmts</th><th>Branches</th><th>Funcs</th><th>Lines</th><th>Uncovered Lines</th></tr><tr><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts'>index.node.ts</a></td><td><b>7.69%</b></td><td>100%</td><td><b>0%</b></td><td><b>14.29%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L23'>23</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L35'>35</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L38'>38</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/index.node.ts#L41'>41</a></td></tr><tr><td colspan='6'><b>src</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/ClassRegistry.ts'>ClassRegistry.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Collection.ts'>Collection.ts</a></td><td><b>94.71%</b></td><td><b>94.64%</b></td><td><b>86.67%</b></td><td><b>97.09%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Collection.ts#L101'>101</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Collection.ts#L104'>104</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Collection.ts#L207-L208'>207&ndash;208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Collection.ts#L233-L234'>233&ndash;234</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/CommonMethods.ts'>CommonMethods.ts</a></td><td><b>96.55%</b></td><td><b>87.50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/CommonMethods.ts#L9'>9</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Intersection.ts'>Intersection.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts'>Observable.ts</a></td><td><b>87.76%</b></td><td><b>85.29%</b></td><td><b>87.50%</b></td><td><b>89.58%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L134-L135'>134&ndash;135</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L160-L161'>160&ndash;161</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L32-L33'>32&ndash;33</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L50'>50</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L78'>78</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Observable.ts#L89'>89</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Point.ts'>Point.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Shadow.ts'>Shadow.ts</a></td><td><b>98.36%</b></td><td><b>95.65%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Shadow.ts#L178'>178</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/cache.ts'>cache.ts</a></td><td><b>97.06%</b></td><td><b>90%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/cache.ts#L57'>57</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts'>config.ts</a></td><td><b>75%</b></td><td><b>66.67%</b></td><td><b>66.67%</b></td><td><b>82.76%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L130'>130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L138-L140'>138&ndash;140</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/config.ts#L151-L153'>151&ndash;153</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/constants.ts'>constants.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/Pattern</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts'>Pattern.ts</a></td><td><b>92.31%</b></td><td><b>91.89%</b></td><td><b>90%</b></td><td><b>93.55%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts#L118'>118</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts#L129'>129</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts#L31'>31</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/Pattern/Pattern.ts#L94'>94</a></td></tr><tr><td colspan='6'><b>src/brushes</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/BaseBrush.ts'>BaseBrush.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts'>CircleBrush.ts</a></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L110'>110</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L112'>112</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L114-L116'>114&ndash;116</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L118-L121'>118&ndash;121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L128-L129'>128&ndash;129</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L13'>13</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L23-L24'>23&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L32-L36'>32&ndash;36</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L40-L44'>40&ndash;44</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L51-L54'>51&ndash;54</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L62-L66'>62&ndash;66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L68'>68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L76-L77'>76&ndash;77</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L79-L82'>79&ndash;82</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L84'>84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L92-L93'>92&ndash;93</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L95'>95</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/CircleBrush.ts#L97-L99'>97&ndash;99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PatternBrush.ts'>PatternBrush.ts</a></td><td><b>97.06%</b></td><td><b>87.50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PatternBrush.ts#L21'>21</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts'>PencilBrush.ts</a></td><td><b>91.06%</b></td><td><b>82.35%</b></td><td>100%</td><td><b>93.81%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L122-L123'>122&ndash;123</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L152'>152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L152-L154'>152&ndash;154</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L276'>276</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L280'>280</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L285-L286'>285&ndash;286</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L68-L69'>68&ndash;69</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/PencilBrush.ts#L84-L85'>84&ndash;85</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts'>SprayBrush.ts</a></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L107-L108'>107&ndash;108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L110-L111'>110&ndash;111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L118-L119'>118&ndash;119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L123-L127'>123&ndash;127</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L140-L141'>140&ndash;141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L141'>141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L149-L152'>149&ndash;152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L154-L157'>154&ndash;157</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L161-L162'>161&ndash;162</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L164'>164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L166-L169'>166&ndash;169</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L172'>172</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L179'>179</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L180'>180</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L182'>182</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L184-L185'>184&ndash;185</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L187'>187</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L194-L195'>194&ndash;195</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L197-L198'>197&ndash;198</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L21'>21</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L212'>212</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L22-L24'>22&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L28'>28</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L32'>32</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L39'>39</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L46'>46</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L53'>53</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L60'>60</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L84-L86'>84&ndash;86</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L94-L96'>94&ndash;96</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/brushes/SprayBrush.ts#L98-L99'>98&ndash;99</a></td></tr><tr><td colspan='6'><b>src/canvas</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts'>Canvas.ts</a></td><td><b>79.12%</b></td><td><b>77.68%</b></td><td><b>83.05%</b></td><td><b>79.61%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1001-L1002'>1001&ndash;1002</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1002'>1002</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1002'>1002</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1004'>1004</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1012'>1012</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1012'>1012</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1012-L1014'>1012&ndash;1014</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1014'>1014</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1014'>1014</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1020-L1021'>1020&ndash;1021</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1029-L1030'>1029&ndash;1030</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1030'>1030</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1030-L1031'>1030&ndash;1031</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1036'>1036</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1038'>1038</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1069-L1071'>1069&ndash;1071</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1074-L1075'>1074&ndash;1075</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1079-L1080'>1079&ndash;1080</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1193-L1195'>1193&ndash;1195</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1198-L1199'>1198&ndash;1199</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1272'>1272</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1391'>1391</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L1513'>1513</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L157'>157</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L182'>182</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L292-L293'>292&ndash;293</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L296-L300'>296&ndash;300</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L305'>305</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L328-L329'>328&ndash;329</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L334-L339'>334&ndash;339</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L359'>359</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L359'>359</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L359-L360'>359&ndash;360</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L360'>360</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L360-L361'>360&ndash;361</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L369'>369</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L37'>37</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L374-L375'>374&ndash;375</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L375'>375</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L375-L376'>375&ndash;376</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L378'>378</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L387'>387</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L393-L394'>393&ndash;394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L394'>394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L394'>394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L437'>437</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L445'>445</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L449'>449</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L449'>449</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L449-L450'>449&ndash;450</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L452'>452</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L534-L535'>534&ndash;535</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L535'>535</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L535-L536'>535&ndash;536</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L542'>542</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L542'>542</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L542-L544'>542&ndash;544</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L564'>564</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L566'>566</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L566'>566</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L566-L567'>566&ndash;567</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L567'>567</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L567'>567</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L570'>570</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L570'>570</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L570-L571'>570&ndash;571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L574'>574</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L583-L584'>583&ndash;584</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L586-L587'>586&ndash;587</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L589'>589</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L589-L590'>589&ndash;590</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L592-L593'>592&ndash;593</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L605-L606'>605&ndash;606</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L606'>606</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L606-L607'>606&ndash;607</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L609-L614'>609&ndash;614</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L620'>620</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L627'>627</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L664'>664</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L664'>664</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L664'>664</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L666'>666</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L668-L673'>668&ndash;673</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L679'>679</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L685'>685</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L685'>685</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L685-L686'>685&ndash;686</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L688'>688</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L691'>691</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L696'>696</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L709'>709</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L737'>737</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L737'>737</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L795-L796'>795&ndash;796</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L796'>796</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L796-L797'>796&ndash;797</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L799'>799</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L802-L803'>802&ndash;803</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L803'>803</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L803-L804'>803&ndash;804</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L806-L807'>806&ndash;807</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L810'>810</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L810-L812'>810&ndash;812</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L815-L816'>815&ndash;816</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L886'>886</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L898'>898</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L905'>905</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L926'>926</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L958'>958</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L979-L980'>979&ndash;980</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L996-L997'>996&ndash;997</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L997'>997</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/Canvas.ts#L997-L999'>997&ndash;999</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/CanvasOptions.ts'>CanvasOptions.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts'>SelectableCanvas.ts</a></td><td><b>94.44%</b></td><td><b>92.28%</b></td><td><b>94.23%</b></td><td><b>96.17%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L1098'>1098</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L1100'>1100</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L1102-L1103'>1102&ndash;1103</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L301'>301</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L477-L478'>477&ndash;478</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L480-L481'>480&ndash;481</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L481'>481</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L481'>481</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L530-L531'>530&ndash;531</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L592-L593'>592&ndash;593</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L646-L648'>646&ndash;648</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L680'>680</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L685-L686'>685&ndash;686</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L713-L714'>713&ndash;714</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L898'>898</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L898-L899'>898&ndash;899</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L902'>902</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L922'>922</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L922'>922</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L971'>971</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/SelectableCanvas.ts#L979'>979</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts'>StaticCanvas.ts</a></td><td><b>96.78%</b></td><td><b>93.09%</b></td><td>100%</td><td><b>98.53%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1030'>1030</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1040'>1040</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1092-L1093'>1092&ndash;1093</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1096'>1096</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1131-L1132'>1131&ndash;1132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1208'>1208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1217'>1217</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1217'>1217</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1221'>1221</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1221'>1221</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L1268-L1269'>1268&ndash;1269</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L185-L186'>185&ndash;186</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L202'>202</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L570'>570</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L582-L583'>582&ndash;583</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L913-L914'>913&ndash;914</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L914'>914</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvas.ts#L914-L915'>914&ndash;915</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/StaticCanvasOptions.ts'>StaticCanvasOptions.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts'>TextEditingManager.ts</a></td><td><b>84.31%</b></td><td><b>71.43%</b></td><td><b>91.67%</b></td><td><b>88%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts#L17-L18'>17&ndash;18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts#L18-L19'>18&ndash;19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts#L19'>19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/TextEditingManager.ts#L19'>19</a></td></tr><tr><td colspan='6'><b>src/canvas/DOMManagers</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/CanvasDOMManager.ts'>CanvasDOMManager.ts</a></td><td><b>95.52%</b></td><td><b>70%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/CanvasDOMManager.ts#L21-L22'>21&ndash;22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/CanvasDOMManager.ts#L29'>29</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/StaticCanvasDOMManager.ts'>StaticCanvasDOMManager.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts'>util.ts</a></td><td><b>86.67%</b></td><td><b>80.56%</b></td><td><b>83.33%</b></td><td><b>93.94%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L14'>14</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L26'>26</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L74'>74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/canvas/DOMManagers/util.ts#L93-L94'>93&ndash;94</a></td></tr><tr><td colspan='6'><b>src/color</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/Color.ts'>Color.ts</a></td><td><b>94.96%</b></td><td><b>91.67%</b></td><td><b>96.30%</b></td><td><b>96.05%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/Color.ts#L233'>233</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/Color.ts#L258-L259'>258&ndash;259</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/Color.ts#L267-L268'>267&ndash;268</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/Color.ts#L48'>48</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/color_map.ts'>color_map.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/constants.ts'>constants.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts'>util.ts</a></td><td><b>85.71%</b></td><td><b>76.92%</b></td><td>100%</td><td><b>89.74%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L55-L56'>55&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L58-L59'>58&ndash;59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L61-L62'>61&ndash;62</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/color/util.ts#L89'>89</a></td></tr><tr><td colspan='6'><b>src/controls</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts'>Control.ts</a></td><td><b>93.33%</b></td><td><b>87.88%</b></td><td><b>91.67%</b></td><td><b>97.78%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts#L175'>175</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts#L240'>240</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts#L327'>327</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts#L327'>327</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/Control.ts#L362'>362</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/changeWidth.ts'>changeWidth.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/commonControls.ts'>commonControls.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts'>controlRendering.ts</a></td><td><b>81.63%</b></td><td><b>78%</b></td><td>100%</td><td><b>84.78%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L106'>106</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L111'>111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L50'>50</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L65-L72'>65&ndash;72</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/controlRendering.ts#L81-L82'>81&ndash;82</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/drag.ts'>drag.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/fireEvent.ts'>fireEvent.ts</a></td><td><b>88.89%</b></td><td><b>75%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/fireEvent.ts#L13'>13</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts'>polyControl.ts</a></td><td><b>6.06%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>11.43%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L103'>103</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L119-L122'>119&ndash;122</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L122'>122</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L125'>125</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L132'>132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L25-L29'>25&ndash;29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L50-L56'>50&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L66'>66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L82-L84'>82&ndash;84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L84'>84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L86'>86</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L89-L90'>89&ndash;90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L92'>92</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/polyControl.ts#L97'>97</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts'>rotate.ts</a></td><td><b>19.57%</b></td><td><b>12.50%</b></td><td><b>50%</b></td><td><b>21.43%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L51-L52'>51&ndash;52</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L55-L57'>55&ndash;57</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L59-L61'>59&ndash;61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L61-L63'>61&ndash;63</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L65-L67'>65&ndash;67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L67-L68'>67&ndash;68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L73-L74'>73&ndash;74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L78'>78</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/rotate.ts#L80-L81'>80&ndash;81</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts'>scale.ts</a></td><td><b>93.57%</b></td><td><b>92.94%</b></td><td>100%</td><td><b>93.67%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts#L129-L130'>129&ndash;130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts#L132-L134'>132&ndash;134</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts#L148-L149'>148&ndash;149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts#L181-L183'>181&ndash;183</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scale.ts#L42'>42</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts'>scaleSkew.ts</a></td><td><b>78.79%</b></td><td><b>64.29%</b></td><td>100%</td><td><b>85.71%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L27'>27</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L31'>31</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L33'>33</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/scaleSkew.ts#L35'>35</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts'>skew.ts</a></td><td><b>91.03%</b></td><td><b>79.31%</b></td><td>100%</td><td><b>97.67%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts#L131-L132'>131&ndash;132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts#L163-L164'>163&ndash;164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts#L171'>171</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts#L177'>177</a>, <a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/skew.ts#L179'>179</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/util.ts'>util.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/wrapWithFireEvent.ts'>wrapWithFireEvent.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/controls/wrapWithFixedAnchor.ts'>wrapWithFixedAnchor.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/env</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/588436b9d9e5dd40b2bc1f6afbbbaf9500061cf4/src/env/browser.ts'>browser.ts</a></td><td><b>84.21%</b></td><td><b>77.78%</b></td><td><b>50%</b></td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/b


asturur: @ShaMan123 those are the only swap instances i could find. Do you think there are more?

I removed the identity matrix test and i added a more generic matrix that doesn't put the absolute pointer in 0,0
ShaMan123: you anyways need to approve it since I created it, so merge at will
asturur: I can't find any getPointer usage in the brush files, can you point to me?
with this PR any usage of getPointer function is associated to the correct name, or at least that seems  to me
asturur: At least the pointers in brush are exposed to the brush functionality only, that is an issue for who is creating custom brushes that should be way less than who is just listening to events

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab41825de..2a48d82c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,8 @@
 
 ## [next]
 
-- chore(Object): rm \_setOriginToCenter and \_resetOrigin unuseful methods [#9179](https://github.com/fabricjs/fabric.js/pull/9179)
+- fix(CanvasEvents): regression of `getPointer` usages + BREAKING: drop event data [#9186](https://github.com/fabricjs/fabric.js/pull/9186)
+- feat(Object): BREAKING rm \_setOriginToCenter and \_resetOrigin unuseful methods [#9179](https://github.com/fabricjs/fabric.js/pull/9179)
 - fix(ActiveSelection): reset positioning when cleared [#9088](https://github.com/fabricjs/fabric.js/pull/9088)
 - ci(): generate docs [#9169](https://github.com/fabricjs/fabric.js/pull/9169)
 - fix(utils) Fixes the code for the anchor point in point controls for polygons [#9178](https://github.com/fabricjs/fabric.js/pull/9178)
diff --git a/jest.config.js b/jest.config.js
index 4a7d66ce3..4e3bea7f5 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -135,7 +135,7 @@ module.exports = {
   // setupFiles: [],
 
   // A list of paths to modules that run some code to configure or set up the testing framework before each test
-  // setupFilesAfterEnv: [],
+  setupFilesAfterEnv: ['./jest.setup.ts'],
 
   // The number of seconds after which a test is considered as slow and reported as such in the results.
   // slowTestThreshold: 5,
diff --git a/jest.extend.ts b/jest.extend.ts
new file mode 100644
index 000000000..9d63eec1f
--- /dev/null
+++ b/jest.extend.ts
@@ -0,0 +1,123 @@
+import { expect } from '@jest/globals';
+import { toMatchSnapshot } from 'jest-snapshot';
+import type { CloneDeepWithCustomizer } from 'lodash';
+import { cloneDeepWith } from 'lodash';
+import { FabricObject } from './src/shapes/Object/Object';
+
+type ExtendedOptions<T = unknown> =
+  | {
+      cloneDeepWith?: CloneDeepWithCustomizer<T>;
+    } & object;
+
+type ObjectOptions<T = unknown> = ExtendedOptions<T> & {
+  includeDefaultValues?: boolean;
+};
+
+export const roundSnapshotOptions = {
+  cloneDeepWith: (value) => {
+    if (typeof value === 'number') {
+      return Math.round(value);
+    }
+  },
+};
+
+expect.extend({
+  toMatchSnapshot(
+    received: any,
+    propertiesOrHint?: ExtendedOptions,
+    hint?: string
+  ) {
+    if (typeof received === 'string') {
+      return toMatchSnapshot.call(
+        this,
+        received,
+        propertiesOrHint || hint || ''
+      );
+    }
+    const { cloneDeepWith: customizer, ...properties } = propertiesOrHint || {};
+    return toMatchSnapshot.call(
+      this,
+      customizer ? cloneDeepWith(received, customizer) : received,
+      properties,
+      hint
+    );
+  },
+  toMatchObjectSnapshot(
+    received: FabricObject | Record<string, any>,
+    {
+      cloneDeepWith: customizer,
+      includeDefaultValues,
+      ...properties
+    }: ObjectOptions = {},
+    hint?: string
+  ) {
+    let snapshot: Record<string, any>;
+    if (received instanceof FabricObject) {
+      const restore = received.includeDefaultValues;
+      typeof includeDefaultValues === 'boolean' &&
+        (received.includeDefaultValues = includeDefaultValues);
+      snapshot = received.toObject();
+      received.includeDefaultValues = restore;
+    } else {
+      snapshot = received;
+    }
+    delete snapshot.version;
+    return toMatchSnapshot.call(
+      this,
+      cloneDeepWith(snapshot, (value, key, object, stack) => {
+        const clone = customizer?.(value, key, object, stack);
+        if (clone) {
+          return clone;
+        } else if (key === 'width') {
+          return Math.round(value);
+        }
+      }),
+      properties,
+      hint
+    );
+  },
+});
+
+// // written in official docs but DOESN'T work
+// declare module 'expect' {
+//   interface AsymmetricMatchers {
+//     toMatchSnapshot(propertiesOrHint?: ExtendedOptions, hint?: string): void;
+//   }
+//   interface Matchers<R, T> {
+//     toMatchSnapshot(propertiesOrHint?: ExtendedOptions<T>, hint?: string): R;
+//   }
+// }
+
+// not written in official docs but DOES work
+declare global {
+  // eslint-disable-next-line @typescript-eslint/no-namespace
+  namespace jest {
+    interface AsymmetricMatchers {
+      toMatchSnapshot(
+        propertiesOrHint?: ExtendedOptions | string,
+        hint?: string
+      ): void;
+      toMatchObjectSnapshot(
+        propertiesOrHint?: ObjectOptions | string,
+        hint?: string
+      ): void;
+    }
+    interface Matchers<R, T> {
+      toMatchSnapshot<U extends { [P in keyof T]: any }>(
+        propertyMatchers: Partial<
+          U & { cloneDeepWith: CloneDeepWithCustomizer<T> }
+        >,
+        snapshotName?: string
+      ): R;
+      toMatchObjectSnapshot<U extends { [P in keyof T]: any }>(
+        propertyMatchers?: Partial<
+          U & {
+            cloneDeepWith: CloneDeepWithCustomizer<T>;
+            includeDefaultValues?: boolean;
+          }
+        >,
+        snapshotName?: string
+      ): R;
+    }
+  }
+}
diff --git a/jest.setup.ts b/jest.setup.ts
new file mode 100644
index 000000000..1c6ccb9bb
--- /dev/null
+++ b/jest.setup.ts
@@ -0,0 +1,5 @@
+import './jest.extend';
+import { getEnv, setEnv } from './src/env';
+
+// set custom env
+beforeAll(() => setEnv({ ...getEnv(), window, document }));
diff --git a/src/EventTypeDefs.ts b/src/EventTypeDefs.ts
index 73aab6d62..63e4d787b 100644
--- a/src/EventTypeDefs.ts
+++ b/src/EventTypeDefs.ts
@@ -163,6 +163,7 @@ export interface DragEventData extends TEvent<DragEvent> {
 
 export interface DropEventData extends DragEventData {
   pointer: Point;
+  absolutePointer: Point;
 }
 
 interface DnDEvents {
diff --git a/src/canvas/Canvas.ts b/src/canvas/Canvas.ts
index 3400eff69..a7e4edbef 100644
--- a/src/canvas/Canvas.ts
+++ b/src/canvas/Canvas.ts
@@ -245,8 +245,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
     const shared = {
       e,
       isClick: false,
-      pointer: this.getPointer(e),
-      absolutePointer: this.getPointer(e, true),
+      pointer: this.getPointer(e, true),
+      absolutePointer: this.getPointer(e),
     };
     this.fire('mouse:out', { ...shared, target });
     this._hoveredTarget = undefined;
@@ -273,8 +273,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
       this.fire('mouse:over', {
         e,
         isClick: false,
-        pointer: this.getPointer(e),
-        absolutePointer: this.getPointer(e, true),
+        pointer: this.getPointer(e, true),
+        absolutePointer: this.getPointer(e),
       });
       this._hoveredTarget = undefined;
       this._hoveredTargets = [];
@@ -512,7 +512,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
       target,
       subTargets: targets,
       dragSource: this._dragSource,
-      pointer: this.getPointer(e),
+      pointer: this.getPointer(e, true),
+      absolutePointer: this.getPointer(e),
     });
     //  will be set by the drop target
     options.didDrop = false;
@@ -930,8 +931,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
         subTargets: targets,
         button,
         isClick,
-        pointer: this.getPointer(e),
-        absolutePointer: this.getPointer(e, true),
+        pointer: this.getPointer(e, true),
+        absolutePointer: this.getPointer(e),
         transform: this._currentTransform,
       };
     if (eventType === 'up') {
@@ -998,6 +999,7 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
       this.discardActiveObject(e);
       this.requestRenderAll();
     }
+    // this is an absolute pointer, the naming is wrong
     const pointer = this.getPointer(e);
     this.freeDrawingBrush &&
       this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });
@@ -1014,6 +1016,7 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
       this.freeDrawingBrush &&
         this.freeDrawingBrush.onMouseMove(pointer, {
           e,
+          // this is an absolute pointer, the naming is wrong
           pointer,
         });
     }
@@ -1030,6 +1033,7 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
     if (this.freeDrawingBrush) {
       this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({
         e: e,
+        // this is an absolute pointer, the naming is wrong
         pointer: pointer,
       });
     } else {
@@ -1315,8 +1319,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
         target: oldTarget,
         nextTarget: target,
         isClick: false,
-        pointer: this.getPointer(e),
-        absolutePointer: this.getPointer(e, true),
+        pointer: this.getPointer(e, true),
+        absolutePointer: this.getPointer(e),
       };
       fireCanvas && this.fire(canvasIn, outOpt);
       oldTarget.fire(targetOut, outOpt);
@@ -1328,8 +1332,8 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
         target,
         previousTarget: oldTarget,
         isClick: false,
-        pointer: this.getPointer(e),
-        absolutePointer: this.getPointer(e, true),
+        pointer: this.getPointer(e, true),
+        absolutePointer: this.getPointer(e),
       };
       fireCanvas && this.fire(canvasOut, inOpt);
       target.fire(targetIn, inOpt);
diff --git a/src/canvas/SelectableCanvas.ts b/src/canvas/SelectableCanvas.ts
index 13661a3f8..b01506c6b 100644
--- a/src/canvas/SelectableCanvas.ts
+++ b/src/canvas/SelectableCanvas.ts
@@ -871,9 +871,9 @@ export class SelectableCanvas<EventSpec extends CanvasEvents = CanvasEvents>
    * by the viewportTransform ( sort of coordinates of what is displayed
    * on the canvas where you are clicking.
    * ignoreVpt true = HTMLElement coordinates relative to top,left
-   * ignoreVpt false, default = fabric space coordinates, the same used for shape position
-   * To interact with your shapes top and left you want to use ignoreVpt true
-   * most of the time, while ignoreVpt false will give you coordinates
+   * ignoreVpt false, default = fabric space coordinates, the same used for shape position.
+   * To interact with your shapes top and left you want to use ignoreVpt false
+   * most of the time, while ignoreVpt true will give you coordinates
    * compatible with the object.oCoords system.
    * of the time.
    * @param {Event} e
diff --git a/src/shapes/Text/Text.spec.ts b/src/shapes/Text/Text.spec.ts
index cadc374c9..b44293f84 100644
--- a/src/shapes/Text/Text.spec.ts
+++ b/src/shapes/Text/Text.spec.ts
@@ -1,4 +1,4 @@
-import '../../../toMatchRoundedSnapshot';
+import { roundSnapshotOptions } from '../../../jest.extend';
 import { cache } from '../../cache';
 import { config } from '../../config';
 import { Text } from './Text';
@@ -9,7 +9,7 @@ afterEach(() => {
 
 describe('Text', () => {
   it('toObject', async () => {
-    expect(new Text('text').toObject()).toMatchRoundedSnapshot(['width']);
+    expect(new Text('text')).toMatchObjectSnapshot();
   });
 
   it('fromObject', async () => {
@@ -25,7 +25,7 @@ describe('Text', () => {
       const text = new Text('');
       const style = text.getCompleteStyleDeclaration(0, 0);
       const measurement = text._measureChar('a', style, zwc, style);
-      expect(measurement).toMatchRoundedSnapshot();
+      expect(measurement).toMatchSnapshot(roundSnapshotOptions);
       expect(measurement).toEqual(text._measureChar('a', style, zwc, style));
     });
 
diff --git a/src/shapes/Text/__snapshots__/Text.spec.ts.snap b/src/shapes/Text/__snapshots__/Text.spec.ts.snap
index 9c8d3003d..1e88f3ded 100644
--- a/src/shapes/Text/__snapshots__/Text.spec.ts.snap
+++ b/src/shapes/Text/__snapshots__/Text.spec.ts.snap
@@ -170,6 +170,7 @@ exports[`Text toObject 1`] = `
   "originY": "top",
   "overline": false,
   "paintFirst": "fill",
+  "path": undefined,
   "pathAlign": "baseline",
   "pathSide": "left",
   "pathStartOffset": 0,
diff --git a/src/shapes/Textbox.spec.ts b/src/shapes/Textbox.spec.ts
index 818294000..05b777035 100644
--- a/src/shapes/Textbox.spec.ts
+++ b/src/shapes/Textbox.spec.ts
@@ -1,4 +1,4 @@
-import '../../toMatchRoundedSnapshot';
+import '../../jest.extend';
 import { Textbox } from './Textbox';
 
 describe('Textbox', () => {
@@ -6,9 +6,8 @@ describe('Textbox', () => {
     const textbox = await Textbox.fromObject({
       text: 'The quick \nbrown \nfox',
     });
-    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
-    textbox.includeDefaultValues = false;
-    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
+    expect(textbox).toMatchObjectSnapshot();
+    expect(textbox).toMatchObjectSnapshot({ includeDefaultValues: false });
   });
 
   it('toObject with styles', () => {
@@ -32,7 +31,7 @@ describe('Textbox', () => {
         },
       },
     });
-    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
+    expect(textbox).toMatchObjectSnapshot();
   });
 
   it('stylesToArray edge case', () => {
diff --git a/src/shapes/__snapshots__/Textbox.spec.ts.snap b/src/shapes/__snapshots__/Textbox.spec.ts.snap
index cb593595c..70e3a521b 100644
--- a/src/shapes/__snapshots__/Textbox.spec.ts.snap
+++ b/src/shapes/__snapshots__/Textbox.spec.ts.snap
@@ -25,6 +25,7 @@ exports[`Textbox fromObject 1`] = `
   "originY": "top",
   "overline": false,
   "paintFirst": "fill",
+  "path": undefined,
   "pathAlign": "baseline",
   "pathSide": "left",
   "pathStartOffset": 0,
@@ -114,6 +115,7 @@ exports[`Textbox toObject with styles 1`] = `
   "originY": "top",
   "overline": false,
   "paintFirst": "fill",
+  "path": undefined,
   "pathAlign": "baseline",
   "pathSide": "left",
   "pathStartOffset": 0,
diff --git a/src/util/dom_misc.ts b/src/util/dom_misc.ts
index f392ebe84..f58152278 100644
--- a/src/util/dom_misc.ts
+++ b/src/util/dom_misc.ts
@@ -4,12 +4,13 @@
  * @return {Object} Object with left/top values
  */
 export function getScrollLeftTop(element: HTMLElement | null) {
+  const doc = element && getDocumentFromElement(element);
   let left = 0,
     top = 0;
-  if (!element) {
+  if (!element || !doc) {
     return { left, top };
   }
-  const doc = getDocumentFromElement(element);
+
   const docElement = doc.documentElement,
     body = doc.body || {
       scrollLeft: 0,
diff --git a/toMatchRoundedSnapshot.ts b/toMatchRoundedSnapshot.ts
deleted file mode 100644
index 3cb1da6d5..000000000
--- a/toMatchRoundedSnapshot.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-/* eslint-disable @typescript-eslint/no-namespace */
-import { expect } from '@jest/globals';
-import { toMatchSnapshot, Context } from 'jest-snapshot';
-import { cloneDeep } from './src/util/internals/cloneDeep';
-
-// https://github.com/jestjs/jest/blob/70b17d2e3d2bf40dd27fecdcdd06c159d26a7c6c/website/versioned_docs/version-25.x/ExpectAPI.md?plain=1#L241-L262
-
-function roundDeep(received: any, key: string | number) {
-  const value = received[key];
-  Array.isArray(value)
-    ? value.forEach((entry, index, array) => roundDeep(array, index))
-    : typeof value === 'object'
-    ? Object.keys(value).forEach((key) => roundDeep(value, key))
-    : typeof value === 'number' && (received[key] = Math.round(value));
-}
-
-expect.extend({
-  toMatchRoundedSnapshot(
-    { version, ...received }: Record<string, unknown>,
-    keys?: string[],
-    ...propertiesOrHint
-  ) {
-    const clone = cloneDeep(received);
-    (keys ?? Object.keys(clone)).forEach((key) => {
-      roundDeep(clone, key);
-    });
-    return toMatchSnapshot.call(this as Context, clone, ...propertiesOrHint);
-  },
-});
-
-// // written in official docs but DOESN'T work
-// declare module 'expect' {
-//   interface AsymmetricMatchers {
-//     toMatchRoundedSnapshot(
-//       keys?: string[],
-//       propertiesOrHint?: object | string,
-//       hint?: string
-//     ): void;
-//   }
-//   interface Matchers<R, T> {
-//     toMatchRoundedSnapshot(
-//       keys?: (keyof T)[],
-//       propertiesOrHint?: object | string,
-//       hint?: string
-//     ): R;
-//   }
-// }
-// not written in official docs but DOES work
-declare global {
-  namespace jest {
-    interface AsymmetricMatchers {
-      toMatchRoundedSnapshot(
-        keys?: string[],
-        propertiesOrHint?: object | string,
-        hint?: string
-      ): void;
-    }
-    interface Matchers<R, T> {
-      toMatchRoundedSnapshot(
-        keys?: (keyof T)[],
-        propertiesOrHint?: object | string,
-        hint?: string
-      ): R;
-    }
-  }
-}


Test patch:
diff --git a/src/canvas/__tests__/__snapshots__/eventData.test.ts.snap b/src/canvas/__tests__/__snapshots__/eventData.test.ts.snap
new file mode 100644
index 000000000..de66727f7
--- /dev/null
+++ b/src/canvas/__tests__/__snapshots__/eventData.test.ts.snap
@@ -0,0 +1,581 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Canvas event data HTML event "contextmenu" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "contextmenu:before",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": undefined,
+    },
+  ],
+  [
+    "contextmenu",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": undefined,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "dblclick" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:dblclick",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "drag" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drag",
+    {
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "dragend" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "dragend",
+    {
+      "didDrop": false,
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "mouse:up:before",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+      "transform": null,
+    },
+  ],
+  [
+    "mouse:up",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "currentSubTargets": [],
+      "currentTarget": "Drag Target",
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+      "transform": null,
+    },
+  ],
+  [
+    "after:render",
+    {
+      "ctx": CanvasRenderingContext2D {
+        "canvas": <canvas
+          class="upper-canvas"
+          data-fabric="top"
+          draggable="true"
+          height="150"
+          style="position: absolute; left: 0px; top: 0px; user-select: none; width: 300px; height: 150px; cursor: move;"
+          width="300"
+        />,
+        "createPattern": [Function],
+        "drawImage": [Function],
+      },
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "dragenter" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "dragenter",
+    {
+      "dragSource": "Drag Target",
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drag:leave",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "dragSource": "Drag Target",
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "previousTarget": undefined,
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "dragleave" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "dragleave",
+    {
+      "dragSource": "Drag Target",
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": undefined,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "dragover" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "dragover",
+    {
+      "canDrop": true,
+      "dragSource": "Drag Target",
+      "dropTarget": "Drag Target",
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drag:leave",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "canDrop": false,
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "previousTarget": undefined,
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "drop" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "dragstart",
+    {
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drop:before",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "didDrop": false,
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drop",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "didDrop": false,
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+  [
+    "drop:after",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "didDrop": false,
+      "dragSource": "Drag Target",
+      "dropTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": "Drag Target",
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "mousedown" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:down:before",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+  [
+    "mouse:down",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "mouseenter" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:over",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "mouseleave" should fire a corresponding canvas event with viewportTransform of %s 1`] = `[]`;
+
+exports[`Canvas event data HTML event "mousemove" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:move:before",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+  [
+    "mouse:move",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "mouseout" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:out",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "target": undefined,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "mouseover" should fire a corresponding canvas event with viewportTransform of %s 1`] = `[]`;
+
+exports[`Canvas event data HTML event "mouseup" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:up:before",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+  [
+    "mouse:up",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "currentSubTargets": [],
+      "currentTarget": undefined,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": true,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+]
+`;
+
+exports[`Canvas event data HTML event "wheel" should fire a corresponding canvas event with viewportTransform of %s 1`] = `
+[
+  [
+    "mouse:wheel",
+    {
+      "absolutePointer": Point {
+        "x": -30,
+        "y": -13,
+      },
+      "button": 1,
+      "e": MouseEvent {
+        "isTrusted": false,
+      },
+      "isClick": false,
+      "pointer": Point {
+        "x": 50,
+        "y": 50,
+      },
+      "subTargets": [],
+      "target": undefined,
+      "transform": null,
+    },
+  ],
+]
+`;
diff --git a/src/canvas/__tests__/eventData.test.ts b/src/canvas/__tests__/eventData.test.ts
new file mode 100644
index 000000000..e3976a2cd
--- /dev/null
+++ b/src/canvas/__tests__/eventData.test.ts
@@ -0,0 +1,102 @@
+/* eslint-disable no-restricted-globals */
+import '../../../jest.extend';
+import { Point } from '../../Point';
+import { IText } from '../../shapes/IText/IText';
+import type { TMat2D } from '../../typedefs';
+import { Canvas } from '../Canvas';
+
+const genericVpt = [2.3, 0, 0, 2.3, 120, 80] as TMat2D;
+
+describe('Canvas event data', () => {
+  let canvas: Canvas;
+  let spy: jest.SpyInstance;
+
+  const snapshotOptions = {
+    cloneDeepWith: (value: any) => {
+      if (value instanceof Point) {
+        return new Point(Math.round(value.x), Math.round(value.y));
+      }
+    },
+  };
+
+  beforeEach(() => {
+    canvas = new Canvas(null);
+    spy = jest.spyOn(canvas, 'fire');
+  });
+
+  afterEach(() => {
+    return canvas.dispose();
+  });
+
+  test.each([
+    'mousedown',
+    'mouseenter',
+    'mouseleave',
+    'mousemove',
+    'mouseout',
+    'mouseover',
+    'dblclick',
+    'wheel',
+    'contextmenu',
+  ] as (keyof WindowEventMap)[])(
+    'HTML event "%s" should fire a corresponding canvas event with viewportTransform of %s',
+    (type) => {
+      canvas.setViewportTransform(genericVpt);
+      canvas
+        .getSelectionElement()
+        .dispatchEvent(new MouseEvent(type, { clientX: 50, clientY: 50 }));
+      expect(spy.mock.calls).toMatchSnapshot(snapshotOptions);
+    }
+  );
+
+  // must call mousedown for mouseup to be listened to
+  test('HTML event "mouseup" should fire a corresponding canvas event with viewportTransform of %s', () => {
+    canvas.setViewportTransform(genericVpt);
+    canvas
+      .getSelectionElement()
+      .dispatchEvent(new MouseEvent('mousedown', { clientX: 50, clientY: 50 }));
+    spy.mockReset();
+    document.dispatchEvent(
+      new MouseEvent('mouseup', { clientX: 50, clientY: 50 })
+    );
+    expect(spy.mock.calls).toMatchSnapshot(snapshotOptions);
+  });
+
+  test.each([
+    'drag',
+    'dragend',
+    'dragenter',
+    'dragleave',
+    'dragover',
+    'drop',
+  ] as (keyof WindowEventMap)[])(
+    'HTML event "%s" should fire a corresponding canvas event with viewportTransform of %s',
+    (type) => {
+      canvas.setViewportTransform(genericVpt);
+      // select target and mock some essentials for events to fire
+      const dragTarget = new IText('Drag Target', {
+        originX: 'center',
+        originY: 'center',
+      });
+      jest.spyOn(dragTarget, 'onDragStart').mockReturnValue(true);
+      jest.spyOn(dragTarget, 'renderDragSourceEffect').mockImplementation();
+      jest.spyOn(dragTarget, 'toJSON').mockReturnValue('Drag Target');
+      canvas.add(dragTarget);
+      canvas.setActiveObject(dragTarget);
+      spy.mockReset();
+      canvas.getSelectionElement().dispatchEvent(
+        new MouseEvent('dragstart', {
+          clientX: 50,
+          clientY: 50,
+        })
+      );
+      canvas.getSelectionElement().dispatchEvent(
+        new MouseEvent(type, {
+          clientX: 50,
+          clientY: 50,
+        })
+      );
+      expect(spy.mock.calls).toMatchSnapshot(snapshotOptions);
+    }
+  );
+});
diff --git a/src/shapes/IText/ITextBehavior.test.ts b/src/shapes/IText/ITextBehavior.test.ts
index ea81de8e6..6ac3deeba 100644
--- a/src/shapes/IText/ITextBehavior.test.ts
+++ b/src/shapes/IText/ITextBehavior.test.ts
@@ -1,4 +1,4 @@
-import '../../../toMatchRoundedSnapshot';
+import { roundSnapshotOptions } from '../../../jest.extend';
 import { IText } from './IText';
 
 export function matchTextStateSnapshot(text: IText) {
@@ -14,9 +14,8 @@ export function matchTextStateSnapshot(text: IText) {
     text: t,
     lines,
     charBounds,
-  }).toMatchRoundedSnapshot();
-  text.includeDefaultValues = false;
-  expect(text.toObject()).toMatchRoundedSnapshot(['width']);
+  }).toMatchSnapshot(roundSnapshotOptions);
+  expect(text).toMatchObjectSnapshot({ includeDefaultValues: false });
 }
 
 function create() {
diff --git a/test/unit/draggable_text.js b/test/unit/draggable_text.js
index 649364e57..26d68e201 100644
--- a/test/unit/draggable_text.js
+++ b/test/unit/draggable_text.js
@@ -482,6 +482,7 @@ function assertDragEventStream(name, a, b) {
                         dropTarget: iText,
                         didDrop: true,
                         pointer: new fabric.Point(110, 15),
+                        absolutePointer: new fabric.Point(110, 15),
                     },
                     {
                         e: drop,
@@ -547,6 +548,7 @@ function assertDragEventStream(name, a, b) {
                         dragSource: iText,
                         dropTarget: iText2,
                         didDrop: true,
+                        absolutePointer: new fabric.Point(240, 15),
                         pointer: new fabric.Point(240, 15),
                     },
                 ]);