diff --git a/SafeExamBrowser.Browser/BrowserApplication.cs b/SafeExamBrowser.Browser/BrowserApplication.cs index bc815c52..d3e61c04 100644 --- a/SafeExamBrowser.Browser/BrowserApplication.cs +++ b/SafeExamBrowser.Browser/BrowserApplication.cs @@ -19,6 +19,7 @@ using SafeExamBrowser.Browser.Contracts; using SafeExamBrowser.Browser.Contracts.Events; using SafeExamBrowser.Browser.Events; using SafeExamBrowser.Configuration.Contracts; +using SafeExamBrowser.Configuration.Contracts.Cryptography; using SafeExamBrowser.I18n.Contracts; using SafeExamBrowser.Logging.Contracts; using SafeExamBrowser.Settings.Browser; @@ -39,6 +40,7 @@ namespace SafeExamBrowser.Browser private AppConfig appConfig; private List instances; private IFileSystemDialog fileSystemDialog; + private IHashAlgorithm hashAlgorithm; private INativeMethods nativeMethods; private IMessageBox messageBox; private IModuleLogger logger; @@ -61,6 +63,7 @@ namespace SafeExamBrowser.Browser AppConfig appConfig, BrowserSettings settings, IFileSystemDialog fileSystemDialog, + IHashAlgorithm hashAlgorithm, INativeMethods nativeMethods, IMessageBox messageBox, IModuleLogger logger, @@ -69,6 +72,7 @@ namespace SafeExamBrowser.Browser { this.appConfig = appConfig; this.fileSystemDialog = fileSystemDialog; + this.hashAlgorithm = hashAlgorithm; this.nativeMethods = nativeMethods; this.instances = new List(); this.logger = logger; @@ -147,7 +151,7 @@ namespace SafeExamBrowser.Browser var isMainInstance = instances.Count == 0; var instanceLogger = logger.CloneFor($"Browser Instance #{id}"); var startUrl = url ?? GenerateStartUrl(); - var instance = new BrowserApplicationInstance(appConfig, settings, id, isMainInstance, fileSystemDialog, messageBox, instanceLogger, text, uiFactory, startUrl); + var instance = new BrowserApplicationInstance(appConfig, settings, id, isMainInstance, fileSystemDialog, hashAlgorithm, messageBox, instanceLogger, text, uiFactory, startUrl); instance.ConfigurationDownloadRequested += (fileName, args) => ConfigurationDownloadRequested?.Invoke(fileName, args); instance.PopupRequested += Instance_PopupRequested; diff --git a/SafeExamBrowser.Browser/BrowserApplicationInstance.cs b/SafeExamBrowser.Browser/BrowserApplicationInstance.cs index 03a9e230..0e7fef26 100644 --- a/SafeExamBrowser.Browser/BrowserApplicationInstance.cs +++ b/SafeExamBrowser.Browser/BrowserApplicationInstance.cs @@ -19,6 +19,7 @@ using SafeExamBrowser.Browser.Events; using SafeExamBrowser.Browser.Filters; using SafeExamBrowser.Browser.Handlers; using SafeExamBrowser.Configuration.Contracts; +using SafeExamBrowser.Configuration.Contracts.Cryptography; using SafeExamBrowser.I18n.Contracts; using SafeExamBrowser.Logging.Contracts; using SafeExamBrowser.Settings.Browser; @@ -46,6 +47,7 @@ namespace SafeExamBrowser.Browser private HttpClient httpClient; private bool isMainInstance; private IFileSystemDialog fileSystemDialog; + private IHashAlgorithm hashAlgorithm; private IMessageBox messageBox; private IModuleLogger logger; private BrowserSettings settings; @@ -81,6 +83,7 @@ namespace SafeExamBrowser.Browser int id, bool isMainInstance, IFileSystemDialog fileSystemDialog, + IHashAlgorithm hashAlgorithm, IMessageBox messageBox, IModuleLogger logger, IText text, @@ -92,6 +95,7 @@ namespace SafeExamBrowser.Browser this.httpClient = new HttpClient(); this.isMainInstance = isMainInstance; this.fileSystemDialog = fileSystemDialog; + this.hashAlgorithm = hashAlgorithm; this.messageBox = messageBox; this.logger = logger; this.settings = settings; @@ -139,6 +143,7 @@ namespace SafeExamBrowser.Browser downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested; downloadHandler.DownloadUpdated += DownloadHandler_DownloadUpdated; keyboardHandler.FindRequested += KeyboardHandler_FindRequested; + keyboardHandler.HomeNavigationRequested += HomeNavigationRequested; keyboardHandler.ReloadRequested += ReloadRequested; keyboardHandler.ZoomInRequested += ZoomInRequested; keyboardHandler.ZoomOutRequested += ZoomOutRequested; @@ -205,6 +210,7 @@ namespace SafeExamBrowser.Browser window.DeveloperConsoleRequested += Window_DeveloperConsoleRequested; window.FindRequested += Window_FindRequested; window.ForwardNavigationRequested += Window_ForwardNavigationRequested; + window.HomeNavigationRequested += HomeNavigationRequested; window.ReloadRequested += ReloadRequested; window.ZoomInRequested += ZoomInRequested; window.ZoomOutRequested += ZoomOutRequested; @@ -366,6 +372,50 @@ namespace SafeExamBrowser.Browser window.UpdateDownloadState(state); } + private void HomeNavigationRequested() + { + if (isMainInstance && (settings.UseStartUrlAsHomeUrl || !string.IsNullOrWhiteSpace(settings.HomeUrl))) + { + var navigate = false; + var url = settings.UseStartUrlAsHomeUrl ? settings.StartUrl : settings.HomeUrl; + + if (settings.HomeNavigationRequiresPassword && !string.IsNullOrWhiteSpace(settings.HomePasswordHash)) + { + var message = text.Get(TextKey.PasswordDialog_BrowserHomePasswordRequired); + var title = !string.IsNullOrWhiteSpace(settings.HomeNavigationMessage) ? settings.HomeNavigationMessage : text.Get(TextKey.PasswordDialog_BrowserHomePasswordRequiredTitle); + var dialog = uiFactory.CreatePasswordDialog(message, title); + var result = dialog.Show(window); + + if (result.Success) + { + var passwordHash = hashAlgorithm.GenerateHashFor(result.Password); + + if (settings.HomePasswordHash.Equals(passwordHash, StringComparison.OrdinalIgnoreCase)) + { + navigate = true; + } + else + { + messageBox.Show(TextKey.MessageBox_InvalidHomePassword, TextKey.MessageBox_InvalidHomePasswordTitle, icon: MessageBoxIcon.Warning, parent: window); + } + } + } + else + { + var message = text.Get(TextKey.MessageBox_BrowserHomeQuestion); + var title = !string.IsNullOrWhiteSpace(settings.HomeNavigationMessage) ? settings.HomeNavigationMessage : text.Get(TextKey.MessageBox_BrowserHomeQuestionTitle); + var result = messageBox.Show(message, title, MessageBoxAction.YesNo, MessageBoxIcon.Question, window); + + navigate = result == MessageBoxResult.Yes; + } + + if (navigate) + { + control.NavigateTo(url); + } + } + } + private void KeyboardHandler_FindRequested() { if (settings.AllowFind) diff --git a/SafeExamBrowser.Browser/Handlers/KeyboardHandler.cs b/SafeExamBrowser.Browser/Handlers/KeyboardHandler.cs index 9b09e95b..e6bfe87b 100644 --- a/SafeExamBrowser.Browser/Handlers/KeyboardHandler.cs +++ b/SafeExamBrowser.Browser/Handlers/KeyboardHandler.cs @@ -15,6 +15,7 @@ namespace SafeExamBrowser.Browser.Handlers internal class KeyboardHandler : IKeyboardHandler { internal event ActionRequestedEventHandler FindRequested; + internal event ActionRequestedEventHandler HomeNavigationRequested; internal event ActionRequestedEventHandler ReloadRequested; internal event ActionRequestedEventHandler ZoomInRequested; internal event ActionRequestedEventHandler ZoomOutRequested; @@ -25,24 +26,32 @@ namespace SafeExamBrowser.Browser.Handlers var ctrl = modifiers.HasFlag(CefEventFlags.ControlDown); var shift = modifiers.HasFlag(CefEventFlags.ShiftDown); - if (type == KeyType.KeyUp && ctrl && (keyCode == (int) Keys.F)) + if (type == KeyType.KeyUp) { - FindRequested?.Invoke(); - } + if (ctrl && keyCode == (int) Keys.F) + { + FindRequested?.Invoke(); + } - if (type == KeyType.KeyUp && ((keyCode == (int) Keys.Add && ctrl) || (keyCode == (int) Keys.D1 && ctrl && shift))) - { - ZoomInRequested?.Invoke(); - } + if (keyCode == (int) Keys.Home) + { + HomeNavigationRequested?.Invoke(); + } - if (type == KeyType.KeyUp && (keyCode == (int) Keys.Subtract || keyCode == (int) Keys.OemMinus) && ctrl) - { - ZoomOutRequested?.Invoke(); - } + if ((ctrl && keyCode == (int) Keys.Add) || (ctrl && shift && keyCode == (int) Keys.D1)) + { + ZoomInRequested?.Invoke(); + } - if (type == KeyType.KeyUp && (keyCode == (int) Keys.D0 || keyCode == (int) Keys.NumPad0) && ctrl) - { - ZoomResetRequested?.Invoke(); + if (ctrl && (keyCode == (int) Keys.Subtract || keyCode == (int) Keys.OemMinus)) + { + ZoomOutRequested?.Invoke(); + } + + if (ctrl && (keyCode == (int) Keys.D0 || keyCode == (int) Keys.NumPad0)) + { + ZoomResetRequested?.Invoke(); + } } return false; diff --git a/SafeExamBrowser.Client/CompositionRoot.cs b/SafeExamBrowser.Client/CompositionRoot.cs index 7a74959d..600ce9b0 100644 --- a/SafeExamBrowser.Client/CompositionRoot.cs +++ b/SafeExamBrowser.Client/CompositionRoot.cs @@ -202,7 +202,7 @@ namespace SafeExamBrowser.Client { var fileSystemDialog = BuildFileSystemDialog(); var moduleLogger = ModuleLogger(nameof(BrowserApplication)); - var browser = new BrowserApplication(context.AppConfig, context.Settings.Browser, fileSystemDialog, nativeMethods, messageBox, moduleLogger, text, uiFactory); + var browser = new BrowserApplication(context.AppConfig, context.Settings.Browser, fileSystemDialog, new HashAlgorithm(), nativeMethods, messageBox, moduleLogger, text, uiFactory); var operation = new BrowserOperation(actionCenter, context, logger, taskbar, taskview, uiFactory); context.Browser = browser; diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs index 2dd30620..6564a95a 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs @@ -93,6 +93,18 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping case Keys.Browser.Filter.FilterRules: MapFilterRules(settings, value); break; + case Keys.Browser.HomeButtonMessage: + MapHomeButtonMessage(settings, value); + break; + case Keys.Browser.HomeButtonRequiresPassword: + MapHomeButtonRequiresPassword(settings, value); + break; + case Keys.Browser.HomeButtonUrl: + MapHomeButtonUrl(settings, value); + break; + case Keys.Browser.HomeButtonUseStartUrl: + MapHomeButtonUseStartUrl(settings, value); + break; case Keys.Browser.MainWindow.AllowAddressBar: MapAllowAddressBar(settings, value); break; @@ -332,6 +344,38 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping } } + private void MapHomeButtonMessage(AppSettings settings, object value) + { + if (value is string message) + { + settings.Browser.HomeNavigationMessage = message; + } + } + + private void MapHomeButtonRequiresPassword(AppSettings settings, object value) + { + if (value is bool requires) + { + settings.Browser.HomeNavigationRequiresPassword = requires; + } + } + + private void MapHomeButtonUrl(AppSettings settings, object value) + { + if (value is string url) + { + settings.Browser.HomeUrl = url; + } + } + + private void MapHomeButtonUseStartUrl(AppSettings settings, object value) + { + if (value is bool use) + { + settings.Browser.UseStartUrlAsHomeUrl = use; + } + } + private void MapMainWindowMode(AppSettings settings, object value) { const int FULLSCREEN = 1; diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs index 6b808f41..f6258449 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs @@ -21,6 +21,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData { AllowBrowserToolbarForReloading(rawData, settings); CalculateConfigurationKey(rawData, settings); + HandleBrowserHomeFunctionality(settings); RemoveLegacyBrowsers(settings); } @@ -57,6 +58,12 @@ namespace SafeExamBrowser.Configuration.ConfigurationData } } + private void HandleBrowserHomeFunctionality(AppSettings settings) + { + settings.Browser.MainWindow.ShowHomeButton = settings.Browser.UseStartUrlAsHomeUrl || !string.IsNullOrWhiteSpace(settings.Browser.HomeUrl); + settings.Browser.HomePasswordHash = settings.Security.QuitPasswordHash; + } + private void RemoveLegacyBrowsers(AppSettings settings) { var legacyBrowsers = new List(); diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs index dac76929..6c402b63 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs @@ -112,6 +112,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.Browser.AdditionalWindow.Position = WindowPosition.Right; settings.Browser.AdditionalWindow.RelativeHeight = 100; settings.Browser.AdditionalWindow.RelativeWidth = 50; + settings.Browser.AdditionalWindow.ShowHomeButton = false; settings.Browser.AdditionalWindow.ShowReloadWarning = false; settings.Browser.AdditionalWindow.ShowToolbar = false; settings.Browser.AdditionalWindow.UrlPolicy = UrlPolicy.Never; @@ -135,6 +136,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.Browser.MainWindow.FullScreenMode = false; settings.Browser.MainWindow.RelativeHeight = 100; settings.Browser.MainWindow.RelativeWidth = 100; + settings.Browser.MainWindow.ShowHomeButton = false; settings.Browser.MainWindow.ShowReloadWarning = true; settings.Browser.MainWindow.ShowToolbar = false; settings.Browser.MainWindow.UrlPolicy = UrlPolicy.Never; diff --git a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs index 75312643..e7c4e127 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs @@ -58,6 +58,10 @@ namespace SafeExamBrowser.Configuration.ConfigurationData internal const string DownloadPdfFiles = "downloadPDFFiles"; internal const string EnableBrowser = "enableSebBrowser"; internal const string ExamKeySalt = "examKeySalt"; + internal const string HomeButtonMessage = "restartExamText"; + internal const string HomeButtonRequiresPassword = "restartExamPasswordProtected"; + internal const string HomeButtonUrl = "restartExamURL"; + internal const string HomeButtonUseStartUrl = "restartExamUseStartURL"; internal const string PopupPolicy = "newBrowserWindowByLinkPolicy"; internal const string PopupBlockForeignHost = "newBrowserWindowByLinkBlockForeign"; internal const string QuitUrl = "quitURL"; diff --git a/SafeExamBrowser.I18n.Contracts/TextKey.cs b/SafeExamBrowser.I18n.Contracts/TextKey.cs index 15b88a06..d532e4ca 100644 --- a/SafeExamBrowser.I18n.Contracts/TextKey.cs +++ b/SafeExamBrowser.I18n.Contracts/TextKey.cs @@ -71,6 +71,8 @@ namespace SafeExamBrowser.I18n.Contracts MessageBox_ApplicationNotFoundTitle, MessageBox_ApplicationTerminationFailure, MessageBox_ApplicationTerminationFailureTitle, + MessageBox_BrowserHomeQuestion, + MessageBox_BrowserHomeQuestionTitle, MessageBox_BrowserNavigationBlocked, MessageBox_BrowserNavigationBlockedTitle, MessageBox_BrowserQuitUrlConfirmation, @@ -84,6 +86,8 @@ namespace SafeExamBrowser.I18n.Contracts MessageBox_ConfigurationDownloadErrorTitle, MessageBox_InvalidConfigurationData, MessageBox_InvalidConfigurationDataTitle, + MessageBox_InvalidHomePassword, + MessageBox_InvalidHomePasswordTitle, MessageBox_InvalidPasswordError, MessageBox_InvalidPasswordErrorTitle, MessageBox_InvalidQuitPassword, @@ -155,6 +159,8 @@ namespace SafeExamBrowser.I18n.Contracts OperationStatus_WaitExplorerStartup, OperationStatus_WaitExplorerTermination, OperationStatus_WaitRuntimeDisconnection, + PasswordDialog_BrowserHomePasswordRequired, + PasswordDialog_BrowserHomePasswordRequiredTitle, PasswordDialog_Cancel, PasswordDialog_Confirm, PasswordDialog_LocalAdminPasswordRequired, diff --git a/SafeExamBrowser.I18n/Data/de.xml b/SafeExamBrowser.I18n/Data/de.xml index 38fb0225..1beca4d2 100644 --- a/SafeExamBrowser.I18n/Data/de.xml +++ b/SafeExamBrowser.I18n/Data/de.xml @@ -171,6 +171,12 @@ Automatisches Beenden fehlgeschlagen + + Sind Sie sicher? (Diese Funktion loggt Sie nicht aus, falls Sie sich auf einer Website eingeloggt haben) + + + Zurück zum Start + Zugriff auf "%%URL%%" ist gemäss der aktiven Konfiguration nicht erlaubt. @@ -210,6 +216,12 @@ Konfigurations-Fehler + + Das eingegebene Passwort ist nicht korrekt. + + + Ungültiges Passwort + Sie haben 5 mal das falsche Passwort eingegeben. SEB wird sich nun beenden... @@ -423,6 +435,12 @@ Warte bis Runtime Verbindung trennt + + Beenden-/Neustart-Passwort eingeben: (Diese Funktion loggt Sie nicht aus, falls Sie sich auf einer Website eingeloggt haben) + + + Zurück zum Start + Abbrechen diff --git a/SafeExamBrowser.I18n/Data/en.xml b/SafeExamBrowser.I18n/Data/en.xml index 27fb436d..42358ee4 100644 --- a/SafeExamBrowser.I18n/Data/en.xml +++ b/SafeExamBrowser.I18n/Data/en.xml @@ -171,6 +171,12 @@ Automatic Termination Failed + + Are you sure? (This function doesn't log you out if you are logged in on a website) + + + Back to Start + Access to "%%URL%%" is not allowed according to the current configuration. @@ -210,6 +216,12 @@ Configuration Error + + The password you entered is incorrect. + + + Invalid Password + You failed to enter the correct password within 5 attempts. SEB will now terminate... @@ -423,6 +435,12 @@ Waiting for the runtime to disconnect + + Enter quit/restart password: (This function doesn't log you out if you are logged in on a website) + + + Back to Start + Cancel diff --git a/SafeExamBrowser.I18n/Data/it.xml b/SafeExamBrowser.I18n/Data/it.xml index 923f570e..702c3f43 100644 --- a/SafeExamBrowser.I18n/Data/it.xml +++ b/SafeExamBrowser.I18n/Data/it.xml @@ -171,6 +171,12 @@ Chiusura automatica non riuscita + + Sei sicuro? (Questa funzione non ti disconnette se sei loggato su un sito web) + + + Torna all'inizio + L'accesso a "%%URL%%" non è consentito in base alla configurazione corrente. @@ -210,6 +216,12 @@ Errore di configurazione + + Non sei riuscito a inserire la password corretta. + + + Password non valida + Non sei riuscito a inserire la password corretta in 5 tentativi. SEB ora verrà chiuso ... @@ -423,6 +435,12 @@ In attesa della disconnessione del runtime + + Inserisci la password di chiusura / riavvio: (questa funzione non ti disconnette se sei connesso a un sito web) + + + Torna all'inizio + Annulla diff --git a/SafeExamBrowser.Settings/Browser/BrowserSettings.cs b/SafeExamBrowser.Settings/Browser/BrowserSettings.cs index 92cbff69..6500229f 100644 --- a/SafeExamBrowser.Settings/Browser/BrowserSettings.cs +++ b/SafeExamBrowser.Settings/Browser/BrowserSettings.cs @@ -118,6 +118,26 @@ namespace SafeExamBrowser.Settings.Browser /// public FilterSettings Filter { get; set; } + /// + /// An optional custom message shown before navigating home. + /// + public string HomeNavigationMessage { get; set; } + + /// + /// Determines whether a password is required to navigate home. + /// + public bool HomeNavigationRequiresPassword { get; set; } + + /// + /// The hash code of the password optionally required to navigate home. + /// + public string HomePasswordHash { get; set; } + + /// + /// An optional custom URL to be used when navigating home. + /// + public string HomeUrl { get; set; } + /// /// The settings to be used for the main browser window. /// @@ -173,6 +193,11 @@ namespace SafeExamBrowser.Settings.Browser /// public bool UseQueryParameter { get; set; } + /// + /// Determines whether the start URL will be used when navigating home. + /// + public bool UseStartUrlAsHomeUrl { get; set; } + /// /// A custom suffix to be appended to the user agent. /// diff --git a/SafeExamBrowser.Settings/Browser/WindowSettings.cs b/SafeExamBrowser.Settings/Browser/WindowSettings.cs index 4d25533f..b7953ec8 100644 --- a/SafeExamBrowser.Settings/Browser/WindowSettings.cs +++ b/SafeExamBrowser.Settings/Browser/WindowSettings.cs @@ -71,6 +71,11 @@ namespace SafeExamBrowser.Settings.Browser /// public int? RelativeWidth { get; set; } + /// + /// Determines whether the home button is visible. + /// + public bool ShowHomeButton { get; set; } + /// /// Determines whether the user will need to confirm every reload attempt. /// diff --git a/SafeExamBrowser.UserInterface.Contracts/Browser/IBrowserWindow.cs b/SafeExamBrowser.UserInterface.Contracts/Browser/IBrowserWindow.cs index 767067a9..64400e27 100644 --- a/SafeExamBrowser.UserInterface.Contracts/Browser/IBrowserWindow.cs +++ b/SafeExamBrowser.UserInterface.Contracts/Browser/IBrowserWindow.cs @@ -59,6 +59,11 @@ namespace SafeExamBrowser.UserInterface.Contracts.Browser /// event ActionRequestedEventHandler ForwardNavigationRequested; + /// + /// Event fired when the user would like to navigate home. + /// + event ActionRequestedEventHandler HomeNavigationRequested; + /// /// Event fired when the user would like to reload the current page. /// diff --git a/SafeExamBrowser.UserInterface.Desktop/Images/SkipBack.xaml b/SafeExamBrowser.UserInterface.Desktop/Images/Home.xaml similarity index 100% rename from SafeExamBrowser.UserInterface.Desktop/Images/SkipBack.xaml rename to SafeExamBrowser.UserInterface.Desktop/Images/Home.xaml diff --git a/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj b/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj index 668ecd69..a99e82d2 100644 --- a/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj +++ b/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj @@ -386,7 +386,7 @@ MSBuild:Compile Designer - + MSBuild:Compile Designer diff --git a/SafeExamBrowser.UserInterface.Desktop/Windows/BrowserWindow.xaml b/SafeExamBrowser.UserInterface.Desktop/Windows/BrowserWindow.xaml index 2855d0ed..da5ae188 100644 --- a/SafeExamBrowser.UserInterface.Desktop/Windows/BrowserWindow.xaml +++ b/SafeExamBrowser.UserInterface.Desktop/Windows/BrowserWindow.xaml @@ -32,15 +32,17 @@ + - @@ -48,7 +50,7 @@ - @@ -48,7 +50,7 @@ -