Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(Textbox): implemente a fix for the style shifting issues on new lines #9197

Merged
merged 15 commits into from
Sep 14, 2023

Conversation

asturur
Copy link
Member

@asturur asturur commented Sep 1, 2023

Motivation

not sure this is 100% safe and needs to be tested rigorously.
When using get2dCursorLocation ignoring wrapping, the missingnewlineoffset is not influent, because is a wrapping only issue. get2dCursorLocation is used in insertNewStyleBlock to determine the style to copy, and in that case we have to ignore the specific of splitByGrapheme because we are making counts on unwrapped text lines.

But what about all the other times we call missingnewlineoffset outside the get2dCursorLocation? that we need to find out.

It would be probably better to just have get2dCursorLocation call a specific function that is different, or have get2dCursorLocation different for textbox.

Note:

As pointed out by @ShaMan123 this is a bug from 5.x not a regression

Description

Changes

Gist

In Action

@github-actions
Copy link
Contributor

github-actions bot commented Sep 1, 2023

Build Stats

file / KB (diff) bundled minified
fabric 915.655 (+0.139) 305.470 (+0.008)

@github-actions
Copy link
Contributor

github-actions bot commented Sep 1, 2023

Coverage after merging fix-style-issue into master will be

82.97%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts7.69%100%0%14.29%17, 20, 23, 35, 38, 41
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.71%94.64%86.67%97.09%101, 104, 207–208, 233–234
   CommonMethods.ts96.55%87.50%100%100%9
   Intersection.ts100%100%100%100%
   Observable.ts87.76%85.29%87.50%89.58%134–135, 160–161, 32–33, 41, 50, 78, 89
   Point.ts100%100%100%100%
   Shadow.ts98.36%95.65%100%100%178
   cache.ts97.06%90%100%100%57
   config.ts75%66.67%66.67%82.76%130, 138, 138, 138, 138, 138–140, 151–153
   constants.ts100%100%100%100%
src/Pattern
   Pattern.ts92.31%91.89%90%93.55%118, 129, 138, 31, 94
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%108, 108, 108, 110, 112, 114–116, 118–121, 128–129, 13, 136, 138, 23–24, 32–36, 40–44, 51–54, 62–66, 68, 76, 76, 76, 76, 76–77, 79, 79, 79–82, 84, 92–93, 95, 97–99
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.06%82.35%100%93.81%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%107, 107, 107, 107, 107–108, 110–111, 118–119, 121, 123–127, 136, 140–141, 141, 149, 149, 149–152, 154–157, 161–162, 164, 166–169, 17, 172, 179, 18, 180, 182, 184–185, 187, 194–195, 197–198, 20, 201, 201, 208, 208, 21, 212, 22, 22, 22–24, 28, 32, 39, 46, 53, 60, 67, 84–86, 94–96, 98–99
src/canvas
   Canvas.ts79.12%77.68%83.05%79.61%1000, 1003–1004, 1004, 1004, 1006, 1014, 1014, 1014–1016, 1016, 1016, 1023–1024, 1032–1033, 1033, 1033–1034, 1040, 1042, 1073–1075, 1078–1079, 1083–1084, 1197–1199, 1202–1203, 1276, 1395, 1517, 157, 182, 292–293, 296–300, 305, 328–329, 334–339, 359, 359, 359–360, 360, 360–361, 369, 37, 374–375, 375, 375–376, 378, 387, 393–394, 394, 394, 41, 437, 445, 449, 449, 449–450, 452, 535–536, 536, 536–537, 543, 543, 543–545, 565, 567, 567, 567–568, 568, 568, 571, 571, 571–572, 575, 584–585, 587–588, 590, 590–591, 593–594, 606–607, 607, 607–608, 610–615, 621, 628, 665, 665, 665, 667, 669–674, 680, 686, 686, 686–687, 689, 692, 697, 710, 738, 738, 796–797, 797, 797–798, 800, 803–804, 804, 804–805, 807–808, 811, 811–813, 816–817, 887, 899, 906, 927, 959, 980–981, 997–998, 998, 998–999
   CanvasOptions.ts100%100%100%100%
   SelectableCanvas.ts94.44%92.28%94.23%96.18%1099, 1101, 1103–1104, 301, 478–479, 481–482, 482, 482, 531–532, 593–594, 647–649, 681, 686–687, 714–715, 899, 899–900, 903, 923, 923, 972, 980
   StaticCanvas.ts96.78%93.09%100%98.53%1030, 1040, 1092–1093, 1096, 1131–1132, 1208, 1217, 1217, 1221, 1221, 1268–1269, 185–186, 202, 570, 582–583, 913–914, 914, 914–915
   StaticCanvasOptions.ts100%100%100%100%
   TextEditingManager.ts84.31%71.43%91.67%88%17–18, 18, 18–19, 19, 19
