Skip to content

Commit 25d41fa

Browse files
committed
make it so all popups must be closed for the browser to exit
1 parent 788fa7f commit 25d41fa

3 files changed

Lines changed: 112 additions & 47 deletions

File tree

FlashpointSecurePlayer/FlashpointSecurePlayerGUI.cs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public partial class FlashpointSecurePlayerGUI : Form {
4040
private readonly bool oldWindowsVersion = Environment.OSVersion.Version < new Version(6, 1);
4141

4242
private bool activeX = false;
43-
WebBrowserMode webBrowserMode = null;
43+
private bool webBrowserModeExiting = false;
4444
private ProcessStartInfo softwareProcessStartInfo = null;
4545
private bool softwareIsOldCPUSimulator = false;
4646

@@ -619,7 +619,7 @@ private async Task ImportActiveXAsync(ErrorDelegate errorDelegate) {
619619
}
620620
}
621621

622-
private void ActivateMode(TemplateElement templateElement, ErrorDelegate errorDelegate) {
622+
private async Task ActivateModeAsync(TemplateElement templateElement, ErrorDelegate errorDelegate) {
623623
bool createdNew = false;
624624

625625
using (Mutex modeMutex = new Mutex(true, MODE_MUTEX_NAME, out createdNew)) {
@@ -662,11 +662,10 @@ private void ActivateMode(TemplateElement templateElement, ErrorDelegate errorDe
662662
throw new InvalidModeException("The address \"" + URL + "\" was not understood by the Mode.");
663663
}
664664

665-
webBrowserMode = new WebBrowserMode(webBrowserURL, UseFlashActiveXControl) {
665+
WebBrowserMode webBrowserMode = new WebBrowserMode(WebBrowserModeExit, webBrowserURL, UseFlashActiveXControl) {
666666
WindowState = FormWindowState.Maximized
667667
};
668-
669-
webBrowserMode.FormClosing += webBrowserMode_FormClosing;
668+
670669
Hide();
671670
webBrowserMode.Show();
672671
return;
@@ -726,7 +725,9 @@ private void ActivateMode(TemplateElement templateElement, ErrorDelegate errorDe
726725

727726
Hide();
728727

729-
softwareProcess.WaitForExit();
728+
await Task.Run(delegate () {
729+
softwareProcess.WaitForExit();
730+
}).ConfigureAwait(true);
730731

731732
Show();
732733
Refresh();
@@ -809,10 +810,14 @@ private void DeactivateMode(TemplateElement templateElement, ErrorDelegate error
809810
}
810811

811812
try {
812-
if (webBrowserMode != null) {
813-
webBrowserMode.FormClosing -= webBrowserMode_FormClosing;
814-
webBrowserMode.Close();
815-
webBrowserMode = null;
813+
webBrowserModeExiting = true;
814+
815+
IList<WebBrowserMode> webBrowserModes = WebBrowserMode.WebBrowserModes;
816+
817+
if (webBrowserModes != null) {
818+
for (int i = 0; i < webBrowserModes.Count; i++) {
819+
webBrowserModes[i].Close();
820+
}
816821
}
817822
} finally {
818823
modeMutex.ReleaseMutex();
@@ -1201,10 +1206,10 @@ await ActivateModificationsAsync(templateElement, delegate (string text) {
12011206
}
12021207

12031208
try {
1204-
ActivateMode(templateElement, delegate (string text) {
1209+
await ActivateModeAsync(templateElement, delegate (string text) {
12051210
ShowErrorFatal(text);
12061211
throw new InvalidModeException("An error occured while activating the Mode.");
1207-
});
1212+
}).ConfigureAwait(true);
12081213
} catch (InvalidModeException ex) {
12091214
// delegate handles error
12101215
LogExceptionToLauncher(ex);
@@ -1248,6 +1253,34 @@ private void ImportStart(object sender, EventArgs e) {
12481253
private void ImportStop(object sender, EventArgs e) {
12491254
ControlBox = true;
12501255
}
1256+
1257+
private void WebBrowserModeExit(object sender, EventArgs e) {
1258+
if (webBrowserModeExiting) {
1259+
return;
1260+
}
1261+
1262+
// Set Current Directory
1263+
try {
1264+
Directory.SetCurrentDirectory(Application.StartupPath);
1265+
} catch {
1266+
// fail silently
1267+
}
1268+
1269+
// this should not cause an exception
1270+
// if it does, it means there is an infinite closing loop
1271+
// (a form is closing a form which is closing a form, and so on)
1272+
// you can debug infinite closing loops by setting breakpoints
1273+
// on all Form.Close functions
1274+
try {
1275+
Show();
1276+
Refresh();
1277+
Application.Exit();
1278+
} catch (InvalidOperationException ex) {
1279+
// IT IS VERY IMPORTANT THIS SHOULD NEVER HAPPEN!
1280+
LogExceptionToLauncher(ex);
1281+
Environment.Exit(-1);
1282+
}
1283+
}
12511284

12521285
private bool loaded = false;
12531286

@@ -1601,36 +1634,6 @@ private void FlashpointSecurePlayer_FormClosing(object sender, FormClosingEventA
16011634
}
16021635
}
16031636
}
1604-
1605-
private void webBrowserMode_FormClosing(object sender, FormClosingEventArgs e) {
1606-
// stop form closing recursion
1607-
if (webBrowserMode != null) {
1608-
webBrowserMode.FormClosing -= webBrowserMode_FormClosing;
1609-
webBrowserMode = null;
1610-
}
1611-
1612-
// Set Current Directory
1613-
try {
1614-
Directory.SetCurrentDirectory(Application.StartupPath);
1615-
} catch {
1616-
// fail silently
1617-
}
1618-
1619-
// this should not cause an exception
1620-
// if it does, it means there is an infinite closing loop
1621-
// (a form is closing a form which is closing a form, and so on)
1622-
// you can debug infinite closing loops by setting breakpoints
1623-
// on all Form.Close functions
1624-
try {
1625-
Show();
1626-
Refresh();
1627-
Application.Exit();
1628-
} catch (InvalidOperationException ex) {
1629-
// IT IS VERY IMPORTANT THIS SHOULD NEVER HAPPEN!
1630-
LogExceptionToLauncher(ex);
1631-
Environment.Exit(-1);
1632-
}
1633-
}
16341637
}
16351638
}
16361639

FlashpointSecurePlayer/ProgressManager.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,13 @@ private static ProgressBarStyle ProgressBarStyle {
394394
return;
395395
}
396396

397-
ProgressBar.Style = value;
397+
if (ProgressBar.InvokeRequired) {
398+
ProgressBar.Invoke(new MethodInvoker(delegate () {
399+
ProgressBar.Style = value;
400+
}));
401+
} else {
402+
ProgressBar.Style = value;
403+
}
398404
}
399405
}
400406

@@ -413,7 +419,13 @@ private static int ProgressBarValue {
413419
return;
414420
}
415421

416-
ProgressBar.Value = value;
422+
if (ProgressBar.InvokeRequired) {
423+
ProgressBar.Invoke(new MethodInvoker(delegate () {
424+
ProgressBar.Value = value;
425+
}));
426+
} else {
427+
ProgressBar.Value = value;
428+
}
417429
}
418430
}
419431

FlashpointSecurePlayer/WebBrowserMode.cs

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,12 +380,31 @@ protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) {
380380
}
381381
}
382382

