108 QNapi::Object windowStageOrWindowObject,
111 auto subWindowOptionsObject =
113 windowStageOrWindowObject.Env(),
115 {
"title", subWindowOptions.windowTitle},
116 {
"decorEnabled", subWindowOptions.decorEnabled},
117 {
"isModal", subWindowOptions.isModal},
119 "windowRect", makeRectObject(windowStageOrWindowObject.Env(), subWindowOptions.windowRect)
123 subWindowOptionsObject.set(
"maximizeSupported",
true);
125 return windowStageOrWindowObject.evalToPromiseOrRejectOnThrow(
126 "createSubWindowWithOptions(*)",
127 {windowName, subWindowOptionsObject});
172 auto sharedContext = QtOhos::moveToSharedPtr(std::move(subWindowOnAppearCbCtx));
177 auto xComponent = takeNodeXComponentFromRegistryOrFail(sharedContext->xComponentId);
179 sharedContext->resultConsumer(
181 QOhosWindowProxyData {
182 .qAbilityPeer = sharedContext->qAbilityPeer,
183 .jsWindow = std::move(sharedContext->windowObject),
184 .windowProxyType = sharedContext->windowProxyType,
185 .subWindowMaximizeSupported = sharedContext->subWindowMaximizeSupported,
186 .nodeXComponent = std::make_shared<QXComponentNode>(xComponent),
187 .jsKeepAliveData = QtOhos::moveToSharedPtr(std::move(sharedContext->localStorageObj)),
188 .owningQWindowRef = sharedContext->owningQWindowRef,
191 sharedContext.reset();
203 auto *env = jsState.env();
205 auto localStorage = makeLocalStorage(jsState);
206 auto subWindowNativeNodeCreateInfo = QNapi::makeObject(
209 {
"xComponentId", createInfo.xComponentId.toNapiValue(env)},
212 [xComponentId = createInfo.xComponentId.stringId()]() {
214 "WindowNativeNodeCreateInfo.onDisAppear() called from JS for xComponentId='%s'",
215 xComponentId.c_str());
220 makeSubWindowOnAppearCallbackHandler(SubWindowOnAppearContext {
221 .xComponentId = createInfo.xComponentId,
222 .localStorageObj = Napi::Persistent(localStorage),
223 .windowObject = Napi::Persistent(createInfo.windowObject),
224 .resultConsumer = std::move(createInfo.resultConsumer),
225 .qAbilityPeer = std::move(createInfo.qAbilityPeer),
226 .windowProxyType = createInfo.windowProxyType,
227 .subWindowMaximizeSupported = createInfo.subWindowMaximizeSupported,
228 .owningQWindowRef = createInfo.owningQWindowRef,
233 localStorage.eval(
"setOrCreate(*)", {
"createInfo", subWindowNativeNodeCreateInfo});
241 struct LoadWindowContentsArgs
243 QNapi::Reference<QNapi::Object> window;
244 QNapi::Reference<QNapi::Object> localStorage;
245 std::string contentPagePath;
248 if (!context.disableWindowFocusableBeforeLoadContentHack)
249 return loadWindowContents(windowObject, context.localStorage, context.contentPagePath);
251 auto loadWindowContentsArgs = LoadWindowContentsArgs {
252 .window = Napi::Persistent(windowObject),
253 .localStorage = Napi::Persistent(context.localStorage),
254 .contentPagePath = context.contentPagePath,
257 return windowObject.evalToPromiseOrRejectOnThrow(
"setWindowFocusable(*)", {
false})
258 .onThen([loadWindowContentsArgs = std::move(loadWindowContentsArgs)]() {
259 return loadWindowContents(
260 loadWindowContentsArgs.window.Value(),
261 loadWindowContentsArgs.localStorage.Value(),
262 loadWindowContentsArgs.contentPagePath);
271 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
273 auto optBaseQAbility = jsState.defaultQAbility();
274 if (!optBaseQAbility)
275 qOhosReportFatalErrorAndAbort(
"%s: can't create window without the default Ability instance", Q_FUNC_INFO);
277 auto abilityStartupOptions =
281 {
"windowLeft", createInfo.frameGeometry.x()},
282 {
"windowTop", createInfo.frameGeometry.y()},
283 {
"windowWidth", createInfo.frameGeometry.width()},
284 {
"windowHeight", createInfo.frameGeometry.height()},
288 auto fullscreenWindowMode = jsState.eval<QNapi::Number>(
289 "@ohos.app.ability.AbilityConstant.WindowMode.WINDOW_MODE_FULLSCREEN");
290 abilityStartupOptions.set(
"windowMode", fullscreenWindowMode);
293 QtOhos::QAbilityInstancesManager::instance(jsState).startNewInstance(
294 optBaseQAbility.value(), createInfo.qWindowRef,
295 abilityStartupOptions,
296 [qWindowRef = createInfo.qWindowRef,
297 windowId = createInfo.windowId,
299 auto createInfo = QOhosWindowProxyExistingMainWindowCreateInfo {
300 .qWindowRef = qWindowRef,
301 .qAbilityInstanceId = qAbilityPeer->instanceId(),
302 .windowId = windowId,
305 makeWindowProxyDataForExistingMainWindowInJsThread(
306 jsState, createInfo,
std::move(resultConsumer));
313 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
316 getQAbilityPeerByInstanceIdOrFail(jsState, createInfo.qAbilityInstanceId));
317 if (!optQUiAbilityPeer) {
318 qOhosReportFatalErrorAndAbort(
319 "%s Attempting to make window proxy for main window for ability without windowStage. This is most likely a programming error. Aborting...",
322 optQUiAbilityPeer->setQWindow(jsState.env(), createInfo.qWindowRef);
324 auto window = optQUiAbilityPeer->window();
326 auto nodeXComponent = takeNodeXComponentFromRegistryOrFail(nativeNodeXComponentId);
330 QOhosWindowProxyData {
331 .qAbilityPeer = optQUiAbilityPeer,
332 .jsWindow = Napi::Persistent(window),
333 .windowProxyType = WindowProxyType::MainWindow,
334 .nodeXComponent = std::make_shared<QXComponentNode>(nodeXComponent),
335 .jsKeepAliveData =
nullptr,
336 .owningQWindowRef = createInfo.qWindowRef,
358 QNapi::Object windowStageOrWindowObject,
360 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
362 auto xComponentId = QXComponentId::createForNativeNodeSubWindow(createInfo.windowId);
365 bool disableWindowFocusableBeforeLoadContentHack;
368 QtOhos::QObjectThreadSafeRef owningQWindowRef;
369 bool createdWithMaximizeSupport;
372 auto qAbilityPeer = getQAbilityPeerByInstanceIdOrFail(jsState, createInfo.qAbilityInstanceId);
376 auto context = QtOhos::moveToSharedPtr(Context {
377 .disableWindowFocusableBeforeLoadContentHack = createInfo.disableWindowFocusableBeforeLoadContentHack,
378 .xComponentId = xComponentId,
379 .qAbilityPeer = qAbilityPeer,
380 .owningQWindowRef = createInfo.window,
381 .createdWithMaximizeSupport = createInfo.maximizeSupported,
388 auto subWindowCreationPromise = [&]() -> QNapi::Promise {
389 if (!isWindowSessionManagerAvailable(jsState)) {
390 context->createdWithMaximizeSupport =
false;
391 return createSubWindowViaWindowStage(qAbilityPeer, windowName);
394 return createSubWindowWithOptions(
395 windowStageOrWindowObject,
398 .windowTitle = createInfo.windowTitle,
399 .decorEnabled = createInfo.decorEnabled,
400 .isModal = createInfo.modal,
401 .maximizeSupported = createInfo.maximizeSupported,
402 .windowRect = createInfo.windowRect,
404 .onCatch([context, qAbilityPeer, windowName](
const QtOhos::CallbackInfo &) -> QNapi::Promise {
407 "createSubWindowWithOptions() is unavailable in this context; "
408 "falling back to createSubWindow()");
409 context->createdWithMaximizeSupport =
false;
410 return createSubWindowViaWindowStage(qAbilityPeer, windowName);
414 subWindowCreationPromise
415 .onThen([resultConsumer = std::move(resultConsumer), context](
const QtOhos::
CallbackInfo &cbInfo)
mutable {
416 auto windowObject = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
418 auto localStorage = makeLocalStorageForWindow(
420 LocalStorageForWindowCreateInfo {
421 .xComponentId = context->xComponentId,
422 .windowObject = windowObject,
423 .resultConsumer = std::move(resultConsumer),
424 .qAbilityPeer = context->qAbilityPeer,
425 .windowProxyType = WindowProxyType::SubWindow,
426 .subWindowMaximizeSupported = context->createdWithMaximizeSupport,
427 .owningQWindowRef = context->owningQWindowRef,
430 return onWindowCreatedLoadWindowContents(
431 cbInfo.jsState(), windowObject,
432 OnWindowCreatedLoadWindowContentsContext {
433 .disableWindowFocusableBeforeLoadContentHack = context->disableWindowFocusableBeforeLoadContentHack,
434 .contentPagePath =
"pages/SubWindowNativeNode",
435 .localStorage = localStorage,
439 QtOhos::logJsCallbackError(cbInfo,
"sub window creation failed");
440 qOhosReportFatalErrorAndAbort(
441 "Failed to create subwindow for windowId='%s'",
442 windowId.toStdString().c_str());
448 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
450 auto xComponentId = QXComponentId::createForNativeNodeFloatWindow(createInfo.internalWindowId);
451 auto qAbilityPeer = QtOhos::QAbilityInstancesManager::instance(jsState).defaultQAbilityPeer();
453 if (qAbilityPeer->qAbility().IsEmpty())
454 qOhosReportFatalErrorAndAbort(
"%s: can't create window without the default Ability instance", Q_FUNC_INFO);
456 auto configurationObject = QNapi::makeObject(
460 {
"name", makeOhosUniqueSystemWindowName(createInfo.internalWindowId)},
461 {
"windowType", jsState.eval<QNapi::Number>(
"@ohos.window.WindowType.TYPE_FLOAT")},
462 {
"ctx", qAbilityPeer->qAbility().get<QNapi::Object>(
"context")},
469 QtOhos::QObjectThreadSafeRef owningQWindowRef;
472 auto context = Context {
473 .xComponentId = xComponentId,
474 .qAbilityPeer = qAbilityPeer,
475 .owningQWindowRef = createInfo.qWindowRef,
479 .evalToPromiseOrRejectOnThrow(
"@ohos.window.createWindow(*)", {configurationObject})
480 .onThen([resultConsumer = std::move(resultConsumer), context = std::move(context)](
const QtOhos::
CallbackInfo &cbInfo)
mutable {
481 auto windowObject = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
483 auto localStorage = makeLocalStorageForWindow(
485 LocalStorageForWindowCreateInfo {
486 .xComponentId = context.xComponentId,
487 .windowObject = windowObject,
488 .resultConsumer = std::move(resultConsumer),
489 .qAbilityPeer = context.qAbilityPeer,
490 .windowProxyType = WindowProxyType::FloatWindow,
491 .owningQWindowRef = context.owningQWindowRef,
494 return onWindowCreatedLoadWindowContents(
495 cbInfo.jsState(), windowObject,
496 OnWindowCreatedLoadWindowContentsContext {
497 .disableWindowFocusableBeforeLoadContentHack =
false,
498 .contentPagePath =
"pages/FloatWindowNativeNode",
499 .localStorage = localStorage,
502 .onCatch([internalWindowId = createInfo.internalWindowId](
const QtOhos::
CallbackInfo &cbInfo) {
503 QtOhos::logJsCallbackError(cbInfo,
"Failed to create TYPE_FLOAT window");
504 qOhosReportFatalErrorAndAbort(
505 "Failed to create TYPE_FLOAT window for windowId='%s'",
506 internalWindowId.toStdString().c_str());
QOhosConsumer< QtOhos::JsState &, QOhosWindowProxyData > resultConsumer