@@ -800,6 +800,130 @@ module.exports.describe = function({testRunner, expect, playwright, MAC, WIN, FF
800
800
} ) ;
801
801
} ) ;
802
802
803
+ describe . fail ( FFOX ) ( 'Page.automaticWaiting' , ( ) => {
804
+ it ( 'clicking anchor should await navigation' , async ( { page, server} ) => {
805
+ const messages = [ ] ;
806
+ server . setRoute ( '/empty.html' , async ( req , res ) => {
807
+ messages . push ( 'route' ) ;
808
+ res . end ( 'done' ) ;
809
+ } ) ;
810
+
811
+ await page . setContent ( `<a href="${ server . EMPTY_PAGE } ">empty.html</a>` ) ;
812
+
813
+ await Promise . all ( [
814
+ page . click ( 'a' ) . then ( ( ) => messages . push ( 'click' ) ) ,
815
+ page . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) )
816
+ ] ) ;
817
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|click' ) ;
818
+ } ) ;
819
+ it ( 'clicking anchor should await cross-process navigation' , async ( { page, server} ) => {
820
+ const messages = [ ] ;
821
+ server . setRoute ( '/empty.html' , async ( req , res ) => {
822
+ messages . push ( 'route' ) ;
823
+ res . end ( 'done' ) ;
824
+ } ) ;
825
+
826
+ await page . setContent ( `<a href="${ server . CROSS_PROCESS_PREFIX + '/empty.html' } ">empty.html</a>` ) ;
827
+
828
+ await Promise . all ( [
829
+ page . click ( 'a' ) . then ( ( ) => messages . push ( 'click' ) ) ,
830
+ page . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) )
831
+ ] ) ;
832
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|click' ) ;
833
+ } ) ;
834
+ it . fail ( CHROMIUM ) ( 'should await form-get on click' , async ( { page, server} ) => {
835
+ const messages = [ ] ;
836
+ server . setRoute ( '/empty.html?foo=bar' , async ( req , res ) => {
837
+ messages . push ( 'route' ) ;
838
+ res . end ( 'done' ) ;
839
+ } ) ;
840
+
841
+ await page . setContent ( `
842
+ <form action="${ server . EMPTY_PAGE } " method="get">
843
+ <input name="foo" value="bar">
844
+ <input type="submit" value="Submit">
845
+ </form>` ) ;
846
+
847
+ await Promise . all ( [
848
+ page . click ( 'input[type=submit]' ) . then ( ( ) => messages . push ( 'click' ) ) ,
849
+ page . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) )
850
+ ] ) ;
851
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|click' ) ;
852
+ } ) ;
853
+ it . fail ( CHROMIUM ) ( 'should await form-post on click' , async ( { page, server} ) => {
854
+ const messages = [ ] ;
855
+ server . setRoute ( '/empty.html' , async ( req , res ) => {
856
+ messages . push ( 'route' ) ;
857
+ res . end ( 'done' ) ;
858
+ } ) ;
859
+
860
+ await page . setContent ( `
861
+ <form action="${ server . EMPTY_PAGE } " method="post">
862
+ <input name="foo" value="bar">
863
+ <input type="submit" value="Submit">
864
+ </form>` ) ;
865
+
866
+ await Promise . all ( [
867
+ page . click ( 'input[type=submit]' ) . then ( ( ) => messages . push ( 'click' ) ) ,
868
+ page . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) )
869
+ ] ) ;
870
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|click' ) ;
871
+ } ) ;
872
+ it ( 'assigning to location should await navigation' , async ( { page, server} ) => {
873
+ const messages = [ ] ;
874
+ server . setRoute ( '/empty.html' , async ( req , res ) => {
875
+ messages . push ( 'route' ) ;
876
+ res . end ( 'done' ) ;
877
+ } ) ;
878
+ await Promise . all ( [
879
+ page . evaluate ( `window.location.href = "${ server . EMPTY_PAGE } "` ) . then ( ( ) => messages . push ( 'evaluate' ) ) ,
880
+ page . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) ) ,
881
+ ] ) ;
882
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|evaluate' ) ;
883
+ } ) ;
884
+ it ( 'should await navigating specified target' , async ( { page, server, httpsServer} ) => {
885
+ const messages = [ ] ;
886
+ server . setRoute ( '/empty.html' , async ( req , res ) => {
887
+ messages . push ( 'route' ) ;
888
+ res . end ( 'done' ) ;
889
+ } ) ;
890
+
891
+ await page . setContent ( `
892
+ <a href="${ server . EMPTY_PAGE } " target=target>empty.html</a>
893
+ <iframe name=target></iframe>
894
+ ` ) ;
895
+ const frame = page . frame ( { name : 'target' } ) ;
896
+ await Promise . all ( [
897
+ page . click ( 'a' ) . then ( ( ) => messages . push ( 'click' ) ) ,
898
+ frame . waitForNavigation ( { waitUntil : [ ] } ) . then ( ( ) => messages . push ( 'waitForNavigation' ) )
899
+ ] ) ;
900
+ expect ( frame . url ( ) ) . toBe ( server . EMPTY_PAGE ) ;
901
+ expect ( messages . join ( '|' ) ) . toBe ( 'route|waitForNavigation|click' ) ;
902
+ } ) ;
903
+ } ) ;
904
+
905
+ describe ( 'Page.automaticWaiting should not hang' , ( ) => {
906
+ it ( 'should not throw when clicking on links which do not commit navigation' , async ( { page, server, httpsServer} ) => {
907
+ await page . goto ( server . EMPTY_PAGE ) ;
908
+ await page . setContent ( `<a href='${ httpsServer . EMPTY_PAGE } '>foobar</a>` ) ;
909
+ await page . click ( 'a' ) ;
910
+ } ) ;
911
+ it ( 'should not throw when clicking on download link' , async ( { page, server, httpsServer} ) => {
912
+ await page . setContent ( `<a href="${ server . PREFIX } /wasm/table2.wasm" download=true>table2.wasm</a>` ) ;
913
+ await page . click ( 'a' ) ;
914
+ } ) ;
915
+ it ( 'should not hang on window.stop' , async ( { page, server, httpsServer} ) => {
916
+ server . setRoute ( '/empty.html' , async ( req , res ) => { } ) ;
917
+ await Promise . all ( [
918
+ page . waitForNavigation ( ) . catch ( e => { } ) ,
919
+ page . evaluate ( ( url ) => {
920
+ window . location . href = url ;
921
+ setTimeout ( ( ) => window . stop ( ) , 100 ) ;
922
+ } , server . EMPTY_PAGE )
923
+ ] ) ;
924
+ } ) ;
925
+ } ) ;
926
+
803
927
describe ( 'Page.waitForLoadState' , ( ) => {
804
928
it ( 'should pick up ongoing navigation' , async ( { page, server} ) => {
805
929
let response = null ;
@@ -950,13 +1074,13 @@ module.exports.describe = function({testRunner, expect, playwright, MAC, WIN, FF
950
1074
951
1075
server . setRoute ( '/empty.html' , ( ) => { } ) ;
952
1076
let error = null ;
953
- const navigationPromise = frame . waitForNavigation ( ) . catch ( e => error = e ) ;
954
1077
await Promise . all ( [
955
- server . waitForRequest ( '/empty.html' ) ,
956
- frame . evaluate ( ( ) => window . location = '/empty.html' )
957
- ] ) ;
958
- await page . $eval ( 'iframe' , frame => frame . remove ( ) ) ;
959
- await navigationPromise ;
1078
+ frame . waitForNavigation ( ) . catch ( e => error = e ) ,
1079
+ server . waitForRequest ( '/empty.html' ) . then ( ( ) => {
1080
+ page . $eval ( 'iframe' , frame => frame . remove ( ) ) ;
1081
+ } ) ,
1082
+ frame . evaluate ( ( ) => window . location = '/empty.html' ) ,
1083
+ ] ) . catch ( e => error = e ) ;
960
1084
expect ( error . message ) . toContain ( 'frame was detached' ) ;
961
1085
} ) ;
962
1086
} ) ;
0 commit comments