src/canvas/DOMManagers
   CanvasDOMManager.ts95.52%70%100%100%21–22, 29
   StaticCanvasDOMManager.ts100%100%100%100%
   util.ts86.67%80.56%83.33%93.94%14, 26, 63–64, 67, 67, 74, 93–94
src/color
   Color.ts94.96%91.67%96.30%96.05%233, 258–259, 267–268, 48
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts85.71%76.92%100%89.74%55–56, 56, 58, 58, 58–59, 61–62, 89
src/controls
   Control.ts93.33%87.88%91.67%97.78%175, 240, 327, 327, 362
   changeWidth.ts100%100%100%100%
   commonControls.ts100%100%100%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   drag.ts100%100%100%100%
   fireEvent.ts88.89%75%100%100%13
   polyControl.ts6.06%0%0%11.43%103, 117, 117, 117, 117, 117, 119–122, 122, 125, 132, 17, 25–29, 29, 29, 29, 29, 29, 29, 29, 50–56, 56, 56, 56, 56, 58, 63–64, 66, 76, 82–84, 84, 86, 89–90, 90, 90, 90, 90, 92, 97
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59, 59, 59, 59, 59–61, 61, 61–63, 65, 65, 65–67, 67, 67–68, 73, 73, 73–74, 76, 78, 80–81
   scale.ts93.57%92.94%100%93.67%129–130, 132–134, 148–149, 181–183, 42
   scaleSkew.ts78.79%64.29%100%85.71%27, 29, 29, 29, 31, 33, 35
   skew.ts91.03%79.31%100%97.67%131–132, 163–164, 171, 177, 179
   util.ts100%100%100%100%
   wrapWithFireEvent.ts100%100%100%100%
   wrapWithFixedAnchor.ts100%100%100%100%
src/env
   browser.ts

@asturur
Copy link
Member Author

asturur commented Sep 1, 2023

I'll wait resolution of #9192 in order to write a test for this

@asturur
Copy link
Member Author

asturur commented Sep 9, 2023

needs a different test to show what is fixing.
Is probably better to first commit the test and make snapshot with current master and the have this PR fix the snapshots

@asturur asturur requested a review from ShaMan123 September 12, 2023 07:33
@asturur asturur merged commit 2b9f071 into master Sep 14, 2023
23 checks passed
Copy link
Contributor

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hard to review this thing.
there is still confusion around usage of wrapped/unwrapped as we discussed.
good luck

@@ -6,7 +6,9 @@ import { TextUtil } from '../../../utils/TextUtil';

setup();

[false, true].forEach((splitByGrapheme) => {
test.describe.configure({ mode: 'serial' });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is this, looks cool

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is to avoid that we run 2 fabricJS tests in the same browser window and we mix up the copy paste status that is stored globally.
Or at least it solved that for me since code that was behaving normally when using my hands wasn't behaving the same when using the tests in parallel.
Should affect ONLY this file here.

@asturur
Copy link
Member Author

asturur commented Sep 15, 2023

hard to review this thing. there is still confusion around usage of wrapped/unwrapped as we discussed. good luck

I can add more explanations.

Every new line added with \n adds a char, but doesn't take a space in the style.
This is represented with the function: missingNewlineOffset

If the text is wrapping inside the textbox, the \n is not in the line and so we do not have this newLineOffset to subtract, the function returns 0 while all the other time returns 1.

Now get2dCursorLocation is used both on wrapped and unwrapped lines and that is done with the skipWrapping boolean.
If skipWrapping is ON, we shouldn't search for wrapped lines in that missingNewlineOffset and we short cut to return the standard value of 1.

Now yes there is still confusion about that and text could be way better, but is not going to be refactored live there is too much risks of bugs and breakage and text is one of the most important features for apps.

The text code is confusing, but this change is made in a way that is not confusing to review because is focused on the exact problem that is causing styling disruption.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants