SEBWIN-106: Implemented basic favicon handling.
This commit is contained in:
parent
6c3a7bee5c
commit
0ee13c9c8b
13 changed files with 152 additions and 11 deletions
|
@ -39,6 +39,7 @@ namespace SafeExamBrowser.Browser
|
||||||
public IWindow Window { get { return window; } }
|
public IWindow Window { get { return window; } }
|
||||||
|
|
||||||
public event DownloadRequestedEventHandler ConfigurationDownloadRequested;
|
public event DownloadRequestedEventHandler ConfigurationDownloadRequested;
|
||||||
|
public event IconChangedEventHandler IconChanged;
|
||||||
public event InstanceTerminatedEventHandler Terminated;
|
public event InstanceTerminatedEventHandler Terminated;
|
||||||
public event NameChangedEventHandler NameChanged;
|
public event NameChangedEventHandler NameChanged;
|
||||||
public event PopupRequestedEventHandler PopupRequested;
|
public event PopupRequestedEventHandler PopupRequested;
|
||||||
|
@ -66,17 +67,19 @@ namespace SafeExamBrowser.Browser
|
||||||
internal void Initialize()
|
internal void Initialize()
|
||||||
{
|
{
|
||||||
var contextMenuHandler = new ContextMenuHandler(settings, text);
|
var contextMenuHandler = new ContextMenuHandler(settings, text);
|
||||||
|
var displayHandler = new DisplayHandler();
|
||||||
var downloadLogger = logger.CloneFor($"{nameof(DownloadHandler)} {Id}");
|
var downloadLogger = logger.CloneFor($"{nameof(DownloadHandler)} {Id}");
|
||||||
var downloadHandler = new DownloadHandler(appConfig, settings, downloadLogger);
|
var downloadHandler = new DownloadHandler(appConfig, settings, downloadLogger);
|
||||||
var keyboardHandler = new KeyboardHandler();
|
var keyboardHandler = new KeyboardHandler();
|
||||||
var lifeSpanHandler = new LifeSpanHandler();
|
var lifeSpanHandler = new LifeSpanHandler();
|
||||||
var requestHandler = new RequestHandler(appConfig);
|
var requestHandler = new RequestHandler(appConfig);
|
||||||
|
|
||||||
|
displayHandler.FaviconChanged += DisplayHandler_FaviconChanged;
|
||||||
downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested;
|
downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested;
|
||||||
keyboardHandler.ReloadRequested += KeyboardHandler_ReloadRequested;
|
keyboardHandler.ReloadRequested += KeyboardHandler_ReloadRequested;
|
||||||
lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested;
|
lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested;
|
||||||
|
|
||||||
control = new BrowserControl(contextMenuHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl);
|
control = new BrowserControl(contextMenuHandler, displayHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl);
|
||||||
control.AddressChanged += Control_AddressChanged;
|
control.AddressChanged += Control_AddressChanged;
|
||||||
control.LoadingStateChanged += Control_LoadingStateChanged;
|
control.LoadingStateChanged += Control_LoadingStateChanged;
|
||||||
control.TitleChanged += Control_TitleChanged;
|
control.TitleChanged += Control_TitleChanged;
|
||||||
|
@ -139,6 +142,14 @@ namespace SafeExamBrowser.Browser
|
||||||
NameChanged?.Invoke(title);
|
NameChanged?.Invoke(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DisplayHandler_FaviconChanged(string uri)
|
||||||
|
{
|
||||||
|
var icon = new BrowserIconResource(uri);
|
||||||
|
|
||||||
|
IconChanged?.Invoke(icon);
|
||||||
|
window.UpdateIcon(icon);
|
||||||
|
}
|
||||||
|
|
||||||
private void DownloadHandler_ConfigurationDownloadRequested(string fileName, DownloadEventArgs args)
|
private void DownloadHandler_ConfigurationDownloadRequested(string fileName, DownloadEventArgs args)
|
||||||
{
|
{
|
||||||
if (settings.AllowConfigurationDownloads)
|
if (settings.AllowConfigurationDownloads)
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace SafeExamBrowser.Browser
|
||||||
internal class BrowserControl : ChromiumWebBrowser, IBrowserControl
|
internal class BrowserControl : ChromiumWebBrowser, IBrowserControl
|
||||||
{
|
{
|
||||||
private IContextMenuHandler contextMenuHandler;
|
private IContextMenuHandler contextMenuHandler;
|
||||||
|
private IDisplayHandler displayHandler;
|
||||||
private IDownloadHandler downloadHandler;
|
private IDownloadHandler downloadHandler;
|
||||||
private IKeyboardHandler keyboardHandler;
|
private IKeyboardHandler keyboardHandler;
|
||||||
private ILifeSpanHandler lifeSpanHandler;
|
private ILifeSpanHandler lifeSpanHandler;
|
||||||
|
@ -45,6 +46,7 @@ namespace SafeExamBrowser.Browser
|
||||||
|
|
||||||
public BrowserControl(
|
public BrowserControl(
|
||||||
IContextMenuHandler contextMenuHandler,
|
IContextMenuHandler contextMenuHandler,
|
||||||
|
IDisplayHandler displayHandler,
|
||||||
IDownloadHandler downloadHandler,
|
IDownloadHandler downloadHandler,
|
||||||
IKeyboardHandler keyboardHandler,
|
IKeyboardHandler keyboardHandler,
|
||||||
ILifeSpanHandler lifeSpanHandler,
|
ILifeSpanHandler lifeSpanHandler,
|
||||||
|
@ -52,6 +54,7 @@ namespace SafeExamBrowser.Browser
|
||||||
string url) : base(url)
|
string url) : base(url)
|
||||||
{
|
{
|
||||||
this.contextMenuHandler = contextMenuHandler;
|
this.contextMenuHandler = contextMenuHandler;
|
||||||
|
this.displayHandler = displayHandler;
|
||||||
this.downloadHandler = downloadHandler;
|
this.downloadHandler = downloadHandler;
|
||||||
this.keyboardHandler = keyboardHandler;
|
this.keyboardHandler = keyboardHandler;
|
||||||
this.lifeSpanHandler = lifeSpanHandler;
|
this.lifeSpanHandler = lifeSpanHandler;
|
||||||
|
@ -64,6 +67,7 @@ namespace SafeExamBrowser.Browser
|
||||||
LoadingStateChanged += (o, args) => loadingStateChanged?.Invoke(args.IsLoading);
|
LoadingStateChanged += (o, args) => loadingStateChanged?.Invoke(args.IsLoading);
|
||||||
TitleChanged += (o, args) => titleChanged?.Invoke(args.Title);
|
TitleChanged += (o, args) => titleChanged?.Invoke(args.Title);
|
||||||
|
|
||||||
|
DisplayHandler = displayHandler;
|
||||||
DownloadHandler = downloadHandler;
|
DownloadHandler = downloadHandler;
|
||||||
KeyboardHandler = keyboardHandler;
|
KeyboardHandler = keyboardHandler;
|
||||||
LifeSpanHandler = lifeSpanHandler;
|
LifeSpanHandler = lifeSpanHandler;
|
||||||
|
|
|
@ -13,8 +13,13 @@ namespace SafeExamBrowser.Browser
|
||||||
{
|
{
|
||||||
public class BrowserIconResource : IIconResource
|
public class BrowserIconResource : IIconResource
|
||||||
{
|
{
|
||||||
public Uri Uri => new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/SafeExamBrowser.ico");
|
public Uri Uri { get; private set; }
|
||||||
public bool IsBitmapResource => true;
|
public bool IsBitmapResource => true;
|
||||||
public bool IsXamlResource => false;
|
public bool IsXamlResource => false;
|
||||||
|
|
||||||
|
public BrowserIconResource(string uri = null)
|
||||||
|
{
|
||||||
|
Uri = new Uri(uri ?? "pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/SafeExamBrowser.ico");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
SafeExamBrowser.Browser/Events/FaviconChangedEventHandler.cs
Normal file
12
SafeExamBrowser.Browser/Events/FaviconChangedEventHandler.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Browser.Events
|
||||||
|
{
|
||||||
|
internal delegate void FaviconChangedEventHandler(string uri);
|
||||||
|
}
|
63
SafeExamBrowser.Browser/Handlers/DisplayHandler.cs
Normal file
63
SafeExamBrowser.Browser/Handlers/DisplayHandler.cs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using CefSharp;
|
||||||
|
using CefSharp.Structs;
|
||||||
|
using SafeExamBrowser.Browser.Events;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Browser.Handlers
|
||||||
|
{
|
||||||
|
/// <remarks>
|
||||||
|
/// See https://cefsharp.github.io/api/67.0.0/html/T_CefSharp_IDisplayHandler.htm.
|
||||||
|
/// </remarks>
|
||||||
|
internal class DisplayHandler : IDisplayHandler
|
||||||
|
{
|
||||||
|
public event FaviconChangedEventHandler FaviconChanged;
|
||||||
|
|
||||||
|
public void OnAddressChanged(IWebBrowser chromiumWebBrowser, AddressChangedEventArgs addressChangedArgs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OnAutoResize(IWebBrowser chromiumWebBrowser, IBrowser browser, Size newSize)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OnConsoleMessage(IWebBrowser chromiumWebBrowser, ConsoleMessageEventArgs consoleMessageArgs)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnFaviconUrlChange(IWebBrowser chromiumWebBrowser, IBrowser browser, IList<string> urls)
|
||||||
|
{
|
||||||
|
if (urls.Any())
|
||||||
|
{
|
||||||
|
FaviconChanged?.Invoke(urls.First());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnFullscreenModeChange(IWebBrowser chromiumWebBrowser, IBrowser browser, bool fullscreen)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnStatusMessage(IWebBrowser chromiumWebBrowser, StatusMessageEventArgs statusMessageArgs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnTitleChanged(IWebBrowser chromiumWebBrowser, TitleChangedEventArgs titleChangedArgs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OnTooltipChanged(IWebBrowser chromiumWebBrowser, ref string text)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,6 +66,7 @@
|
||||||
<Compile Include="BrowserApplicationInfo.cs" />
|
<Compile Include="BrowserApplicationInfo.cs" />
|
||||||
<Compile Include="BrowserApplicationInstance.cs" />
|
<Compile Include="BrowserApplicationInstance.cs" />
|
||||||
<Compile Include="BrowserInstanceIdentifier.cs" />
|
<Compile Include="BrowserInstanceIdentifier.cs" />
|
||||||
|
<Compile Include="Events\FaviconChangedEventHandler.cs" />
|
||||||
<Compile Include="Events\PopupRequestedEventArgs.cs" />
|
<Compile Include="Events\PopupRequestedEventArgs.cs" />
|
||||||
<Compile Include="Events\PopupRequestedEventHandler.cs" />
|
<Compile Include="Events\PopupRequestedEventHandler.cs" />
|
||||||
<Compile Include="Events\ReloadRequestedEventHandler.cs" />
|
<Compile Include="Events\ReloadRequestedEventHandler.cs" />
|
||||||
|
@ -74,6 +75,7 @@
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="BrowserIconResource.cs" />
|
<Compile Include="BrowserIconResource.cs" />
|
||||||
|
<Compile Include="Handlers\DisplayHandler.cs" />
|
||||||
<Compile Include="Handlers\DownloadHandler.cs" />
|
<Compile Include="Handlers\DownloadHandler.cs" />
|
||||||
<Compile Include="Handlers\KeyboardHandler.cs" />
|
<Compile Include="Handlers\KeyboardHandler.cs" />
|
||||||
<Compile Include="Handlers\LifeSpanHandler.cs" />
|
<Compile Include="Handlers\LifeSpanHandler.cs" />
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using SafeExamBrowser.Contracts.Configuration;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Contracts.Core.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Event handler used to indicate that the icon of an <see cref="IApplicationInstance"/> has changed.
|
||||||
|
/// </summary>
|
||||||
|
public delegate void IconChangedEventHandler(IIconResource icon);
|
||||||
|
}
|
|
@ -6,7 +6,6 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.Contracts.Core.Events
|
namespace SafeExamBrowser.Contracts.Core.Events
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -26,6 +26,11 @@ namespace SafeExamBrowser.Contracts.Core
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when the icon of the application instance has changed.
|
||||||
|
/// </summary>
|
||||||
|
event IconChangedEventHandler IconChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event fired when the application instance has been terminated.
|
/// Event fired when the application instance has been terminated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
<Compile Include="Configuration\DataResources\IResourceSaver.cs" />
|
<Compile Include="Configuration\DataResources\IResourceSaver.cs" />
|
||||||
<Compile Include="Configuration\SaveStatus.cs" />
|
<Compile Include="Configuration\SaveStatus.cs" />
|
||||||
<Compile Include="Configuration\Settings\UserInterfaceMode.cs" />
|
<Compile Include="Configuration\Settings\UserInterfaceMode.cs" />
|
||||||
|
<Compile Include="Core\Events\IconChangedEventHandler.cs" />
|
||||||
<Compile Include="Core\Events\InstanceTerminatedEventHandler.cs" />
|
<Compile Include="Core\Events\InstanceTerminatedEventHandler.cs" />
|
||||||
<Compile Include="Core\Events\NameChangedEventHandler.cs" />
|
<Compile Include="Core\Events\NameChangedEventHandler.cs" />
|
||||||
<Compile Include="Core\IApplicationController.cs" />
|
<Compile Include="Core\IApplicationController.cs" />
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using SafeExamBrowser.Contracts.Configuration;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Windows;
|
using SafeExamBrowser.Contracts.UserInterface.Windows;
|
||||||
|
|
||||||
|
@ -46,6 +47,11 @@ namespace SafeExamBrowser.Contracts.UserInterface.Browser
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void UpdateAddress(string adress);
|
void UpdateAddress(string adress);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the icon of the browser window.
|
||||||
|
/// </summary>
|
||||||
|
void UpdateIcon(IIconResource icon);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the loading state according to the given value.
|
/// Updates the loading state according to the given value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using SafeExamBrowser.Contracts.Configuration;
|
||||||
using SafeExamBrowser.Contracts.Configuration.Settings;
|
using SafeExamBrowser.Contracts.Configuration.Settings;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Browser;
|
using SafeExamBrowser.Contracts.UserInterface.Browser;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
||||||
|
@ -89,6 +91,11 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
Dispatcher.Invoke(() => UrlTextBox.Text = url);
|
Dispatcher.Invoke(() => UrlTextBox.Text = url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateIcon(IIconResource icon)
|
||||||
|
{
|
||||||
|
Dispatcher.BeginInvoke(new Action(() => Icon = new BitmapImage(icon.Uri)));
|
||||||
|
}
|
||||||
|
|
||||||
public void UpdateLoadingState(bool isLoading)
|
public void UpdateLoadingState(bool isLoading)
|
||||||
{
|
{
|
||||||
Dispatcher.Invoke(() =>
|
Dispatcher.Invoke(() =>
|
||||||
|
|
|
@ -6,10 +6,11 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using SafeExamBrowser.Contracts.Core;
|
|
||||||
using SafeExamBrowser.Contracts.Configuration;
|
using SafeExamBrowser.Contracts.Configuration;
|
||||||
|
using SafeExamBrowser.Contracts.Core;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events;
|
using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events;
|
||||||
using SafeExamBrowser.UserInterface.Desktop.Utilities;
|
using SafeExamBrowser.UserInterface.Desktop.Utilities;
|
||||||
|
|
||||||
|
@ -37,14 +38,22 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
Text.Text = instance.Name;
|
Text.Text = instance.Name;
|
||||||
Button.ToolTip = instance.Name;
|
Button.ToolTip = instance.Name;
|
||||||
|
|
||||||
instance.NameChanged += (name) =>
|
instance.IconChanged += Instance_IconChanged;
|
||||||
|
instance.NameChanged += Instance_NameChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Instance_IconChanged(IIconResource icon)
|
||||||
|
{
|
||||||
|
Dispatcher.BeginInvoke(new Action(() => Icon.Content = IconResourceLoader.Load(icon)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Instance_NameChanged(string name)
|
||||||
|
{
|
||||||
|
Dispatcher.Invoke(() =>
|
||||||
{
|
{
|
||||||
Dispatcher.Invoke(() =>
|
Text.Text = name;
|
||||||
{
|
Button.ToolTip = name;
|
||||||
Text.Text = name;
|
});
|
||||||
Button.ToolTip = name;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Button_Click(object sender, RoutedEventArgs e)
|
private void Button_Click(object sender, RoutedEventArgs e)
|
||||||
|
|
Loading…
Reference in a new issue