• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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