66using System . Dynamic ;
77using System . Globalization ;
88using System . Threading . Tasks ;
9+ using CefSharp . Example ;
910using Xunit ;
1011using Xunit . Abstractions ;
1112
@@ -23,6 +24,68 @@ public JavascriptCallbackTests(ITestOutputHelper output, CefSharpFixture collect
2324 this . collectionFixture = collectionFixture ;
2425 }
2526
27+ [ Fact ]
28+ public async Task V8Context ( )
29+ {
30+ Task callbackExecuteCancelAfterDisposeTask ;
31+ using ( var browser = new CefSharp . OffScreen . ChromiumWebBrowser ( automaticallyCreateBrowser : false ) )
32+ {
33+ await browser . CreateBrowserAsync ( ) ;
34+
35+ // no V8 context
36+ var withoutV8ContextException = await Assert . ThrowsAsync < Exception > ( ( ) => browser . EvaluateScriptAsync ( "(function() { return 1+1; })" ) ) ;
37+ Assert . StartsWith ( "Unable to execute javascript at this time" , withoutV8ContextException . Message ) ;
38+
39+ Task < JavascriptResponse > callbackExecuteWithoutV8ContextTask ;
40+ using ( var frame = browser . GetMainFrame ( ) )
41+ {
42+ callbackExecuteWithoutV8ContextTask = frame . EvaluateScriptAsync ( "(function() { return 1+2; })" ) ;
43+ }
44+
45+ // V8 context
46+ await browser . LoadUrlAsync ( CefExample . HelloWorldUrl ) ;
47+
48+ var callbackExecuteWithoutV8ContextResponse = await callbackExecuteWithoutV8ContextTask ;
49+ Assert . True ( callbackExecuteWithoutV8ContextResponse . Success ) ;
50+ var callbackExecuteWithoutV8ContextCallback = ( IJavascriptCallback ) callbackExecuteWithoutV8ContextResponse . Result ;
51+ var callbackExecuteWithoutV8ContextExecuteResponse = await callbackExecuteWithoutV8ContextCallback . ExecuteAsync ( ) ;
52+ Assert . True ( callbackExecuteWithoutV8ContextExecuteResponse . Success ) ;
53+ Assert . Equal ( 3 , callbackExecuteWithoutV8ContextExecuteResponse . Result ) ;
54+
55+ var callbackExecuteCancelAfterV8ContextResponse = await browser . EvaluateScriptAsync ( "(function() { return new Promise(resolve => setTimeout(resolve, 1000)); })" ) ;
56+ Assert . True ( callbackExecuteCancelAfterV8ContextResponse . Success ) ;
57+ var evaluateCancelAfterV8ContextCallback = ( IJavascriptCallback ) callbackExecuteCancelAfterV8ContextResponse . Result ;
58+ var evaluateCancelAfterV8ContextTask = evaluateCancelAfterV8ContextCallback . ExecuteAsync ( ) ;
59+
60+ // change V8 context
61+ await browser . LoadUrlAsync ( CefExample . HelloWorldUrl ) ;
62+
63+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => evaluateCancelAfterV8ContextTask ) ;
64+
65+ var callbackExecuteCancelAfterDisposeResponse = await browser . EvaluateScriptAsync ( "(function() { return new Promise(resolve => setTimeout(resolve, 1000)); })" ) ;
66+ Assert . True ( callbackExecuteCancelAfterDisposeResponse . Success ) ;
67+ var callbackExecuteCancelAfterDisposeCallback = ( IJavascriptCallback ) callbackExecuteCancelAfterDisposeResponse . Result ;
68+ callbackExecuteCancelAfterDisposeTask = callbackExecuteCancelAfterDisposeCallback . ExecuteAsync ( ) ;
69+ }
70+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => callbackExecuteCancelAfterDisposeTask ) ;
71+ }
72+
73+ [ Fact ]
74+ public async Task CancelCallbackOnCrash ( )
75+ {
76+ AssertInitialLoadComplete ( ) ;
77+
78+ var javascriptResponse = await Browser . EvaluateScriptAsync ( "(function() { return new Promise(resolve => setTimeout(resolve, 1000)); })" ) ;
79+ Assert . True ( javascriptResponse . Success ) ;
80+
81+ var callback = ( IJavascriptCallback ) javascriptResponse . Result ;
82+
83+ var task = callback . ExecuteAsync ( ) ;
84+
85+ await Browser . LoadUrlAsync ( "chrome://crash" ) ;
86+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => task ) ;
87+ }
88+
2689 [ Theory ]
2790 [ InlineData ( "(function() { return Promise.resolve(53)})" , 53 ) ]
2891 [ InlineData ( "(function() { return Promise.resolve('53')})" , "53" ) ]
0 commit comments