Skip to content

Commit 154cedf

Browse files
committed
Refactor WebView* into WebViewWrapper
This commit contributes to refactoring of all the webView* instances into a wrapper class WebViewWrapper for better encapsulation and fault proof initialization using a single future. contributes to #62 and #127
1 parent affce53 commit 154cedf

File tree

2 files changed

+70
-65
lines changed

2 files changed

+70
-65
lines changed

bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java

Lines changed: 69 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -287,149 +287,149 @@ static int callAndWait(String[] pstr, ToIntFunction<IUnknown> callable) {
287287
return phr[0];
288288
}
289289

290-
class WebViewProvider {
290+
class WebViewWrapper {
291+
private ICoreWebView2 webView;
292+
private ICoreWebView2_2 webView_2;
293+
private ICoreWebView2_10 webView_10;
294+
private ICoreWebView2_11 webView_11;
295+
private ICoreWebView2_12 webView_12;
296+
private ICoreWebView2_13 webView_13;
297+
}
291298

292-
private CompletableFuture<ICoreWebView2> webViewFuture = new CompletableFuture<>();
293-
private CompletableFuture<ICoreWebView2_2> webView_2Future = new CompletableFuture<>();
294-
private CompletableFuture<ICoreWebView2_10> webView_10Future = new CompletableFuture<>();
295-
private CompletableFuture<ICoreWebView2_11> webView_11Future = new CompletableFuture<>();
296-
private CompletableFuture<ICoreWebView2_12> webView_12Future = new CompletableFuture<>();
297-
private CompletableFuture<ICoreWebView2_13> webView_13Future = new CompletableFuture<>();
299+
class WebViewProvider {
298300

299-
private CompletableFuture<Void> lastWebViewTask = webViewFuture.thenRun(() -> {});
301+
private CompletableFuture<WebViewWrapper> webViewWrapperFuture = new CompletableFuture<>();
302+
private CompletableFuture<Void> lastWebViewTask = webViewWrapperFuture.thenRun(() -> {});;
300303

301304
ICoreWebView2 initializeWebView(ICoreWebView2Controller controller) {
302305
long[] ppv = new long[1];
303306
controller.get_CoreWebView2(ppv);
304307
final ICoreWebView2 webView = new ICoreWebView2(ppv[0]);
305-
initializeWebView_2(webView);
306-
initializeWebView_10(webView);
307-
initializeWebView_11(webView);
308-
initializeWebView_12(webView);
309-
initializeWebView_13(webView);
310-
webViewFuture.complete(webView);
308+
final WebViewWrapper webViewWrapper = new WebViewWrapper();
309+
webViewWrapper.webView = webView;
310+
webViewWrapper.webView_2 = initializeWebView_2(webView);
311+
webViewWrapper.webView_10 = initializeWebView_10(webView);
312+
webViewWrapper.webView_11 = initializeWebView_11(webView);
313+
webViewWrapper.webView_12 = initializeWebView_12(webView);
314+
webViewWrapper.webView_13= initializeWebView_13(webView);
315+
webViewWrapperFuture.complete(webViewWrapper);
311316
return webView;
312317
}
313318

314319
private void abortInitialization() {
315-
webViewFuture.cancel(true);
320+
webViewWrapperFuture.cancel(true);
316321
}
317322

318-
private void initializeWebView_2(ICoreWebView2 webView) {
323+
private ICoreWebView2_2 initializeWebView_2(ICoreWebView2 webView) {
319324
long[] ppv = new long[1];
320325
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_2, ppv);
321326
if (hr == COM.S_OK) {
322-
webView_2Future.complete(new ICoreWebView2_2(ppv[0]));
323-
} else {
324-
webView_2Future.cancel(true);
327+
return new ICoreWebView2_2(ppv[0]);
325328
}
329+
return null;
326330
}
327331

328-
private void initializeWebView_10(ICoreWebView2 webView) {
332+
private ICoreWebView2_10 initializeWebView_10(ICoreWebView2 webView) {
329333
long[] ppv = new long[1];
330334
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_10, ppv);
331335
if (hr == COM.S_OK) {
332-
webView_10Future.complete(new ICoreWebView2_10(ppv[0]));
333-
} else {
334-
webView_10Future.cancel(true);
336+
return new ICoreWebView2_10(ppv[0]);
335337
}
338+
return null;
336339
}
337340

338-
private void initializeWebView_11(ICoreWebView2 webView) {
341+
private ICoreWebView2_11 initializeWebView_11(ICoreWebView2 webView) {
339342
long[] ppv = new long[1];
340343
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_11, ppv);
341344
if (hr == COM.S_OK) {
342-
webView_11Future.complete(new ICoreWebView2_11(ppv[0]));
343-
} else {
344-
webView_11Future.cancel(true);
345+
return new ICoreWebView2_11(ppv[0]);
345346
}
347+
return null;
346348
}
347349

348-
private void initializeWebView_12(ICoreWebView2 webView) {
350+
private ICoreWebView2_12 initializeWebView_12(ICoreWebView2 webView) {
349351
long[] ppv = new long[1];
350352
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_12, ppv);
351353
if (hr == COM.S_OK) {
352-
webView_12Future.complete(new ICoreWebView2_12(ppv[0]));
353-
} else {
354-
webView_12Future.cancel(true);
354+
return new ICoreWebView2_12(ppv[0]);
355355
}
356+
return null;
356357
}
357358

358-
private void initializeWebView_13(ICoreWebView2 webView) {
359+
private ICoreWebView2_13 initializeWebView_13(ICoreWebView2 webView) {
359360
long[] ppv = new long[1];
360361
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_13, ppv);
361362
if (hr == COM.S_OK) {
362-
webView_13Future.complete(new ICoreWebView2_13(ppv[0]));
363-
} else {
364-
webView_13Future.cancel(true);
363+
return new ICoreWebView2_13(ppv[0]);
365364
}
365+
return null;
366366
}
367367

368368
ICoreWebView2 getWebView(boolean waitForPendingWebviewTasksToFinish) {
369369
if(waitForPendingWebviewTasksToFinish) {
370370
waitForFutureToFinish(lastWebViewTask);
371371
}
372-
return webViewFuture.join();
372+
return webViewWrapperFuture.join().webView;
373373
}
374374

375375
ICoreWebView2_2 getWebView_2(boolean waitForPendingWebviewTasksToFinish) {
376376
if(waitForPendingWebviewTasksToFinish) {
377377
waitForFutureToFinish(lastWebViewTask);
378378
}
379-
return webView_2Future.join();
379+
return webViewWrapperFuture.join().webView_2;
380380
}
381381

382382
boolean isWebView_2Available() {
383-
waitForFutureToFinish(webView_2Future);
384-
return !webView_2Future.isCancelled();
383+
waitForFutureToFinish(webViewWrapperFuture);
384+
return webViewWrapperFuture.join().webView_2 != null;
385385
}
386386

387387
ICoreWebView2_10 getWebView_10(boolean waitForPendingWebviewTasksToFinish) {
388388
if(waitForPendingWebviewTasksToFinish) {
389389
waitForFutureToFinish(lastWebViewTask);
390390
}
391-
return webView_10Future.join();
391+
return webViewWrapperFuture.join().webView_10;
392392
}
393393

394394
boolean isWebView_10Available() {
395-
waitForFutureToFinish(webView_10Future);
396-
return !webView_10Future.isCancelled();
395+
waitForFutureToFinish(webViewWrapperFuture);
396+
return webViewWrapperFuture.join().webView_10 != null;
397397
}
398398

399399
ICoreWebView2_11 getWebView_11(boolean waitForPendingWebviewTasksToFinish) {
400400
if(waitForPendingWebviewTasksToFinish) {
401401
waitForFutureToFinish(lastWebViewTask);
402402
}
403-
return webView_11Future.join();
403+
return webViewWrapperFuture.join().webView_11;
404404
}
405405

406406
boolean isWebView_11Available() {
407-
waitForFutureToFinish(webView_11Future);
408-
return !webView_11Future.isCancelled();
407+
waitForFutureToFinish(webViewWrapperFuture);
408+
return webViewWrapperFuture.join().webView_11 != null;
409409
}
410410

411411
ICoreWebView2_12 getWebView_12(boolean waitForPendingWebviewTasksToFinish) {
412412
if(waitForPendingWebviewTasksToFinish) {
413413
waitForFutureToFinish(lastWebViewTask);
414414
}
415-
return webView_12Future.join();
415+
return webViewWrapperFuture.join().webView_12;
416416
}
417417

418418
boolean isWebView_12Available() {
419-
waitForFutureToFinish(webView_12Future);
420-
return !webView_12Future.isCancelled();
419+
waitForFutureToFinish(webViewWrapperFuture);
420+
return webViewWrapperFuture.join().webView_12 != null;
421421
}
422422

423423
ICoreWebView2_13 getWebView_13(boolean waitForPendingWebviewTasksToFinish) {
424424
if(waitForPendingWebviewTasksToFinish) {
425425
waitForFutureToFinish(lastWebViewTask);
426426
}
427-
return webView_13Future.join();
427+
return webViewWrapperFuture.join().webView_13;
428428
}
429429

430430
boolean isWebView_13Available() {
431-
waitForFutureToFinish(webView_13Future);
432-
return !webView_13Future.isCancelled();
431+
waitForFutureToFinish(webViewWrapperFuture);
432+
return webViewWrapperFuture.join().webView_13 != null;
433433
}
434434

435435
/*
@@ -587,21 +587,13 @@ private void createInstance(int previousAttempts) {
587587
}
588588

589589
private IUnknown createControllerInitializationCallback(int previousAttempts) {
590-
Runnable initializationRollback = () -> {
591-
webViewProvider.abortInitialization();
592-
if (environment2 != null) {
593-
environment2.Release();
594-
environment2 = null;
595-
}
596-
containingEnvironment.instances().remove(this);
597-
};
598590
return newCallback((result, pv) -> {
599591
if (browser.isDisposed()) {
600-
initializationRollback.run();
592+
rollbackInitialization();
601593
return COM.S_OK;
602594
}
603595
if (result == OS.HRESULT_FROM_WIN32(OS.ERROR_INVALID_STATE)) {
604-
initializationRollback.run();
596+
rollbackInitialization();
605597
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
606598
" Edge instance with same data folder but different environment options already exists");
607599
}
@@ -611,14 +603,14 @@ private IUnknown createControllerInitializationCallback(int previousAttempts) {
611603
setupBrowser((int) result, pv);
612604
break;
613605
case COM.E_WRONG_THREAD:
614-
initializationRollback.run();
606+
rollbackInitialization();
615607
error(SWT.ERROR_THREAD_INVALID_ACCESS, (int) result);
616608
break;
617609
case COM.E_ABORT:
618-
initializationRollback.run();
610+
rollbackInitialization();
619611
break;
620612
default:
621-
initializationRollback.run();
613+
rollbackInitialization();
622614
if (previousAttempts < MAXIMUM_CREATION_RETRIES) {
623615
System.err.println(String.format("Edge initialization failed, retrying (attempt %d / %d)", previousAttempts + 1, MAXIMUM_CREATION_RETRIES));
624616
createInstance(previousAttempts + 1);
@@ -632,6 +624,19 @@ private IUnknown createControllerInitializationCallback(int previousAttempts) {
632624
});
633625
}
634626

627+
private void rollbackInitialization() {
628+
webViewProvider.abortInitialization();
629+
releaseEnvironment();
630+
}
631+
632+
private void releaseEnvironment() {
633+
if (environment2 != null) {
634+
environment2.Release();
635+
environment2 = null;
636+
}
637+
containingEnvironment.instances().remove(this);
638+
}
639+
635640
void setupBrowser(int hr, long pv) {
636641
long[] ppv = new long[] {pv};
637642
controller = new ICoreWebView2Controller(ppv[0]);

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ private int reportOpenedDescriptors() {
302302
}
303303

304304
private Browser createBrowser(Shell s, int flags) {
305-
long maximumBrowserCreationMilliseconds = 90_000;
305+
long maximumBrowserCreationMilliseconds = 10_000;
306306
long createStartTime = System.currentTimeMillis();
307307
Browser b = new Browser(s, flags);
308308
// Wait for asynchronous initialization via getting URL

0 commit comments

Comments
 (0)