33 *
44 * SPDX-License-Identifier: MIT
55 */
6+ import { Page } from "playwright/test" ;
7+ import { DataSamplesPage } from "./app/data-samples" ;
8+ import { ImportPage } from "./app/import-page" ;
69import { test } from "./fixtures" ;
710
811test . describe ( "import project (microbit.org case)" , ( ) => {
@@ -19,4 +22,55 @@ test.describe("import project (microbit.org case)", () => {
1922 await dataSamplesPage . expectOnPage ( ) ;
2023 await dataSamplesPage . expectActions ( [ "exercising" , "not exercising" ] ) ;
2124 } ) ;
25+
26+ test ( "cross-tab behavior regression" , async ( {
27+ newPage : newPage1 ,
28+ dataSamplesPage : dataSamplesPage1 ,
29+ context,
30+ } ) => {
31+ // https://github.com/microbit-foundation/ml-trainer/issues/618
32+ await newPage1 . goto ( ) ;
33+ await newPage1 . startNewSession ( ) ;
34+ await dataSamplesPage1 . expectOnPage ( ) ;
35+
36+ const page2 = await context . newPage ( ) ;
37+ const importPage2 = new ImportPage ( page2 ) ;
38+ await importPage2 . gotoSimpleAIExerciseTimer ( ) ;
39+ await importPage2 . startSession ( ) ;
40+ const dataSamplesPage2 = new DataSamplesPage ( page2 ) ;
41+ await dataSamplesPage2 . expectOnPage ( ) ;
42+ await dataSamplesPage2 . expectActions ( [ "exercising" , "not exercising" ] ) ;
43+
44+ await triggerVisibilityChanged ( page2 , true ) ;
45+ await triggerVisibilityChanged ( page2 , false ) ;
46+
47+ await dataSamplesPage2 . expectActions ( [ ] ) ;
48+ } ) ;
2249} ) ;
50+
51+ const triggerVisibilityChanged = async ( page : Page , hidden : boolean ) => {
52+ const frames = page . frames ( ) ;
53+ if ( frames . length > 0 ) {
54+ await Promise . allSettled (
55+ page . frames ( ) . map ( ( frame ) => frame . waitForLoadState ( "networkidle" ) )
56+ ) ;
57+ }
58+
59+ const makecode = frames . find ( ( f ) => {
60+ return (
61+ // Allow for fragments, extra params.
62+ f . url ( ) . startsWith ( "https://makecode.microbit.org/?lang=en&controller=2" )
63+ ) ;
64+ } ) ;
65+
66+ const setHidden = ( value : boolean ) => {
67+ Object . defineProperty ( document , "visibilityState" , {
68+ value : value ? "hidden" : "visible" ,
69+ writable : true ,
70+ } ) ;
71+ Object . defineProperty ( document , "hidden" , { value, writable : true } ) ;
72+ document . dispatchEvent ( new Event ( "visibilitychange" , { bubbles : true } ) ) ;
73+ } ;
74+ await makecode ! . evaluate ( setHidden , hidden ) ;
75+ await new Promise ( ( resolve ) => setTimeout ( resolve , 3000 ) ) ;
76+ } ;
0 commit comments