diff --git a/interfaces/kits/napi/window_runtime/api/@ohos.window.d.ts b/interfaces/kits/napi/window_runtime/api/@ohos.window.d.ts index 0243d3e1..83c065df 100644 --- a/interfaces/kits/napi/window_runtime/api/@ohos.window.d.ts +++ b/interfaces/kits/napi/window_runtime/api/@ohos.window.d.ts @@ -910,6 +910,15 @@ declare namespace window { * @since 9 */ disableWindowDecor(): void; + + /** + * Dump window client information. + * Called in the dump callback of ability is the typical usage scenario. + * @since 9 + * @param params Indicates the params from command. + * @return The dump info array. + */ + dump(params: Array): Array; } enum WindowStageEventType { diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp b/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp index ff183ff4..b327b6de 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp @@ -15,6 +15,7 @@ #include "js_window.h" #include +#include "js_window_utils.h" #include "window.h" #include "window_manager_hilog.h" #include "window_option.h" @@ -291,6 +292,13 @@ NativeValue* JsWindow::GetColorSpace(NativeEngine* engine, NativeCallbackInfo* i return (me != nullptr) ? me->OnGetColorSpace(*engine, *info) : nullptr; } +NativeValue* JsWindow::Dump(NativeEngine* engine, NativeCallbackInfo* info) +{ + WLOGFI("[NAPI]Dump"); + JsWindow* me = CheckParamsAndGetThis(engine, info); + return (me != nullptr) ? me->OnDump(*engine, *info) : nullptr; +} + NativeValue* JsWindow::OnShow(NativeEngine& engine, NativeCallbackInfo& info) { WMError errCode = WMError::WM_OK; @@ -1438,6 +1446,30 @@ NativeValue* JsWindow::OnGetColorSpace(NativeEngine& engine, NativeCallbackInfo& return result; } +NativeValue* JsWindow::OnDump(NativeEngine& engine, NativeCallbackInfo& info) +{ + WLOGFI("[NAPI]dump window start"); + if (info.argc < 1 || info.argc > 2) { // 2: maximum params num + WLOGFE("[NAPI]Argc is invalid: %{public}zu", info.argc); + return nullptr; + } + if (windowToken_ == nullptr) { + WLOGFE("[NAPI]window is nullptr or get invalid param"); + return nullptr; + } + std::vector params; + if (!ConvertNativeValueToVector(engine, info.argv[0], params)) { + WLOGFE("[NAPI]ConvertNativeValueToVector fail"); + return nullptr; + } + std::vector dumpInfo; + windowToken_->DumpInfo(params, dumpInfo); + NativeValue* dumpInfoValue = CreateNativeArray(engine, dumpInfo); + WLOGFI("[NAPI]Window [%{public}u, %{public}s] dump end", + windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str()); + return dumpInfoValue; +} + std::shared_ptr FindJsWindowObject(std::string windowName) { WLOGFI("[NAPI]Try to find window %{public}s in g_jsWindowMap", windowName.c_str()); @@ -1497,6 +1529,7 @@ NativeValue* CreateJsWindowObject(NativeEngine& engine, sptr& window) BindNativeFunction(engine, *object, "setTransparent", JsWindow::SetTransparent); BindNativeFunction(engine, *object, "setCallingWindow", JsWindow::SetCallingWindow); BindNativeFunction(engine, *object, "disableWindowDecor", JsWindow::DisableWindowDecor); + BindNativeFunction(engine, *object, "dump", JsWindow::Dump); std::shared_ptr jsWindowRef; jsWindowRef.reset(engine.CreateReference(objValue, 1)); diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window.h b/interfaces/kits/napi/window_runtime/window_napi/js_window.h index 4ec210cc..ad791578 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window.h +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window.h @@ -65,6 +65,7 @@ public: static NativeValue* IsSupportWideGamut(NativeEngine* engine, NativeCallbackInfo* info); static NativeValue* SetColorSpace(NativeEngine* engine, NativeCallbackInfo* info); static NativeValue* GetColorSpace(NativeEngine* engine, NativeCallbackInfo* info); + static NativeValue* Dump(NativeEngine* engine, NativeCallbackInfo* info); private: std::string GetWindowName(); @@ -101,6 +102,7 @@ private: NativeValue* OnSetTransparent(NativeEngine& engine, NativeCallbackInfo& info); NativeValue* OnSetCallingWindow(NativeEngine& engine, NativeCallbackInfo& info); NativeValue* OnDisableWindowDecor(NativeEngine& engine, NativeCallbackInfo& info); + NativeValue* OnDump(NativeEngine& engine, NativeCallbackInfo& info); sptr windowToken_ = nullptr; std::unique_ptr registerManager_ = nullptr; diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp index 2515a880..6284331d 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp @@ -19,8 +19,8 @@ #include "accesstoken_kit.h" #include "bundle_constants.h" #include "ipc_skeleton.h" -#include "js_runtime_utils.h" #include "window_manager_hilog.h" + namespace OHOS { namespace Rosen { using namespace AbilityRuntime; diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.h b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.h index 130a37bd..aab1ee74 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.h +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.h @@ -16,6 +16,7 @@ #ifndef OHOS_JS_WINDOW_UTILS_H #define OHOS_JS_WINDOW_UTILS_H #include +#include "js_runtime_utils.h" #include "native_engine/native_engine.h" #include "native_engine/native_value.h" #include "window.h" @@ -110,6 +111,22 @@ const std::map JS_TO_NATIVE_WINDOW_MODE_MAP { NativeValue* ColorSpaceInit(NativeEngine* engine); NativeValue* WindowStageEventTypeInit(NativeEngine* engine); bool GetAPI7Ability(NativeEngine& engine, AppExecFwk::Ability* &ability); + template + inline bool ConvertNativeValueToVector(NativeEngine& engine, NativeValue* nativeValue, std::vector& out) + { + NativeArray* nativeArray = AbilityRuntime::ConvertNativeValueTo(nativeValue); + if (nativeArray == nullptr) { + return false; + } + T value; + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + if (!AbilityRuntime::ConvertFromJsValue(engine, nativeArray->GetElement(i), value)) { + return false; + } + out.emplace_back(value); + } + return true; + } } } #endif \ No newline at end of file