2020-08-04 04:41:48 +08:00
/ * *
* Copyright 2018 Google Inc . All rights reserved .
* Modifications copyright ( c ) Microsoft Corporation .
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2021-04-03 12:07:45 +08:00
2022-03-26 07:05:50 +08:00
import { browserTest as it , expect } from '../config/browserTest' ;
2020-08-04 04:41:48 +08:00
2022-03-11 02:42:52 +08:00
it ( 'should work @smoke' , async ( { browser , browserName } ) = > {
2020-08-04 04:41:48 +08:00
const func = ( ) = > new Date ( 1479579154987 ) . toString ( ) ;
{
2020-09-14 22:53:25 +08:00
const context = await browser . newContext ( { locale : 'en-US' , timezoneId : 'America/Jamaica' } ) ;
2020-08-04 04:41:48 +08:00
const page = await context . newPage ( ) ;
2021-06-04 07:21:23 +08:00
expect ( await page . evaluate ( func ) ) . toBe ( 'Sat Nov 19 2016 13:12:34 GMT-0500 (Eastern Standard Time)' ) ;
2020-08-04 04:41:48 +08:00
await context . close ( ) ;
}
{
2020-09-14 22:53:25 +08:00
const context = await browser . newContext ( { locale : 'en-US' , timezoneId : 'Pacific/Honolulu' } ) ;
2020-08-04 04:41:48 +08:00
const page = await context . newPage ( ) ;
2021-06-04 07:21:23 +08:00
expect ( await page . evaluate ( func ) ) . toBe ( 'Sat Nov 19 2016 08:12:34 GMT-1000 (Hawaii-Aleutian Standard Time)' ) ;
2020-08-04 04:41:48 +08:00
await context . close ( ) ;
}
{
2020-09-14 22:53:25 +08:00
const context = await browser . newContext ( { locale : 'en-US' , timezoneId : 'America/Buenos_Aires' } ) ;
2020-08-04 04:41:48 +08:00
const page = await context . newPage ( ) ;
2021-06-04 07:21:23 +08:00
expect ( await page . evaluate ( func ) ) . toBe ( 'Sat Nov 19 2016 15:12:34 GMT-0300 (Argentina Standard Time)' ) ;
2020-08-04 04:41:48 +08:00
await context . close ( ) ;
}
{
2020-09-14 22:53:25 +08:00
const context = await browser . newContext ( { locale : 'en-US' , timezoneId : 'Europe/Berlin' } ) ;
2020-08-04 04:41:48 +08:00
const page = await context . newPage ( ) ;
2021-06-04 07:21:23 +08:00
expect ( await page . evaluate ( func ) ) . toBe ( 'Sat Nov 19 2016 19:12:34 GMT+0100 (Central European Standard Time)' ) ;
2020-08-04 04:41:48 +08:00
await context . close ( ) ;
}
} ) ;
2025-09-19 23:52:04 +08:00
it ( 'should throw for invalid timezone IDs when creating pages' , async ( { browser , browserName } ) = > {
2020-08-04 04:41:48 +08:00
for ( const timezoneId of [ 'Foo/Bar' , 'Baz/Qux' ] ) {
2025-09-19 23:52:04 +08:00
if ( browserName as any === '_bidiChromium' || browserName as any === '_bidiFirefox' ) {
const error = await browser . newContext ( { timezoneId } ) . catch ( e = > e ) ;
if ( browserName as any === '_bidiChromium' )
expect ( error . message ) . toContain ( ` Invalid timezone " ${ timezoneId } " ` ) ;
else if ( browserName as any === '_bidiFirefox' )
expect ( error . message ) . toContain ( ` Expected "timezone" to be a valid timezone ID (e.g., "Europe/Berlin") or a valid timezone offset (e.g., "+01:00"), got ${ timezoneId } ` ) ;
} else {
let error = null ;
const context = await browser . newContext ( { timezoneId } ) ;
await context . newPage ( ) . catch ( e = > error = e ) ;
expect ( error . message ) . toContain ( ` Invalid timezone ID: ${ timezoneId } ` ) ;
await context . close ( ) ;
}
2020-08-04 04:41:48 +08:00
}
} ) ;
2021-09-28 00:58:08 +08:00
it ( 'should work for multiple pages sharing same process' , async ( { browser , server } ) = > {
2020-08-04 04:41:48 +08:00
const context = await browser . newContext ( { timezoneId : 'Europe/Moscow' } ) ;
const page = await context . newPage ( ) ;
await page . goto ( server . EMPTY_PAGE ) ;
let [ popup ] = await Promise . all ( [
page . waitForEvent ( 'popup' ) ,
page . evaluate ( url = > { window . open ( url ) ; } , server . EMPTY_PAGE ) ,
] ) ;
[ popup ] = await Promise . all ( [
popup . waitForEvent ( 'popup' ) ,
popup . evaluate ( url = > { window . open ( url ) ; } , server . EMPTY_PAGE ) ,
] ) ;
await context . close ( ) ;
} ) ;
2020-08-06 07:31:43 +08:00
2021-09-28 00:58:08 +08:00
it ( 'should not change default timezone in another context' , async ( { browser , server } ) = > {
2020-08-06 07:31:43 +08:00
async function getContextTimezone ( context ) {
const page = await context . newPage ( ) ;
return await page . evaluate ( ( ) = > Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ) ;
}
let defaultTimezone ;
{
const context = await browser . newContext ( ) ;
defaultTimezone = await getContextTimezone ( context ) ;
await context . close ( ) ;
}
const timezoneOverride = defaultTimezone === 'Europe/Moscow' ? 'America/Los_Angeles' : 'Europe/Moscow' ;
{
2021-09-28 00:58:08 +08:00
const context = await browser . newContext ( { timezoneId : timezoneOverride } ) ;
2020-08-06 07:31:43 +08:00
expect ( await getContextTimezone ( context ) ) . toBe ( timezoneOverride ) ;
await context . close ( ) ;
}
{
const context = await browser . newContext ( ) ;
expect ( await getContextTimezone ( context ) ) . toBe ( defaultTimezone ) ;
await context . close ( ) ;
}
} ) ;
2023-11-02 00:29:57 +08:00
it ( 'should affect Intl.DateTimeFormat().resolvedOptions().timeZone' , async ( { browser , server } ) = > {
const context = await browser . newContext ( { timezoneId : 'America/Jamaica' } ) ;
const page = await context . newPage ( ) ;
await page . goto ( server . EMPTY_PAGE ) ;
expect ( await page . evaluate ( ( ) = > ( new Intl . DateTimeFormat ( ) ) . resolvedOptions ( ) . timeZone ) ) . toBe ( 'America/Jamaica' ) ;
await context . close ( ) ;
} ) ;