Skip to content

Commit 4e16f3b

Browse files
authored
Enhancement - Add LoadUrlAsync (#3596)
Core - Add LoadUrlAsync - Add IWebBrowser.LoadUrlAsync - Add LoadUrlAsyncResponse - Update unit tests to use new method - Add static method to allow for CefSharp.Wpf.HwndHost to share the same code.
1 parent 0386220 commit 4e16f3b

File tree

12 files changed

+277
-68
lines changed

12 files changed

+277
-68
lines changed

CefSharp.Test/DevTools/DevToolsClientFacts.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public async Task CanGetDevToolsProtocolVersion()
5555
{
5656
using (var browser = new ChromiumWebBrowser("www.google.com"))
5757
{
58-
await browser.LoadPageAsync();
58+
await browser.LoadUrlAsync();
5959

6060
using (var devToolsClient = browser.GetDevToolsClient())
6161
{
@@ -76,7 +76,7 @@ public async Task CanEmulationCanEmulate()
7676
{
7777
using (var browser = new ChromiumWebBrowser("www.google.com"))
7878
{
79-
await browser.LoadPageAsync();
79+
await browser.LoadUrlAsync();
8080

8181
using (var devToolsClient = browser.GetDevToolsClient())
8282
{
@@ -92,7 +92,7 @@ public async Task CanGetPageNavigationHistory()
9292
{
9393
using (var browser = new ChromiumWebBrowser("www.google.com"))
9494
{
95-
await browser.LoadPageAsync();
95+
await browser.LoadUrlAsync();
9696

9797
using (var devToolsClient = browser.GetDevToolsClient())
9898
{
@@ -115,7 +115,7 @@ public async Task CanSetCookieForDomain(string name, string value, string domain
115115
{
116116
using (var browser = new ChromiumWebBrowser("www.google.com"))
117117
{
118-
await browser.LoadPageAsync();
118+
await browser.LoadUrlAsync();
119119

120120
using (var devToolsClient = browser.GetDevToolsClient())
121121
{
@@ -131,7 +131,7 @@ public async Task CanUseMultipleDevToolsClientInstancesPerBrowser()
131131
{
132132
using (var browser = new ChromiumWebBrowser("www.google.com"))
133133
{
134-
await browser.LoadPageAsync();
134+
await browser.LoadUrlAsync();
135135

136136
using (var devToolsClient = browser.GetDevToolsClient())
137137
{
@@ -164,7 +164,7 @@ public async Task CanSetUserAgentOverride()
164164
{
165165
using (var browser = new ChromiumWebBrowser("www.google.com"))
166166
{
167-
await browser.LoadPageAsync();
167+
await browser.LoadUrlAsync();
168168

169169
using (var devToolsClient = browser.GetDevToolsClient())
170170
{

CefSharp.Test/JavascriptBinding/IntegrationTestFacts.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public async Task IsObjectCachedWithInvalidObjectNameReturnsFalse()
106106
{
107107
using (var browser = new ChromiumWebBrowser(CefExample.BindingApiCustomObjectNameTestUrl))
108108
{
109-
await browser.LoadPageAsync();
109+
await browser.LoadUrlAsync();
110110

111111
//We'll execute twice using the different cased (camelcase naming and standard)
112112
var response = await browser.EvaluateScriptAsync("CefSharp.IsObjectCached('doesntexist')");
@@ -132,7 +132,7 @@ public async Task JsBindingGlobalObjectNameCustomValueExecuteIsObjectCachedSucce
132132
//To modify the settings we need to defer browser creation slightly
133133
browser.CreateBrowser();
134134

135-
await browser.LoadPageAsync();
135+
await browser.LoadUrlAsync();
136136

137137
var result = await browser.EvaluateScriptAsync("bindingApiObject.isObjectCached('doesntexist') === false");
138138

@@ -195,7 +195,7 @@ public async Task JsBindingRenderProcessId(string script)
195195
{
196196
using (var browser = new ChromiumWebBrowser(CefExample.BindingApiCustomObjectNameTestUrl))
197197
{
198-
await browser.LoadPageAsync();
198+
await browser.LoadUrlAsync();
199199

200200
var result = await browser.EvaluateScriptAsync(script);
201201

@@ -215,7 +215,7 @@ public async Task CanCallCefSharpBindObjectAsyncWithoutParams()
215215
{
216216
using (var browser = new ChromiumWebBrowser(CefExample.HelloWorldUrl))
217217
{
218-
await browser.LoadPageAsync();
218+
await browser.LoadUrlAsync();
219219

220220
//TODO: See if we can avoid GetAwaiter().GetResult()
221221
var evt = Assert.Raises<JavascriptBindingEventArgs>(

CefSharp.Test/OffScreen/OffScreenBrowserBasicFacts.cs

Lines changed: 84 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,51 @@ public async Task CanLoadGoogle()
4747
{
4848
using (var browser = new ChromiumWebBrowser("www.google.com"))
4949
{
50-
await browser.LoadPageAsync();
50+
var response = await browser.LoadUrlAsync();
51+
52+
Assert.True(response.Success);
5153

5254
var mainFrame = browser.GetMainFrame();
5355
Assert.True(mainFrame.IsValid);
5456
Assert.Contains("www.google", mainFrame.Url);
57+
Assert.Equal(200, response.HttpStatusCode);
5558

5659
output.WriteLine("Url {0}", mainFrame.Url);
5760
}
5861
}
5962

63+
[Fact]
64+
public async Task CanLoadInvalidDomain()
65+
{
66+
using (var browser = new ChromiumWebBrowser("notfound.cefsharp.test"))
67+
{
68+
var response = await browser.LoadUrlAsync();
69+
70+
var mainFrame = browser.GetMainFrame();
71+
Assert.True(mainFrame.IsValid);
72+
Assert.Contains("notfound.cefsharp.test", mainFrame.Url);
73+
Assert.Equal(CefErrorCode.NameNotResolved, response.ErrorCode);
74+
75+
output.WriteLine("Url {0}", mainFrame.Url);
76+
}
77+
}
78+
79+
[Fact]
80+
public async Task CanLoadExpiredBadSsl()
81+
{
82+
using (var browser = new ChromiumWebBrowser("https://expired.badssl.com/"))
83+
{
84+
var response = await browser.LoadUrlAsync();
85+
86+
var mainFrame = browser.GetMainFrame();
87+
Assert.True(mainFrame.IsValid);
88+
Assert.Contains("", mainFrame.Url);
89+
Assert.Equal(-1, response.HttpStatusCode);
90+
91+
output.WriteLine("Url {0}", mainFrame.Url);
92+
}
93+
}
94+
6095
[Fact]
6196
public void BrowserRefCountDecrementedOnDispose()
6297
{
@@ -104,7 +139,9 @@ public async Task CanLoadGoogleAndEvaluateScript()
104139
{
105140
using (var browser = new ChromiumWebBrowser("www.google.com"))
106141
{
107-
await browser.LoadPageAsync();
142+
var response = await browser.LoadUrlAsync();
143+
144+
Assert.True(response.Success);
108145

109146
var mainFrame = browser.GetMainFrame();
110147
Assert.True(mainFrame.IsValid);
@@ -137,7 +174,10 @@ public async Task CrossSiteNavigationJavascriptBinding()
137174
browser.JavascriptObjectRepository.Register("bound", boundObj, true);
138175
#endif
139176

140-
await browser.LoadPageAsync();
177+
var response = await browser.LoadUrlAsync();
178+
179+
Assert.True(response.Success);
180+
141181
browser.GetMainFrame().ExecuteJavaScriptAsync(script);
142182

143183
await Task.Delay(2000);
@@ -146,7 +186,7 @@ public async Task CrossSiteNavigationJavascriptBinding()
146186
boundObj.MethodCalled = false;
147187

148188
browser.Load("https://www.google.com");
149-
await browser.LoadPageAsync();
189+
await browser.LoadUrlAsync();
150190
browser.GetMainFrame().ExecuteJavaScriptAsync(script);
151191
await Task.Delay(2000);
152192
Assert.True(boundObj.MethodCalled);
@@ -178,7 +218,7 @@ public async Task JavascriptBindingMultipleObjects()
178218
#endif
179219
};
180220

181-
await browser.LoadPageAsync();
221+
await browser.LoadUrlAsync();
182222
browser.GetMainFrame().ExecuteJavaScriptAsync(script);
183223

184224
await Task.Delay(2000);
@@ -196,7 +236,9 @@ public async Task CanEvaluateScriptAsyncWithEncodedStringArguments()
196236
{
197237
using (var browser = new ChromiumWebBrowser("http://www.google.com"))
198238
{
199-
await browser.LoadPageAsync();
239+
var response = await browser.LoadUrlAsync();
240+
241+
Assert.True(response.Success);
200242

201243
var mainFrame = browser.GetMainFrame();
202244
Assert.True(mainFrame.IsValid);
@@ -227,7 +269,9 @@ public async Task CanEvaluateScriptAsPromiseAsyncJavascriptBindingApiGlobalObjec
227269
browser.JavascriptObjectRepository.Settings.JavascriptBindingApiGlobalObjectName = rootObjName;
228270
browser.CreateBrowser();
229271

230-
await browser.LoadPageAsync();
272+
var response = await browser.LoadUrlAsync();
273+
274+
Assert.True(response.Success);
231275

232276
var mainFrame = browser.GetMainFrame();
233277
Assert.True(mainFrame.IsValid);
@@ -251,7 +295,9 @@ public async Task CanEvaluateScriptAsPromiseAsync(string script, bool success, s
251295
{
252296
using (var browser = new ChromiumWebBrowser("http://www.google.com"))
253297
{
254-
await browser.LoadPageAsync();
298+
var response = await browser.LoadUrlAsync();
299+
300+
Assert.True(response.Success);
255301

256302
var mainFrame = browser.GetMainFrame();
257303
Assert.True(mainFrame.IsValid);
@@ -281,7 +327,9 @@ public async Task CanEvaluateScriptAsPromiseAsyncReturnObject(string script, boo
281327
{
282328
using (var browser = new ChromiumWebBrowser("http://www.google.com"))
283329
{
284-
await browser.LoadPageAsync();
330+
var response = await browser.LoadUrlAsync();
331+
332+
Assert.True(response.Success);
285333

286334
var mainFrame = browser.GetMainFrame();
287335
Assert.True(mainFrame.IsValid);
@@ -308,7 +356,9 @@ public async Task CanMakeFrameUrlRequest()
308356
{
309357
using (var browser = new ChromiumWebBrowser("https://code.jquery.com/jquery-3.4.1.min.js"))
310358
{
311-
await browser.LoadPageAsync();
359+
var response = await browser.LoadUrlAsync();
360+
361+
Assert.True(response.Success);
312362

313363
var mainFrame = browser.GetMainFrame();
314364
Assert.True(mainFrame.IsValid);
@@ -344,7 +394,9 @@ public async Task CanDownloadUrlForFrame(string url)
344394
{
345395
using (var browser = new ChromiumWebBrowser(url))
346396
{
347-
await browser.LoadPageAsync();
397+
var response = await browser.LoadUrlAsync();
398+
399+
Assert.True(response.Success);
348400

349401
var htmlSrc = await browser.GetSourceAsync();
350402

@@ -388,7 +440,7 @@ public async Task CanDownloadFileToFolderWithoutAskingUser(string url)
388440
}
389441
});
390442

391-
await chromiumWebBrowser.LoadPageAsync();
443+
await chromiumWebBrowser.LoadUrlAsync();
392444

393445
chromiumWebBrowser.StartDownload(url);
394446

@@ -447,15 +499,17 @@ public async Task CanExecuteJavascriptInMainFrameAfterNavigatingToDifferentOrigi
447499
{
448500
using (var browser = new ChromiumWebBrowser(firstUrl))
449501
{
450-
await browser.LoadPageAsync();
502+
var response = await browser.LoadUrlAsync();
503+
504+
Assert.True(response.Success);
451505

452506
Assert.True(browser.CanExecuteJavascriptInMainFrame);
453507

454-
await browser.LoadPageAsync(secondUrl);
508+
await browser.LoadUrlAsync(secondUrl);
455509

456510
Assert.True(browser.CanExecuteJavascriptInMainFrame);
457511

458-
await browser.LoadPageAsync(firstUrl);
512+
await browser.LoadUrlAsync(firstUrl);
459513

460514
Assert.True(browser.CanExecuteJavascriptInMainFrame);
461515
}
@@ -469,7 +523,9 @@ public async Task CanLoadRequestWithPostData(string url)
469523
//To use LoadRequest we must first load a web page
470524
using (var browser = new ChromiumWebBrowser(new HtmlString("Testing")))
471525
{
472-
await browser.LoadPageAsync();
526+
var response = await browser.LoadUrlAsync();
527+
528+
Assert.True(response.Success);
473529

474530
var request = new Request();
475531
request.Url = "http://httpbin.org/post";
@@ -510,7 +566,9 @@ public async Task CanLoadHttpWebsiteUsingProxy()
510566

511567
using (var browser = new ChromiumWebBrowser("http://cefsharp.github.io/", requestContext: requestContext))
512568
{
513-
await browser.LoadPageAsync();
569+
var response = await browser.LoadUrlAsync();
570+
571+
Assert.True(response.Success);
514572

515573
var mainFrame = browser.GetMainFrame();
516574
Assert.True(mainFrame.IsValid);
@@ -544,7 +602,9 @@ public async Task CanLoadHttpWebsiteUsingSetProxyAsync()
544602

545603
using (var browser = new ChromiumWebBrowser("http://cefsharp.github.io/", requestContext: requestContext))
546604
{
547-
await browser.LoadPageAsync();
605+
var response = await browser.LoadUrlAsync();
606+
607+
Assert.True(response.Success);
548608

549609
var mainFrame = browser.GetMainFrame();
550610
Assert.True(mainFrame.IsValid);
@@ -594,7 +654,9 @@ await Cef.UIThreadTaskFactory.StartNew(delegate
594654

595655
using (var browser = new ChromiumWebBrowser("http://cefsharp.github.io/", requestContext: requestContext))
596656
{
597-
await browser.LoadPageAsync();
657+
var response = await browser.LoadUrlAsync();
658+
659+
Assert.True(response.Success);
598660

599661
var mainFrame = browser.GetMainFrame();
600662
Assert.True(mainFrame.IsValid);
@@ -612,7 +674,9 @@ public async Task CanLoadMultipleBrowserInstancesSequentially()
612674
{
613675
using (var browser = new ChromiumWebBrowser(new HtmlString("Testing")))
614676
{
615-
await browser.LoadPageAsync();
677+
var response = await browser.LoadUrlAsync();
678+
679+
Assert.True(response.Success);
616680

617681
var source = await browser.GetSourceAsync();
618682

CefSharp.Test/PostMessage/IntegrationTestFacts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task JavascriptCustomEvent(string jsEventObject, string eventToRais
5151
//Page.AddScriptToEvaluateOnNewDocument (via DevTools)
5252
using (var browser = new ChromiumWebBrowser(new HtmlString("Initial Load")))
5353
{
54-
await browser.LoadPageAsync();
54+
await browser.LoadUrlAsync();
5555

5656
using (var devToolsClient = browser.GetDevToolsClient())
5757
{

CefSharp.Test/WebBrowserTestExtensions.cs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,6 @@ namespace CefSharp.Test
99
{
1010
public static class WebBrowserTestExtensions
1111
{
12-
public static Task LoadPageAsync(this IWebBrowser browser, string address = null)
13-
{
14-
//If using .Net 4.6 then use TaskCreationOptions.RunContinuationsAsynchronously
15-
//and switch to tcs.TrySetResult below - no need for the custom extension method
16-
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
17-
18-
EventHandler<LoadingStateChangedEventArgs> handler = null;
19-
handler = (sender, args) =>
20-
{
21-
//Wait for while page to finish loading not just the first frame
22-
if (!args.IsLoading)
23-
{
24-
browser.LoadingStateChanged -= handler;
25-
//This is required when using a standard TaskCompletionSource
26-
//Extension method found in the CefSharp.Internals namespace
27-
tcs.TrySetResult(true);
28-
}
29-
};
30-
31-
browser.LoadingStateChanged += handler;
32-
33-
if (!string.IsNullOrEmpty(address))
34-
{
35-
browser.Load(address);
36-
}
37-
return tcs.Task;
38-
}
39-
4012
public static Task LoadRequestAsync(this IWebBrowser browser, IRequest request)
4113
{
4214
if(request == null)

0 commit comments

Comments
 (0)