Repository: fabricjs/fabric.js
Pull request #9380 (2023-09-25 16:32:38)

patch(Coords): calc oCoords only with canvas ref
<!--
        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 -->

~Still working on controls and finding too many edgecases
I have a control that needs to access the canvas, so trying to do `fabricObject.canvas` needa to be safeguarded.
And it makes absolutely no sense.
Because controls exist only on the canvas and need the canvas for vpt calculations etc. so without the canvas the controls are not used, calculated for no reason and produce wrong values~

Since the introduction of layout in groups and nested targets, calls to setCoords are happening before adding an object to the canvas.
With the recent addition of https://github.com/fabricjs/fabric.js/pull/9376 you can use the object itself when calculating objects coordinates and this brings you to eventually evaluate the canvas of that object that is undefined in that moment.
For objects that do not do that we are still setting oCoords ignoring the canvas VPT and so potentially wrong.

## Description

<!-- What you are proposing -->

calc oCoords only when the canvas is available to the object
Since fabric calls setCoords when an object is added to canvas this PR makes no difference and is not breaking, but when working with custom logic the result will predictable and will save the developer from annoying errors and bugs.

## 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.988 (**+0.017**) | 305.554 (**+0.015**) | 

github-actions[bot]: 

Coverage after merging <b>canvas-setCoords</b> into <b>master</b> will be<table><tbody><tr><th>82.96%</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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/index.node.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/index.node.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/index.node.ts#L23'>23</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/index.node.ts#L35'>35</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/index.node.ts#L38'>38</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Collection.ts#L101'>101</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Collection.ts#L104'>104</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Collection.ts#L207-L208'>207&ndash;208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Collection.ts#L233-L234'>233&ndash;234</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/CommonMethods.ts#L9'>9</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L134-L135'>134&ndash;135</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L160-L161'>160&ndash;161</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L32-L33'>32&ndash;33</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L50'>50</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L78'>78</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Observable.ts#L89'>89</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Shadow.ts#L178'>178</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/cache.ts#L57'>57</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L130'>130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L138-L140'>138&ndash;140</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/config.ts#L151-L153'>151&ndash;153</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Pattern/Pattern.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Pattern/Pattern.ts#L130'>130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Pattern/Pattern.ts#L139'>139</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Pattern/Pattern.ts#L32'>32</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/Pattern/Pattern.ts#L95'>95</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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L110'>110</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L112'>112</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L114-L116'>114&ndash;116</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L118-L121'>118&ndash;121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L128-L129'>128&ndash;129</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L13'>13</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L23-L24'>23&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L32-L36'>32&ndash;36</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L40-L44'>40&ndash;44</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L51-L54'>51&ndash;54</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L62-L66'>62&ndash;66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L68'>68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L76-L77'>76&ndash;77</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L79-L82'>79&ndash;82</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L84'>84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L92-L93'>92&ndash;93</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/CircleBrush.ts#L95'>95</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PatternBrush.ts#L21'>21</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L122-L123'>122&ndash;123</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L152'>152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L152-L154'>152&ndash;154</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L276'>276</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L280'>280</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L285-L286'>285&ndash;286</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/PencilBrush.ts#L68-L69'>68&ndash;69</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L107-L108'>107&ndash;108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L110-L111'>110&ndash;111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L118-L119'>118&ndash;119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L123-L127'>123&ndash;127</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L140-L141'>140&ndash;141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L141'>141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L149-L152'>149&ndash;152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L154-L157'>154&ndash;157</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L161-L162'>161&ndash;162</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L164'>164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L166-L169'>166&ndash;169</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L172'>172</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L179'>179</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L180'>180</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L182'>182</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L184-L185'>184&ndash;185</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L187'>187</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L194-L195'>194&ndash;195</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L197-L198'>197&ndash;198</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L21'>21</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L212'>212</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L22-L24'>22&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L28'>28</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L32'>32</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L39'>39</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L46'>46</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L53'>53</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L60'>60</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L84-L86'>84&ndash;86</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/brushes/SprayBrush.ts#L94-L96'>94&ndash;96</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1000'>1000</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1003-L1004'>1003&ndash;1004</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1004'>1004</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1004'>1004</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1006'>1006</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1014'>1014</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1014'>1014</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1014-L1016'>1014&ndash;1016</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1016'>1016</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1016'>1016</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1023-L1024'>1023&ndash;1024</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1032-L1033'>1032&ndash;1033</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1033'>1033</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1033-L1034'>1033&ndash;1034</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1040'>1040</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1042'>1042</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1073-L1075'>1073&ndash;1075</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1078-L1079'>1078&ndash;1079</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1083-L1084'>1083&ndash;1084</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1197-L1199'>1197&ndash;1199</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1202-L1203'>1202&ndash;1203</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1276'>1276</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1395'>1395</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L1517'>1517</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L157'>157</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L182'>182</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L292-L293'>292&ndash;293</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L296-L300'>296&ndash;300</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L305'>305</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L328-L329'>328&ndash;329</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L334-L339'>334&ndash;339</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L359'>359</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L359'>359</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L359-L360'>359&ndash;360</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L360'>360</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L360-L361'>360&ndash;361</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L369'>369</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L37'>37</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L374-L375'>374&ndash;375</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L375'>375</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L375-L376'>375&ndash;376</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L378'>378</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L387'>387</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L393-L394'>393&ndash;394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L394'>394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L394'>394</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L437'>437</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L445'>445</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L449'>449</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L449'>449</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L449-L450'>449&ndash;450</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L452'>452</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L535-L536'>535&ndash;536</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L536'>536</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L536-L537'>536&ndash;537</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L543'>543</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L543'>543</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L543-L545'>543&ndash;545</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L565'>565</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L567'>567</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L567'>567</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L567-L568'>567&ndash;568</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L568'>568</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L568'>568</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L571'>571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L571'>571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L571-L572'>571&ndash;572</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L575'>575</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L584-L585'>584&ndash;585</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L587-L588'>587&ndash;588</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L590'>590</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L590-L591'>590&ndash;591</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L593-L594'>593&ndash;594</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L606-L607'>606&ndash;607</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L607'>607</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L607-L608'>607&ndash;608</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L610-L615'>610&ndash;615</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L621'>621</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L628'>628</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L665'>665</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L665'>665</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L665'>665</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L667'>667</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L669-L674'>669&ndash;674</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L680'>680</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L686'>686</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L686'>686</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L686-L687'>686&ndash;687</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L689'>689</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L692'>692</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L697'>697</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L710'>710</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L738'>738</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L738'>738</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L796-L797'>796&ndash;797</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L797'>797</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L797-L798'>797&ndash;798</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L800'>800</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L803-L804'>803&ndash;804</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L804'>804</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L804-L805'>804&ndash;805</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L807-L808'>807&ndash;808</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L811'>811</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L811-L813'>811&ndash;813</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L816-L817'>816&ndash;817</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L887'>887</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L899'>899</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L906'>906</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L927'>927</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L959'>959</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L980-L981'>980&ndash;981</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L997-L998'>997&ndash;998</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L998'>998</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/Canvas.ts#L998-L999'>998&ndash;999</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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.18%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L1099'>1099</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L1101'>1101</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L1103-L1104'>1103&ndash;1104</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L301'>301</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L478-L479'>478&ndash;479</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L481-L482'>481&ndash;482</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L482'>482</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L482'>482</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L531-L532'>531&ndash;532</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L593-L594'>593&ndash;594</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L647-L649'>647&ndash;649</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L681'>681</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L686-L687'>686&ndash;687</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L714-L715'>714&ndash;715</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L899'>899</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L899-L900'>899&ndash;900</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L903'>903</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L923'>923</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L923'>923</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L972'>972</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/SelectableCanvas.ts#L980'>980</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1031'>1031</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1041'>1041</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1093-L1094'>1093&ndash;1094</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1097'>1097</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1132-L1133'>1132&ndash;1133</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1209'>1209</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1218'>1218</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1218'>1218</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1222'>1222</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1222'>1222</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L1269-L1270'>1269&ndash;1270</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L187-L188'>187&ndash;188</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L204'>204</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L571'>571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L583-L584'>583&ndash;584</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L914-L915'>914&ndash;915</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L915'>915</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/StaticCanvas.ts#L915-L916'>915&ndash;916</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/TextEditingManager.ts#L17-L18'>17&ndash;18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/TextEditingManager.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/TextEditingManager.ts#L18-L19'>18&ndash;19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/TextEditingManager.ts#L19'>19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/CanvasDOMManager.ts#L21-L22'>21&ndash;22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/CanvasDOMManager.ts#L29'>29</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/StaticCanvasDOMManager.ts'>StaticCanvasDOMManager.ts</a></td><td><b>97.50%</b></td><td><b>88.89%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/StaticCanvasDOMManager.ts#L33'>33</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L14'>14</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L26'>26</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/canvas/DOMManagers/util.ts#L74'>74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/Color.ts#L233'>233</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/Color.ts#L258-L259'>258&ndash;259</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/Color.ts#L267-L268'>267&ndash;268</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/Color.ts#L48'>48</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L55-L56'>55&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L58-L59'>58&ndash;59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/color/util.ts#L61-L62'>61&ndash;62</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts'>Control.ts</a></td><td><b>93.41%</b></td><td><b>88.24%</b></td><td><b>91.67%</b></td><td><b>97.78%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts#L181'>181</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts#L247'>247</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts#L334'>334</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts#L334'>334</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/Control.ts#L369'>369</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L106'>106</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L111'>111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L50'>50</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/controlRendering.ts#L65-L72'>65&ndash;72</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/fireEvent.ts#L13'>13</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L103'>103</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L117'>117</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L119-L122'>119&ndash;122</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L122'>122</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L125'>125</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L132'>132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L25-L29'>25&ndash;29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L50-L56'>50&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L66'>66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L82-L84'>82&ndash;84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L84'>84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L86'>86</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L89-L90'>89&ndash;90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L92'>92</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/polyControl.ts#L97'>97</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L51-L52'>51&ndash;52</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L55-L57'>55&ndash;57</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L59-L61'>59&ndash;61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L61-L63'>61&ndash;63</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L65-L67'>65&ndash;67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L67-L68'>67&ndash;68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L73-L74'>73&ndash;74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/rotate.ts#L78'>78</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scale.ts#L129-L130'>129&ndash;130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scale.ts#L132-L134'>132&ndash;134</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scale.ts#L148-L149'>148&ndash;149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scale.ts#L181-L183'>181&ndash;183</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scale.ts#L42'>42</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L27'>27</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L31'>31</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L33'>33</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/scaleSkew.ts#L35'>35</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/skew.ts#L131-L132'>131&ndash;132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/skew.ts#L163-L164'>163&ndash;164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/skew.ts#L171'>171</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/skew.ts#L177'>177</a>, <a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/src/controls/skew.ts#L179'>179</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/eb2e27ccfc9f560e2320aadd2f764e7076589ac8/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/e


