From 3b4b05d2f7adc88e299fbffd211f611682f4f2a1 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 7 May 2024 15:40:28 -0700 Subject: [PATCH] refactor(core): Remove hybrid mode flag and move scheduler provider location (#55722) The flag is not used anymore and, as a result, is easier to move the scheduler provider. PR Close #55722 --- .../core/src/application/create_application.ts | 12 ++++++++++-- .../src/change_detection/scheduling/flags.ts | 10 ---------- .../scheduling/ng_zone_scheduling.ts | 13 +++---------- packages/core/src/core_private_export.ts | 1 + packages/core/src/platform/platform_ref.ts | 18 ++++++++++++------ .../animations/bundle.golden_symbols.json | 3 +++ .../cyclic_import/bundle.golden_symbols.json | 3 +++ .../bundling/defer/bundle.golden_symbols.json | 3 --- .../forms_reactive/bundle.golden_symbols.json | 3 +++ .../bundle.golden_symbols.json | 3 +++ .../hello_world/bundle.golden_symbols.json | 3 +++ .../bundling/todo/bundle.golden_symbols.json | 3 +++ packages/core/testing/src/test_bed_compiler.ts | 8 +++++++- .../platform-browser/testing/src/browser.ts | 3 +++ 14 files changed, 54 insertions(+), 32 deletions(-) delete mode 100644 packages/core/src/change_detection/scheduling/flags.ts diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 5a2ba6e0db0ba..c68bee53a9bdd 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -29,7 +29,11 @@ import {NgZone} from '../zone/ng_zone'; import {ApplicationInitStatus} from './application_init'; import {_callAndReportToErrorHandler, ApplicationRef} from './application_ref'; -import {PROVIDED_ZONELESS} from '../change_detection/scheduling/zoneless_scheduling'; +import { + PROVIDED_ZONELESS, + ChangeDetectionScheduler, +} from '../change_detection/scheduling/zoneless_scheduling'; +import {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl'; /** * Internal create application API that implements the core application creation logic and optional @@ -59,7 +63,11 @@ export function internalCreateApplication(config: { // Create root application injector based on a set of providers configured at the platform // bootstrap level as well as providers passed to the bootstrap call by a user. - const allAppProviders = [internalProvideZoneChangeDetection({}), ...(appProviders || [])]; + const allAppProviders = [ + internalProvideZoneChangeDetection({}), + {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl}, + ...(appProviders || []), + ]; const adapter = new EnvironmentNgModuleRefAdapter({ providers: allAppProviders, parent: platformInjector as EnvironmentInjector, diff --git a/packages/core/src/change_detection/scheduling/flags.ts b/packages/core/src/change_detection/scheduling/flags.ts deleted file mode 100644 index 2bbd6727c441c..0000000000000 --- a/packages/core/src/change_detection/scheduling/flags.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -/** Flag to enable/disable the zoneless scheduler as default provider with zone scheduling. */ -export const alwaysProvideZonelessScheduler = true; diff --git a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts index 3f91da59db885..dd11fba50f7ae 100644 --- a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts @@ -25,18 +25,16 @@ import {performanceMarkFeature} from '../../util/performance'; import {NgZone} from '../../zone'; import {InternalNgZoneOptions} from '../../zone/ng_zone'; -import {alwaysProvideZonelessScheduler} from './flags'; import { ChangeDetectionScheduler, - ZONELESS_ENABLED, ZONELESS_SCHEDULER_DISABLED, + ZONELESS_ENABLED, } from './zoneless_scheduling'; -import {ChangeDetectionSchedulerImpl} from './zoneless_scheduling_impl'; @Injectable({providedIn: 'root'}) export class NgZoneChangeDetectionScheduler { private readonly zone = inject(NgZone); - private readonly changeDetectionScheduler = inject(ChangeDetectionScheduler, {optional: true}); + private readonly changeDetectionScheduler = inject(ChangeDetectionScheduler); private readonly applicationRef = inject(ApplicationRef); private _onMicrotaskEmptySubscription?: Subscription; @@ -51,7 +49,7 @@ export class NgZoneChangeDetectionScheduler { // `onMicroTaskEmpty` can happen _during_ the zoneless scheduler change detection because // zone.run(() => {}) will result in `checkStable` at the end of the `zone.run` closure // and emit `onMicrotaskEmpty` synchronously if run coalsecing is false. - if (this.changeDetectionScheduler?.runningTick) { + if (this.changeDetectionScheduler.runningTick) { return; } this.zone.run(() => { @@ -119,11 +117,6 @@ export function internalProvideZoneChangeDetection({ // Always disable scheduler whenever explicitly disabled, even if another place called // `provideZoneChangeDetection` without the 'ignore' option. ignoreChangesOutsideZone === true ? {provide: ZONELESS_SCHEDULER_DISABLED, useValue: true} : [], - // TODO(atscott): This should move to the same places that zone change detection is provided by - // default instead of being in the zone scheduling providers. - alwaysProvideZonelessScheduler || ignoreChangesOutsideZone === false - ? {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl} - : [], ]; } diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index 411c94a8d9579..532096dd50ed9 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -22,6 +22,7 @@ export { defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, } from './change_detection/change_detection'; export {internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection} from './change_detection/scheduling/ng_zone_scheduling'; +export {ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl} from './change_detection/scheduling/zoneless_scheduling_impl'; export { ChangeDetectionScheduler as ɵChangeDetectionScheduler, NotificationSource as ɵNotificationSource, diff --git a/packages/core/src/platform/platform_ref.ts b/packages/core/src/platform/platform_ref.ts index 9967ea6e8815c..b04093907091d 100644 --- a/packages/core/src/platform/platform_ref.ts +++ b/packages/core/src/platform/platform_ref.ts @@ -20,7 +20,11 @@ import { internalProvideZoneChangeDetection, PROVIDED_NG_ZONE, } from '../change_detection/scheduling/ng_zone_scheduling'; -import {ZONELESS_ENABLED} from '../change_detection/scheduling/zoneless_scheduling'; +import { + ChangeDetectionScheduler, + ZONELESS_ENABLED, +} from '../change_detection/scheduling/zoneless_scheduling'; +import {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl'; import {Injectable, InjectionToken, Injector} from '../di'; import {ErrorHandler} from '../error_handler'; import {RuntimeError, RuntimeErrorCode} from '../errors'; @@ -89,11 +93,13 @@ export class PlatformRef { // created outside of the Angular zone. return ngZone.run(() => { const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone; - const moduleRef = createNgModuleRefWithProviders( - moduleFactory.moduleType, - this.injector, - internalProvideZoneChangeDetection({ngZoneFactory: () => ngZone, ignoreChangesOutsideZone}), - ); + const moduleRef = createNgModuleRefWithProviders(moduleFactory.moduleType, this.injector, [ + ...internalProvideZoneChangeDetection({ + ngZoneFactory: () => ngZone, + ignoreChangesOutsideZone, + }), + {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl}, + ]); if (typeof ngDevMode === 'undefined' || ngDevMode) { if (moduleRef.injector.get(PROVIDED_NG_ZONE)) { diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index ad40f0a2586c9..f1d1e965b7a37 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -1151,6 +1151,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "interpolateParams" }, diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 28f49f043c0a1..618b478242a0d 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -914,6 +914,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "invokeDirectivesHostBindings" }, diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 19b5995d1d860..bd683f578ceb7 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -1430,9 +1430,6 @@ { "name": "init_fields" }, - { - "name": "init_flags" - }, { "name": "init_forward_ref" }, diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 33b5a398311ee..ad6cca802b054 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -1298,6 +1298,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "invokeDirectivesHostBindings" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index c1c459b04cf32..b41780c9119bf 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -1262,6 +1262,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "invokeDirectivesHostBindings" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 5236c7890993d..158a4098102c7 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -734,6 +734,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "invokeHostBindingsInCreationMode" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 5503d9ce96695..5a2b415a179fe 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -1100,6 +1100,9 @@ { "name": "internalImportProvidersFrom" }, + { + "name": "internalProvideZoneChangeDetection" + }, { "name": "invokeDirectivesHostBindings" }, diff --git a/packages/core/testing/src/test_bed_compiler.ts b/packages/core/testing/src/test_bed_compiler.ts index 8dae25466c7f1..0c799b8474730 100644 --- a/packages/core/testing/src/test_bed_compiler.ts +++ b/packages/core/testing/src/test_bed_compiler.ts @@ -9,6 +9,8 @@ import {ResourceLoader} from '@angular/compiler'; import { ApplicationInitStatus, + ɵChangeDetectionScheduler as ChangeDetectionScheduler, + ɵChangeDetectionSchedulerImpl as ChangeDetectionSchedulerImpl, Compiler, COMPILER_OPTIONS, Component, @@ -926,7 +928,11 @@ export class TestBedCompiler { private compileTestModule(): void { class RootScopeModule {} compileNgModuleDefs(RootScopeModule as NgModuleType, { - providers: [...this.rootProviderOverrides, internalProvideZoneChangeDetection({})], + providers: [ + ...this.rootProviderOverrides, + internalProvideZoneChangeDetection({}), + {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl}, + ], }); const providers = [ diff --git a/packages/platform-browser/testing/src/browser.ts b/packages/platform-browser/testing/src/browser.ts index e5a760b6a150a..cd74f0d80dc80 100644 --- a/packages/platform-browser/testing/src/browser.ts +++ b/packages/platform-browser/testing/src/browser.ts @@ -15,6 +15,8 @@ import { platformCore, StaticProvider, ɵinternalProvideZoneChangeDetection as internalProvideZoneChangeDetection, + ɵChangeDetectionScheduler as ChangeDetectionScheduler, + ɵChangeDetectionSchedulerImpl as ChangeDetectionSchedulerImpl, } from '@angular/core'; import {BrowserModule, ɵBrowserDomAdapter as BrowserDomAdapter} from '@angular/platform-browser'; @@ -47,6 +49,7 @@ export const platformBrowserTesting = createPlatformFactory( providers: [ {provide: APP_ID, useValue: 'a'}, internalProvideZoneChangeDetection({}), + {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl}, {provide: PlatformLocation, useClass: MockPlatformLocation}, ], })