Harden editor app windowing boundary

This commit is contained in:
2026-04-26 16:01:07 +08:00
parent f4afaf184e
commit ac626d48c4
31 changed files with 473 additions and 553 deletions

View File

@@ -1,11 +1,9 @@
#include "Platform/Win32/Windowing/EditorWindowHostRuntime.h"
#include "Bootstrap/EditorResources.h"
#include "Composition/EditorContext.h"
#include "Platform/Win32/Chrome/EditorWindowChromeController.h"
#include "Platform/Win32/Windowing/EditorFloatingWindowPlacement.h"
#include "Platform/Win32/Windowing/EditorWindow.h"
#include "Windowing/Content/EditorWindowContentFactory.h"
#include "Windowing/Content/EditorWindowContentController.h"
#include "Windowing/Host/EditorWindowHostCoordinator.h"
#include "Platform/Win32/Runtime/EditorWindowFrameDriver.h"
@@ -57,16 +55,14 @@ std::string DescribeHostWindows(
EditorWindowHostRuntime::EditorWindowHostRuntime(
EditorWindowHostConfig hostConfig,
std::filesystem::path repoRoot,
EditorContext& editorContext,
EditorWindowContentFactory& contentFactory)
std::filesystem::path captureRoot)
: m_hostConfig(hostConfig),
m_repoRoot(std::move(repoRoot)),
m_editorContext(editorContext),
m_contentFactory(contentFactory) {}
m_captureRoot(std::move(captureRoot)) {}
EditorWindowHostRuntime::~EditorWindowHostRuntime() = default;
EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
EditorWindow* EditorWindowHostRuntime::CreateHostWindow(
std::unique_ptr<EditorWindowContentController> contentController,
const EditorWindowCreateParams& params) {
if (contentController == nullptr) {
@@ -177,10 +173,14 @@ EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
SendMessageW(hwnd, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(smallIcon));
}
if (m_hostCoordinator == nullptr) {
return failWindowInitialization("managed window initialization failed: coordinator missing");
}
if (!rawWindow->Initialize(
m_repoRoot,
m_editorContext,
m_editorContext.GetShellAsset().captureRootPath,
m_hostCoordinator->GetEditorContext(),
m_captureRoot,
params.autoCaptureOnStartup)) {
return failWindowInitialization("managed window initialization failed");
}
@@ -190,35 +190,6 @@ EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
return rawWindow;
}
EditorWindow* EditorWindowHostRuntime::CreateWorkspaceWindow(
const UIEditorWindowWorkspaceState& windowState,
const EditorWindowCreateParams& params) {
if (windowState.windowId.empty()) {
LogRuntimeTrace("window", "workspace window creation rejected: state missing window id");
return nullptr;
}
if (!params.windowId.empty() && windowState.windowId != params.windowId) {
LogRuntimeTrace(
"window",
"workspace window creation rejected: state window id '" +
windowState.windowId + "' does not match create params '" +
params.windowId + "'");
return nullptr;
}
return CreateEditorWindow(
m_contentFactory.CreateWorkspaceContentController(windowState),
params);
}
EditorWindow* EditorWindowHostRuntime::CreateUtilityWindow(
const EditorUtilityWindowDescriptor& descriptor,
const EditorWindowCreateParams& params) {
return CreateEditorWindow(
m_contentFactory.CreateUtilityContentController(descriptor),
params);
}
void EditorWindowHostRuntime::BindHostCoordinator(
EditorWindowHostCoordinator& hostCoordinator) {
m_hostCoordinator = &hostCoordinator;
@@ -370,7 +341,7 @@ void EditorWindowHostRuntime::RenderAllWindows() {
EditorWindowFrameTransferRequests transferRequests =
EditorWindowFrameDriver::DriveFrame(
*window,
m_editorContext,
m_hostCoordinator->GetEditorContext(),
m_hostCoordinator->IsGlobalTabDragActive());
m_hostCoordinator->RefreshWindowPresentation(*window);
if (!transferRequests.HasPendingRequests()) {