1 /*
2 * Copyright (c) 2023 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 "frameworks/bridge/declarative_frontend/jsview/js_image_span.h"
17 #include "frameworks/bridge/declarative_frontend/jsview/js_container_span.h"
18
19 #if !defined(PREVIEW)
20 #include <dlfcn.h>
21 #endif
22
23 #include "base/log/ace_scoring_log.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components_ng/pattern/image/image_model.h"
26 #include "core/components_ng/pattern/text/image_span_view.h"
27 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
28 #include "frameworks/bridge/declarative_frontend/jsview/js_image.h"
29
30 namespace OHOS::Ace::Framework {
Create(const JSCallbackInfo & info)31 void JSImageSpan::Create(const JSCallbackInfo& info)
32 {
33 if (!Container::IsCurrentUseNewPipeline()) {
34 return;
35 }
36 if (info.Length() != 1) {
37 return;
38 }
39 JSImage::CreateImage(info, true);
40 NG::ImageSpanView::Create();
41 }
42
SetAlt(const JSCallbackInfo & info)43 void JSImageSpan::SetAlt(const JSCallbackInfo& info)
44 {
45 if (!Container::IsCurrentUseNewPipeline()) {
46 return;
47 }
48 if (info.Length() < 1) {
49 return;
50 }
51 JSImage::SetAlt(info);
52 }
53
SetObjectFit(const JSCallbackInfo & info)54 void JSImageSpan::SetObjectFit(const JSCallbackInfo& info)
55 {
56 if (info.Length() != 1) {
57 return;
58 }
59
60 JSRef<JSVal> args = info[0];
61 if (args->IsNumber()) {
62 auto fit = static_cast<ImageFit>(args->ToNumber<int32_t>());
63 if (fit < ImageFit::FILL || fit > ImageFit::BOTTOM_END) {
64 fit = ImageFit::COVER;
65 }
66 ImageModel::GetInstance()->SetImageFit(fit);
67 } else {
68 ImageModel::GetInstance()->SetImageFit(ImageFit::COVER);
69 }
70 }
71
SetVerticalAlign(int32_t verticalAlign)72 void JSImageSpan::SetVerticalAlign(int32_t verticalAlign)
73 {
74 auto align = static_cast<VerticalAlign>(verticalAlign);
75 if (align < VerticalAlign::TOP || align > VerticalAlign::NONE) {
76 align = VerticalAlign::BOTTOM;
77 }
78 NG::ImageSpanView::SetVerticalAlign(align);
79 }
80
SetTextBackgroundStyle(const JSCallbackInfo & info)81 void JSImageSpan::SetTextBackgroundStyle(const JSCallbackInfo& info)
82 {
83 auto textBackgroundStyle = JSContainerSpan::ParseTextBackgroundStyle(info);
84 NG::ImageSpanView::SetPlaceHolderStyle(textBackgroundStyle);
85 }
86
OnComplete(const JSCallbackInfo & args)87 void JSImageSpan::OnComplete(const JSCallbackInfo& args)
88 {
89 JSRef<JSVal> arg = args[0];
90 if (arg->IsFunction()) {
91 auto jsLoadSuccFunc = AceType::MakeRefPtr<JsEventFunction<LoadImageSuccessEvent, 1>>(
92 JSRef<JSFunc>::Cast(arg), LoadImageSuccEventToJSValue);
93
94 auto onComplete = [execCtx = args.GetExecutionContext(), func = std::move(jsLoadSuccFunc)](
95 const LoadImageSuccessEvent& info) {
96 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
97 ACE_SCORING_EVENT("ImageSpan.onComplete");
98 func->Execute(info);
99 };
100 ImageModel::GetInstance()->SetOnComplete(std::move(onComplete));
101 }
102 }
103
OnError(const JSCallbackInfo & args)104 void JSImageSpan::OnError(const JSCallbackInfo& args)
105 {
106 JSRef<JSVal> arg = args[0];
107 if (arg->IsFunction()) {
108 auto jsLoadFailFunc = AceType::MakeRefPtr<JsEventFunction<LoadImageFailEvent, 1>>(
109 JSRef<JSFunc>::Cast(arg), LoadImageFailEventToJSValue);
110 auto onError = [execCtx = args.GetExecutionContext(), func = std::move(jsLoadFailFunc)](
111 const LoadImageFailEvent& info) {
112 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
113 ACE_SCORING_EVENT("ImageSpan.onError");
114 func->Execute(info);
115 };
116 ImageModel::GetInstance()->SetOnError(onError);
117 }
118 }
119
SetBaselineOffset(const JSCallbackInfo & info)120 void JSImageSpan::SetBaselineOffset(const JSCallbackInfo& info)
121 {
122 if (info.Length() < 1) {
123 return;
124 }
125 NG::CalcLength value;
126 if (ConvertFromJSValueNG(info[0], value) &&
127 value.GetDimensionContainsNegative().Unit() != DimensionUnit::PERCENT) {
128 NG::ImageSpanView::SetBaselineOffset(value.GetDimensionContainsNegative());
129 return;
130 }
131 value.Reset();
132 NG::ImageSpanView::SetBaselineOffset(value.GetDimensionContainsNegative());
133 }
134
JSBind(BindingTarget globalObj)135 void JSImageSpan::JSBind(BindingTarget globalObj)
136 {
137 JSClass<JSImageSpan>::Declare("ImageSpan");
138 MethodOptions opt = MethodOptions::NONE;
139 JSClass<JSImageSpan>::StaticMethod("create", &JSImageSpan::Create, opt);
140 JSClass<JSImageSpan>::StaticMethod("alt", &JSImageSpan::SetAlt, opt);
141 JSClass<JSImageSpan>::StaticMethod("objectFit", &JSImageSpan::SetObjectFit);
142 JSClass<JSImageSpan>::StaticMethod("verticalAlign", &JSImageSpan::SetVerticalAlign);
143 JSClass<JSImageSpan>::StaticMethod("textBackgroundStyle", &JSImageSpan::SetTextBackgroundStyle);
144 JSClass<JSImageSpan>::StaticMethod("onComplete", &JSImageSpan::OnComplete);
145 JSClass<JSImageSpan>::StaticMethod("onError", &JSImageSpan::OnError);
146 JSClass<JSImageSpan>::StaticMethod("border", &JSImage::JsBorder);
147 JSClass<JSImageSpan>::StaticMethod("borderRadius", &JSImage::JsBorderRadius);
148 JSClass<JSImageSpan>::StaticMethod("baselineOffset", &JSImageSpan::SetBaselineOffset);
149 JSClass<JSImageSpan>::InheritAndBind<JSViewAbstract>(globalObj);
150 }
151 } // namespace OHOS::Ace::Framework
152