angular-cn/packages/core/test
Alex Rickabaugh 32c760f5e7 fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244)
The Angular runtime frequently calls into user code (for example, when
writing to a property binding). Since user code can throw errors, calls to
it are frequently wrapped in a try-finally block. In Ivy, the following
pattern is common:

```typescript
enterView();
try {
  callUserCode();
} finally {
  leaveView();
}
```

This has a significant problem, however: `leaveView` has a side effect: it
calls any pending lifecycle hooks that might've been scheduled during the
current round of change detection. Generally it's a bad idea to run
lifecycle hooks after the application has crashed. The application is in an
inconsistent state - directives may not be instantiated fully, queries may
not be resolved, bindings may not have been applied, etc. Invariants that
the app code relies upon may not hold. Further crashes or broken behavior
are likely.

Frequently, lifecycle hooks are used to make assertions about these
invariants. When these assertions fail, they will throw and "swallow" the
original error, making debugging of the problem much more difficult.

This commit modifies `leaveView` to understand whether the application is
currently crashing, via a parameter `safeToRunHooks`. This parameter is set
by modifying the above pattern:

```typescript
enterView();
let safeToRunHooks = false;
try {
  callUserCode();
  safeToRunHooks = true;
} finally {
  leaveView(..., safeToRunHooks);
}
```

If `callUserCode` crashes, then `safeToRunHooks` will never be set to `true`
and `leaveView` won't call any further user code. The original error will
then propagate back up the stack and be reported correctly. A test is added
to verify this behavior.

PR Close #31244
2019-06-26 08:01:14 -07:00
..
acceptance fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
animation test(core): update core tests (unrelated to queries) to use static flag (#30626) 2019-05-23 10:31:32 -07:00
bundling refactor(ivy): rename applyXYZ to executeActionOnXYZ for clarity (#31182) 2019-06-25 17:03:52 -07:00
change_detection build: extract interface and util sub compilation from core (#28028) 2019-01-10 16:31:44 -08:00
debug fix(ivy): DebugNode.attributes not preserving attribute name casing (#30864) 2019-06-06 13:47:16 -07:00
di fix(ivy): call factory functions with correct type for derived classes (#30855) 2019-06-11 14:27:17 -07:00
dom fix(platform-server): add styles to elements correctly (#22527) 2018-03-14 14:12:31 -07:00
linker feat(ivy): require 'token' for ngInjectableDef (#30855) 2019-06-11 14:27:16 -07:00
metadata test(core): update query-specific tests in core (#30626) 2019-05-23 10:31:32 -07:00
reflection refactor(core): clean up support for ES2015 constructor delegation (#30368) 2019-05-10 09:17:20 -07:00
render3 fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
sanitization refactor(ivy): Move instructions back to ɵɵ (#30546) 2019-05-20 16:37:47 -07:00
strict_types refactor(ivy): Move instructions back to ɵɵ (#30546) 2019-05-20 16:37:47 -07:00
testability build: update zone.js to 0.9.0 (#28219) 2019-03-26 12:50:38 -07:00
util refactor(ivy): remove duplicated flatten util (#29547) 2019-03-27 12:36:23 -07:00
view feat(ivy): require 'token' for ngInjectableDef (#30855) 2019-06-11 14:27:16 -07:00
zone build: extract interface and util sub compilation from core (#28028) 2019-01-10 16:31:44 -08:00
BUILD.bazel build: enable shard_count for some jasmine tests that have many specs (#31009) 2019-06-18 12:11:30 -07:00
application_init_spec.ts fix(ivy): Enable AoT tests to run on CI; disable failing tests (#26975) 2018-11-07 10:35:20 -08:00
application_module_spec.ts build(core): remove `main()` from specs (#21053) 2017-12-22 13:10:51 -08:00
application_ref_integration_spec.ts test(ivy): finish root cause analysis for @angular/core TestBed failing tests (#27510) 2018-12-06 13:41:02 -08:00
application_ref_spec.ts feat(ivy): use i18n locale data to determine the plural form of ICU expressions (#29249) 2019-05-30 15:09:02 -04:00
component_fixture_spec.ts test(ivy): update root causes for @angular/core TestBed failures (#27370) 2018-11-30 13:41:21 -08:00
dev_mode_spec.ts build(core): remove `main()` from specs (#21053) 2017-12-22 13:10:51 -08:00
directive_lifecycle_integration_spec.ts test(ivy): update root causes for @angular/core TestBed failures (#27419) 2018-12-03 08:19:56 -08:00
error_handler_spec.ts refactor(ivy): refactor more files in DI to prepare it for bazel packages (#28098) 2019-01-14 09:55:30 -08:00
event_emitter_spec.ts fix(core): fix proper propagation of subscriptions in EventEmitter (#22016) 2018-02-06 07:56:33 -08:00
fake_async_spec.ts fix(ivy): update token used for fakeAsync test (#28383) 2019-01-29 16:39:14 -08:00
forward_ref_integration_spec.ts build: update to rules_typescript 0.25.1 (#28625) 2019-02-21 07:46:21 -08:00
spies.ts build: fix file paths after moving modules/@angular/* to packages/* 2017-03-08 16:29:28 -08:00
test_bed_async_spec.ts fix(ivy): stub TestBed.compileComponents implementation (#26506) 2018-10-17 13:08:14 -07:00
test_bed_spec.ts feat(ivy): TestBed support for reusing non-exported components (#30578) 2019-05-24 14:01:44 -04:00
testing_internal_spec.ts build: update to rules_typescript 0.25.1 (#28625) 2019-02-21 07:46:21 -08:00
util_spec.ts build: extract interface and util sub compilation from core (#28028) 2019-01-10 16:31:44 -08:00