asturur: can't accept a PR anymore that cites annoying error and bugs without specifing what is going on.
Is the issue that viewportTransform is the identity matrix when canvas is not defined?
Why canvas is note defined in your use case?
ShaMan123: Yes
Not canvas means no vpt
Also group layout calls setCoords and that can happen before being added to canvas

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f13d153a..0d2c4559c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 ## [next]
 
+- patch(Coords): calc oCoords only with canvas ref [#9380](https://github.com/fabricjs/fabric.js/pull/9380)
 - patch(Control): pass object to `calcCornerCoords` [#9376](https://github.com/fabricjs/fabric.js/pull/9376)
 - fix(Canvas): invalidate `_objectsToRender` on stack change [#9387](https://github.com/fabricjs/fabric.js/pull/9387)
 - ci(e2e): fix babel compiling error [#9388](https://github.com/fabricjs/fabric.js/pull/9388)
diff --git a/src/shapes/Object/FabricObject.spec.ts b/src/shapes/Object/FabricObject.spec.ts
new file mode 100644
index 000000000..cd011e706
--- /dev/null
+++ b/src/shapes/Object/FabricObject.spec.ts
@@ -0,0 +1,16 @@
+import { FabricObject } from './FabricObject';
+
+describe('FabricObject', () => {
+  it('setCoords should calculate control coords only if canvas ref is set', () => {
+    const object = new FabricObject();
+    expect(object.aCoords).toBeUndefined();
+    expect(object.oCoords).toBeUndefined();
+    object.setCoords();
+    expect(object.aCoords).toBeDefined();
+    expect(object.oCoords).toBeUndefined();
+    object.canvas = jest.fn();
+    object.setCoords();
+    expect(object.aCoords).toBeDefined();
+    expect(object.oCoords).toBeDefined();
+  });
+});
diff --git a/src/shapes/Object/InteractiveObject.spec.ts b/src/shapes/Object/InteractiveObject.spec.ts
index 65b8ae849..72bf246a5 100644
--- a/src/shapes/Object/InteractiveObject.spec.ts
+++ b/src/shapes/Object/InteractiveObject.spec.ts
@@ -1,11 +1,13 @@
 import { radiansToDegrees } from '../../util';
 import { Group } from '../Group';
+import { Canvas } from '../../canvas/Canvas';
 import { FabricObject } from './FabricObject';
 import type { TOCoord } from './InteractiveObject';
 
 describe('Object', () => {
   describe('setCoords for objects inside group with rotation', () => {
     it('all corners are rotated as much as the object total angle', () => {
+      const canvas = new Canvas();
       const object = new FabricObject({
         left: 25,
         top: 60,
@@ -21,6 +23,7 @@ describe('Object', () => {
         interactive: true,
         subTargetCheck: true,
       });
+      canvas.add(group);
       group.setCoords();
       const objectAngle = Math.round(object.getTotalAngle());
       expect(objectAngle).toEqual(35);
diff --git a/src/shapes/Object/InteractiveObject.ts b/src/shapes/Object/InteractiveObject.ts
index 552d4d21e..f3a0c16a8 100644
--- a/src/shapes/Object/InteractiveObject.ts
+++ b/src/shapes/Object/InteractiveObject.ts
@@ -309,7 +309,7 @@ export class InteractiveFabricObject<
   setCoords(): void {
     super.setCoords();
     // set coordinates of the draggable boxes in the corners used to scale/rotate the image
-    this.oCoords = this.calcOCoords();
+    this.canvas && (this.oCoords = this.calcOCoords());
   }
 
   /**


Test patch:
diff --git a/test/unit/group.js b/test/unit/group.js
index 2ca68bd8b..db8448770 100644
--- a/test/unit/group.js
+++ b/test/unit/group.js
@@ -741,9 +741,9 @@
         rect2 = new fabric.Rect({ top: 5, left: 5, width: 2, height: 2, strokeWidth: 0, fill: 'red', opacity: 1, objectCaching: false}),
         group = new fabric.Group([rect1]);
 
-    var coords = group.oCoords;
+    var coords = group.aCoords;
     group.add(rect2);
-    var newCoords = group.oCoords;
+    var newCoords = group.aCoords;
     assert.notEqual(coords, newCoords, 'object coords have been recalculated - add');
   });
 
@@ -781,9 +781,9 @@
         rect2 = new fabric.Rect({ top: 5, left: 5, width: 2, height: 2, strokeWidth: 0, fill: 'red', opacity: 1, objectCaching: false}),
         group = new fabric.Group([rect1, rect2]);
 
-    var coords = group.oCoords;
+    var coords = group.aCoords;
     group.remove(rect2);
-    var newCoords = group.oCoords;
+    var newCoords = group.aCoords;
     assert.notEqual(coords, newCoords, 'object coords have been recalculated - remove');
   });
 
diff --git a/test/unit/object_geometry.js b/test/unit/object_geometry.js
index 561d82802..2df36fa0a 100644
--- a/test/unit/object_geometry.js
+++ b/test/unit/object_geometry.js
@@ -244,7 +244,7 @@
   });
 
   QUnit.test('setCoords', function(assert) {
-    var cObj = new fabric.Object({ left: 150, top: 150, width: 100, height: 100, strokeWidth: 0});
+    var cObj = new fabric.Object({ left: 150, top: 150, width: 100, height: 100, strokeWidth: 0,canvas:{}});
     assert.ok(typeof cObj.setCoords === 'function');
     cObj.setCoords();
     assert.equal(cObj.oCoords.tl.x, 150);
diff --git a/test/unit/object_interactivity.js b/test/unit/object_interactivity.js
index c0426fcc9..b608f27c9 100644
--- a/test/unit/object_interactivity.js
+++ b/test/unit/object_interactivity.js
@@ -98,7 +98,7 @@
   });
 
   QUnit.test('corner coords', function(assert) {
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 10, height: 10, strokeWidth: 0 });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 10, height: 10, strokeWidth: 0, canvas: {} });
     cObj.setCoords();
 
     assert.equal(cObj.oCoords.tl.corner.tl.x.toFixed(2), 3.5);
@@ -151,7 +151,7 @@
     sharedControls.bl.sizeX = 30;
     sharedControls.bl.sizeY = 10;
 
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 10, height: 10, strokeWidth: 0, controls: sharedControls });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 10, height: 10, strokeWidth: 0, controls: sharedControls, canvas: {} });
     cObj.setCoords();
 
     assert.equal(cObj.oCoords.tl.corner.tl.x.toFixed(2), 3.5);
@@ -201,7 +201,7 @@
   });
 
   QUnit.test('_findTargetCorner', function(assert) {
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0 });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0, canvas: {}});
     assert.ok(typeof cObj._findTargetCorner === 'function', '_findTargetCorner should exist');
     cObj.setCoords();
     cObj.canvas = {
@@ -220,7 +220,7 @@
   });
 
   QUnit.test('_findTargetCorner for touches', function(assert) {
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0 });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0, canvas: {} });
     cObj.setCoords();
     cObj.canvas = {
       getActiveObject() { return cObj }
@@ -241,7 +241,7 @@
 
 
   QUnit.test('_findTargetCorner for non active object', function (assert) {
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0 });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0, canvas: {} });
     assert.ok(typeof cObj._findTargetCorner === 'function', '_findTargetCorner should exist');
     cObj.setCoords();
     cObj.canvas = {
@@ -251,7 +251,7 @@
   });
 
   QUnit.test('_findTargetCorner for non visible control', function (assert) {
-    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0 });
+    var cObj = new fabric.Object({ top: 10, left: 10, width: 30, height: 30, strokeWidth: 0, canvas: {} });
     assert.ok(typeof cObj._findTargetCorner === 'function', '_findTargetCorner should exist');
     cObj.setCoords();
     cObj.canvas = {