103 QNapi::Object windowStageOrWindowObject,
106 auto subWindowOptionsObject =
108 windowStageOrWindowObject.Env(),
110 {
"title", subWindowOptions.windowTitle},
111 {
"decorEnabled", subWindowOptions.decorEnabled},
112 {
"isModal", subWindowOptions.isModal},
114 "windowRect", makeRectObject(windowStageOrWindowObject.Env(), subWindowOptions.windowRect)
118 return windowStageOrWindowObject.evalToPromiseOrRejectOnThrow(
119 "createSubWindowWithOptions(*)",
120 {windowName, subWindowOptionsObject});
135 auto sharedContext = QtOhos::moveToSharedPtr(std::move(subWindowOnAppearCbCtx));
140 auto xComponent = takeNodeXComponentFromRegistryOrFail(sharedContext->xComponentId);
142 sharedContext->resultConsumer(
144 QOhosWindowProxyData {
145 .qAbilityPeer = sharedContext->qAbilityPeer,
146 .jsWindow = std::move(sharedContext->windowObject),
147 .windowProxyType = sharedContext->windowProxyType,
148 .nodeXComponent = std::make_shared<QXComponentNode>(xComponent),
149 .jsKeepAliveData = QtOhos::moveToSharedPtr(std::move(sharedContext->localStorageObj)),
152 sharedContext.reset();
164 auto *env = jsState.env();
166 auto localStorage = makeLocalStorage(jsState);
167 auto subWindowNativeNodeCreateInfo = QNapi::makeObject(
170 {
"xComponentId", createInfo.xComponentId.toNapiValue(env)},
173 [xComponentId = createInfo.xComponentId.stringId()]() {
175 "WindowNativeNodeCreateInfo.onDisAppear() called from JS for xComponentId='%s'",
176 xComponentId.c_str());
181 makeSubWindowOnAppearCallbackHandler(SubWindowOnAppearContext {
182 .xComponentId = createInfo.xComponentId,
183 .localStorageObj = Napi::Persistent(localStorage),
184 .windowObject = Napi::Persistent(createInfo.windowObject),
185 .resultConsumer = std::move(createInfo.resultConsumer),
186 .qAbilityPeer = std::move(createInfo.qAbilityPeer),
187 .windowProxyType = createInfo.windowProxyType,
192 localStorage.call(
"setOrCreate", {
"createInfo", subWindowNativeNodeCreateInfo});
200 struct LoadWindowContentsArgs
202 QNapi::Reference<QNapi::Object> window;
203 QNapi::Reference<QNapi::Object> localStorage;
204 std::string contentPagePath;
207 return !context.disableWindowFocusableBeforeLoadContentHack
208 ? loadWindowContents(windowObject, context.localStorage, context.contentPagePath)
209 : windowObject.evalToPromiseOrRejectOnThrow(
"setWindowFocusable(*)", {
false})
210 .withContext(LoadWindowContentsArgs {
211 .window = Napi::Persistent(windowObject),
212 .localStorage = Napi::Persistent(context.localStorage),
213 .contentPagePath = context.contentPagePath,
215 .onThenWithContext([](LoadWindowContentsArgs &windowLocalStoragePair) {
216 return loadWindowContents(
217 windowLocalStoragePair.window.Value(),
218 windowLocalStoragePair.localStorage.Value(),
219 windowLocalStoragePair.contentPagePath);
228 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
230 auto abilityStartupOptions =
234 {
"windowLeft", createInfo.frameGeometry.x()},
235 {
"windowTop", createInfo.frameGeometry.y()},
236 {
"windowWidth", createInfo.frameGeometry.width()},
237 {
"windowHeight", createInfo.frameGeometry.height()},
241 auto fullscreenWindowMode = jsState.eval<QNapi::Number>(
242 "@ohos.app.ability.AbilityConstant.WindowMode.WINDOW_MODE_FULLSCREEN");
243 abilityStartupOptions.set(
"windowMode", fullscreenWindowMode);
246 jsState.startNewQAbilityInstance(
248 abilityStartupOptions,
249 [qWindowRef = createInfo.qWindowRef,
250 windowId = createInfo.windowId,
252 auto createInfo = QOhosWindowProxyExistingMainWindowCreateInfo {
253 .qWindowRef = qWindowRef,
254 .qAbilityInstanceId = qAbilityPeer->instanceId(),
255 .windowId = windowId,
258 makeWindowProxyDataForExistingMainWindowInJsThread(
259 jsState, createInfo,
std::move(resultConsumer));
266 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
269 getQAbilityPeerByInstanceIdOrFail(jsState, createInfo.qAbilityInstanceId));
270 if (!optQUiAbilityPeer) {
271 qOhosReportFatalErrorAndAbort(
272 "%s Attempting to make window proxy for main window for ability without windowStage. This is most likely a programming error. Aborting...",
275 optQUiAbilityPeer->setQWindow(jsState.env(), createInfo.qWindowRef);
277 auto window = optQUiAbilityPeer->windowStage().call<QNapi::Object>(
"getMainWindowSync");
279 auto nodeXComponent = takeNodeXComponentFromRegistryOrFail(nativeNodeXComponentId);
283 QOhosWindowProxyData {
284 .qAbilityPeer = optQUiAbilityPeer,
285 .jsWindow = Napi::Persistent(window),
286 .windowProxyType = WindowProxyType::MainWindow,
287 .nodeXComponent = std::make_shared<QXComponentNode>(nodeXComponent),
288 .jsKeepAliveData =
nullptr,
310 QNapi::Object windowStageOrWindowObject,
312 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
314 auto xComponentId = QXComponentId::createForNativeNodeSubWindow(createInfo.windowId);
317 bool disableWindowFocusableBeforeLoadContentHack;
322 auto qAbilityPeer = getQAbilityPeerByInstanceIdOrFail(jsState, createInfo.qAbilityInstanceId);
330 auto subWindowCreationPromise = [&]() -> QNapi::Promise {
331 if (!QOhosDeviceInfo::isPhone()) {
332 return createSubWindowWithOptions(
333 windowStageOrWindowObject,
336 .windowTitle = createInfo.windowTitle,
337 .decorEnabled = createInfo.decorEnabled,
338 .isModal = createInfo.modal,
339 .windowRect = createInfo.windowRect,
344 auto optQUiAbilityPeer = QtOhos::QUiAbilityPeer::tryCastFromQAbilityPeerOrNull(qAbilityPeer);
345 if (!optQUiAbilityPeer) {
346 qOhosReportFatalErrorAndAbort(
347 "%s sub window creation requires an ability with a windowStage. Aborting...",
350 return createSubWindow(optQUiAbilityPeer->windowStage(), windowName);
353 subWindowCreationPromise
354 .withContext(Context {
356 .xComponentId = xComponentId,
357 .qAbilityPeer = qAbilityPeer,
359 .onThenWithContext([resultConsumer = std::move(resultConsumer)](
const QtOhos::
CallbackInfo &cbInfo, Context &context)
mutable {
360 auto windowObject = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
362 auto localStorage = makeLocalStorageForWindow(
364 LocalStorageForWindowCreateInfo {
365 .xComponentId = context.xComponentId,
366 .windowObject = windowObject,
367 .resultConsumer = std::move(resultConsumer),
368 .qAbilityPeer = context.qAbilityPeer,
369 .windowProxyType = WindowProxyType::SubWindow,
372 return onWindowCreatedLoadWindowContents(
373 cbInfo.jsState(), windowObject,
374 OnWindowCreatedLoadWindowContentsContext {
375 .disableWindowFocusableBeforeLoadContentHack = context.disableWindowFocusableBeforeLoadContentHack,
376 .contentPagePath =
"pages/SubWindowNativeNode",
377 .localStorage = localStorage,
381 QtOhos::logJsCallbackError(cbInfo,
"sub window creation failed");
382 qOhosReportFatalErrorAndAbort(
383 "Failed to create subwindow for windowId='%s'",
384 windowId.toStdString().c_str());
390 QOhosConsumer<QtOhos::JsState &, QOhosWindowProxyData> resultConsumer)
392 auto xComponentId = QXComponentId::createForNativeNodeFloatWindow(createInfo.internalWindowId);
395 auto configurationObject = QNapi::makeObject(
399 {
"name", makeOhosUniqueSystemWindowName(createInfo.internalWindowId)},
400 {
"windowType", jsState.eval<QNapi::Number>(
"@ohos.window.WindowType.TYPE_FLOAT")},
401 {
"ctx", qAbilityPeer->qAbility().get<QNapi::Object>(
"context")},
411 .evalToPromiseOrRejectOnThrow(
"@ohos.window.createWindow(*)", {configurationObject})
412 .withContext(Context {
413 .xComponentId = xComponentId,
414 .qAbilityPeer = qAbilityPeer,
416 .onThenWithContext([resultConsumer = std::move(resultConsumer)](
const QtOhos::
CallbackInfo &cbInfo, Context &context)
mutable {
417 auto windowObject = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
419 auto localStorage = makeLocalStorageForWindow(
421 LocalStorageForWindowCreateInfo {
422 .xComponentId = context.xComponentId,
423 .windowObject = windowObject,
424 .resultConsumer = std::move(resultConsumer),
425 .qAbilityPeer = context.qAbilityPeer,
426 .windowProxyType = WindowProxyType::FloatWindow,
429 return onWindowCreatedLoadWindowContents(
430 cbInfo.jsState(), windowObject,
431 OnWindowCreatedLoadWindowContentsContext {
432 .disableWindowFocusableBeforeLoadContentHack =
false,
433 .contentPagePath =
"pages/FloatWindowNativeNode",
434 .localStorage = localStorage,
437 .onCatch([internalWindowId = createInfo.internalWindowId](
const QtOhos::
CallbackInfo &cbInfo) {
438 QtOhos::logJsCallbackError(cbInfo,
"Failed to create TYPE_FLOAT window");
439 qOhosReportFatalErrorAndAbort(
440 "Failed to create TYPE_FLOAT window for windowId='%s'",
441 internalWindowId.toStdString().c_str());
QNapi::Reference< QNapi::Object > windowObject
QOhosConsumer< QtOhos::JsState &, QOhosWindowProxyData > resultConsumer
std::shared_ptr< QtOhos::QAbilityPeer > qAbilityPeer
QNapi::Reference< QNapi::Object > localStorageObj