-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Keep dirty manipulations private to Element base class
#109401
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
Conversation
dirty manipulations private to Element base class
caf3b6c to
e5f7399
Compare
|
@Hixie Curious to hear what you think about this or whether you have another suggestion for addressing this. |
e5f7399 to
7746c21
Compare
|
Global presubmit in google (with that one fix mentioned in the PR description) came back green, g3fix for that fix is posted in cl/467248749. |
Hixie
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
I think this broke the build by causing an integration test to time out. The test that hangs is here: flutter/packages/flutter_tools/test/integration.shard/break_on_framework_exceptions_test.dart Line 674 in dce82f7
I'm assuming that this is causing the hang because of some change in the rebuild code that the integration test is testing. I'm going to revert this to green the build. (I'm gardener this week) |
…lutter#109401)" This reverts commit a624cb7 because it appears to have broken the build.
…lutter#109401)" This reverts commit 7887ca5.
* 7d1323c Updating expiring cirrus key. (flutter/flutter#109461) * a85902a Roll Flutter Engine from de118a55ade0 to c354e0e04cea (2 revisions) (flutter/flutter#109462) * 28de3d4 Roll Flutter Engine from c354e0e04cea to d1b18b5d6811 (1 revision) (flutter/flutter#109466) * a624cb7 Keep `dirty` manipulations private to `Element` base class (flutter/flutter#109401) * dce82f7 Remove deprecated Ruby File.exists? in helper script (flutter/flutter#109428) * 7887ca5 Revert "Keep `dirty` manipulations private to `Element` base class (#109401)" (flutter/flutter#109481) * 237a298 Roll Flutter Engine from d1b18b5d6811 to a2f3bd58ce73 (1 revision) (flutter/flutter#109472) * fe2fc8d Single tap on the previous selection should toggle the toolbar on iOS… (flutter/flutter#108913) * 696c6fb Roll Flutter Engine from a2f3bd58ce73 to fb19700742c3 (6 revisions) (flutter/flutter#109482) * 17bc0ce Roll Flutter Engine from fb19700742c3 to 2180e62f6c7e (1 revision) (flutter/flutter#109483) * 4265015 Roll Flutter Engine from 2180e62f6c7e to cd1a1cb757f5 (1 revision) (flutter/flutter#109488) * c142dd3 Roll Flutter Engine from cd1a1cb757f5 to 5cc5c5f04f0a (1 revision) (flutter/flutter#109490) * 8a55c36 Roll Flutter Engine from 5cc5c5f04f0a to 18dca3de7496 (2 revisions) (flutter/flutter#109493) * d50c5b1 Roll Flutter Engine from 18dca3de7496 to 83771593cb55 (1 revision) (flutter/flutter#109505) * 97901da Cleaner test.dart output. (flutter/flutter#109206) * fb3c8ea Roll Flutter Engine from 83771593cb55 to f49a617535af (1 revision) (flutter/flutter#109509) * 5fcd9c2 Update README.md (flutter/flutter#109506) * 4dd7065 Add onOpened callback to PopupMenuButton (flutter/flutter#103753) * ed3238e Roll Flutter Engine from f49a617535af to cc9f4c63b7e5 (1 revision) (flutter/flutter#109518) * 8b1ca3f Roll Flutter Engine from cc9f4c63b7e5 to 4656c2f46cad (1 revision) (flutter/flutter#109524) * 20ffb32 Roll Flutter Engine from 4656c2f46cad to 16fb19e72f88 (1 revision) (flutter/flutter#109526) * 087750f Roll Flutter Engine from 16fb19e72f88 to 9c3c233e2639 (1 revision) (flutter/flutter#109532) * 4aba124 Roll Flutter Engine from 9c3c233e2639 to f0c3829e90ce (1 revision) (flutter/flutter#109536) * 2bce108 Roll Plugins from 9fb7654 to 094f1c3 (7 revisions) (flutter/flutter#109543) * 97d9a2f Roll Flutter Engine from f0c3829e90ce to 8c019cdd446f (2 revisions) (flutter/flutter#109548) * 458d618 Roll Flutter Engine from 8c019cdd446f to 198b0051a5a2 (1 revision) (flutter/flutter#109552) * c873c21 Roll Flutter Engine from 198b0051a5a2 to 33fccf564973 (1 revision) (flutter/flutter#109557)
* 7d1323c Updating expiring cirrus key. (flutter/flutter#109461) * a85902a Roll Flutter Engine from de118a55ade0 to c354e0e04cea (2 revisions) (flutter/flutter#109462) * 28de3d4 Roll Flutter Engine from c354e0e04cea to d1b18b5d6811 (1 revision) (flutter/flutter#109466) * a624cb7 Keep `dirty` manipulations private to `Element` base class (flutter/flutter#109401) * dce82f7 Remove deprecated Ruby File.exists? in helper script (flutter/flutter#109428) * 7887ca5 Revert "Keep `dirty` manipulations private to `Element` base class (#109401)" (flutter/flutter#109481) * 237a298 Roll Flutter Engine from d1b18b5d6811 to a2f3bd58ce73 (1 revision) (flutter/flutter#109472) * fe2fc8d Single tap on the previous selection should toggle the toolbar on iOS… (flutter/flutter#108913) * 696c6fb Roll Flutter Engine from a2f3bd58ce73 to fb19700742c3 (6 revisions) (flutter/flutter#109482) * 17bc0ce Roll Flutter Engine from fb19700742c3 to 2180e62f6c7e (1 revision) (flutter/flutter#109483) * 4265015 Roll Flutter Engine from 2180e62f6c7e to cd1a1cb757f5 (1 revision) (flutter/flutter#109488) * c142dd3 Roll Flutter Engine from cd1a1cb757f5 to 5cc5c5f04f0a (1 revision) (flutter/flutter#109490) * 8a55c36 Roll Flutter Engine from 5cc5c5f04f0a to 18dca3de7496 (2 revisions) (flutter/flutter#109493) * d50c5b1 Roll Flutter Engine from 18dca3de7496 to 83771593cb55 (1 revision) (flutter/flutter#109505) * 97901da Cleaner test.dart output. (flutter/flutter#109206) * fb3c8ea Roll Flutter Engine from 83771593cb55 to f49a617535af (1 revision) (flutter/flutter#109509) * 5fcd9c2 Update README.md (flutter/flutter#109506) * 4dd7065 Add onOpened callback to PopupMenuButton (flutter/flutter#103753) * ed3238e Roll Flutter Engine from f49a617535af to cc9f4c63b7e5 (1 revision) (flutter/flutter#109518) * 8b1ca3f Roll Flutter Engine from cc9f4c63b7e5 to 4656c2f46cad (1 revision) (flutter/flutter#109524) * 20ffb32 Roll Flutter Engine from 4656c2f46cad to 16fb19e72f88 (1 revision) (flutter/flutter#109526) * 087750f Roll Flutter Engine from 16fb19e72f88 to 9c3c233e2639 (1 revision) (flutter/flutter#109532) * 4aba124 Roll Flutter Engine from 9c3c233e2639 to f0c3829e90ce (1 revision) (flutter/flutter#109536) * 2bce108 Roll Plugins from 9fb7654 to 094f1c3 (7 revisions) (flutter/flutter#109543) * 97d9a2f Roll Flutter Engine from f0c3829e90ce to 8c019cdd446f (2 revisions) (flutter/flutter#109548) * 458d618 Roll Flutter Engine from 8c019cdd446f to 198b0051a5a2 (1 revision) (flutter/flutter#109552) * c873c21 Roll Flutter Engine from 198b0051a5a2 to 33fccf564973 (1 revision) (flutter/flutter#109557)
* 7d1323c Updating expiring cirrus key. (flutter/flutter#109461) * a85902a Roll Flutter Engine from de118a55ade0 to c354e0e04cea (2 revisions) (flutter/flutter#109462) * 28de3d4 Roll Flutter Engine from c354e0e04cea to d1b18b5d6811 (1 revision) (flutter/flutter#109466) * a624cb7 Keep `dirty` manipulations private to `Element` base class (flutter/flutter#109401) * dce82f7 Remove deprecated Ruby File.exists? in helper script (flutter/flutter#109428) * 7887ca5 Revert "Keep `dirty` manipulations private to `Element` base class (#109401)" (flutter/flutter#109481) * 237a298 Roll Flutter Engine from d1b18b5d6811 to a2f3bd58ce73 (1 revision) (flutter/flutter#109472) * fe2fc8d Single tap on the previous selection should toggle the toolbar on iOS… (flutter/flutter#108913) * 696c6fb Roll Flutter Engine from a2f3bd58ce73 to fb19700742c3 (6 revisions) (flutter/flutter#109482) * 17bc0ce Roll Flutter Engine from fb19700742c3 to 2180e62f6c7e (1 revision) (flutter/flutter#109483) * 4265015 Roll Flutter Engine from 2180e62f6c7e to cd1a1cb757f5 (1 revision) (flutter/flutter#109488) * c142dd3 Roll Flutter Engine from cd1a1cb757f5 to 5cc5c5f04f0a (1 revision) (flutter/flutter#109490) * 8a55c36 Roll Flutter Engine from 5cc5c5f04f0a to 18dca3de7496 (2 revisions) (flutter/flutter#109493) * d50c5b1 Roll Flutter Engine from 18dca3de7496 to 83771593cb55 (1 revision) (flutter/flutter#109505) * 97901da Cleaner test.dart output. (flutter/flutter#109206) * fb3c8ea Roll Flutter Engine from 83771593cb55 to f49a617535af (1 revision) (flutter/flutter#109509) * 5fcd9c2 Update README.md (flutter/flutter#109506) * 4dd7065 Add onOpened callback to PopupMenuButton (flutter/flutter#103753) * ed3238e Roll Flutter Engine from f49a617535af to cc9f4c63b7e5 (1 revision) (flutter/flutter#109518) * 8b1ca3f Roll Flutter Engine from cc9f4c63b7e5 to 4656c2f46cad (1 revision) (flutter/flutter#109524) * 20ffb32 Roll Flutter Engine from 4656c2f46cad to 16fb19e72f88 (1 revision) (flutter/flutter#109526) * 087750f Roll Flutter Engine from 16fb19e72f88 to 9c3c233e2639 (1 revision) (flutter/flutter#109532) * 4aba124 Roll Flutter Engine from 9c3c233e2639 to f0c3829e90ce (1 revision) (flutter/flutter#109536) * 2bce108 Roll Plugins from 9fb7654 to 094f1c3 (7 revisions) (flutter/flutter#109543) * 97d9a2f Roll Flutter Engine from f0c3829e90ce to 8c019cdd446f (2 revisions) (flutter/flutter#109548) * 458d618 Roll Flutter Engine from 8c019cdd446f to 198b0051a5a2 (1 revision) (flutter/flutter#109552) * c873c21 Roll Flutter Engine from 198b0051a5a2 to 33fccf564973 (1 revision) (flutter/flutter#109557)
* 7d1323c Updating expiring cirrus key. (flutter/flutter#109461) * a85902a Roll Flutter Engine from de118a55ade0 to c354e0e04cea (2 revisions) (flutter/flutter#109462) * 28de3d4 Roll Flutter Engine from c354e0e04cea to d1b18b5d6811 (1 revision) (flutter/flutter#109466) * a624cb7 Keep `dirty` manipulations private to `Element` base class (flutter/flutter#109401) * dce82f7 Remove deprecated Ruby File.exists? in helper script (flutter/flutter#109428) * 7887ca5 Revert "Keep `dirty` manipulations private to `Element` base class (#109401)" (flutter/flutter#109481) * 237a298 Roll Flutter Engine from d1b18b5d6811 to a2f3bd58ce73 (1 revision) (flutter/flutter#109472) * fe2fc8d Single tap on the previous selection should toggle the toolbar on iOS… (flutter/flutter#108913) * 696c6fb Roll Flutter Engine from a2f3bd58ce73 to fb19700742c3 (6 revisions) (flutter/flutter#109482) * 17bc0ce Roll Flutter Engine from fb19700742c3 to 2180e62f6c7e (1 revision) (flutter/flutter#109483) * 4265015 Roll Flutter Engine from 2180e62f6c7e to cd1a1cb757f5 (1 revision) (flutter/flutter#109488) * c142dd3 Roll Flutter Engine from cd1a1cb757f5 to 5cc5c5f04f0a (1 revision) (flutter/flutter#109490) * 8a55c36 Roll Flutter Engine from 5cc5c5f04f0a to 18dca3de7496 (2 revisions) (flutter/flutter#109493) * d50c5b1 Roll Flutter Engine from 18dca3de7496 to 83771593cb55 (1 revision) (flutter/flutter#109505) * 97901da Cleaner test.dart output. (flutter/flutter#109206) * fb3c8ea Roll Flutter Engine from 83771593cb55 to f49a617535af (1 revision) (flutter/flutter#109509) * 5fcd9c2 Update README.md (flutter/flutter#109506) * 4dd7065 Add onOpened callback to PopupMenuButton (flutter/flutter#103753) * ed3238e Roll Flutter Engine from f49a617535af to cc9f4c63b7e5 (1 revision) (flutter/flutter#109518) * 8b1ca3f Roll Flutter Engine from cc9f4c63b7e5 to 4656c2f46cad (1 revision) (flutter/flutter#109524) * 20ffb32 Roll Flutter Engine from 4656c2f46cad to 16fb19e72f88 (1 revision) (flutter/flutter#109526) * 087750f Roll Flutter Engine from 16fb19e72f88 to 9c3c233e2639 (1 revision) (flutter/flutter#109532) * 4aba124 Roll Flutter Engine from 9c3c233e2639 to f0c3829e90ce (1 revision) (flutter/flutter#109536) * 2bce108 Roll Plugins from 9fb7654 to 094f1c3 (7 revisions) (flutter/flutter#109543) * 97d9a2f Roll Flutter Engine from f0c3829e90ce to 8c019cdd446f (2 revisions) (flutter/flutter#109548) * 458d618 Roll Flutter Engine from 8c019cdd446f to 198b0051a5a2 (1 revision) (flutter/flutter#109552) * c873c21 Roll Flutter Engine from 198b0051a5a2 to 33fccf564973 (1 revision) (flutter/flutter#109557)
I tried to create a custom Element that was a direct subclass of
Elementoutside of the framework and it was impossible to implement this right because I couldn't properly set/unset thedirtyflag when necessary. Element subclasses in the framework directly manipulate the privateElement._dirtyfield, but subclasses outside offramework.dartdon't have this option. This change keeps settingElement._dirtyprivate to theElementclass to give subclasses outside of the framework a fair chance. This is archived by:_dirtyin the default implementation ofElement.performRebuild. Subclasses are now expected to call this super implementation to reset the flag.forceparameter to theElement.rebuildmethod to force rebuilding even if theElementisn't dirty. This is convenient to call from implementations ofupdatein subclasses.I don't expect this to be a breaking change. Elements implemented outside the framework, who are not calling
super.performRebuildalready, are essentially broken because they can't reset thedirtyflag properly. Therefore, I am not expecting any implementations out there that overrideperformRebuildwithout already calling super. Furthermore, the addition of a new parameter torebuildshouldn't break any subclasses since subclasses should be overridingperformRebuildinstead and that signature is unchanged. (However, I did find one class in google3 that overridesrebuilddirectly and that override needs to be updated to include the newly addedforceparameter.)Alternatives considered:
forceas a parameter torebuild, add a newforceRebuildmethod. While this would be non-breaking in google3, it would deepen the call stack if we want to call intoforceRebuildfromrebuildto re-use code.Element.updateset the dirty flag to true so subclasses can call the regularrebuildmethod in theirupdatemethod (since the element is now dirty, rebuild will actually do the rebuilding work). While this would work for all Element subclasses implemented in the framework, this would force every Element to always rebuild inupdateto clear the dirty flag. Conceptually, this seems incorrect as there could in theory be updates that don't require a rebuild because the update is essentially a no-op.Element.performRebuildreset the dirty flag, provide a specific API to mark an Element as clean again (i.e.Element.markAsClean()). I am a little hesitant to give Element more API surface and adding that extra API feels easier to miss-use then havingperformRebuildclear the flag.