383+
static private List<WebBrowserMode> webBrowserModes = new List<WebBrowserMode>() { };
384+
385+
static public IList<WebBrowserMode> WebBrowserModes {
386+
get {
387+
if (webBrowserModes == null) {
388+
return null;
389+
}
390+
return webBrowserModes.AsReadOnly();
391+
}
392+
}
393+
394+
private readonly EventHandler webBrowserModeExit;
395+
383396
private Uri WebBrowserURL { get; set; } = null;
384397
private bool UseFlashActiveXControl { get; set; } = false;
385398

386-
public WebBrowserMode(bool useFlashActiveXControl = false) {
399+
public WebBrowserMode(EventHandler webBrowserModeExit, bool useFlashActiveXControl = false) {
387400
InitializeComponent();
388401

402+
this.webBrowserModeExit = webBrowserModeExit;
403+
404+
if (webBrowserModes != null) {
405+
webBrowserModes.Add(this);
406+
}
407+
389408
UseFlashActiveXControl = useFlashActiveXControl;
390409

391410
lowLevelMouseProc = new HookProc(LowLevelMouseProc);
@@ -395,9 +414,15 @@ public WebBrowserMode(bool useFlashActiveXControl = false) {
395414
statusBarStatusStrip.Renderer = new EndEllipsisTextRenderer();
396415
}
397416

398-
public WebBrowserMode(Uri webBrowserURL, bool useFlashActiveXControl = false) {
417+
public WebBrowserMode(EventHandler webBrowserModeExit, Uri webBrowserURL, bool useFlashActiveXControl = false) {
399418
InitializeComponent();
400419

420+
this.webBrowserModeExit = webBrowserModeExit;
421+
422+
if (webBrowserModes != null) {
423+
webBrowserModes.Add(this);
424+
}
425+
401426
WebBrowserURL = webBrowserURL;
402427
UseFlashActiveXControl = useFlashActiveXControl;
403428

@@ -408,6 +433,16 @@ public WebBrowserMode(Uri webBrowserURL, bool useFlashActiveXControl = false) {
408433
statusBarStatusStrip.Renderer = new EndEllipsisTextRenderer();
409434
}
410435

436+
private void OnWebBrowserModeExit(EventArgs e) {
437+
EventHandler eventHandler = webBrowserModeExit;
438+
439+
if (eventHandler == null) {
440+
return;
441+
}
442+
443+
eventHandler(this, e);
444+
}
445+
411446
private bool addressToolStripSpringTextBoxEntered = false;
412447

413448
public void AddressInvalid() {
@@ -492,7 +527,7 @@ public void BrowserPrint() {
492527

493528
public WebBrowserMode BrowserNewWindow() {
494529
// we don't want this window to be the parent, breaks fullscreen and not otherwise useful
495-
WebBrowserMode webBrowserForm = new WebBrowserMode(UseFlashActiveXControl);
530+
WebBrowserMode webBrowserForm = new WebBrowserMode(webBrowserModeExit, UseFlashActiveXControl);
496531
webBrowserForm.Show(/*this*/);
497532
return webBrowserForm;
498533
}
@@ -620,6 +655,21 @@ private void WebBrowserMode_FormClosing(object sender, FormClosingEventArgs e) {
620655
closableWebBrowser = null;
621656

622657
customSecurityManager = null;
658+
659+
if (webBrowserModes == null) {
660+
return;
661+
}
662+
663+
webBrowserModes.Remove(this);
664+
665+
if (webBrowserModes.Any()) {
666+
return;
667+
}
668+
669+
// stop form closing recursion
670+
FormClosing -= WebBrowserMode_FormClosing;
671+
672+
OnWebBrowserModeExit(EventArgs.Empty);
623673
}
624674

625675
private void WebBrowserMode_Activated(object sender, EventArgs e) {

0 commit comments

Comments
 (0)