• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "js_window_stage.h"
17 #include <string>
18 #include "js_runtime_utils.h"
19 #include "js_window.h"
20 #include "js_window_register_manager.h"
21 #include "js_window_utils.h"
22 #include "window_manager_hilog.h"
23 namespace OHOS {
24 namespace Rosen {
25 using namespace AbilityRuntime;
26 namespace {
27 const int CONTENT_STORAGE_ARG = 2;
28 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "JsWindowStage"};
29 } // namespace
30 
31 std::unique_ptr<JsWindowRegisterManager> g_listenerManager = std::make_unique<JsWindowRegisterManager>();
JsWindowStage(const std::shared_ptr<Rosen::WindowScene> & windowScene)32 JsWindowStage::JsWindowStage(const std::shared_ptr<Rosen::WindowScene>& windowScene)
33     : windowScene_(windowScene)
34 {
35 }
36 
~JsWindowStage()37 JsWindowStage::~JsWindowStage()
38 {
39 }
Finalizer(NativeEngine * engine,void * data,void * hint)40 void JsWindowStage::Finalizer(NativeEngine* engine, void* data, void* hint)
41 {
42     WLOGFI("JsWindowStage::Finalizer is called");
43     std::unique_ptr<JsWindowStage>(static_cast<JsWindowStage*>(data));
44 }
45 
SetUIContent(NativeEngine * engine,NativeCallbackInfo * info)46 NativeValue* JsWindowStage::SetUIContent(NativeEngine* engine, NativeCallbackInfo* info)
47 {
48     WLOGFI("JsWindowStage::SetUIContent is called");
49     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
50     return (me != nullptr) ? me->OnSetUIContent(*engine, *info) : nullptr;
51 }
52 
GetMainWindow(NativeEngine * engine,NativeCallbackInfo * info)53 NativeValue* JsWindowStage::GetMainWindow(NativeEngine* engine, NativeCallbackInfo* info)
54 {
55     WLOGFI("JsWindowStage::GetMainWindow is called");
56     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
57     return (me != nullptr) ? me->OnGetMainWindow(*engine, *info) : nullptr;
58 }
59 
On(NativeEngine * engine,NativeCallbackInfo * info)60 NativeValue* JsWindowStage::On(NativeEngine* engine, NativeCallbackInfo* info)
61 {
62     WLOGFI("JsWindowStage::On is called");
63     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
64     return (me != nullptr) ? me->OnEvent(*engine, *info) : nullptr;
65 }
66 
Off(NativeEngine * engine,NativeCallbackInfo * info)67 NativeValue* JsWindowStage::Off(NativeEngine* engine, NativeCallbackInfo* info)
68 {
69     WLOGFI("JsWindowStage::Off is called");
70     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
71     return (me != nullptr) ? me->OffEvent(*engine, *info) : nullptr;
72 }
73 
LoadContent(NativeEngine * engine,NativeCallbackInfo * info)74 NativeValue* JsWindowStage::LoadContent(NativeEngine* engine, NativeCallbackInfo* info)
75 {
76     WLOGFI("JsWindowStage::LoadContent is called");
77     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
78     return (me != nullptr) ? me->OnLoadContent(*engine, *info) : nullptr;
79 }
80 
GetWindowMode(NativeEngine * engine,NativeCallbackInfo * info)81 NativeValue* JsWindowStage::GetWindowMode(NativeEngine* engine, NativeCallbackInfo* info)
82 {
83     WLOGFI("JsWindowStage::GetWindowMode is called");
84     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
85     return (me != nullptr) ? me->OnGetWindowMode(*engine, *info) : nullptr;
86 }
87 
CreateSubWindow(NativeEngine * engine,NativeCallbackInfo * info)88 NativeValue* JsWindowStage::CreateSubWindow(NativeEngine* engine, NativeCallbackInfo* info)
89 {
90     WLOGFI("JsWindowStage::CreateSubWindow is called");
91     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
92     return (me != nullptr) ? me->OnCreateSubWindow(*engine, *info) : nullptr;
93 }
94 
GetSubWindow(NativeEngine * engine,NativeCallbackInfo * info)95 NativeValue* JsWindowStage::GetSubWindow(NativeEngine* engine, NativeCallbackInfo* info)
96 {
97     WLOGFI("JsWindowStage::GetSubWindow is called");
98     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
99     return (me != nullptr) ? me->OnGetSubWindow(*engine, *info) : nullptr;
100 }
101 
SetShowOnLockScreen(NativeEngine * engine,NativeCallbackInfo * info)102 NativeValue* JsWindowStage::SetShowOnLockScreen(NativeEngine* engine, NativeCallbackInfo* info)
103 {
104     WLOGFI("[NAPI]SetShowOnLockScreen");
105     JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
106     return (me != nullptr) ? me->OnSetShowOnLockScreen(*engine, *info) : nullptr;
107 }
108 
OnSetUIContent(NativeEngine & engine,NativeCallbackInfo & info)109 NativeValue* JsWindowStage::OnSetUIContent(NativeEngine& engine, NativeCallbackInfo& info)
110 {
111     WLOGFI("JsWindowStage::OnSetUIContent is called");
112     if (info.argc < 2) { // 2: minimum param num
113         WLOGFE("JsWindowStage::OnSetUIContent Not enough params");
114         return engine.CreateUndefined();
115     }
116     if (windowScene_ == nullptr || windowScene_->GetMainWindow() == nullptr) {
117         WLOGFE("JsWindowStage::OnSetUIContent windowScene_ or MainWindow is nullptr");
118         return engine.CreateUndefined();
119     }
120 
121     // Parse info->argv[0] as abilitycontext
122     auto objContext = ConvertNativeValueTo<NativeObject>(info.argv[0]);
123     if (objContext == nullptr) {
124         WLOGFE("JsWindowStage::OnSetUIContent info->argv[0] InValid");
125         return engine.CreateUndefined();
126     }
127 
128     // Parse info->argv[1] as url
129     std::string contextUrl;
130     if (!ConvertFromJsValue(engine, info.argv[1], contextUrl)) {
131         WLOGFE("JsWindowStage::OnSetUIContent failed to convert parameter to url");
132         return engine.CreateUndefined();
133     }
134     WLOGFI("JsWindowStage::OnSetUIContent Get url: %{public}s", contextUrl.c_str());
135 
136     windowScene_->GetMainWindow()->SetUIContent(contextUrl, &engine, info.argv[CONTENT_STORAGE_ARG]);
137 
138     return engine.CreateUndefined();
139 }
140 
OnGetMainWindow(NativeEngine & engine,NativeCallbackInfo & info)141 NativeValue* JsWindowStage::OnGetMainWindow(NativeEngine& engine, NativeCallbackInfo& info)
142 {
143     WLOGFI("JsWindowStage::OnGetMainWindow is called");
144     AsyncTask::CompleteCallback complete =
145         [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
146             if (windowScene_ == nullptr) {
147                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
148                 WLOGFE("JsWindowStage windowScene_ is nullptr!");
149                 return;
150             }
151             auto window = windowScene_->GetMainWindow();
152             if (window != nullptr) {
153                 task.Resolve(engine, OHOS::Rosen::CreateJsWindowObject(engine, window));
154                 WLOGFI("JsWindowStage::OnGetMainWindow success");
155             } else {
156                 task.Reject(engine, CreateJsError(engine,
157                     static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
158                     "JsWindowStage::OnGetMainWindow failed."));
159             }
160         };
161     NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
162     NativeValue* result = nullptr;
163     AsyncTask::Schedule(
164         engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
165     return result;
166 }
167 
OnEvent(NativeEngine & engine,NativeCallbackInfo & info)168 NativeValue* JsWindowStage::OnEvent(NativeEngine& engine, NativeCallbackInfo& info)
169 {
170     WLOGFI("JsWindowStage::OnEvent is called");
171     if (windowScene_ == nullptr || info.argc < 2) { // 2: minimum param nums
172         WLOGFE("JsWindowStage::OnEvent windowScene_ is nullptr or params not match");
173         return engine.CreateUndefined();
174     }
175     // Parse info->argv[0] as string
176     std::string eventString;
177     if (!ConvertFromJsValue(engine, info.argv[0], eventString)) {
178         WLOGFE("JsWindowStage::OnEvent info->argv[0] Failed to convert parameter to string");
179         return engine.CreateUndefined();
180     }
181     NativeValue* value = info.argv[1];
182     if (!value->IsCallable()) {
183         WLOGFE("JsWindowStage::OnEvent info->argv[1] is not callable");
184         return engine.CreateUndefined();
185     }
186 
187     auto window = windowScene_->GetMainWindow();
188     if (window == nullptr) {
189         WLOGFE("JsWindowStage::OnEvent GetMainWindow failed");
190         return engine.CreateUndefined();
191     }
192     g_listenerManager->RegisterListener(window, eventString, CaseType::CASE_STAGE, engine, value);
193     return engine.CreateUndefined();
194 }
195 
OffEvent(NativeEngine & engine,NativeCallbackInfo & info)196 NativeValue* JsWindowStage::OffEvent(NativeEngine& engine, NativeCallbackInfo& info)
197 {
198     WLOGFI("JsWindowStage::OffEvent is called");
199     if (windowScene_ == nullptr) {
200         WLOGFE("JsWindowStage::OffEvent windowScene_ is nullptr");
201         return engine.CreateUndefined();
202     }
203 
204     // Parse info->argv[0] as string
205     std::string eventString;
206     if (!ConvertFromJsValue(engine, info.argv[0], eventString)) {
207         WLOGFE("JsWindowStage::OffEvent info->argv[0] Failed to convert parameter to string");
208         return engine.CreateUndefined();
209     }
210     if (eventString.compare("windowStageEvent") != 0) {
211         WLOGFE("JsWindowStage::OffEvent info->argv[0] is InValid");
212         return engine.CreateUndefined();
213     }
214 
215     NativeValue* value = info.argv[1];
216     auto window = windowScene_->GetMainWindow();
217     if (window == nullptr) {
218         WLOGFE("JsWindowStage::OnEvent GetMainWindow failed");
219         return engine.CreateUndefined();
220     }
221     if (value->TypeOf() == NATIVE_FUNCTION) {
222         WLOGFI("JsWindowStage::OffEvent info->argv[1] is callable type");
223         g_listenerManager->UnregisterListener(window, eventString, CaseType::CASE_STAGE, value);
224     } else if (value->TypeOf() == NativeValueType::NATIVE_UNDEFINED) {
225         WLOGFI("JsWindowStage::OffEvent info->argv[1] is native undefined type");
226         g_listenerManager->UnregisterListener(window, eventString, CaseType::CASE_STAGE, nullptr);
227     } else {
228         WLOGFE("JsWindowStage::OffEvent info->argv[1] is InValid param");
229     }
230     return engine.CreateUndefined();
231 }
232 
OnLoadContent(NativeEngine & engine,NativeCallbackInfo & info)233 NativeValue* JsWindowStage::OnLoadContent(NativeEngine& engine, NativeCallbackInfo& info)
234 {
235     WLOGFI("JsWindowStage::OnLoadContent is called");
236     WMError errCode = WMError::WM_OK;
237     std::string contextUrl;
238     if (!ConvertFromJsValue(engine, info.argv[0], contextUrl)) {
239         WLOGFE("Failed to convert parameter to context url");
240         errCode = WMError::WM_ERROR_INVALID_PARAM;
241     }
242     NativeValue* storage = nullptr;
243     NativeValue* callBack = nullptr;
244     NativeValue* value1 = info.argv[1];
245     NativeValue* value2 = info.argv[2]; // 2: param index
246     if (value1->TypeOf() == NATIVE_FUNCTION) {
247         callBack = value1;
248     } else if (value1->TypeOf() == NATIVE_OBJECT) {
249         storage = value1;
250     }
251     if (value2->TypeOf() == NATIVE_FUNCTION) {
252         callBack = value2;
253     }
254     std::shared_ptr<NativeReference> contentStorage = (storage == nullptr) ? nullptr :
255         std::shared_ptr<NativeReference>(engine.CreateReference(storage, 1));
256     AsyncTask::CompleteCallback complete =
257         [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
258             if (windowScene_ == nullptr) {
259                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
260                 WLOGFE("JsWindowStage windowScene_ is nullptr!");
261                 return;
262             }
263             auto win = windowScene_->GetMainWindow();
264             if (win == nullptr) {
265                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
266                 return;
267             }
268             NativeValue* nativeStorage = (contentStorage == nullptr) ? nullptr : contentStorage->Get();
269             Rosen::WMError ret = win->SetUIContent(contextUrl, &engine, nativeStorage, false);
270             if (ret != Rosen::WMError::WM_OK) {
271                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(ret)));
272                 return;
273             }
274             task.Resolve(engine, engine.CreateUndefined());
275             WLOGFI("JsWindowStage::OnLoadContent success");
276         };
277     NativeValue* result = nullptr;
278     AsyncTask::Schedule(
279         engine, CreateAsyncTaskWithLastParam(engine, callBack, nullptr, std::move(complete), &result));
280     return result;
281 }
282 
OnGetWindowMode(NativeEngine & engine,NativeCallbackInfo & info)283 NativeValue* JsWindowStage::OnGetWindowMode(NativeEngine& engine, NativeCallbackInfo& info)
284 {
285     WLOGFI("JsWindowStage::OnGetWindowMode is called");
286     AsyncTask::CompleteCallback complete =
287         [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
288             if (windowScene_ == nullptr) {
289                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
290                 WLOGFE("JsWindowStage windowScene_ is nullptr!");
291                 return;
292             }
293             auto window = windowScene_->GetMainWindow();
294             if (window == nullptr) {
295                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
296                     "JsWindowStage::OnGetWindowMode failed."));
297                 WLOGFE("JsWindowStage window is nullptr");
298                 return;
299             }
300             Rosen::WindowMode mode = window->GetMode();
301             if (NATIVE_TO_JS_WINDOW_MODE_MAP.count(mode) != 0) {
302                 task.Resolve(engine, CreateJsValue(engine, NATIVE_TO_JS_WINDOW_MODE_MAP.at(mode)));
303                 WLOGFI("JsWindowStage OnGetWindowMode success");
304             } else {
305                 task.Resolve(engine, CreateJsValue(engine, mode));
306                 WLOGFI("JsWindowStage OnGetWindowMode success, but not in apimode");
307             }
308         };
309     NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
310     NativeValue* result = nullptr;
311     AsyncTask::Schedule(
312         engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
313     return result;
314 }
315 
OnCreateSubWindow(NativeEngine & engine,NativeCallbackInfo & info)316 NativeValue* JsWindowStage::OnCreateSubWindow(NativeEngine& engine, NativeCallbackInfo& info)
317 {
318     WLOGFI("JsWindowStage::OnCreateSubWindow is called");
319     WMError errCode = WMError::WM_OK;
320     std::string windowName;
321     if (!ConvertFromJsValue(engine, info.argv[0], windowName)) {
322         WLOGFE("Failed to convert parameter to windowName");
323         errCode = WMError::WM_ERROR_INVALID_PARAM;
324     }
325     AsyncTask::CompleteCallback complete =
326         [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
327             if (windowScene_ == nullptr || errCode != WMError::WM_OK) {
328                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(errCode)));
329                 WLOGFE("JsWindowStage windowScene_ is nullptr or invaliad params!");
330                 return;
331             }
332             sptr<Rosen::WindowOption> windowOption = new Rosen::WindowOption();
333             windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
334             windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
335             auto window = windowScene_->CreateWindow(windowName, windowOption);
336             if (window == nullptr) {
337                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
338                     "JsWindowStage::OnCreateSubWindow failed."));
339                 WLOGFE("JsWindowStage window is nullptr");
340                 return;
341             }
342             task.Resolve(engine, CreateJsWindowObject(engine, window));
343             WLOGFI("JsWindowStage OnCreateSubWindow success");
344         };
345     NativeValue* callback = (info.argv[1]->TypeOf() == NATIVE_FUNCTION) ? info.argv[1] : nullptr;
346     NativeValue* result = nullptr;
347     AsyncTask::Schedule(
348         engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
349     return result;
350 }
351 
CreateJsSubWindowArrayObject(NativeEngine & engine,std::vector<sptr<Window>> subWinVec)352 NativeValue* JsWindowStage::CreateJsSubWindowArrayObject(NativeEngine& engine,
353     std::vector<sptr<Window>> subWinVec)
354 {
355     WLOGFI("JsWindowUtils::CreateJsSubWindowArrayObject is called");
356     NativeValue* objValue = engine.CreateArray(subWinVec.size());
357     NativeArray* array = ConvertNativeValueTo<NativeArray>(objValue);
358     if (array == nullptr) {
359         WLOGFE("Failed to convert subWinVec to jsArrayObject");
360         return nullptr;
361     }
362     uint32_t index = 0;
363     for (size_t i = 0; i < subWinVec.size(); i++) {
364         array->SetElement(index++, CreateJsWindowObject(engine, subWinVec[i]));
365     }
366     return objValue;
367 }
368 
OnGetSubWindow(NativeEngine & engine,NativeCallbackInfo & info)369 NativeValue* JsWindowStage::OnGetSubWindow(NativeEngine& engine, NativeCallbackInfo& info)
370 {
371     WLOGFI("JsWindowStage::OnGetSubWindow is called");
372     AsyncTask::CompleteCallback complete =
373         [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
374             if (windowScene_ == nullptr) {
375                 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
376                 WLOGFE("JsWindowStage windowScene_ is nullptr!");
377                 return;
378             }
379             std::vector<sptr<Window>> subWindowVec = windowScene_->GetSubWindow();
380             task.Resolve(engine, CreateJsSubWindowArrayObject(engine, subWindowVec));
381             WLOGFI("JsWindowStage OnGetSubWindow success");
382         };
383     NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
384     NativeValue* result = nullptr;
385     AsyncTask::Schedule(
386         engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
387     return result;
388 }
389 
OnSetShowOnLockScreen(NativeEngine & engine,NativeCallbackInfo & info)390 NativeValue* JsWindowStage::OnSetShowOnLockScreen(NativeEngine& engine, NativeCallbackInfo& info)
391 {
392     if (info.argc != 1) {
393         WLOGFE("[NAPI]Argc is invalid: %{public}zu", info.argc);
394         return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_INVALID_PARAM));
395     }
396     if (windowScene_ == nullptr || windowScene_->GetMainWindow() == nullptr) {
397         WLOGFE("[NAPI]WindowScene is null or window is null");
398         return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR));
399     }
400 
401     bool showOnLockScreen = false;
402     NativeBoolean* nativeVal = ConvertNativeValueTo<NativeBoolean>(info.argv[0]);
403     if (nativeVal == nullptr) {
404         WLOGFE("[NAPI]Failed to convert parameter to boolean");
405         return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_INVALID_PARAM));
406     } else {
407         showOnLockScreen = static_cast<bool>(*nativeVal);
408     }
409 
410     auto window = windowScene_->GetMainWindow();
411     WMError ret;
412     if (showOnLockScreen) {
413         ret = window->AddWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
414     } else {
415         ret = window->RemoveWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
416     }
417     WLOGFI("[NAPI]Window [%{public}u, %{public}s] SetShowOnLockScreen %{public}u, ret = %{public}u",
418         window->GetWindowId(), window->GetWindowName().c_str(), showOnLockScreen, ret);
419 
420     return CreateJsValue(engine, static_cast<int32_t>(ret));
421 }
422 
CreateJsWindowStage(NativeEngine & engine,std::shared_ptr<Rosen::WindowScene> windowScene)423 NativeValue* CreateJsWindowStage(NativeEngine& engine,
424     std::shared_ptr<Rosen::WindowScene> windowScene)
425 {
426     WLOGFI("JsWindowStage::CreateJsWindowStage is called");
427     NativeValue* objValue = engine.CreateObject();
428     NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
429 
430     std::unique_ptr<JsWindowStage> jsWindowStage = std::make_unique<JsWindowStage>(windowScene);
431     object->SetNativePointer(jsWindowStage.release(), JsWindowStage::Finalizer, nullptr);
432 
433     BindNativeFunction(engine,
434         *object, "setUIContent", JsWindowStage::SetUIContent);
435     BindNativeFunction(engine,
436         *object, "loadContent", JsWindowStage::LoadContent);
437     BindNativeFunction(engine,
438         *object, "getMainWindow", JsWindowStage::GetMainWindow);
439     BindNativeFunction(engine,
440         *object, "getWindowMode", JsWindowStage::GetWindowMode);
441     BindNativeFunction(engine,
442         *object, "createSubWindow", JsWindowStage::CreateSubWindow);
443     BindNativeFunction(engine,
444         *object, "getSubWindow", JsWindowStage::GetSubWindow);
445     BindNativeFunction(engine, *object, "on", JsWindowStage::On);
446     BindNativeFunction(engine, *object, "off", JsWindowStage::Off);
447     BindNativeFunction(engine,
448         *object, "setShowOnLockScreen", JsWindowStage::SetShowOnLockScreen);
449 
450     return objValue;
451 }
452 }  // namespace Rosen
453 }  // namespace OHOS
454