From ba2f46424957d321db5504256824746bda0a3d9a Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 1 Nov 2021 21:03:51 +0100 Subject: [PATCH] Restructure CEF stuff in preparation for launcher packaging. Robust.Client.CEF Renamed to Robust.Client.WebView since CEF should really be an implementation detail. Content is no longer responsible for initializing and managing the module, this is done automatically by the engine. WebView is initialized by declaring it in a manifest.yml file in the game resources. In the future the launcher will read this same file to manage WebView module versions. CefManager has been made private and the content-visible API is now IWebViewManager. --- Robust.Client.CEF/IBrowserWindow.cs | 9 --- Robust.Client.CEF/Robust.Client.CEF.csproj | 25 -------- .../BeforeBrowseContext.cs | 2 +- .../BrowserWindowCreateParameters.cs | 2 +- .../CefKeyCodes.cs | 2 +- .../CefManager.BrowserWindow.cs | 20 +++---- .../CefManager.cs | 33 +++++------ .../IWebViewControl.cs | 4 +- Robust.Client.WebView/IWebViewManager.cs | 7 +++ Robust.Client.WebView/IWebViewWindow.cs | 9 +++ .../ImageBuffer.cs | 2 +- .../Program.cs | 2 +- .../RequestHandlerContext.cs | 2 +- .../RequestResults.cs | 2 +- .../Robust.Client.WebView.csproj | 25 ++++++++ .../RobustCefApp.cs | 2 +- .../RobustCefClient.cs | 2 +- .../RobustLoadHandler.cs | 2 +- .../RobustRequestHandler.cs | 2 +- .../WebView.cs | 14 +++-- .../GameController.RobustModules.cs | 52 ++++++++++++++++ .../GameController/GameController.cs | 59 +++++++++++++++++-- Robust.Client/Properties/AssemblyInfo.cs | 2 +- .../WebViewHook/IWebViewManagerHook.cs | 25 ++++++++ Robust.Shared/Properties/AssemblyInfo.cs | 2 +- 25 files changed, 219 insertions(+), 89 deletions(-) delete mode 100644 Robust.Client.CEF/IBrowserWindow.cs delete mode 100644 Robust.Client.CEF/Robust.Client.CEF.csproj rename {Robust.Client.CEF => Robust.Client.WebView}/BeforeBrowseContext.cs (95%) rename {Robust.Client.CEF => Robust.Client.WebView}/BrowserWindowCreateParameters.cs (90%) rename {Robust.Client.CEF => Robust.Client.WebView}/CefKeyCodes.cs (99%) rename {Robust.Client.CEF => Robust.Client.WebView}/CefManager.BrowserWindow.cs (89%) rename {Robust.Client.CEF => Robust.Client.WebView}/CefManager.cs (79%) rename Robust.Client.CEF/IBrowserControl.cs => Robust.Client.WebView/IWebViewControl.cs (94%) create mode 100644 Robust.Client.WebView/IWebViewManager.cs create mode 100644 Robust.Client.WebView/IWebViewWindow.cs rename {Robust.Client.CEF => Robust.Client.WebView}/ImageBuffer.cs (97%) rename {Robust.Client.CEF => Robust.Client.WebView}/Program.cs (96%) rename {Robust.Client.CEF => Robust.Client.WebView}/RequestHandlerContext.cs (97%) rename {Robust.Client.CEF => Robust.Client.WebView}/RequestResults.cs (98%) create mode 100644 Robust.Client.WebView/Robust.Client.WebView.csproj rename {Robust.Client.CEF => Robust.Client.WebView}/RobustCefApp.cs (97%) rename {Robust.Client.CEF => Robust.Client.WebView}/RobustCefClient.cs (96%) rename {Robust.Client.CEF => Robust.Client.WebView}/RobustLoadHandler.cs (93%) rename {Robust.Client.CEF => Robust.Client.WebView}/RobustRequestHandler.cs (99%) rename Robust.Client.CEF/BrowserControl.cs => Robust.Client.WebView/WebView.cs (98%) create mode 100644 Robust.Client/GameController/GameController.RobustModules.cs create mode 100644 Robust.Client/WebViewHook/IWebViewManagerHook.cs diff --git a/Robust.Client.CEF/IBrowserWindow.cs b/Robust.Client.CEF/IBrowserWindow.cs deleted file mode 100644 index 137ed8a98..000000000 --- a/Robust.Client.CEF/IBrowserWindow.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace Robust.Client.CEF -{ - public interface IBrowserWindow : IBrowserControl, IDisposable - { - bool Closed { get; } - } -} diff --git a/Robust.Client.CEF/Robust.Client.CEF.csproj b/Robust.Client.CEF/Robust.Client.CEF.csproj deleted file mode 100644 index 806343e6b..000000000 --- a/Robust.Client.CEF/Robust.Client.CEF.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - - net5.0 - x64 - true - WinExe - - - - - - - - - - - - - - - - - diff --git a/Robust.Client.CEF/BeforeBrowseContext.cs b/Robust.Client.WebView/BeforeBrowseContext.cs similarity index 95% rename from Robust.Client.CEF/BeforeBrowseContext.cs rename to Robust.Client.WebView/BeforeBrowseContext.cs index 31b35db8a..a50b1c110 100644 --- a/Robust.Client.CEF/BeforeBrowseContext.cs +++ b/Robust.Client.WebView/BeforeBrowseContext.cs @@ -1,6 +1,6 @@ using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { public sealed class BeforeBrowseContext { diff --git a/Robust.Client.CEF/BrowserWindowCreateParameters.cs b/Robust.Client.WebView/BrowserWindowCreateParameters.cs similarity index 90% rename from Robust.Client.CEF/BrowserWindowCreateParameters.cs rename to Robust.Client.WebView/BrowserWindowCreateParameters.cs index a08b62fe5..2314845dd 100644 --- a/Robust.Client.CEF/BrowserWindowCreateParameters.cs +++ b/Robust.Client.WebView/BrowserWindowCreateParameters.cs @@ -1,4 +1,4 @@ -namespace Robust.Client.CEF +namespace Robust.Client.WebView { public sealed class BrowserWindowCreateParameters { diff --git a/Robust.Client.CEF/CefKeyCodes.cs b/Robust.Client.WebView/CefKeyCodes.cs similarity index 99% rename from Robust.Client.CEF/CefKeyCodes.cs rename to Robust.Client.WebView/CefKeyCodes.cs index 712912ad1..f70d64641 100644 --- a/Robust.Client.CEF/CefKeyCodes.cs +++ b/Robust.Client.WebView/CefKeyCodes.cs @@ -1,7 +1,7 @@  using System.Diagnostics.CodeAnalysis; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "UnusedMember.Global")] diff --git a/Robust.Client.CEF/CefManager.BrowserWindow.cs b/Robust.Client.WebView/CefManager.BrowserWindow.cs similarity index 89% rename from Robust.Client.CEF/CefManager.BrowserWindow.cs rename to Robust.Client.WebView/CefManager.BrowserWindow.cs index 1fb4bc318..694049be1 100644 --- a/Robust.Client.CEF/CefManager.BrowserWindow.cs +++ b/Robust.Client.WebView/CefManager.BrowserWindow.cs @@ -6,17 +6,17 @@ using Robust.Shared.Log; using Robust.Shared.ViewVariables; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { - public partial class CefManager + internal partial class CefManager { [Dependency] private readonly IClydeInternal _clyde = default!; - private readonly List _browserWindows = new(); + private readonly List _browserWindows = new(); - public IEnumerable AllBrowserWindows => _browserWindows; + public IEnumerable AllBrowserWindows => _browserWindows; - public IBrowserWindow CreateBrowserWindow(BrowserWindowCreateParameters createParams) + public IWebViewWindow CreateBrowserWindow(BrowserWindowCreateParameters createParams) { var mainHWnd = (_clyde.MainWindow as IClydeWindowInternal)?.WindowsHWnd ?? 0; @@ -25,7 +25,7 @@ namespace Robust.Client.CEF info.Height = createParams.Height; info.SetAsPopup(mainHWnd, "ss14cef"); - var impl = new BrowserWindowImpl(this); + var impl = new WebViewWindowImpl(this); var lifeSpanHandler = new WindowLifeSpanHandler(impl); var reqHandler = new RobustRequestHandler(Logger.GetSawmill("root")); @@ -40,7 +40,7 @@ namespace Robust.Client.CEF return impl; } - private sealed class BrowserWindowImpl : IBrowserWindow + private sealed class WebViewWindowImpl : IWebViewWindow { private readonly CefManager _manager; internal CefBrowser Browser = default!; @@ -73,7 +73,7 @@ namespace Robust.Client.CEF } } - public BrowserWindowImpl(CefManager manager) + public WebViewWindowImpl(CefManager manager) { _manager = manager; } @@ -168,9 +168,9 @@ namespace Robust.Client.CEF private sealed class WindowLifeSpanHandler : CefLifeSpanHandler { - private readonly BrowserWindowImpl _windowImpl; + private readonly WebViewWindowImpl _windowImpl; - public WindowLifeSpanHandler(BrowserWindowImpl windowImpl) + public WindowLifeSpanHandler(WebViewWindowImpl windowImpl) { _windowImpl = windowImpl; } diff --git a/Robust.Client.CEF/CefManager.cs b/Robust.Client.WebView/CefManager.cs similarity index 79% rename from Robust.Client.CEF/CefManager.cs rename to Robust.Client.WebView/CefManager.cs index ce51754a8..e4e074afe 100644 --- a/Robust.Client.CEF/CefManager.cs +++ b/Robust.Client.WebView/CefManager.cs @@ -1,36 +1,37 @@ using System; using System.IO; -using JetBrains.Annotations; +using Robust.Client.WebView; +using Robust.Client.WebViewHook; using Robust.Shared.ContentPack; +using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Utility; -// The library we're using right now. TODO CEF: Do we want to use something else? We will need to ship it ourselves if so. +// The library we're using right now. +// TODO CEF: Do we want to use something else? We will need to ship it ourselves if so. using Xilium.CefGlue; -namespace Robust.Client.CEF +[assembly: WebViewManagerImpl(typeof(CefManager))] + +namespace Robust.Client.WebView { - // Register this with IoC. - // TODO CEF: think if making this inherit CefApp is a good idea... - // TODO CEF: A way to handle external window browsers... - [UsedImplicitly] - public partial class CefManager + internal partial class CefManager : IWebViewManagerHook, IWebViewManager { private CefApp _app = default!; private bool _initialized = false; - /// - /// Call this to initialize CEF. - /// public void Initialize() { + IoCManager.RegisterInstance(this); + IoCManager.RegisterInstance(this); + DebugTools.Assert(!_initialized); string subProcessName; if (OperatingSystem.IsWindows()) - subProcessName = "Robust.Client.CEF.exe"; + subProcessName = "Robust.Client.WebView.exe"; else if (OperatingSystem.IsLinux()) - subProcessName = "Robust.Client.CEF"; + subProcessName = "Robust.Client.WebView"; else throw new NotSupportedException("Unsupported platform for CEF!"); @@ -77,9 +78,6 @@ namespace Robust.Client.CEF throw new InvalidOperationException("CefManager has not been initialized!"); } - /// - /// Needs to be called regularly for CEF to keep working. - /// public void Update() { DebugTools.Assert(_initialized); @@ -88,9 +86,6 @@ namespace Robust.Client.CEF CefRuntime.DoMessageLoopWork(); } - /// - /// Call before program shutdown. - /// public void Shutdown() { DebugTools.Assert(_initialized); diff --git a/Robust.Client.CEF/IBrowserControl.cs b/Robust.Client.WebView/IWebViewControl.cs similarity index 94% rename from Robust.Client.CEF/IBrowserControl.cs rename to Robust.Client.WebView/IWebViewControl.cs index 807d39f65..2010434b3 100644 --- a/Robust.Client.CEF/IBrowserControl.cs +++ b/Robust.Client.WebView/IWebViewControl.cs @@ -1,8 +1,8 @@ using System; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { - public interface IBrowserControl + public interface IWebViewControl { /// /// Current URL of the browser. Set to load a new page. diff --git a/Robust.Client.WebView/IWebViewManager.cs b/Robust.Client.WebView/IWebViewManager.cs new file mode 100644 index 000000000..d0f5fb603 --- /dev/null +++ b/Robust.Client.WebView/IWebViewManager.cs @@ -0,0 +1,7 @@ +namespace Robust.Client.WebView +{ + public interface IWebViewManager + { + IWebViewWindow CreateBrowserWindow(BrowserWindowCreateParameters createParams); + } +} diff --git a/Robust.Client.WebView/IWebViewWindow.cs b/Robust.Client.WebView/IWebViewWindow.cs new file mode 100644 index 000000000..a502c6c86 --- /dev/null +++ b/Robust.Client.WebView/IWebViewWindow.cs @@ -0,0 +1,9 @@ +using System; + +namespace Robust.Client.WebView +{ + public interface IWebViewWindow : IWebViewControl, IDisposable + { + bool Closed { get; } + } +} diff --git a/Robust.Client.CEF/ImageBuffer.cs b/Robust.Client.WebView/ImageBuffer.cs similarity index 97% rename from Robust.Client.CEF/ImageBuffer.cs rename to Robust.Client.WebView/ImageBuffer.cs index cf11f2c70..924afbea6 100644 --- a/Robust.Client.CEF/ImageBuffer.cs +++ b/Robust.Client.WebView/ImageBuffer.cs @@ -6,7 +6,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { internal sealed class ImageBuffer { diff --git a/Robust.Client.CEF/Program.cs b/Robust.Client.WebView/Program.cs similarity index 96% rename from Robust.Client.CEF/Program.cs rename to Robust.Client.WebView/Program.cs index b54b6badd..b5e72e59d 100644 --- a/Robust.Client.CEF/Program.cs +++ b/Robust.Client.WebView/Program.cs @@ -1,7 +1,7 @@ using System; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { public static class Program { diff --git a/Robust.Client.CEF/RequestHandlerContext.cs b/Robust.Client.WebView/RequestHandlerContext.cs similarity index 97% rename from Robust.Client.CEF/RequestHandlerContext.cs rename to Robust.Client.WebView/RequestHandlerContext.cs index 500ffd535..f987dce9a 100644 --- a/Robust.Client.CEF/RequestHandlerContext.cs +++ b/Robust.Client.WebView/RequestHandlerContext.cs @@ -3,7 +3,7 @@ using System.IO; using System.Net; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { public sealed class RequestHandlerContext { diff --git a/Robust.Client.CEF/RequestResults.cs b/Robust.Client.WebView/RequestResults.cs similarity index 98% rename from Robust.Client.CEF/RequestResults.cs rename to Robust.Client.WebView/RequestResults.cs index c49521148..e510c91dc 100644 --- a/Robust.Client.CEF/RequestResults.cs +++ b/Robust.Client.WebView/RequestResults.cs @@ -3,7 +3,7 @@ using System.IO; using System.Net; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { internal interface IRequestResult { diff --git a/Robust.Client.WebView/Robust.Client.WebView.csproj b/Robust.Client.WebView/Robust.Client.WebView.csproj new file mode 100644 index 000000000..a9feaab3b --- /dev/null +++ b/Robust.Client.WebView/Robust.Client.WebView.csproj @@ -0,0 +1,25 @@ + + + + + + net5.0 + x64 + true + WinExe + + + + + + + + + + + + + + + + diff --git a/Robust.Client.CEF/RobustCefApp.cs b/Robust.Client.WebView/RobustCefApp.cs similarity index 97% rename from Robust.Client.CEF/RobustCefApp.cs rename to Robust.Client.WebView/RobustCefApp.cs index 816fbaf52..74144ec55 100644 --- a/Robust.Client.CEF/RobustCefApp.cs +++ b/Robust.Client.WebView/RobustCefApp.cs @@ -3,7 +3,7 @@ using Robust.Shared.IoC; using Robust.Shared.Log; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { internal class RobustCefApp : CefApp { diff --git a/Robust.Client.CEF/RobustCefClient.cs b/Robust.Client.WebView/RobustCefClient.cs similarity index 96% rename from Robust.Client.CEF/RobustCefClient.cs rename to Robust.Client.WebView/RobustCefClient.cs index 4a6bf9e2b..623f0f336 100644 --- a/Robust.Client.CEF/RobustCefClient.cs +++ b/Robust.Client.WebView/RobustCefClient.cs @@ -1,6 +1,6 @@ using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { // Simple CEF client. internal class RobustCefClient : CefClient diff --git a/Robust.Client.CEF/RobustLoadHandler.cs b/Robust.Client.WebView/RobustLoadHandler.cs similarity index 93% rename from Robust.Client.CEF/RobustLoadHandler.cs rename to Robust.Client.WebView/RobustLoadHandler.cs index ead54c673..a0345b975 100644 --- a/Robust.Client.CEF/RobustLoadHandler.cs +++ b/Robust.Client.WebView/RobustLoadHandler.cs @@ -1,6 +1,6 @@ using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { public sealed class RobustLoadHandler : CefLoadHandler { diff --git a/Robust.Client.CEF/RobustRequestHandler.cs b/Robust.Client.WebView/RobustRequestHandler.cs similarity index 99% rename from Robust.Client.CEF/RobustRequestHandler.cs rename to Robust.Client.WebView/RobustRequestHandler.cs index 5721684c7..de4d42ad2 100644 --- a/Robust.Client.CEF/RobustRequestHandler.cs +++ b/Robust.Client.WebView/RobustRequestHandler.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using Robust.Shared.Log; using Xilium.CefGlue; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { internal sealed class RobustRequestHandler : CefRequestHandler { diff --git a/Robust.Client.CEF/BrowserControl.cs b/Robust.Client.WebView/WebView.cs similarity index 98% rename from Robust.Client.CEF/BrowserControl.cs rename to Robust.Client.WebView/WebView.cs index 5d40ba570..f2a49283f 100644 --- a/Robust.Client.CEF/BrowserControl.cs +++ b/Robust.Client.WebView/WebView.cs @@ -10,14 +10,16 @@ using Robust.Shared.Utility; using Robust.Shared.ViewVariables; using SixLabors.ImageSharp.PixelFormats; using Xilium.CefGlue; -using static Robust.Client.CEF.CefKeyCodes; -using static Robust.Client.CEF.CefKeyCodes.ChromiumKeyboardCode; +using static Robust.Client.WebView.CefKeyCodes; +using static Robust.Client.WebView.CefKeyCodes.ChromiumKeyboardCode; using static Robust.Client.Input.Keyboard; -namespace Robust.Client.CEF +namespace Robust.Client.WebView { - // Funny browser control to integrate in UI. - public class BrowserControl : Control, IBrowserControl, IRawInputControl + /// + /// An UI control that presents web content. + /// + public sealed class WebView : Control, IWebViewControl, IRawInputControl { private const int ScrollSpeed = 50; @@ -146,7 +148,7 @@ namespace Robust.Client.CEF [Key.Pause] = VKEY_PAUSE, }; - public BrowserControl() + public WebView() { CanKeyboardFocus = true; KeyboardFocusOnClick = true; diff --git a/Robust.Client/GameController/GameController.RobustModules.cs b/Robust.Client/GameController/GameController.RobustModules.cs new file mode 100644 index 000000000..640771aad --- /dev/null +++ b/Robust.Client/GameController/GameController.RobustModules.cs @@ -0,0 +1,52 @@ +using System; +using System.Reflection; +using Robust.Client.WebViewHook; +using Robust.Shared.Log; +using Robust.Shared.Utility; + +namespace Robust.Client +{ + internal sealed partial class GameController + { + private void LoadOptionalRobustModules() + { + // In the future, this manifest should be loaded somewhere else and used for more parts of init. + // For now, this is fine. + var manifest = LoadResourceManifest(); + + foreach (var module in manifest.Modules) + { + switch (module) + { + case "Robust.Client.WebView": + LoadRobustWebView(); + break; + default: + Logger.Error($"Unknown Robust module: {module}"); + return; + } + } + } + + private void LoadRobustWebView() + { + Logger.Debug("Loading Robust.Client.WebView"); + + var assembly = LoadRobustModuleAssembly("Robust.Client.WebView"); + var attribute = assembly.GetCustomAttribute()!; + DebugTools.AssertNotNull(attribute); + + var managerType = attribute.ImplementationType; + _webViewHook = (IWebViewManagerHook)Activator.CreateInstance(managerType)!; + _webViewHook.Initialize(); + + Logger.Debug("Done initializing Robust.Client.WebView"); + } + + private Assembly LoadRobustModuleAssembly(string assemblyName) + { + // TODO: Launcher distribution and all that stuff. + return Assembly.Load(assemblyName); + } + } +} diff --git a/Robust.Client/GameController/GameController.cs b/Robust.Client/GameController/GameController.cs index 18be0bbf1..76859ccac 100644 --- a/Robust.Client/GameController/GameController.cs +++ b/Robust.Client/GameController/GameController.cs @@ -17,6 +17,7 @@ using Robust.Client.State; using Robust.Client.UserInterface; using Robust.Client.Utility; using Robust.Client.ViewVariables; +using Robust.Client.WebViewHook; using Robust.LoaderApi; using Robust.Shared; using Robust.Shared.Asynchronous; @@ -32,6 +33,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager; using Robust.Shared.Timing; using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; namespace Robust.Client { @@ -67,6 +69,8 @@ namespace Robust.Client [Dependency] private readonly IMidiManager _midiManager = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; + private IWebViewManagerHook? _webViewHook; + private CommandLineArgs? _commandLineArgs; // Arguments for loader-load. Not used otherwise. @@ -87,7 +91,7 @@ namespace Robust.Client _clyde.SetWindowTitle(Options.DefaultWindowTitle); _taskManager.Initialize(); - _fontManager.SetFontDpi((uint) _configurationManager.GetCVar(CVars.DisplayFontDpi)); + _fontManager.SetFontDpi((uint)_configurationManager.GetCVar(CVars.DisplayFontDpi)); // Disable load context usage on content start. // This prevents Content.Client being loaded twice and things like csi blowing up because of it. @@ -107,6 +111,9 @@ namespace Robust.Client IoCManager.Resolve().Initialize(); + // Load optional Robust modules. + LoadOptionalRobustModules(); + // Call Init in game assemblies. _modLoader.BroadcastRunLevel(ModRunLevel.PreInit); _modLoader.BroadcastRunLevel(ModRunLevel.Init); @@ -196,6 +203,39 @@ namespace Robust.Client return true; } + private ResourceManifestData LoadResourceManifest() + { + // Parses /manifest.yml for game-specific settings that cannot be exclusively set up by content code. + if (!_resourceCache.TryContentFileRead("/manifest.yml", out var stream)) + return new ResourceManifestData(Array.Empty()); + + var yamlStream = new YamlStream(); + using (stream) + { + using var streamReader = new StreamReader(stream, EncodingHelpers.UTF8); + yamlStream.Load(streamReader); + } + + if (yamlStream.Documents.Count != 1 || yamlStream.Documents[0].RootNode is not YamlMappingNode mapping) + { + throw new InvalidOperationException( + "Expected a single YAML document with root mapping for /manifest.yml"); + } + + var modules = Array.Empty(); + if (mapping.TryGetNode("modules", out var modulesMap)) + { + var sequence = (YamlSequenceNode)modulesMap; + modules = new string[sequence.Children.Count]; + for (var i = 0; i < modules.Length; i++) + { + modules[i] = sequence[i].AsString(); + } + } + + return new ResourceManifestData(modules); + } + internal bool StartupSystemSplash(GameControllerOptions options, Func? logHandlerFactory) { Options = options; @@ -217,8 +257,10 @@ namespace Robust.Client System.Console.WriteLine($"LogLevel {level} does not exist!"); continue; } + logLevel = result; } + _logManager.GetSawmill(sawmill).Level = logLevel; } } @@ -259,7 +301,7 @@ namespace Robust.Client { // Handle GameControllerOptions implicit CVar overrides. - _configurationManager.OverrideConVars(new [] + _configurationManager.OverrideConVars(new[] { (CVars.DisplayWindowIconSet.Name, options.WindowIconSet.ToString()), (CVars.DisplaySplashLogo.Name, options.SplashLogo.ToString()) @@ -271,9 +313,11 @@ namespace Robust.Client _resourceCache.Initialize(Options.LoadConfigAndUserData ? userDataDir : null); var mountOptions = _commandLineArgs != null - ? MountOptions.Merge(_commandLineArgs.MountOptions, Options.MountOptions) : Options.MountOptions; + ? MountOptions.Merge(_commandLineArgs.MountOptions, Options.MountOptions) + : Options.MountOptions; - ProgramShared.DoMounts(_resourceCache, mountOptions, Options.ContentBuildDirectory, Options.AssemblyDirectory, + ProgramShared.DoMounts(_resourceCache, mountOptions, Options.ContentBuildDirectory, + Options.AssemblyDirectory, Options.LoadContentResources, _loaderArgs != null && !Options.ResourceMountDisabled, ContentStart); if (_loaderArgs != null) @@ -394,6 +438,7 @@ namespace Robust.Client private void Update(FrameEventArgs frameEventArgs) { + _webViewHook?.Update(); _clyde.FrameProcess(frameEventArgs); _modLoader.BroadcastUpdate(ModUpdateLevel.FramePreEngine, frameEventArgs); _stateManager.FrameUpdate(frameEventArgs); @@ -442,7 +487,7 @@ namespace Robust.Client var uh = logManager.GetSawmill("unhandled"); AppDomain.CurrentDomain.UnhandledException += (sender, args) => { - var message = ((Exception) args.ExceptionObject).ToString(); + var message = ((Exception)args.ExceptionObject).ToString(); uh.Log(args.IsTerminating ? LogLevel.Fatal : LogLevel.Error, message); }; @@ -485,11 +530,15 @@ namespace Robust.Client { _modLoader.Shutdown(); + _webViewHook?.Shutdown(); + _networkManager.Shutdown("Client shutting down"); _midiManager.Shutdown(); IoCManager.Resolve().Shutdown(); _entityManager.Shutdown(); _clyde.Shutdown(); } + + private sealed record ResourceManifestData(string[] Modules); } } diff --git a/Robust.Client/Properties/AssemblyInfo.cs b/Robust.Client/Properties/AssemblyInfo.cs index b524c65b9..21c92e6b0 100644 --- a/Robust.Client/Properties/AssemblyInfo.cs +++ b/Robust.Client/Properties/AssemblyInfo.cs @@ -1,7 +1,7 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Robust.UnitTesting")] -[assembly: InternalsVisibleTo("Robust.Client.CEF")] +[assembly: InternalsVisibleTo("Robust.Client.WebView")] [assembly: InternalsVisibleTo("Robust.Lite")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly: InternalsVisibleTo("Robust.Benchmarks")] diff --git a/Robust.Client/WebViewHook/IWebViewManagerHook.cs b/Robust.Client/WebViewHook/IWebViewManagerHook.cs new file mode 100644 index 000000000..455aab622 --- /dev/null +++ b/Robust.Client/WebViewHook/IWebViewManagerHook.cs @@ -0,0 +1,25 @@ +using System; + +namespace Robust.Client.WebViewHook +{ + /// + /// Used so that the IWebViewManager can be loaded when loading Robust.Client.WebView. + /// + [AttributeUsage(AttributeTargets.Assembly)] + internal sealed class WebViewManagerImplAttribute : Attribute + { + public readonly Type ImplementationType; + + public WebViewManagerImplAttribute(Type implementationType) + { + ImplementationType = implementationType; + } + } + + internal interface IWebViewManagerHook + { + void Initialize(); + void Update(); + void Shutdown(); + } +} diff --git a/Robust.Shared/Properties/AssemblyInfo.cs b/Robust.Shared/Properties/AssemblyInfo.cs index c0d1c6bc3..9cb51f852 100644 --- a/Robust.Shared/Properties/AssemblyInfo.cs +++ b/Robust.Shared/Properties/AssemblyInfo.cs @@ -11,7 +11,7 @@ [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // Gives access to Castle(Moq) [assembly: InternalsVisibleTo("Content.Benchmarks")] [assembly: InternalsVisibleTo("Robust.Benchmarks")] -[assembly: InternalsVisibleTo("Robust.Client.CEF")] +[assembly: InternalsVisibleTo("Robust.Client.WebView")] #if NET5_0_OR_GREATER [module: SkipLocalsInit]