angular-cn/packages
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
..
animations build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
bazel Revert "build(bazel): update to bazel 0.27.0 and fix compat in @angular/bazel package (#31019)" (#31267) 2019-06-25 14:36:01 -07:00
benchpress build: remove unreferenced tsconfig-build.json files (#30858) 2019-06-05 09:03:36 -07:00
common docs: remove inappropriate link (#31091) 2019-06-19 15:31:56 -07:00
compiler perf(ivy): chain multiple `i18nExp` calls (#31258) 2019-06-25 11:26:29 -07:00
compiler-cli fix(ivy): ngcc - do not analyze files outside the current package (#30591) 2019-06-26 08:00:03 -07:00
core fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
docs refactor: move angular source to /packages rather than modules/@angular 2017-03-08 16:29:27 -08:00
elements Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
examples Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
forms build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
http build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
language-service refactor(language-service): Remove NgLSHost -> NgLS dependency (#31122) 2019-06-19 15:19:56 -07:00
platform-browser docs: add platform to glossary (#30731) 2019-06-12 11:46:25 -07:00
platform-browser-dynamic build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
platform-server docs: add platform to glossary (#30731) 2019-06-12 11:46:25 -07:00
platform-webworker build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
platform-webworker-dynamic build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
private/testing test(ivy): add onlyInIvy perf counter expectations (#30339) 2019-05-09 11:22:00 -07:00
router build: convert entry_point to label (#30627) 2019-06-11 00:03:11 +00:00
service-worker Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
upgrade feat(upgrade): provide unit test helpers for wiring up injectors (#16848) 2019-06-20 17:04:01 -07:00
zone.js Revert "build: fix build failures with worker mode cache and @types/events (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
BUILD.bazel build: rules_nodejs 0.26.0 & use @npm instead of @ngdeps now that downstream angular build uses angular bundles (#28871) 2019-02-28 12:06:36 -08:00
README.md Revert "docs: Remove unneeded file (#18106)" 2017-07-20 16:46:47 -05:00
empty.ts refactor: move angular source to /packages rather than modules/@angular 2017-03-08 16:29:27 -08:00
goog.d.ts test(ivy): add bundling test `todo_i18n` (#27420) 2018-12-04 19:59:12 -08:00
license-banner.txt build: bump year (#27880) 2019-01-11 11:15:59 -08:00
system.d.ts refactor: move angular source to /packages rather than modules/@angular 2017-03-08 16:29:27 -08:00
tsconfig-build.json build: update to rules_typescript 0.25.1 (#28625) 2019-02-21 07:46:21 -08:00
tsconfig-test.json Revert "build: disable must-use-promises check in ts_library tsetse for tests as... (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
tsconfig.json build: move zone.js to angular repo (#30962) 2019-06-20 11:27:39 -07:00
types.d.ts build: switch to typescript's es2015 typings (#28570) 2019-02-06 14:17:55 -05:00

README.md

Angular

The sources for this package are in the main Angular repo. Please file issues and pull requests against that repo.

License: MIT