6
6
using System . Dynamic ;
7
7
using System . Globalization ;
8
8
using System . Threading . Tasks ;
9
+ using CefSharp . Example ;
9
10
using Xunit ;
10
11
using Xunit . Abstractions ;
11
12
@@ -23,6 +24,68 @@ public JavascriptCallbackTests(ITestOutputHelper output, CefSharpFixture collect
23
24
this . collectionFixture = collectionFixture ;
24
25
}
25
26
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
+
26
89
[ Theory ]
27
90
[ InlineData ( "(function() { return Promise.resolve(53)})" , 53 ) ]
28
91
[ InlineData ( "(function() { return Promise.resolve('53')})" , "53" ) ]
0 commit comments