From 2dd6280ab84ffa14ff9024689fa6a54c14d8d68a Mon Sep 17 00:00:00 2001 From: Dzmitry Shylovich Date: Thu, 5 Jan 2017 20:24:37 +0300 Subject: [PATCH] fix(common): do not override locale provided on bootstrap (#13654) Closes #13607 --- .../@angular/core/src/application_module.ts | 11 +++++++++- .../core/test/application_module_spec.ts | 2 +- .../test/browser/bootstrap_spec.ts | 20 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/modules/@angular/core/src/application_module.ts b/modules/@angular/core/src/application_module.ts index 39eb8ee63b..a52b568979 100644 --- a/modules/@angular/core/src/application_module.ts +++ b/modules/@angular/core/src/application_module.ts @@ -11,6 +11,7 @@ import {ApplicationInitStatus} from './application_init'; import {ApplicationRef, ApplicationRef_} from './application_ref'; import {APP_ID_RANDOM_PROVIDER} from './application_tokens'; import {IterableDiffers, KeyValueDiffers, defaultIterableDiffers, defaultKeyValueDiffers} from './change_detection/change_detection'; +import {Inject, Optional, SkipSelf} from './di/metadata'; import {LOCALE_ID} from './i18n/tokens'; import {Compiler} from './linker/compiler'; import {ViewUtils} from './linker/view_utils'; @@ -24,6 +25,10 @@ export function _keyValueDiffersFactory() { return defaultKeyValueDiffers; } +export function _localeFactory(locale?: string): string { + return locale || 'en-US'; +} + /** * This module includes the providers of @angular/core that are needed * to bootstrap components via `ApplicationRef`. @@ -41,7 +46,11 @@ export function _keyValueDiffersFactory() { AnimationQueue, {provide: IterableDiffers, useFactory: _iterableDiffersFactory}, {provide: KeyValueDiffers, useFactory: _keyValueDiffersFactory}, - {provide: LOCALE_ID, useValue: 'en-US'}, + { + provide: LOCALE_ID, + useFactory: _localeFactory, + deps: [[new Inject(LOCALE_ID), new Optional(), new SkipSelf()]] + }, ] }) export class ApplicationModule { diff --git a/modules/@angular/core/test/application_module_spec.ts b/modules/@angular/core/test/application_module_spec.ts index 4c78ce8ce3..e60f3af880 100644 --- a/modules/@angular/core/test/application_module_spec.ts +++ b/modules/@angular/core/test/application_module_spec.ts @@ -14,4 +14,4 @@ export function main() { it('should set the default locale to "en-US"', inject([LOCALE_ID], (defaultLocale: string) => { expect(defaultLocale).toEqual('en-US'); })); }); -} \ No newline at end of file +} diff --git a/modules/@angular/platform-browser/test/browser/bootstrap_spec.ts b/modules/@angular/platform-browser/test/browser/bootstrap_spec.ts index b86f92e9db..e0e883da7b 100644 --- a/modules/@angular/platform-browser/test/browser/bootstrap_spec.ts +++ b/modules/@angular/platform-browser/test/browser/bootstrap_spec.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ -import {APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, Compiler, Component, Directive, ErrorHandler, Inject, Input, NgModule, OnDestroy, PLATFORM_INITIALIZER, Pipe, Provider, VERSION, createPlatformFactory} from '@angular/core'; +import {APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, Compiler, Component, Directive, ErrorHandler, Inject, Input, LOCALE_ID, NgModule, OnDestroy, PLATFORM_INITIALIZER, Pipe, Provider, VERSION, createPlatformFactory} from '@angular/core'; import {ApplicationRef, destroyPlatform} from '@angular/core/src/application_ref'; import {Console} from '@angular/core/src/console'; import {ComponentRef} from '@angular/core/src/linker/component_factory'; import {Testability, TestabilityRegistry} from '@angular/core/src/testability/testability'; -import {AsyncTestCompleter, Log, afterEach, beforeEach, beforeEachProviders, describe, iit, inject, it} from '@angular/core/testing/testing_internal'; +import {AsyncTestCompleter, Log, afterEach, beforeEach, beforeEachProviders, describe, inject, it} from '@angular/core/testing/testing_internal'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; @@ -109,7 +109,8 @@ class DummyConsole implements Console { class TestModule {} -function bootstrap(cmpType: any, providers: Provider[] = []): Promise { +function bootstrap( + cmpType: any, providers: Provider[] = [], platformProviders: Provider[] = []): Promise { @NgModule({ imports: [BrowserModule], declarations: [cmpType], @@ -119,7 +120,7 @@ function bootstrap(cmpType: any, providers: Provider[] = []): Promise { }) class TestModule { } - return platformBrowserDynamic().bootstrapModule(TestModule); + return platformBrowserDynamic(platformProviders).bootstrapModule(TestModule); } export function main() { @@ -281,6 +282,17 @@ export function main() { }); })); + it('should not override locale provided during bootstrap', + inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { + const refPromise = + bootstrap(HelloRootCmp, [testProviders], [{provide: LOCALE_ID, useValue: 'fr-FR'}]); + + refPromise.then(ref => { + expect(ref.injector.get(LOCALE_ID)).toEqual('fr-FR'); + async.done(); + }); + })); + it('should avoid cyclic dependencies when root component requires Lifecycle through DI', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { const refPromise = bootstrap(HelloRootCmp4, testProviders);