From c0b0a6440d6da46cf70f0e673282187a2e85cb31 Mon Sep 17 00:00:00 2001 From: lijiancheng21 Date: Mon, 21 Jul 2025 11:06:01 +0800 Subject: [PATCH] WebSchemeHandlerResponse_set_get Signed-off-by: lijiancheng21 --- .../ani/webview/ets/@ohos.web.webview.ets | 10 + .../webview/src/common/ani_parse_utils.cpp | 2 +- .../ani_web_scheme_handler_response.cpp | 264 ++++++++++++++++++ .../ani_webview_controller.cpp | 2 +- 4 files changed, 276 insertions(+), 2 deletions(-) diff --git a/interfaces/kits/ani/webview/ets/@ohos.web.webview.ets b/interfaces/kits/ani/webview/ets/@ohos.web.webview.ets index 7df5e2f89..56fa426c1 100644 --- a/interfaces/kits/ani/webview/ets/@ohos.web.webview.ets +++ b/interfaces/kits/ani/webview/ets/@ohos.web.webview.ets @@ -660,6 +660,16 @@ export default namespace webview { * @since 20 */ native getUrl(): string; + native setMimeType(type: string): void; + native getMimeType(): string; + native setEncoding(encoding: string): void; + native getEncoding(): string; + native setStatusText(text: string): void; + native getStatusText(): string; + native setStatus(code: number): void; + native getStatus(): number; + native setHeaderByName(name: string, value: string, overwrite: boolean): void; + native getHeaderByName(name: string): string; } export class WebDownloadItem { diff --git a/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp b/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp index b6fd9475f..f205c54ef 100644 --- a/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp +++ b/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp @@ -652,7 +652,7 @@ bool AniParseUtils::ParseInt64(ani_env* env, ani_ref ref, int64_t& outValue) } ani_boolean isLong; if (env->Object_InstanceOf(static_cast(ref), longClass, &isLong) != ANI_OK || isLong != ANI_TRUE) { - WVLOG_E("ParseInt64 failed - invalid double type"); + WVLOG_E("ParseInt64 failed - invalid long type"); return false; } diff --git a/interfaces/kits/ani/webview/src/webviewcontroller/ani_web_scheme_handler_response.cpp b/interfaces/kits/ani/webview/src/webviewcontroller/ani_web_scheme_handler_response.cpp index 9a41c005e..bff961318 100644 --- a/interfaces/kits/ani/webview/src/webviewcontroller/ani_web_scheme_handler_response.cpp +++ b/interfaces/kits/ani/webview/src/webviewcontroller/ani_web_scheme_handler_response.cpp @@ -108,6 +108,260 @@ static void Constructor(ani_env *env, ani_object object) } } +static void JsSetMimeType(ani_env* env, ani_object object, ani_object mimeTypeObject) +{ + WVLOG_D("WebSchemeHandlerResponse JsSetMimeType."); + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return; + } + ani_boolean isUndefined = true; + if (env->Reference_IsUndefined(mimeTypeObject, &isUndefined) != ANI_OK || isUndefined) { + AniBusinessError::ThrowError(env, PARAM_CHECK_ERROR, + NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one")); + return; + } + if (!AniParseUtils::IsString(env, mimeTypeObject)) { + AniBusinessError::ThrowError( + env, PARAM_CHECK_ERROR, NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "type", "string")); + return; + } + std::string mimeType; + if (!AniParseUtils::ParseString(env, mimeTypeObject, mimeType)) { + WVLOG_E("ParseString fail"); + return; + } + schemeHandler->SetMimeType(mimeType.c_str()); +} + +static ani_string JsGetMimeType(ani_env* env, ani_object object) +{ + WVLOG_D("WebSchemeHandlerResponse JsGetMimeType."); + ani_string mimeType = nullptr; + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return mimeType; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return mimeType; + } + char* result = schemeHandler->GetMimeType(); + if (result == nullptr) { + return mimeType; + } + env->String_NewUTF8(result, strlen(result), &mimeType); + OH_ArkWeb_ReleaseString(result); + return mimeType; +} + +static void JsSetEncoding(ani_env* env, ani_object object, ani_object encodingObject) +{ + WVLOG_D("WebSchemeHandlerResponse JsSetEncoding."); + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return; + } + ani_boolean isUndefined = true; + if (env->Reference_IsUndefined(encodingObject, &isUndefined) != ANI_OK || isUndefined) { + AniBusinessError::ThrowError(env, PARAM_CHECK_ERROR, + NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one")); + return; + } + if (!AniParseUtils::IsString(env, encodingObject)) { + AniBusinessError::ThrowError(env, PARAM_CHECK_ERROR, + NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "encoding", "string")); + return; + } + std::string encoding; + if (!AniParseUtils::ParseString(env, encodingObject, encoding)) { + WVLOG_E("ParseString fail"); + return; + } + schemeHandler->SetEncoding(encoding.c_str()); +} + +static ani_string JsGetEncoding(ani_env* env, ani_object object) +{ + WVLOG_D("WebSchemeHandlerResponse JsGetEncoding."); + ani_string encoding = nullptr; + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return encoding; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return encoding; + } + char* result = schemeHandler->GetEncoding(); + if (result == nullptr) { + return encoding; + } + env->String_NewUTF8(result, strlen(result), &encoding); + OH_ArkWeb_ReleaseString(result); + return encoding; +} + +static void JsSetStatusText(ani_env* env, ani_object object, ani_object statusTextObject) +{ + WVLOG_D("WebSchemeHandlerResponse JsSetStatusText."); + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return; + } + ani_boolean isUndefined = true; + if (env->Reference_IsUndefined(statusTextObject, &isUndefined) != ANI_OK || isUndefined) { + AniBusinessError::ThrowError(env, PARAM_CHECK_ERROR, + NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one")); + return; + } + if (!AniParseUtils::IsString(env, statusTextObject)) { + AniBusinessError::ThrowError( + env, PARAM_CHECK_ERROR, NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "text", "string")); + return; + } + std::string statusText; + if (!AniParseUtils::ParseString(env, statusTextObject, statusText)) { + WVLOG_E("ParseString fail"); + return; + } + schemeHandler->SetStatusText(statusText.c_str()); +} + +static ani_string JsGetStatusText(ani_env* env, ani_object object) +{ + WVLOG_D("WebSchemeHandlerResponse JsGetStatusText."); + ani_string statusText = nullptr; + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return statusText; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return statusText; + } + char* result = schemeHandler->GetStatusText(); + if (result == nullptr) { + return statusText; + } + env->String_NewUTF8(result, strlen(result), &statusText); + OH_ArkWeb_ReleaseString(result); + return statusText; +} + +static void JsSetStatus(ani_env* env, ani_object object, ani_double statusValue) +{ + WVLOG_D("WebSchemeHandlerResponse JsSetStatus."); + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return; + } + schemeHandler->SetStatus(static_cast(statusValue)); +} + +static ani_double JsGetStatus(ani_env* env, ani_object object) +{ + WVLOG_D("WebSchemeHandlerResponse JsGetStatus."); + ani_double result = 0; + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return result; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return result; + } + double value = schemeHandler->GetStatus(); + result = static_cast(value); + return result; +} + +static void JsSetHeaderByName( + ani_env* env, ani_object object, ani_object nameObject, ani_object valueObject, ani_boolean overWriteObject) +{ + WVLOG_D("WebSchemeHandlerResponse JsSetHeaderByName."); + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return; + } + if (!AniParseUtils::IsString(env, nameObject)) { + AniBusinessError::ThrowError( + env, PARAM_CHECK_ERROR, NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "name", "string")); + return; + } + if (!AniParseUtils::IsString(env, valueObject)) { + AniBusinessError::ThrowError( + env, PARAM_CHECK_ERROR, NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "value", "string")); + return; + } + std::string name; + std::string value; + if (!AniParseUtils::ParseString(env, nameObject, name)) { + WVLOG_E("ParseString fail"); + return; + } + if (!AniParseUtils::ParseString(env, valueObject, value)) { + WVLOG_E("ParseString fail"); + return; + } + schemeHandler->SetHeaderByName(name.c_str(), value.c_str(), static_cast(overWriteObject)); +} + +static ani_string JsGetHeaderByName(ani_env* env, ani_object object, ani_object nameObject) +{ + WVLOG_D("WebSchemeHandlerResponse JsGetHeaderByName."); + ani_string headerValue = nullptr; + if (env == nullptr) { + WVLOG_E("env is nullptr"); + return headerValue; + } + auto* schemeHandler = reinterpret_cast(AniParseUtils::Unwrap(env, object)); + if (!schemeHandler) { + AniBusinessError::ThrowErrorByErrCode(env, INIT_ERROR); + return headerValue; + } + std::string name; + if (!AniParseUtils::ParseString(env, nameObject, name)) { + return nullptr; + } + char* result = schemeHandler->GetHeaderByName(name.c_str()); + if (result == nullptr) { + return headerValue; + } + env->String_NewUTF8(result, strlen(result), &headerValue); + OH_ArkWeb_ReleaseString(result); + return headerValue; +} + ani_status StsWebSchemeHandlerResponseInit(ani_env *env) { if (env == nullptr) { @@ -124,6 +378,16 @@ ani_status StsWebSchemeHandlerResponseInit(ani_env *env) ani_native_function { "", nullptr, reinterpret_cast(Constructor) }, ani_native_function { "setUrl", nullptr, reinterpret_cast(JsSetUrl) }, ani_native_function { "getUrl", nullptr, reinterpret_cast(JsGetUrl) }, + ani_native_function { "setMimeType", nullptr, reinterpret_cast(JsSetMimeType) }, + ani_native_function { "getMimeType", nullptr, reinterpret_cast(JsGetMimeType) }, + ani_native_function { "setEncoding", nullptr, reinterpret_cast(JsSetEncoding) }, + ani_native_function { "getEncoding", nullptr, reinterpret_cast(JsGetEncoding) }, + ani_native_function { "setStatusText", nullptr, reinterpret_cast(JsSetStatusText) }, + ani_native_function { "getStatusText", nullptr, reinterpret_cast(JsGetStatusText) }, + ani_native_function { "setStatus", nullptr, reinterpret_cast(JsSetStatus) }, + ani_native_function { "getStatus", nullptr, reinterpret_cast(JsGetStatus) }, + ani_native_function { "setHeaderByName", nullptr, reinterpret_cast(JsSetHeaderByName) }, + ani_native_function { "getHeaderByName", nullptr, reinterpret_cast(JsGetHeaderByName) }, }; status = env->Class_BindNativeMethods(webSchemeHandlerResponseCls, allMethods.data(), allMethods.size()); diff --git a/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp b/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp index 63e499231..ed70a1c5e 100644 --- a/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp +++ b/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp @@ -3991,7 +3991,7 @@ ani_object ConvertToAniHandlerOfInt64Array(ani_env* env, std::shared_ptr(values[i]); + ani_long item = static_cast(values[i]); ani_class cls {}; if (ANI_OK != env->FindClass("Lstd/core/Long;", &cls)) { return nullptr; -- Gitee