Go to file
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
.circleci ci: enable remote build caching for CI jobs (#31204) 2019-06-25 10:26:43 -07:00
.codefresh ci: remove msys workaround (#30510) 2019-05-30 13:33:34 -04:00
.devcontainer build: add recommended config files for VSCode remote development (#30450) 2019-05-20 10:13:53 -07:00
.github ci: add owners for zone.js to CODEOWNERS (#31203) 2019-06-25 11:20:01 -07:00
.vscode build: add recommended config files for VSCode remote development (#30450) 2019-05-20 10:13:53 -07:00
aio docs: correct indention for code example in deployment guide (#31255) 2019-06-25 14:44:34 -07:00
docs docs(ivy): improve debug documentation (#30562) 2019-05-30 13:39:44 -04:00
integration fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
modules Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
packages fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
scripts ci: re-enable payload size tracking (#31138) 2019-06-19 15:55:10 -07:00
third_party feat(bazel): use rbe_autoconfig() and new container. (#29336) 2019-05-09 14:58:34 -07:00
tools test(ivy): ngcc - remove use of mock-fs in tests (#30591) 2019-06-26 08:00:02 -07:00
.bazelignore Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
.bazelrc 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
.clang-format feat(tooling): Add a .clang-format for automated JavaScript formatting. 2015-04-02 08:44:34 -07:00
.editorconfig build: use https link to editorconfig.org in .editorconfig (#27664) 2018-12-18 09:30:09 -08:00
.gitattributes test: fix ts api guardian and public guard tests on windows (#30105) 2019-04-26 16:32:22 -07:00
.gitignore build: add recommended config files for VSCode remote development (#30450) 2019-05-20 10:13:53 -07:00
.mailmap build: add a Git .mailmap with my new name (#19550) 2017-10-09 14:35:30 -07:00
.nvmrc build: update .nvmrc file to correct node version (#25992) 2018-09-18 13:11:58 -07:00
BUILD.bazel Revert "build: update to rules_nodejs 0.32.2 (#31019)" (#31267) 2019-06-25 14:36:00 -07:00
CHANGELOG.md release: cut the v8.1.0-next.3 release 2019-06-19 10:57:13 -07:00
CODE_OF_CONDUCT.md docs: fix community tab in GitHub by copying CoC 2018-02-27 19:02:30 -08:00
CONTRIBUTING.md build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00
LICENSE build: bump year (#27880) 2019-01-11 11:15:59 -08:00
README.md docs: fix `quickstart` link in readme (#30807) 2019-06-03 11:43:58 -07:00
WORKSPACE 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
browser-providers.conf.js ci: lock chrome and firefox versions for saucelabs (#29529) 2019-03-27 12:38:13 -07:00
browser_repositories.bzl build(bazel): update to latest stable chromium 74 on osx and linux for karma under bazel (#30502) 2019-05-16 14:38:14 -07:00
gulpfile.js refactor: remove extra line break in gulpfile (#29489) 2019-03-25 09:22:37 -07:00
karma-js.conf.js 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
package.json test(ivy): ngcc - remove use of mock-fs in tests (#30591) 2019-06-26 08:00:02 -07:00
protractor-perf.conf.js fixup! test(ivy): make the test run with benchpress (#30449) 2019-05-16 20:04:04 -07:00
renovate.json ci: update packageFiles to be renovated (#29071) 2019-03-05 09:43:23 -08:00
shims_for_IE.js Revert "refactor: add license header to JS files & format files (#12035)" 2016-10-04 14:06:41 -07:00
test-events.js fix(platform-browser): run BLACK_LISTED_EVENTS outside of ngZone (#18993) 2017-09-05 15:33:22 -05:00
test-main.js feat(upgrade): provide unit test helpers for wiring up injectors (#16848) 2019-06-20 17:04:01 -07:00
tslint.json refactor: remove toplevel property accesses (#29329) 2019-05-16 12:08:49 -07:00
yarn.lock test(ivy): ngcc - remove use of mock-fs in tests (#30591) 2019-06-26 08:00:02 -07:00
yarn.lock.readme.md build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00

README.md

CircleCI BrowserStack Status Join the chat at https://gitter.im/angular/angular npm version

Angular

Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScript and other languages.

Quickstart

Get started in 5 minutes.

Changelog

Learn about the latest improvements.

Want to help?

Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for contributing and then check out one of our issues in the hotlist: community-help.