1 /*
2 * Copyright (c) 2022-2024 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 "core/components_ng/pattern/web/web_pattern.h"
17
18 #include <securec.h>
19 #include <algorithm>
20 #include <cmath>
21 #include <iomanip>
22 #include <iostream>
23 #include <string>
24 #include <sstream>
25 #include <string_ex.h>
26 #include <unordered_map>
27 #include <vector>
28
29 #include "display_manager.h"
30 #include "file_uri.h"
31 #include "image_source.h"
32 #include "input_method_controller.h"
33 #include "parameters.h"
34
35 #include "interfaces/inner_api/ui_session/ui_session_manager.h"
36 #include "auto_fill_type.h"
37 #include "page_node_info.h"
38
39 #include "adapter/ohos/capability/html/span_to_html.h"
40 #include "base/geometry/ng/offset_t.h"
41 #include "base/geometry/rect.h"
42 #include "base/image/file_uri_helper.h"
43 #include "base/log/dump_log.h"
44 #include "base/utils/utils.h"
45 #include "base/mousestyle/mouse_style.h"
46 #include "base/utils/date_util.h"
47 #include "base/utils/linear_map.h"
48 #include "base/utils/time_util.h"
49 #include "base/utils/utils.h"
50 #include "core/common/ace_engine_ext.h"
51 #include "core/common/ai/data_detector_mgr.h"
52 #include "core/common/ai/image_analyzer_manager.h"
53 #include "core/common/container.h"
54 #include "core/common/ime/input_method_manager.h"
55 #include "core/common/recorder/event_definition.h"
56 #include "core/common/recorder/event_recorder.h"
57 #include "core/common/recorder/inspector_tree_collector.h"
58 #include "core/common/stylus/stylus_detector_mgr.h"
59 #include "core/common/udmf/udmf_client.h"
60 #include "core/common/udmf/unified_data.h"
61 #include "core/common/vibrator/vibrator_utils.h"
62 #include "core/components/dialog/dialog_theme.h"
63 #include "core/components/picker/picker_data.h"
64 #include "core/components/text_overlay/text_overlay_theme.h"
65 #include "core/components/web/resource/web_delegate.h"
66 #include "core/components/web/web_property.h"
67 #include "core/components_ng/base/view_stack_processor.h"
68 #include "core/components_ng/pattern/dialog/dialog_pattern.h"
69 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
70 #include "core/components_ng/pattern/list/list_pattern.h"
71 #include "core/components_ng/pattern/menu/menu_view.h"
72 #include "core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h"
73 #include "core/components_ng/pattern/overlay/overlay_manager.h"
74 #include "core/components_ng/pattern/refresh/refresh_pattern.h"
75 #include "core/components_ng/pattern/select_overlay/select_overlay_pattern.h"
76 #include "core/components_ng/pattern/swiper/swiper_pattern.h"
77 #include "core/components_ng/pattern/text/text_pattern.h"
78 #include "core/components_ng/pattern/text_field/text_field_manager.h"
79 #include "core/components_ng/pattern/web/web_event_hub.h"
80 #include "core/components_ng/pattern/web/view_data_common.h"
81 #include "core/components_ng/pattern/web/transitional_node_info.h"
82 #include "core/event/key_event.h"
83 #include "core/event/touch_event.h"
84 #include "core/event/event_info_convertor.h"
85 #include "core/pipeline_ng/pipeline_context.h"
86 #include "frameworks/base/utils/system_properties.h"
87 #include "frameworks/core/components_ng/base/ui_node.h"
88 #include "web_pattern.h"
89 #include "nweb_handler.h"
90
91 namespace OHOS::Ace::NG {
92 namespace {
93 const std::string IMAGE_POINTER_CONTEXT_MENU_PATH = "etc/webview/ohos_nweb/context-menu.svg";
94 const std::string IMAGE_POINTER_ALIAS_PATH = "etc/webview/ohos_nweb/alias.svg";
95 const std::string AUTO_FILL_VIEW_DATA_PAGE_URL = "autofill_viewdata_origin_pageurl";
96 const std::string AUTO_FILL_VIEW_DATA_OTHER_ACCOUNT = "autofill_viewdata_other_account";
97 const std::string AUTO_FILL_START_POPUP_WINDOW = "persist.sys.abilityms.autofill.is_passwd_popup_window";
98 const std::string WEB_INFO_PC = "8";
99 const std::string WEB_INFO_TABLET = "4";
100 const std::string WEB_INFO_PHONE = "2";
101 const std::string WEB_INFO_DEFAULT = "1";
102 constexpr int32_t UPDATE_WEB_LAYOUT_DELAY_TIME = 20;
103 constexpr int32_t AUTOFILL_DELAY_TIME = 200;
104 constexpr int32_t IMAGE_POINTER_CUSTOM_CHANNEL = 4;
105 constexpr int32_t TOUCH_EVENT_MAX_SIZE = 5;
106 constexpr int32_t KEYEVENT_MAX_NUM = 1000;
107 constexpr int32_t RESERVED_DEVICEID1 = 0xAAAAAAFF;
108 constexpr int32_t RESERVED_DEVICEID2 = 0xAAAAAAFE;
109 const LinearEnumMapNode<OHOS::NWeb::CursorType, MouseFormat> g_cursorTypeMap[] = {
110 { OHOS::NWeb::CursorType::CT_CROSS, MouseFormat::CROSS },
111 { OHOS::NWeb::CursorType::CT_HAND, MouseFormat::HAND_POINTING },
112 { OHOS::NWeb::CursorType::CT_IBEAM, MouseFormat::TEXT_CURSOR },
113 { OHOS::NWeb::CursorType::CT_WAIT, MouseFormat::LOADING },
114 { OHOS::NWeb::CursorType::CT_HELP, MouseFormat::HELP },
115 { OHOS::NWeb::CursorType::CT_EASTRESIZE, MouseFormat::WEST_EAST },
116 { OHOS::NWeb::CursorType::CT_NORTHRESIZE, MouseFormat::NORTH_SOUTH },
117 { OHOS::NWeb::CursorType::CT_NORTHEASTRESIZE, MouseFormat::NORTH_EAST_SOUTH_WEST },
118 { OHOS::NWeb::CursorType::CT_NORTHWESTRESIZE, MouseFormat::NORTH_WEST_SOUTH_EAST },
119 { OHOS::NWeb::CursorType::CT_SOUTHRESIZE, MouseFormat::NORTH_SOUTH },
120 { OHOS::NWeb::CursorType::CT_SOUTHEASTRESIZE, MouseFormat::NORTH_WEST_SOUTH_EAST },
121 { OHOS::NWeb::CursorType::CT_SOUTHWESTRESIZE, MouseFormat::NORTH_EAST_SOUTH_WEST },
122 { OHOS::NWeb::CursorType::CT_WESTRESIZE, MouseFormat::WEST_EAST },
123 { OHOS::NWeb::CursorType::CT_NORTHSOUTHRESIZE, MouseFormat::NORTH_SOUTH },
124 { OHOS::NWeb::CursorType::CT_EASTWESTRESIZE, MouseFormat::WEST_EAST },
125 { OHOS::NWeb::CursorType::CT_NORTHEASTSOUTHWESTRESIZE, MouseFormat::NORTH_EAST_SOUTH_WEST },
126 { OHOS::NWeb::CursorType::CT_NORTHWESTSOUTHEASTRESIZE, MouseFormat::NORTH_WEST_SOUTH_EAST },
127 { OHOS::NWeb::CursorType::CT_COLUMNRESIZE, MouseFormat::RESIZE_LEFT_RIGHT },
128 { OHOS::NWeb::CursorType::CT_ROWRESIZE, MouseFormat::RESIZE_UP_DOWN },
129 { OHOS::NWeb::CursorType::CT_MIDDLEPANNING, MouseFormat::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST },
130 { OHOS::NWeb::CursorType::CT_EASTPANNING, MouseFormat::MIDDLE_BTN_EAST },
131 { OHOS::NWeb::CursorType::CT_NORTHPANNING, MouseFormat::MIDDLE_BTN_NORTH },
132 { OHOS::NWeb::CursorType::CT_NORTHEASTPANNING, MouseFormat::MIDDLE_BTN_NORTH_EAST },
133 { OHOS::NWeb::CursorType::CT_NORTHWESTPANNING, MouseFormat::MIDDLE_BTN_NORTH_WEST },
134 { OHOS::NWeb::CursorType::CT_SOUTHPANNING, MouseFormat::MIDDLE_BTN_SOUTH },
135 { OHOS::NWeb::CursorType::CT_SOUTHEASTPANNING, MouseFormat::MIDDLE_BTN_SOUTH_EAST },
136 { OHOS::NWeb::CursorType::CT_SOUTHWESTPANNING, MouseFormat::MIDDLE_BTN_SOUTH_WEST },
137 { OHOS::NWeb::CursorType::CT_WESTPANNING, MouseFormat::MIDDLE_BTN_WEST },
138 { OHOS::NWeb::CursorType::CT_MOVE, MouseFormat::CURSOR_MOVE },
139 { OHOS::NWeb::CursorType::CT_VERTICALTEXT, MouseFormat::HORIZONTAL_TEXT_CURSOR },
140 { OHOS::NWeb::CursorType::CT_CELL, MouseFormat::CURSOR_CROSS },
141 { OHOS::NWeb::CursorType::CT_PROGRESS, MouseFormat::RUNNING },
142 { OHOS::NWeb::CursorType::CT_NODROP, MouseFormat::CURSOR_FORBID },
143 { OHOS::NWeb::CursorType::CT_COPY, MouseFormat::CURSOR_COPY },
144 { OHOS::NWeb::CursorType::CT_NONE, MouseFormat::CURSOR_NONE },
145 { OHOS::NWeb::CursorType::CT_NOTALLOWED, MouseFormat::CURSOR_FORBID },
146 { OHOS::NWeb::CursorType::CT_ZOOMIN, MouseFormat::ZOOM_IN },
147 { OHOS::NWeb::CursorType::CT_ZOOMOUT, MouseFormat::ZOOM_OUT },
148 { OHOS::NWeb::CursorType::CT_GRAB, MouseFormat::HAND_OPEN },
149 { OHOS::NWeb::CursorType::CT_GRABBING, MouseFormat::HAND_GRABBING },
150 { OHOS::NWeb::CursorType::CT_MIDDLE_PANNING_VERTICAL, MouseFormat::MIDDLE_BTN_NORTH_SOUTH },
151 { OHOS::NWeb::CursorType::CT_MIDDLE_PANNING_HORIZONTAL, MouseFormat::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST },
152 };
153
154 std::unordered_map<KeyCode, KeyCode> g_numPadFunctionMap = {
155 { KeyCode::KEY_NUMPAD_0, KeyCode::KEY_INSERT },
156 { KeyCode::KEY_NUMPAD_1, KeyCode::KEY_MOVE_END },
157 { KeyCode::KEY_NUMPAD_2, KeyCode::KEY_DPAD_DOWN },
158 { KeyCode::KEY_NUMPAD_3, KeyCode::KEY_PAGE_DOWN },
159 { KeyCode::KEY_NUMPAD_4, KeyCode::KEY_DPAD_LEFT },
160 { KeyCode::KEY_NUMPAD_5, KeyCode::KEY_CLEAR },
161 { KeyCode::KEY_NUMPAD_6, KeyCode::KEY_DPAD_RIGHT },
162 { KeyCode::KEY_NUMPAD_7, KeyCode::KEY_MOVE_HOME },
163 { KeyCode::KEY_NUMPAD_8, KeyCode::KEY_DPAD_UP },
164 { KeyCode::KEY_NUMPAD_9, KeyCode::KEY_PAGE_UP },
165 { KeyCode::KEY_NUMPAD_DIVIDE, KeyCode::KEY_NUMPAD_DIVIDE },
166 { KeyCode::KEY_NUMPAD_MULTIPLY, KeyCode::KEY_NUMPAD_MULTIPLY },
167 { KeyCode::KEY_NUMPAD_SUBTRACT, KeyCode::KEY_NUMPAD_SUBTRACT },
168 { KeyCode::KEY_NUMPAD_ADD, KeyCode::KEY_NUMPAD_ADD },
169 { KeyCode::KEY_NUMPAD_DOT, KeyCode::KEY_FORWARD_DEL },
170 { KeyCode::KEY_NUMPAD_ENTER, KeyCode::KEY_NUMPAD_ENTER }
171 };
172
173 constexpr Dimension OPTION_MARGIN = 8.0_vp;
174 constexpr Dimension CALIBERATE_X = 4.0_vp;
175 constexpr Color SELECTED_OPTION_FONT_COLOR = Color(0xff0a59f7);
176 constexpr Color SELECTED_OPTION_BACKGROUND_COLOR = Color(0x19254FF7);
177
178 constexpr int32_t HALF = 2;
179 constexpr int32_t AI_TIMEOUT_LIMIT = 200;
180 constexpr int32_t CHECK_PRE_SIZE = 5;
181 constexpr int32_t ADJUST_RATIO = 10;
182
183 struct TranslateTextExtraData {
184 bool needTranslate = false;
185 std::string registerObjectName = "";
186 std::string registerFunctionName = "";
187 std::string translateScript = "";
188 std::string initScript = "";
189 };
190 TranslateTextExtraData g_translateTextData;
191
ParseDateTimeJson(const std::string & timeJson,NWeb::DateTime & result)192 bool ParseDateTimeJson(const std::string& timeJson, NWeb::DateTime& result)
193 {
194 auto sourceJson = JsonUtil::ParseJsonString(timeJson);
195 if (!sourceJson || sourceJson->IsNull()) {
196 return false;
197 }
198
199 auto year = sourceJson->GetValue("year");
200 if (year && year->IsNumber()) {
201 result.year = year->GetInt();
202 }
203 auto month = sourceJson->GetValue("month");
204 if (month && month->IsNumber()) {
205 result.month = month->GetInt();
206 }
207 auto day = sourceJson->GetValue("day");
208 if (day && day->IsNumber()) {
209 result.day = day->GetInt();
210 }
211 auto hour = sourceJson->GetValue("hour");
212 if (hour && hour->IsNumber()) {
213 result.hour = hour->GetInt();
214 }
215 auto minute = sourceJson->GetValue("minute");
216 if (minute && minute->IsNumber()) {
217 result.minute = minute->GetInt();
218 }
219 return true;
220 }
221
ParseTextJsonValue(const std::string & textJson)222 std::string ParseTextJsonValue(const std::string& textJson)
223 {
224 auto sourceJson = JsonUtil::ParseJsonString(textJson);
225 if (!sourceJson || sourceJson->IsNull()) {
226 return "";
227 }
228 auto value = sourceJson->GetValue("value");
229 if (value && value->IsString()) {
230 return value->GetString();
231 }
232 return "";
233 }
234
235 const std::string NWEB_AUTOFILL_TYPE_OFF = "off";
236 const std::map<std::string, AceAutoFillType> NWEB_AUTOFILL_TYPE_TO_ACE = {
237 {OHOS::NWeb::NWEB_AUTOFILL_STREET_ADDRESS, AceAutoFillType::ACE_FULL_STREET_ADDRESS},
238 {OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_3, AceAutoFillType::ACE_DISTRICT_ADDRESS},
239 {OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_2, AceAutoFillType::ACE_CITY_ADDRESS},
240 {OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_1, AceAutoFillType::ACE_PROVINCE_ADDRESS},
241 {OHOS::NWeb::NWEB_AUTOFILL_COUNTRY, AceAutoFillType::ACE_COUNTRY_ADDRESS},
242 {OHOS::NWeb::NWEB_AUTOFILL_NAME, AceAutoFillType::ACE_PERSON_FULL_NAME},
243 {OHOS::NWeb::NWEB_AUTOFILL_FAMILY_NAME, AceAutoFillType::ACE_PERSON_LAST_NAME},
244 {OHOS::NWeb::NWEB_AUTOFILL_GIVEN_NAME, AceAutoFillType::ACE_PERSON_FIRST_NAME},
245 {OHOS::NWeb::NWEB_AUTOFILL_TEL_NATIONAL, AceAutoFillType::ACE_PHONE_NUMBER},
246 {OHOS::NWeb::NWEB_AUTOFILL_TEL, AceAutoFillType::ACE_FULL_PHONE_NUMBER},
247 {OHOS::NWeb::NWEB_AUTOFILL_TEL_COUNTRY_CODE, AceAutoFillType::ACE_PHONE_COUNTRY_CODE},
248 {OHOS::NWeb::NWEB_AUTOFILL_EMAIL, AceAutoFillType::ACE_EMAIL_ADDRESS},
249 {OHOS::NWeb::NWEB_AUTOFILL_CC_NUMBER, AceAutoFillType::ACE_BANK_CARD_NUMBER},
250 {OHOS::NWeb::NWEB_AUTOFILL_ID_CARD_NUMBER, AceAutoFillType::ACE_ID_CARD_NUMBER},
251 {OHOS::NWeb::NWEB_AUTOFILL_DETAIL_INFO_WITHOUT_STREET, AceAutoFillType::ACE_DETAIL_INFO_WITHOUT_STREET},
252 {OHOS::NWeb::NWEB_AUTOFILL_FORMAT_ADDRESS, AceAutoFillType::ACE_FORMAT_ADDRESS},
253 {OHOS::NWeb::NWEB_AUTOFILL_NICKNAME, AceAutoFillType::ACE_NICKNAME},
254 {OHOS::NWeb::NWEB_AUTOFILL_USERNAME, AceAutoFillType::ACE_USER_NAME},
255 {OHOS::NWeb::NWEB_AUTOFILL_PASSWORD, AceAutoFillType::ACE_PASSWORD},
256 {OHOS::NWeb::NWEB_AUTOFILL_NEW_PASSWORD, AceAutoFillType::ACE_NEW_PASSWORD},
257 {OHOS::NWeb::NWEB_AUTOFILL_PASSPORT_NUMBER, AceAutoFillType::ACE_PASSPORT_NUMBER},
258 {OHOS::NWeb::NWEB_AUTOFILL_VALIDITY, AceAutoFillType::ACE_VALIDITY},
259 {OHOS::NWeb::NWEB_AUTOFILL_ISSUE_AT, AceAutoFillType::ACE_ISSUE_AT},
260 {OHOS::NWeb::NWEB_AUTOFILL_ORGANIZATION, AceAutoFillType::ACE_ORGANIZATION},
261 {OHOS::NWeb::NWEB_AUTOFILL_TAX_ID, AceAutoFillType::ACE_TAX_ID},
262 {OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_CITY_AND_STATE, AceAutoFillType::ACE_ADDRESS_CITY_AND_STATE},
263 {OHOS::NWeb::NWEB_AUTOFILL_FLIGHT_NUMBER, AceAutoFillType::ACE_FLIGHT_NUMBER},
264 {OHOS::NWeb::NWEB_AUTOFILL_LICENSE_NUMBER, AceAutoFillType::ACE_LICENSE_NUMBER},
265 {OHOS::NWeb::NWEB_AUTOFILL_LICENSE_FILE_NUMBER, AceAutoFillType::ACE_LICENSE_FILE_NUMBER},
266 {OHOS::NWeb::NWEB_AUTOFILL_LICENSE_PLATE, AceAutoFillType::ACE_LICENSE_PLATE},
267 {OHOS::NWeb::NWEB_AUTOFILL_ENGINE_NUMBER, AceAutoFillType::ACE_ENGINE_NUMBER},
268 {OHOS::NWeb::NWEB_AUTOFILL_LICENSE_CHASSIS_NUMBER, AceAutoFillType::ACE_LICENSE_CHASSIS_NUMBER},
269 };
270
271 const std::map<AceAutoFillType, std::string> ACE_AUTOFILL_TYPE_TO_NWEB = {
272 {AceAutoFillType::ACE_FULL_STREET_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_STREET_ADDRESS},
273 {AceAutoFillType::ACE_DISTRICT_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_3},
274 {AceAutoFillType::ACE_CITY_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_2},
275 {AceAutoFillType::ACE_PROVINCE_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_LEVEL_1},
276 {AceAutoFillType::ACE_COUNTRY_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_COUNTRY},
277 {AceAutoFillType::ACE_PERSON_FULL_NAME, OHOS::NWeb::NWEB_AUTOFILL_NAME},
278 {AceAutoFillType::ACE_PERSON_LAST_NAME, OHOS::NWeb::NWEB_AUTOFILL_FAMILY_NAME},
279 {AceAutoFillType::ACE_PERSON_FIRST_NAME, OHOS::NWeb::NWEB_AUTOFILL_GIVEN_NAME},
280 {AceAutoFillType::ACE_PHONE_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_TEL_NATIONAL},
281 {AceAutoFillType::ACE_FULL_PHONE_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_TEL},
282 {AceAutoFillType::ACE_PHONE_COUNTRY_CODE, OHOS::NWeb::NWEB_AUTOFILL_TEL_COUNTRY_CODE},
283 {AceAutoFillType::ACE_EMAIL_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_EMAIL},
284 {AceAutoFillType::ACE_BANK_CARD_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_CC_NUMBER},
285 {AceAutoFillType::ACE_ID_CARD_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_ID_CARD_NUMBER},
286 {AceAutoFillType::ACE_DETAIL_INFO_WITHOUT_STREET, OHOS::NWeb::NWEB_AUTOFILL_DETAIL_INFO_WITHOUT_STREET},
287 {AceAutoFillType::ACE_FORMAT_ADDRESS, OHOS::NWeb::NWEB_AUTOFILL_FORMAT_ADDRESS},
288 {AceAutoFillType::ACE_NICKNAME, OHOS::NWeb::NWEB_AUTOFILL_NICKNAME},
289 {AceAutoFillType::ACE_USER_NAME, OHOS::NWeb::NWEB_AUTOFILL_USERNAME},
290 {AceAutoFillType::ACE_PASSWORD, OHOS::NWeb::NWEB_AUTOFILL_PASSWORD},
291 {AceAutoFillType::ACE_NEW_PASSWORD, OHOS::NWeb::NWEB_AUTOFILL_NEW_PASSWORD},
292 {AceAutoFillType::ACE_PASSPORT_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_PASSPORT_NUMBER},
293 {AceAutoFillType::ACE_VALIDITY, OHOS::NWeb::NWEB_AUTOFILL_VALIDITY},
294 {AceAutoFillType::ACE_ISSUE_AT, OHOS::NWeb::NWEB_AUTOFILL_ISSUE_AT},
295 {AceAutoFillType::ACE_ORGANIZATION, OHOS::NWeb::NWEB_AUTOFILL_ORGANIZATION},
296 {AceAutoFillType::ACE_TAX_ID, OHOS::NWeb::NWEB_AUTOFILL_TAX_ID},
297 {AceAutoFillType::ACE_ADDRESS_CITY_AND_STATE, OHOS::NWeb::NWEB_AUTOFILL_ADDRESS_CITY_AND_STATE},
298 {AceAutoFillType::ACE_FLIGHT_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_FLIGHT_NUMBER},
299 {AceAutoFillType::ACE_LICENSE_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_LICENSE_NUMBER},
300 {AceAutoFillType::ACE_LICENSE_FILE_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_LICENSE_FILE_NUMBER},
301 {AceAutoFillType::ACE_LICENSE_PLATE, OHOS::NWeb::NWEB_AUTOFILL_LICENSE_PLATE},
302 {AceAutoFillType::ACE_ENGINE_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_ENGINE_NUMBER},
303 {AceAutoFillType::ACE_LICENSE_CHASSIS_NUMBER, OHOS::NWeb::NWEB_AUTOFILL_LICENSE_CHASSIS_NUMBER},
304 };
305
306 const std::map<std::string, OHOS::NWeb::NWebAutofillEvent> NWEB_AUTOFILL_EVENTS = {
307 {OHOS::NWeb::NWEB_AUTOFILL_EVENT_SAVE, OHOS::NWeb::NWebAutofillEvent::SAVE},
308 {OHOS::NWeb::NWEB_AUTOFILL_EVENT_FILL, OHOS::NWeb::NWebAutofillEvent::FILL},
309 {OHOS::NWeb::NWEB_AUTOFILL_EVENT_UPDATE, OHOS::NWeb::NWebAutofillEvent::UPDATE},
310 {OHOS::NWeb::NWEB_AUTOFILL_EVENT_CLOSE, OHOS::NWeb::NWebAutofillEvent::CLOSE},
311 };
312
GetWebDebugBackGroundColor()313 std::string GetWebDebugBackGroundColor()
314 {
315 return OHOS::system::GetParameter("web.debug.surfaceNodeBackgroundColor", "");
316 }
317 } // namespace
318
319 constexpr int32_t SINGLE_CLICK_NUM = 1;
320 constexpr int32_t DOUBLE_CLICK_NUM = 2;
321 constexpr int32_t TRIPLE_CLICK_NUM = 3;
322 constexpr double DEFAULT_DBCLICK_INTERVAL = 0.5;
323 constexpr double DEFAULT_DBCLICK_OFFSET = 2.0;
324 constexpr double DEFAULT_AXIS_RATIO = -12.5;
325 constexpr double DEFAULT_WEB_WIDTH = 100.0;
326 constexpr double DEFAULT_WEB_HEIGHT = 80.0;
327 constexpr Dimension TOOLTIP_BORDER_WIDTH = 1.0_vp;
328 constexpr Dimension TOOLTIP_FONT_SIZE = 14.0_vp;
329 constexpr Dimension TOOLTIP_PADDING = 8.0_vp;
330 constexpr float TOOLTIP_MAX_PORTION = 0.35f;
331 constexpr float TOOLTIP_MARGIN = 10.0f;
332 constexpr float TOOLTIP_DELAY_MS = 700;
333 constexpr uint32_t ADJUST_WEB_DRAW_LENGTH = 3000;
334 constexpr int32_t FIT_CONTENT_LIMIT_LENGTH = 8000;
335 const std::string PATTERN_TYPE_WEB = "WEBPATTERN";
336 const std::string BUFFER_USAGE_WEB = "web";
337 const std::string DEFAULT_WEB_TEXT_ENCODING_FORMAT = "UTF-8";
338 constexpr int32_t SYNC_SURFACE_QUEUE_SIZE = 8;
339 constexpr int32_t ASYNC_SURFACE_QUEUE_SIZE_FOR_PHONE = 5;
340 constexpr int32_t ASYNC_SURFACE_QUEUE_SIZE_FOR_OTHERS = 4;
341 constexpr uint32_t DEBUG_DRAGMOVEID_TIMER = 30;
342 // web feature params
343 constexpr char VISIBLE_ACTIVE_ENABLE[] = "persist.web.visible_active_enable";
344 constexpr char MEMORY_LEVEL_ENABEL[] = "persist.web.memory_level_enable";
345 const std::vector<std::string> SYNC_RENDER_SLIDE {V2::LIST_ETS_TAG, V2::SCROLL_ETS_TAG};
346
347 constexpr int32_t DEFAULT_PINCH_FINGER = 2;
348 constexpr double DEFAULT_PINCH_DISTANCE = 6.0;
349 constexpr double DEFAULT_PINCH_SCALE = 1.0;
350 constexpr double DEFAULT_PINCH_SCALE_MAX = 5.0;
351 constexpr double DEFAULT_PINCH_SCALE_MIN = 0.1;
352 constexpr int32_t STATUS_ZOOMIN = 1;
353 constexpr int32_t STATUS_ZOOMOUT = 2;
354 constexpr int32_t ZOOM_ERROR_COUNT_MAX = 5;
355 constexpr double ZOOMIN_PUBLIC_ERRAND = 0.4444;
356 constexpr int32_t ZOOM_CONVERT_NUM = 10;
357 constexpr int32_t POPUP_CALCULATE_RATIO = 2;
358 constexpr int32_t MIN_ACCESSIBILITY_FOCUS_SIZE = 2;
359
360 constexpr int32_t PINCH_START_TYPE = 1;
361 constexpr int32_t PINCH_UPDATE_TYPE = 3;
362 constexpr int32_t PINCH_END_TYPE = 2;
363 constexpr int32_t PINCH_CANCEL_TYPE = 4;
364
365 constexpr char ACCESSIBILITY_GENERIC_CONTAINER[] = "genericContainer";
366 constexpr char ACCESSIBILITY_IMAGE[] = "image";
367 constexpr char ACCESSIBILITY_PARAGRAPH[] = "paragraph";
368 constexpr char WEB_NODE_URL[] = "url";
369
370 const std::string IS_HINT_TYPE = "{\"isHint2Type\": true}";
371 const std::string STRING_LF = "\n";
372 const std::string DRAG_DATA_TYPE_TEXT = "general.plain-text";
373 const std::string DRAG_DATA_TYPE_HTML = "general.html";
374 const std::set<std::string> FILE_TYPE_SET = {"general.file", "general.audio", "general.video", "general.image"};
375 const std::string DRAG_DATA_TYPE_LINK = "general.hyperlink";
376 const std::string FAKE_DRAG_DATA_VAL = " ";
377 const std::string FAKE_LINK_VAL = "https://xxx.xxx.xxx";
378
379 #define WEB_ACCESSIBILITY_DELAY_TIME 100
380 #define GPU_ABNORMAL_VALUE (32 * 1024)
381 #define GPU_SERIOUS_ABNORMAL_VALUE (32 * 1024 * 1024)
382 #define SIZE_UNIT 1024
383 #define FLOAT_UNIT 100.0F
384 #define DECIMAL_POINTS 2
385
386 using Recorder::EventRecorder;
387
388 class WebAccessibilityChildTreeCallback : public AccessibilityChildTreeCallback {
389 public:
WebAccessibilityChildTreeCallback(const WeakPtr<WebPattern> & weakPattern,int64_t accessibilityId)390 WebAccessibilityChildTreeCallback(const WeakPtr<WebPattern> &weakPattern, int64_t accessibilityId)
391 : AccessibilityChildTreeCallback(accessibilityId), weakPattern_(weakPattern)
392 {}
393
394 ~WebAccessibilityChildTreeCallback() override = default;
395
OnRegister(uint32_t windowId,int32_t treeId)396 bool OnRegister(uint32_t windowId, int32_t treeId) override
397 {
398 auto pattern = weakPattern_.Upgrade();
399 if (pattern == nullptr) {
400 return false;
401 }
402 if (isReg_) {
403 return true;
404 }
405 if (!pattern->OnAccessibilityChildTreeRegister()) {
406 return false;
407 }
408 pattern->SetAccessibilityState(true, isDelayed_);
409 isDelayed_ = false;
410 isReg_ = true;
411 return true;
412 }
413
OnDeregister()414 bool OnDeregister() override
415 {
416 auto pattern = weakPattern_.Upgrade();
417 if (pattern == nullptr) {
418 return false;
419 }
420 if (!isReg_) {
421 return true;
422 }
423 if (!pattern->OnAccessibilityChildTreeDeregister()) {
424 return false;
425 }
426 pattern->SetAccessibilityState(false);
427 isReg_ = false;
428 return true;
429 }
430
OnSetChildTree(int32_t childWindowId,int32_t childTreeId)431 bool OnSetChildTree(int32_t childWindowId, int32_t childTreeId) override
432 {
433 auto pattern = weakPattern_.Upgrade();
434 if (pattern == nullptr) {
435 return false;
436 }
437 pattern->OnSetAccessibilityChildTree(childWindowId, childTreeId);
438 return true;
439 }
440
OnDumpChildInfo(const std::vector<std::string> & params,std::vector<std::string> & info)441 bool OnDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) override
442 {
443 return false;
444 }
445
OnClearRegisterFlag()446 void OnClearRegisterFlag() override
447 {
448 auto pattern = weakPattern_.Upgrade();
449 if (pattern == nullptr) {
450 return;
451 }
452 isReg_ = false;
453 }
454
SetIsDelayed(bool isDelayed)455 void SetIsDelayed(bool isDelayed)
456 {
457 isDelayed_ = isDelayed;
458 }
459
460 private:
461 bool isReg_ = false;
462 bool isDelayed_ = false;
463 WeakPtr<WebPattern> weakPattern_;
464 };
465
WebPattern()466 WebPattern::WebPattern()
467 {
468 InitMagnifier();
469 renderMode_ = RenderMode::ASYNC_RENDER;
470 cursorType_ = OHOS::NWeb::CursorType::CT_NONE;
471 viewDataCommon_ = std::make_shared<ViewDataCommon>();
472 RegisterSurfaceDensityCallback();
473 }
474
WebPattern(const std::string & webSrc,const RefPtr<WebController> & webController,RenderMode renderMode,bool incognitoMode,const std::string & sharedRenderProcessToken)475 WebPattern::WebPattern(const std::string& webSrc, const RefPtr<WebController>& webController, RenderMode renderMode,
476 bool incognitoMode, const std::string& sharedRenderProcessToken)
477 : webSrc_(std::move(webSrc)), webController_(webController), renderMode_(renderMode), incognitoMode_(incognitoMode),
478 sharedRenderProcessToken_(sharedRenderProcessToken)
479 {
480 InitMagnifier();
481 cursorType_ = OHOS::NWeb::CursorType::CT_NONE;
482 viewDataCommon_ = std::make_shared<ViewDataCommon>();
483 RegisterSurfaceDensityCallback();
484 }
485
WebPattern(const std::string & webSrc,const SetWebIdCallback & setWebIdCallback,RenderMode renderMode,bool incognitoMode,const std::string & sharedRenderProcessToken)486 WebPattern::WebPattern(const std::string& webSrc, const SetWebIdCallback& setWebIdCallback, RenderMode renderMode,
487 bool incognitoMode, const std::string& sharedRenderProcessToken)
488 : webSrc_(std::move(webSrc)), setWebIdCallback_(setWebIdCallback), renderMode_(renderMode),
489 incognitoMode_(incognitoMode), sharedRenderProcessToken_(sharedRenderProcessToken)
490 {
491 InitMagnifier();
492 cursorType_ = OHOS::NWeb::CursorType::CT_NONE;
493 viewDataCommon_ = std::make_shared<ViewDataCommon>();
494 RegisterSurfaceDensityCallback();
495 }
496
~WebPattern()497 WebPattern::~WebPattern()
498 {
499 TAG_LOGI(AceLogTag::ACE_WEB, "NWEB ~WebPattern start");
500 ACE_SCOPED_TRACE("WebPattern::~WebPattern, web id = %d", GetWebId());
501 UninitTouchEventListener();
502 if (delegate_) {
503 TAG_LOGD(AceLogTag::ACE_WEB, "NWEB ~WebPattern delegate_ start SetAudioMuted");
504 delegate_->SetAudioMuted(true);
505 delegate_->UnRegisterNativeArkJSFunction(Recorder::WEB_OBJ_NAME);
506 }
507
508 if (observer_) {
509 TAG_LOGD(AceLogTag::ACE_WEB, "NWEB ~WebPattern observer_ start NotifyDestory");
510 observer_->NotifyDestory();
511 }
512 if (isActive_) {
513 TAG_LOGD(AceLogTag::ACE_WEB, "NWEB ~WebPattern isActive_ start OnInActive");
514 if (delegate_ && delegate_->IsActivePolicyDisable()) {
515 // if active policy disable, must force it Inactive, otherwise OnInActive will inactive it.
516 delegate_->OnInactive();
517 } else {
518 OnInActive();
519 }
520 }
521 if (imageAnalyzerManager_) {
522 imageAnalyzerManager_->ReleaseImageAnalyzer();
523 }
524 UninitializeAccessibility();
525 HideMagnifier();
526 OnTooltip("");
527 auto pipeline = PipelineBase::GetCurrentContextSafely();
528 if (pipeline) {
529 pipeline->UnregisterDensityChangedCallback(densityCallbackId_);
530 }
531 }
532
ShowContextSelectOverlay(const RectF & firstHandle,const RectF & secondHandle,TextResponseType responseType,bool handleReverse)533 void WebPattern::ShowContextSelectOverlay(const RectF& firstHandle, const RectF& secondHandle,
534 TextResponseType responseType, bool handleReverse)
535 {
536 if (contextSelectOverlay_) {
537 contextSelectOverlay_->ProcessOverlay({ .animation = true });
538 }
539 }
540
CloseContextSelectionMenu()541 void WebPattern::CloseContextSelectionMenu()
542 {
543 if (contextSelectOverlay_ && contextSelectOverlay_->IsCurrentMenuVisibile()) {
544 contextSelectOverlay_->CloseOverlay(true, CloseReason::CLOSE_REASON_NORMAL);
545 }
546 }
547
RemovePreviewMenuNode()548 void WebPattern::RemovePreviewMenuNode()
549 {
550 if (!previewImageNodeId_.has_value()) {
551 return;
552 }
553 TAG_LOGI(AceLogTag::ACE_WEB, "RemovePreviewMenuNode");
554 curContextMenuResult_ = false;
555 auto previewNode =
556 FrameNode::GetFrameNode(V2::IMAGE_ETS_TAG, previewImageNodeId_.value());
557 CHECK_NULL_VOID(previewNode);
558 auto parent = previewNode->GetParent();
559 CHECK_NULL_VOID(parent);
560 parent->RemoveChild(previewNode);
561 previewImageNodeId_.reset();
562 parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
563 }
564
IsPreviewMenuNotNeedShowPreview()565 bool WebPattern::IsPreviewMenuNotNeedShowPreview()
566 {
567 bool isNotNeedShowPreview = (isNewDragStyle_ && IsPreviewImageNodeExist()) || imageOverlayIsSelected_;
568 TAG_LOGI(AceLogTag::ACE_WEB,
569 "IsPreviewMenuNotNeedShowPreview:%{public}d, temporarily for AI entity popup: %{public}d",
570 isNotNeedShowPreview, imageOverlayIsSelected_);
571 return isNotNeedShowPreview;
572 }
573
SetPreviewSelectionMenu(const std::shared_ptr<WebPreviewSelectionMenuParam> & param)574 void WebPattern::SetPreviewSelectionMenu(const std::shared_ptr<WebPreviewSelectionMenuParam>& param)
575 {
576 CHECK_NULL_VOID(param);
577 auto onPreviewMenuDisappear = [weak = AceType::WeakClaim(this),
578 onDisappear = std::move(param->menuParam.onDisappear)]() {
579 TAG_LOGD(AceLogTag::ACE_WEB, "onPreviewMenuDisappear");
580 if (onDisappear) {
581 onDisappear();
582 }
583 auto webPattern = weak.Upgrade();
584 CHECK_NULL_VOID(webPattern);
585 webPattern->RemovePreviewMenuNode();
586 CHECK_NULL_VOID(webPattern->contextMenuResult_);
587 webPattern->contextMenuResult_->Cancel();
588 };
589 param->menuParam.onDisappear = std::move(onPreviewMenuDisappear);
590 auto key = std::make_pair(param->type, param->responseType);
591 auto it = previewSelectionMenuMap_.find(key);
592 if (it != previewSelectionMenuMap_.end()) {
593 if (param->menuBuilder == nullptr) {
594 previewSelectionMenuMap_.erase(it);
595 return;
596 }
597 it->second = param;
598 return;
599 }
600 previewSelectionMenuMap_[key] = param;
601 TAG_LOGD(AceLogTag::ACE_WEB, "muneParam hapticFeedbackMode:%{public}d", param->menuParam.hapticFeedbackMode);
602 }
603
GetPreviewSelectionMenuParams(const WebElementType & type,const ResponseType & responseType)604 std::shared_ptr<WebPreviewSelectionMenuParam> WebPattern::GetPreviewSelectionMenuParams(
605 const WebElementType& type, const ResponseType& responseType)
606 {
607 auto key = std::make_pair(type, responseType);
608 auto it = previewSelectionMenuMap_.find(key);
609 if (it != previewSelectionMenuMap_.end()) {
610 return it->second;
611 }
612
613 TAG_LOGD(AceLogTag::ACE_WEB, "The key not in previewSelectionMenuMap_");
614 return nullptr;
615 }
616
GetPreviewImageOffsetAndSize(bool isImage,Offset & previewOffset,SizeF & previewSize)617 void WebPattern::GetPreviewImageOffsetAndSize(bool isImage, Offset& previewOffset, SizeF& previewSize)
618 {
619 if (isImage) {
620 CHECK_NULL_VOID(contextMenuParam_);
621 int32_t x = 0;
622 int32_t y = 0;
623 int32_t width = 0;
624 int32_t height = 0;
625 contextMenuParam_->GetImageRect(x, y, width, height);
626 previewOffset.SetX((float)x);
627 previewOffset.SetY((float)y);
628 previewSize.SetWidth((float)width);
629 previewSize.SetHeight((float)height);
630 } else {
631 previewSize.SetWidth(drawSize_.Width());
632 previewSize.SetHeight(drawSize_.Height());
633 }
634 auto host = GetHost();
635 CHECK_NULL_VOID(host);
636 auto pipeline = host->GetContextRefPtr();
637 CHECK_NULL_VOID(pipeline);
638 previewSize.SetWidth(previewSize.Width() / pipeline->GetDipScale());
639 previewSize.SetHeight(previewSize.Height() / pipeline->GetDipScale());
640 }
641
CreatePreviewImageFrameNode(bool isImage)642 RefPtr<FrameNode> WebPattern::CreatePreviewImageFrameNode(bool isImage)
643 {
644 RemovePreviewMenuNode();
645 previewImageNodeId_ = ElementRegister::GetInstance()->MakeUniqueId();
646 auto previewNode = FrameNode::GetOrCreateFrameNode(
647 V2::IMAGE_ETS_TAG, previewImageNodeId_.value(), []() { return AceType::MakeRefPtr<ImagePattern>(); });
648 CHECK_NULL_RETURN(previewNode, nullptr);
649 auto previewRenderContext = previewNode->GetRenderContext();
650 CHECK_NULL_RETURN(previewRenderContext, nullptr);
651 auto previewGesture = previewNode->GetOrCreateGestureEventHub();
652 CHECK_NULL_RETURN(previewGesture, nullptr);
653
654 previewNode->SetDraggable(false);
655 previewGesture->SetDragEvent(nullptr, { PanDirection::DOWN }, 0, Dimension(0));
656
657 Offset previewOffset(0, 0);
658 SizeF previewSize;
659 GetPreviewImageOffsetAndSize(isImage, previewOffset, previewSize);
660 if (previewSize.Width() <= 0 || previewSize.Height() <= 0) {
661 TAG_LOGI(AceLogTag::ACE_WEB, "CreatePreviewImageFrameNode get preview size(%{public}f, %{public}f) error",
662 previewSize.Width(), previewSize.Height());
663 return nullptr;
664 }
665 previewRenderContext->UpdatePosition(
666 OffsetT<Dimension>(Dimension(previewOffset.GetX()), Dimension(previewOffset.GetY())));
667
668 auto previewProperty = previewNode->GetLayoutProperty<ImageLayoutProperty>();
669 previewProperty->UpdateAutoResize(false);
670 previewProperty->UpdateMarginSelfIdealSize(previewSize);
671 MeasureProperty layoutConstraint;
672 CalcSize idealSize = { CalcLength(Dimension(previewSize.Width(), DimensionUnit::VP).ConvertToPx()),
673 CalcLength(Dimension(previewSize.Height(), DimensionUnit::VP).ConvertToPx()) };
674 layoutConstraint.selfIdealSize = idealSize;
675 layoutConstraint.maxSize = idealSize;
676 previewNode->UpdateLayoutConstraint(layoutConstraint);
677 TAG_LOGI(AceLogTag::ACE_WEB,
678 "CreatePreviewImageFrameNode offset:%{public}f, %{public}f; size:%{public}f, %{public}f",
679 previewOffset.GetX(), previewOffset.GetY(), previewSize.Width(), previewSize.Height());
680 needUpdateImagePreviewParam_ = true;
681 curContextMenuResult_ = true;
682 return previewNode;
683 }
684
UpdateImagePreviewParam()685 void WebPattern::UpdateImagePreviewParam()
686 {
687 CHECK_NULL_VOID(needUpdateImagePreviewParam_);
688 needUpdateImagePreviewParam_ = false;
689 if (!previewImageNodeId_.has_value()) {
690 return;
691 }
692 TAG_LOGI(AceLogTag::ACE_WEB, "UpdateImagePreviewParam");
693 auto params = GetPreviewSelectionMenuParams(curElementType_, curResponseType_);
694 if (!params) {
695 RemovePreviewMenuNode();
696 return;
697 }
698 #ifndef ACE_UNITTEST
699 auto previewNode =
700 FrameNode::GetFrameNode(V2::IMAGE_ETS_TAG, previewImageNodeId_.value());
701 CHECK_NULL_VOID(previewNode);
702 ViewStackProcessor::GetInstance()->Push(previewNode);
703 ViewAbstractModel::GetInstance()->BindContextMenu(
704 curResponseType_, params->menuBuilder, params->menuParam, params->previewBuilder);
705 ViewAbstractModel::GetInstance()->BindDragWithContextMenuParams(params->menuParam);
706 ViewStackProcessor::GetInstance()->Finish();
707 #endif
708 }
709
OnContextMenuShow(const std::shared_ptr<BaseEventInfo> & info,bool isRichtext,bool result)710 void WebPattern::OnContextMenuShow(const std::shared_ptr<BaseEventInfo>& info, bool isRichtext, bool result)
711 {
712 TAG_LOGI(AceLogTag::ACE_WEB,
713 "OnContextMenuShow result:%{public}d, isNewDragStyle_:%{public}d", result, isNewDragStyle_);
714 curContextMenuResult_ = result;
715 auto *eventInfo = TypeInfoHelper::DynamicCast<ContextMenuEvent>(info.get());
716 CHECK_NULL_VOID(eventInfo);
717 contextMenuParam_ = eventInfo->GetParam();
718 CHECK_NULL_VOID(contextMenuParam_);
719 contextMenuResult_ = eventInfo->GetContextMenuResult();
720 CHECK_NULL_VOID(contextMenuResult_);
721 if (isRichtext) {
722 if (!contextSelectOverlay_) {
723 contextSelectOverlay_ = AceType::MakeRefPtr<WebContextSelectOverlay>(WeakClaim(this));
724 }
725 ShowContextSelectOverlay(RectF(), RectF());
726 return;
727 }
728 CHECK_NULL_VOID(isNewDragStyle_ && result);
729 bool isImage =
730 ((contextMenuParam_->GetMediaType() == OHOS::NWeb::NWebContextMenuParams::ContextMenuMediaType::CM_MT_IMAGE) &&
731 (contextMenuParam_->GetLinkUrl().empty()));
732 if (isImage) {
733 auto sourceType = contextMenuParam_->GetSourceType();
734 if (sourceType == OHOS::NWeb::NWebContextMenuParams::ContextMenuSourceType::CM_ST_MOUSE) {
735 curResponseType_ = ResponseType::RIGHT_CLICK;
736 } else if (sourceType == OHOS::NWeb::NWebContextMenuParams::ContextMenuSourceType::CM_ST_LONG_PRESS) {
737 curResponseType_ = ResponseType::LONG_PRESS;
738 } else {
739 return;
740 }
741 curElementType_ = WebElementType::IMAGE;
742 CHECK_NULL_VOID(GetPreviewSelectionMenuParams(curElementType_, curResponseType_));
743 auto host = GetHost();
744 if (!host) {
745 TAG_LOGE(AceLogTag::ACE_WEB, "GetHost failed");
746 delegate_->OnContextMenuHide("");
747 return;
748 }
749 auto previewNode = CreatePreviewImageFrameNode(isImage);
750 if (!previewNode) {
751 TAG_LOGI(AceLogTag::ACE_WEB, "CreatePreviewImageFrameNode failed");
752 previewImageNodeId_.reset();
753 delegate_->OnContextMenuHide("");
754 return;
755 }
756
757 host->AddChild(previewNode);
758 previewNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
759 previewNode->MarkModifyDone();
760 host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
761 host->MarkModifyDone();
762 }
763 }
764
OnContextMenuHide()765 void WebPattern::OnContextMenuHide()
766 {
767 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern OnContextMenuHide");
768 if (webData_) {
769 CloseContextSelectionMenu();
770 return;
771 }
772 RemovePreviewMenuNode();
773 CHECK_NULL_VOID(contextMenuResult_);
774 contextMenuResult_->Cancel();
775 curContextMenuResult_ = false;
776 }
777
NeedSoftKeyboard() const778 bool WebPattern::NeedSoftKeyboard() const
779 {
780 if (delegate_) {
781 return delegate_->NeedSoftKeyboard();
782 }
783 return false;
784 }
785
OnAttachToMainTree()786 void WebPattern::OnAttachToMainTree()
787 {
788 TAG_LOGI(AceLogTag::ACE_WEB, "OnAttachToMainTree WebId %{public}d", GetWebId());
789 isAttachedToMainTree_ = true;
790 InitSlideUpdateListener();
791 // report component is in foreground.
792 delegate_->OnRenderToForeground();
793 }
794
OnDetachFromMainTree()795 void WebPattern::OnDetachFromMainTree()
796 {
797 TAG_LOGI(AceLogTag::ACE_WEB, "OnDetachFromMainTree WebId %{public}d", GetWebId());
798 isAttachedToMainTree_ = false;
799 // report component is in background.
800 delegate_->OnRenderToBackground();
801 }
802
OnAttachToFrameNode()803 void WebPattern::OnAttachToFrameNode()
804 {
805 auto host = GetHost();
806 CHECK_NULL_VOID(host);
807 auto pipeline = PipelineContext::GetCurrentContext();
808 CHECK_NULL_VOID(pipeline);
809 SetRotation(pipeline->GetTransformHint());
810
811 host->GetRenderContext()->UpdateClipEdge(true);
812 if (!renderContextForSurface_) {
813 renderContextForSurface_ = RenderContext::Create();
814 static RenderContext::ContextParam param = { RenderContext::ContextType::HARDWARE_SURFACE,
815 "RosenWeb" };
816 CHECK_NULL_VOID(renderContextForSurface_);
817 renderContextForSurface_->InitContext(false, param);
818 // Disable hardware composition when initializing to fix visual artifacts when switching to a new webview.
819 auto surfaceNode = OHOS::Rosen::RSBaseNode::ReinterpretCast<OHOS::Rosen::RSSurfaceNode>(GetSurfaceRSNode());
820 CHECK_NULL_VOID(surfaceNode);
821 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnAttachToFrameNode, web id = %{public}d", GetWebId());
822 ACE_SCOPED_TRACE("WebPattern::OnAttachToFrameNode, web id = %d", GetWebId());
823 surfaceNode->SetHardwareEnabled(true, Rosen::SelfDrawingNodeType::DEFAULT, false);
824 }
825
826 if (!renderContextForPopupSurface_) {
827 renderContextForPopupSurface_ = RenderContext::Create();
828 CHECK_NULL_VOID(renderContextForPopupSurface_);
829 static RenderContext::ContextParam popupParam = { RenderContext::ContextType::HARDWARE_SURFACE,
830 "RosenWebPopup" };
831 renderContextForPopupSurface_->InitContext(false, popupParam);
832 }
833 host->GetLayoutProperty()->UpdateMeasureType(MeasureType::MATCH_PARENT);
834 pipeline->AddNodesToNotifyMemoryLevel(host->GetId());
835
836 auto callbackId = pipeline->RegisterTransformHintChangeCallback([weak = WeakClaim(this)](uint32_t transform) {
837 auto pattern = weak.Upgrade();
838 if (pattern) {
839 TAG_LOGD(AceLogTag::ACE_WEB, "OnAttach to frame node, set transform:%{public}u", transform);
840 pattern->SetRotation(transform);
841 }
842 });
843 UpdateTransformHintChangedCallbackId(callbackId);
844 #if !defined(PREVIEW) && !defined(ACE_UNITTEST) && defined(OHOS_PLATFORM)
845 if (UiSessionManager::GetInstance()->GetWebFocusRegistered()) {
846 auto callback = [](int64_t accessibilityId, const std::string data) {
847 UiSessionManager::GetInstance()->ReportWebUnfocusEvent(accessibilityId, data);
848 };
849 RegisterTextBlurCallback(callback);
850 }
851 pipeline->RegisterListenerForTranslate(WeakClaim(RawPtr(host)));
852 EventRecorder::Get().OnAttachWeb(host);
853 #endif
854 }
855
OnDetachFromFrameNode(FrameNode * frameNode)856 void WebPattern::OnDetachFromFrameNode(FrameNode* frameNode)
857 {
858 CHECK_NULL_VOID(delegate_);
859 isFocus_ = false;
860 delegate_->OnBlur();
861 OnQuickMenuDismissed();
862
863 auto id = frameNode->GetId();
864 auto pipeline = AceType::DynamicCast<PipelineContext>(PipelineBase::GetCurrentContext());
865 CHECK_NULL_VOID(pipeline);
866 pipeline->RemoveWindowStateChangedCallback(id);
867 pipeline->RemoveWindowSizeChangeCallback(id);
868 pipeline->RemoveNodesToNotifyMemoryLevel(id);
869
870 if (HasTransformHintChangedCallbackId()) {
871 pipeline->UnregisterTransformHintChangedCallback(transformHintChangedCallbackId_.value_or(-1));
872 }
873 #if !defined(PREVIEW) && !defined(ACE_UNITTEST) && defined(OHOS_PLATFORM)
874 if (UiSessionManager::GetInstance()->GetWebFocusRegistered()) {
875 UnRegisterTextBlurCallback();
876 }
877 pipeline->UnRegisterListenerForTranslate(id);
878 EventRecorder::Get().OnDetachWeb(id);
879 #endif
880 }
881
SetRotation(uint32_t rotation)882 void WebPattern::SetRotation(uint32_t rotation)
883 {
884 if (renderMode_ == RenderMode::SYNC_RENDER || rotation_ == rotation) {
885 return;
886 }
887 rotation_ = rotation;
888 CHECK_NULL_VOID(renderSurface_);
889 renderSurface_->SetTransformHint(rotation);
890 CHECK_NULL_VOID(delegate_);
891 delegate_->SetTransformHint(rotation);
892 }
893
InitEvent()894 void WebPattern::InitEvent()
895 {
896 auto host = GetHost();
897 CHECK_NULL_VOID(host);
898 auto eventHub = host->GetEventHub<WebEventHub>();
899 CHECK_NULL_VOID(eventHub);
900
901 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
902 CHECK_NULL_VOID(gestureHub);
903
904 InitTouchEvent(gestureHub);
905 InitDragEvent(gestureHub);
906 InitPanEvent(gestureHub);
907 InitPinchEvent(gestureHub);
908
909 auto inputHub = eventHub->GetOrCreateInputEventHub();
910 CHECK_NULL_VOID(inputHub);
911 InitMouseEvent(inputHub);
912 InitHoverEvent(inputHub);
913
914 auto focusHub = eventHub->GetOrCreateFocusHub();
915 CHECK_NULL_VOID(focusHub);
916 InitFocusEvent(focusHub);
917 }
918
InitConfigChangeCallback(const RefPtr<PipelineContext> & context)919 void WebPattern::InitConfigChangeCallback(const RefPtr<PipelineContext> &context)
920 {
921 auto langTask = [weak = AceType::WeakClaim(this)]() {
922 auto WebPattern = weak.Upgrade();
923 CHECK_NULL_VOID(WebPattern);
924 WebPattern->UpdateLocale();
925 };
926 context->SetConfigChangedCallback(GetHost()->GetId(), std::move(langTask));
927 }
928
InitFeatureParam()929 void WebPattern::InitFeatureParam()
930 {
931 isVisibleActiveEnable_ = system::GetBoolParameter(VISIBLE_ACTIVE_ENABLE, true);
932 isMemoryLevelEnable_ = system::GetBoolParameter(MEMORY_LEVEL_ENABEL, true);
933 }
934
InitPanEvent(const RefPtr<GestureEventHub> & gestureHub)935 void WebPattern::InitPanEvent(const RefPtr<GestureEventHub>& gestureHub)
936 {
937 if (panEvent_) {
938 return;
939 }
940 auto actionStartTask = [weak = WeakClaim(this)](const GestureEvent& event) {
941 auto pattern = weak.Upgrade();
942 CHECK_NULL_VOID(pattern);
943 // Determine if there is already a fixed nested scroll mode.
944 if (!pattern->GetIsFixedNestedScrollMode() || !pattern->GetNestedScrollParent()) {
945 pattern->SetParentScrollable();
946 }
947 pattern->UpdateTouchpadSlidingStatus(event);
948 pattern->GetParentAxis();
949 };
950 auto actionUpdateTask = [weak = WeakClaim(this)](const GestureEvent& event) {
951 auto pattern = weak.Upgrade();
952 CHECK_NULL_VOID(pattern);
953 pattern->HandleDragMove(event);
954 };
955 auto actionEndTask = [weak = WeakClaim(this)](const GestureEvent& info) {
956 auto pattern = weak.Upgrade();
957 CHECK_NULL_VOID(pattern);
958 pattern->HandleFlingMove(info);
959 };
960 auto actionCancelTask = [weak = WeakClaim(this)]() { return; };
961 PanDirection panDirection;
962 panDirection.type = PanDirection::ALL;
963 panEvent_ = MakeRefPtr<PanEvent>(
964 std::move(actionStartTask), std::move(actionUpdateTask), std::move(actionEndTask), std::move(actionCancelTask));
965 gestureHub->AddPanEvent(panEvent_, panDirection, DEFAULT_PAN_FINGER, DEFAULT_PAN_DISTANCE);
966 gestureHub->SetPanEventType(GestureTypeName::WEBSCROLL);
967 gestureHub->SetOnGestureJudgeNativeBegin([](const RefPtr<NG::GestureInfo>& gestureInfo,
968 const std::shared_ptr<BaseGestureEvent>& info) -> GestureJudgeResult {
969 if (!gestureInfo) {
970 // info is null, default case to continue
971 return GestureJudgeResult::CONTINUE;
972 }
973 if (gestureInfo->GetType() != GestureTypeName::WEBSCROLL) {
974 // not web pan event type, continue
975 return GestureJudgeResult::CONTINUE;
976 }
977 auto inputEventType = gestureInfo->GetInputEventType();
978 if (inputEventType == InputEventType::AXIS) {
979 // axis event type of web pan, dispatch to panEvent to process
980 return GestureJudgeResult::CONTINUE;
981 } else if (inputEventType == InputEventType::MOUSE_BUTTON) {
982 // mouse button event type of web pan, dispatch to DragEvent to process
983 return GestureJudgeResult::REJECT;
984 }
985 // In other cases, the panEvent is used by default
986 return GestureJudgeResult::CONTINUE;
987 });
988 }
989
HandleFlingMove(const GestureEvent & event)990 void WebPattern::HandleFlingMove(const GestureEvent& event)
991 {
992 if ((event.GetInputEventType() == InputEventType::AXIS) &&
993 (event.GetSourceTool() == SourceTool::TOUCHPAD)) {
994 CHECK_NULL_VOID(delegate_);
995 std::vector<int32_t> pressedCodes;
996 auto gesturePressedCodes = event.GetPressedKeyCodes();
997 for (auto pCode : gesturePressedCodes) {
998 pressedCodes.push_back(static_cast<int32_t>(pCode));
999 }
1000 auto localLocation = event.GetLocalLocation();
1001 delegate_->WebHandleTouchpadFlingEvent(localLocation.GetX(), localLocation.GetY(),
1002 event.GetVelocity().GetVelocityX(),
1003 event.GetVelocity().GetVelocityY(),
1004 pressedCodes);
1005 }
1006 }
1007
HandleDragMove(const GestureEvent & event)1008 void WebPattern::HandleDragMove(const GestureEvent& event)
1009 {
1010 if (event.GetInputEventType() == InputEventType::AXIS) {
1011 CHECK_NULL_VOID(delegate_);
1012 auto localLocation = event.GetLocalLocation();
1013 std::vector<int32_t> pressedCodes;
1014 auto gesturePressedCodes = event.GetPressedKeyCodes();
1015 for (auto pCode : gesturePressedCodes) {
1016 pressedCodes.push_back(static_cast<int32_t>(pCode));
1017 }
1018 TAG_LOGD(AceLogTag::ACE_WEB, "HandleDragMove Axis deltaX: %{public}f deltaY: %{public}f",
1019 event.GetDelta().GetX(), event.GetDelta().GetY());
1020 delegate_->WebHandleAxisEvent(localLocation.GetX(), localLocation.GetY(),
1021 event.GetDelta().GetX() / DEFAULT_AXIS_RATIO, event.GetDelta().GetY() / DEFAULT_AXIS_RATIO,
1022 pressedCodes, static_cast<int32_t>(event.GetSourceTool()));
1023 }
1024 }
1025
InitPinchEvent(const RefPtr<GestureEventHub> & gestureHub)1026 void WebPattern::InitPinchEvent(const RefPtr<GestureEventHub>& gestureHub)
1027 {
1028 if (pinchGesture_) {
1029 if (gestureHub->WillRecreateGesture()) {
1030 gestureHub->AddGesture(pinchGesture_);
1031 }
1032 return;
1033 }
1034 auto actionStartTask = [weak = WeakClaim(this)](const GestureEvent& event) {
1035 if (event.GetSourceTool() == SourceTool::TOUCHPAD) {
1036 auto pattern = weak.Upgrade();
1037 CHECK_NULL_VOID(pattern);
1038 pattern->startPageScale_ = pattern->pageScale_;
1039 TAG_LOGD(AceLogTag::ACE_WEB, "InitPinchEvent actionStartTask startPageScale: %{public}f",
1040 pattern->startPageScale_);
1041
1042 pattern->startPinchScale_ = event.GetScale();
1043 pattern->preScale_ = pattern->startPinchScale_;
1044 pattern->zoomOutSwitch_ = false;
1045 pattern->zoomStatus_ = 0;
1046 pattern->zoomErrorCount_ = 0;
1047 TAG_LOGD(AceLogTag::ACE_WEB, "InitPinchEvent actionStartTask startPinchScale: %{public}f",
1048 pattern->startPinchScale_);
1049
1050 pattern->HandleScaleGestureStart(event);
1051 }
1052 };
1053 auto actionUpdateTask = [weak = WeakClaim(this)](const GestureEvent& event) {
1054 ACE_SCOPED_TRACE("WebPattern::InitPinchEvent actionUpdateTask");
1055 if (event.GetSourceTool() == SourceTool::TOUCHPAD) {
1056 auto pattern = weak.Upgrade();
1057 CHECK_NULL_VOID(pattern);
1058 TAG_LOGD(AceLogTag::ACE_WEB, "InitPinchEvent actionUpdateTask event scale:%{public}f: ", event.GetScale());
1059 pattern->HandleScaleGestureChange(event);
1060 }
1061 };
1062 auto actionEndTask = [weak = WeakClaim(this)](const GestureEvent& event) {
1063 if (event.GetSourceTool() == SourceTool::TOUCHPAD) {
1064 auto pattern = weak.Upgrade();
1065 CHECK_NULL_VOID(pattern);
1066 pattern->HandleScaleGestureEnd(event);
1067 }
1068 };
1069 auto actionCancelTask = [weak = WeakClaim(this)](const GestureEvent& event) {
1070 if (event.GetSourceTool() == SourceTool::TOUCHPAD) {
1071 auto pattern = weak.Upgrade();
1072 CHECK_NULL_VOID(pattern);
1073 pattern->HandleScaleGestureCancel(event);
1074 }
1075 };
1076
1077 pinchGesture_ = MakeRefPtr<PinchGesture>(DEFAULT_PINCH_FINGER, DEFAULT_PINCH_DISTANCE);
1078 pinchGesture_->SetPriority(GesturePriority::Parallel);
1079 pinchGesture_->SetOnActionStartId(actionStartTask);
1080 pinchGesture_->SetOnActionUpdateId(actionUpdateTask);
1081 pinchGesture_->SetOnActionEndId(actionEndTask);
1082 pinchGesture_->SetOnActionCancelId(actionCancelTask);
1083 gestureHub->AddGesture(pinchGesture_);
1084 }
1085
CheckZoomStatus(const double & curScale)1086 bool WebPattern::CheckZoomStatus(const double& curScale)
1087 {
1088 int32_t curScaleNew = (int32_t)(curScale * 100);
1089 int32_t preScaleNew = (int32_t)(preScale_ * 100);
1090
1091 // check zoom status
1092 if ((zoomStatus_ == STATUS_ZOOMOUT && curScaleNew - preScaleNew < 0) && zoomErrorCount_ < ZOOM_ERROR_COUNT_MAX) {
1093 zoomErrorCount_++;
1094 TAG_LOGI(AceLogTag::ACE_WEB, "CheckZoomStatus zoomStatus = zoomout && curScale < preScale,"
1095 "ignore date.");
1096 return false;
1097 } else if ((zoomStatus_ == STATUS_ZOOMIN && curScaleNew - preScaleNew > 0) &&
1098 zoomErrorCount_ < ZOOM_ERROR_COUNT_MAX) {
1099 zoomErrorCount_++;
1100 TAG_LOGI(AceLogTag::ACE_WEB, "CheckZoomStatus zoomStatus = zoomin && curScale >= preScale,"
1101 "ignore date.");
1102 return false;
1103 } else {
1104 // nothing
1105 }
1106 return true;
1107 }
1108
ZoomOutAndIn(const double & curScale,double & scale)1109 bool WebPattern::ZoomOutAndIn(const double& curScale, double& scale)
1110 {
1111 int32_t curScaleNew = (int32_t)(curScale * 100);
1112 int32_t preScaleNew = (int32_t)(preScale_ * 100);
1113
1114 // zoom out
1115 if (GreatOrEqual(curScale, preScale_)) {
1116 if (GreatOrEqual(preScale_, DEFAULT_PINCH_SCALE)) {
1117 // start page scale > 1
1118 if (GreatOrEqual(curScale, DEFAULT_PINCH_SCALE) && !zoomOutSwitch_) {
1119 scale = curScale * startPageScale_;
1120
1121 TAG_LOGD(AceLogTag::ACE_WEB, "ZoomOutAndIn curScale * pageScale_= %{public}f", scale);
1122 } else {
1123 TAG_LOGD(AceLogTag::ACE_WEB, "ZoomOutAndIn curScale < DEFAULT_PINCH_SCALE");
1124 scale = DEFAULT_PINCH_SCALE + (curScale - startPinchScale_);
1125 }
1126 } else {
1127 // The scale is from 0.4 to 0.5, the scale conversion should be from 1.0 to 1.1
1128 // once
1129 if (zoomStatus_ == STATUS_ZOOMIN) {
1130 TAG_LOGI(AceLogTag::ACE_WEB, "ZoomOutAndIn Switch from zoomin to zoomout.");
1131 // must be page scale form 0.4 to 1
1132 scale = pageScale_;
1133 // reset
1134 startPinchScale_ = preScale_;
1135 zoomOutSwitch_ = true;
1136 } else {
1137 TAG_LOGD(AceLogTag::ACE_WEB, "ZoomOutAndIn zoomStatus_ = STATUS_ZOOMOUT curScale < 1.0");
1138 scale = DEFAULT_PINCH_SCALE + (curScale - startPinchScale_);
1139 }
1140 }
1141 zoomStatus_ = STATUS_ZOOMOUT;
1142 // zoom in
1143 } else {
1144 // from zoonout to zoomin
1145 if (zoomStatus_ == STATUS_ZOOMOUT) {
1146 TAG_LOGI(AceLogTag::ACE_WEB, "ZoomOutAndIn Switch from zoomout to zoomin.");
1147 // reset
1148 startPinchScale_ = preScale_;
1149 zoomOutSwitch_ = false;
1150 }
1151
1152 if (curScaleNew == preScaleNew) {
1153 TAG_LOGI(AceLogTag::ACE_WEB, "ZoomOutAndIn curScaleNew == preScaleNew");
1154 return false;
1155 }
1156
1157 scale = curScale;
1158
1159 zoomStatus_ = STATUS_ZOOMIN;
1160 }
1161 return true;
1162 }
1163
HandleScaleGestureChange(const GestureEvent & event)1164 void WebPattern::HandleScaleGestureChange(const GestureEvent& event)
1165 {
1166 CHECK_NULL_VOID(delegate_);
1167
1168 double curScale = event.GetScale();
1169 if (NearEqual(curScale, preScale_)) {
1170 TAG_LOGI(AceLogTag::ACE_WEB, "HandleScaleGestureChange curScale == preScale");
1171 return;
1172 }
1173
1174 if (LessOrEqual(curScale, 0.0) || LessOrEqual(preScale_, 0.0)) {
1175 TAG_LOGE(AceLogTag::ACE_WEB, "HandleScaleGestureChange invalid scale");
1176 return;
1177 }
1178
1179 TAG_LOGD(AceLogTag::ACE_WEB,
1180 "HandleScaleGestureChange curScale:%{public}f, preScale: %{public}f, "
1181 "zoomStatus: %{public}d, pageScale: %{public}f, startPinchScale: %{public}f, startPageScale: %{public}f",
1182 curScale, preScale_, zoomStatus_, pageScale_, startPinchScale_, startPageScale_);
1183
1184 if (!CheckZoomStatus(curScale)) {
1185 return;
1186 }
1187
1188 zoomErrorCount_ = 0;
1189
1190 double newScale = curScale / preScale_;
1191 double newOriginScale = GetNewOriginScale(event.GetScale());
1192
1193 double centerX = event.GetPinchCenter().GetX();
1194 double centerY = event.GetPinchCenter().GetY();
1195 auto frameNode = GetHost();
1196 CHECK_NULL_VOID(frameNode);
1197 auto offset = frameNode->GetOffsetRelativeToWindow();
1198 TAG_LOGD(AceLogTag::ACE_WEB,
1199 "HandleScaleGestureChangeV2 curScale:%{public}f newScale: %{public}f"
1200 " centerX: %{public}f centerY: %{public}f",
1201 curScale, newScale, centerX, centerY);
1202
1203 // Plan two
1204 delegate_->ScaleGestureChangeV2(
1205 PINCH_UPDATE_TYPE, newScale, newOriginScale, centerX - offset.GetX(), centerY - offset.GetY());
1206
1207 preScale_ = curScale;
1208 }
1209
getZoomOffset(double & scale) const1210 double WebPattern::getZoomOffset(double& scale) const
1211 {
1212 double offset = DEFAULT_PINCH_SCALE - scale;
1213 if (LessOrEqual(offset, 0.0)) {
1214 TAG_LOGE(AceLogTag::ACE_WEB, "getZoomOffset curScale < preScale");
1215 return 0.0;
1216 }
1217 return offset * ZOOM_CONVERT_NUM * ZOOMIN_PUBLIC_ERRAND;
1218 }
1219
GetNewScale(double & scale) const1220 double WebPattern::GetNewScale(double& scale) const
1221 {
1222 if (GreatOrEqual(scale, DEFAULT_PINCH_SCALE_MAX)) {
1223 scale = DEFAULT_PINCH_SCALE_MAX;
1224
1225 TAG_LOGE(AceLogTag::ACE_WEB, "GetNewScale scale > DEFAULT_PINCH_SCALE_MAX");
1226 return DEFAULT_PINCH_SCALE;
1227 }
1228
1229 double newScale = 0.0;
1230 if (GreatOrEqual(scale, DEFAULT_PINCH_SCALE)) {
1231 // In order to achieve a sequence similar to scale, eg. 1.1, 1.2, 1.3
1232 if (zoomStatus_ == STATUS_ZOOMOUT) {
1233 newScale = scale / pageScale_;
1234 // scale > 1.0 when scale form zoomout to zoomin
1235 } else if (zoomStatus_ == STATUS_ZOOMIN) {
1236 scale = startPageScale_ * scale;
1237 if (GreatNotEqual(scale, 0.0)) {
1238 newScale = scale / pageScale_;
1239 } else {
1240 newScale = DEFAULT_PINCH_SCALE_MIN;
1241 scale = DEFAULT_PINCH_SCALE;
1242
1243 TAG_LOGE(AceLogTag::ACE_WEB, "GetNewScale scale < 0.0");
1244 }
1245 }
1246
1247 // scale max
1248 if (GreatOrEqual(newScale, DEFAULT_PINCH_SCALE_MAX)) {
1249 newScale = DEFAULT_PINCH_SCALE_MAX;
1250 scale = DEFAULT_PINCH_SCALE_MAX;
1251
1252 TAG_LOGI(AceLogTag::ACE_WEB, "GetNewScale newScale > DEFAULT_PINCH_SCALE_MAX");
1253 }
1254 } else {
1255 TAG_LOGD(AceLogTag::ACE_WEB, "GetNewScale getZoomOffset:%{public}f", getZoomOffset(scale));
1256
1257 scale = startPageScale_ - getZoomOffset(scale);
1258 if (GreatNotEqual(scale, 0.0)) {
1259 newScale = scale / pageScale_;
1260 } else {
1261 newScale = DEFAULT_PINCH_SCALE_MIN;
1262 scale = DEFAULT_PINCH_SCALE;
1263
1264 TAG_LOGE(AceLogTag::ACE_WEB, "GetNewScale scale < 0.0");
1265 }
1266
1267 TAG_LOGD(AceLogTag::ACE_WEB,
1268 "GetNewScale scale: %{public}f, newScale: %{public}f, pageScale: %{public}f, startPageScale: %{public}f",
1269 scale, newScale, pageScale_, startPageScale_);
1270 }
1271
1272 // scale min
1273 if (LessNotEqual(newScale, DEFAULT_PINCH_SCALE_MIN)) {
1274 newScale = DEFAULT_PINCH_SCALE_MIN;
1275 scale = DEFAULT_PINCH_SCALE;
1276
1277 TAG_LOGE(AceLogTag::ACE_WEB, "GetNewScale newScale < DEFAULT_PINCH_SCALE_MIN");
1278 }
1279
1280 return newScale;
1281 }
1282
GetNewOriginScale(double originScale) const1283 double WebPattern::GetNewOriginScale(double originScale) const
1284 {
1285 double newScale = 0.0;
1286 if (zoomStatus_ == STATUS_ZOOMOUT) {
1287 newScale = DEFAULT_PINCH_SCALE_MAX;
1288 } else if (zoomStatus_ == STATUS_ZOOMIN) {
1289 newScale = DEFAULT_PINCH_SCALE_MIN;
1290 }
1291
1292 return newScale;
1293 }
1294
HandleScaleGestureStart(const GestureEvent & event)1295 void WebPattern::HandleScaleGestureStart(const GestureEvent& event)
1296 {
1297 CHECK_NULL_VOID(delegate_);
1298
1299 double scale = event.GetScale();
1300
1301 double centerX = event.GetPinchCenter().GetX();
1302 double centerY = event.GetPinchCenter().GetY();
1303 auto frameNode = GetHost();
1304 CHECK_NULL_VOID(frameNode);
1305 auto offset = frameNode->GetOffsetRelativeToWindow();
1306
1307 delegate_->ScaleGestureChangeV2(
1308 PINCH_START_TYPE, scale, event.GetScale(), centerX - offset.GetX(), centerY - offset.GetY());
1309 }
1310
HandleScaleGestureEnd(const GestureEvent & event)1311 void WebPattern::HandleScaleGestureEnd(const GestureEvent& event)
1312 {
1313 CHECK_NULL_VOID(delegate_);
1314
1315 double scale = event.GetScale();
1316
1317 double centerX = event.GetPinchCenter().GetX();
1318 double centerY = event.GetPinchCenter().GetY();
1319 auto frameNode = GetHost();
1320 CHECK_NULL_VOID(frameNode);
1321 auto offset = frameNode->GetOffsetRelativeToWindow();
1322
1323 delegate_->ScaleGestureChangeV2(
1324 PINCH_END_TYPE, scale, event.GetScale(), centerX - offset.GetX(), centerY - offset.GetY());
1325 }
1326
HandleScaleGestureCancel(const GestureEvent & event)1327 void WebPattern::HandleScaleGestureCancel(const GestureEvent& event)
1328 {
1329 CHECK_NULL_VOID(delegate_);
1330
1331 double scale = event.GetScale();
1332
1333 double centerX = event.GetPinchCenter().GetX();
1334 double centerY = event.GetPinchCenter().GetY();
1335 auto frameNode = GetHost();
1336 CHECK_NULL_VOID(frameNode);
1337 auto offset = frameNode->GetOffsetRelativeToWindow();
1338
1339 delegate_->ScaleGestureChangeV2(
1340 PINCH_CANCEL_TYPE, scale, event.GetScale(), centerX - offset.GetX(), centerY - offset.GetY());
1341 }
1342
InitTouchEvent(const RefPtr<GestureEventHub> & gestureHub)1343 void WebPattern::InitTouchEvent(const RefPtr<GestureEventHub>& gestureHub)
1344 {
1345 if (touchEvent_) {
1346 return;
1347 }
1348
1349 auto touchTask = [weak = WeakClaim(this)](const TouchEventInfo& info) {
1350 auto pattern = weak.Upgrade();
1351 CHECK_NULL_VOID(pattern);
1352 pattern->OnTooltip("");
1353 if (info.GetChangedTouches().empty()) {
1354 return;
1355 }
1356
1357 // only handle touch event
1358 if (info.GetSourceDevice() != SourceType::TOUCH) {
1359 return;
1360 }
1361 pattern->isMouseEvent_ = false;
1362 pattern->HandleTouchEvent(info);
1363 };
1364 touchEvent_ = MakeRefPtr<TouchEventImpl>(std::move(touchTask));
1365 gestureHub->AddTouchEvent(touchEvent_);
1366 }
1367
InitMouseEvent(const RefPtr<InputEventHub> & inputHub)1368 void WebPattern::InitMouseEvent(const RefPtr<InputEventHub>& inputHub)
1369 {
1370 if (mouseEvent_) {
1371 return;
1372 }
1373
1374 auto mouseTask = [weak = WeakClaim(this)](MouseInfo& info) {
1375 auto pattern = weak.Upgrade();
1376 CHECK_NULL_VOID(pattern);
1377 TouchEventInfo touchEventInfo("touchEvent");
1378 if (EventInfoConvertor::ConvertMouseToTouchIfNeeded(info, touchEventInfo)) {
1379 TAG_LOGI(AceLogTag::ACE_WEB, "Convert mouse event to touch event: button %{public}d, action %{public}d.",
1380 (int)info.GetButton(), (int)info.GetAction());
1381 touchEventInfo.SetTouchEventsEnd(true);
1382 pattern->HandleTouchEvent(touchEventInfo);
1383 return;
1384 }
1385 pattern->HandleMouseEvent(info);
1386 };
1387
1388 mouseEvent_ = MakeRefPtr<InputEvent>(std::move(mouseTask));
1389 inputHub->AddOnMouseEvent(mouseEvent_);
1390 }
1391
InitHoverEvent(const RefPtr<InputEventHub> & inputHub)1392 void WebPattern::InitHoverEvent(const RefPtr<InputEventHub>& inputHub)
1393 {
1394 if (hoverEvent_) {
1395 return;
1396 }
1397
1398 auto hoverTask = [weak = WeakClaim(this)](bool isHover) {
1399 auto pattern = weak.Upgrade();
1400 CHECK_NULL_VOID(pattern);
1401 MouseInfo info;
1402 info.SetAction(isHover ? MouseAction::HOVER : MouseAction::HOVER_EXIT);
1403 pattern->WebOnMouseEvent(info);
1404 };
1405
1406 hoverEvent_ = MakeRefPtr<InputEvent>(std::move(hoverTask));
1407 inputHub->AddOnHoverEvent(hoverEvent_);
1408 }
1409
HandleTouchEvent(const TouchEventInfo & info)1410 void WebPattern::HandleTouchEvent(const TouchEventInfo& info)
1411 {
1412 touchEventInfo_ = info;
1413 const auto& changedPoint = info.GetChangedTouches().front();
1414 if (changedPoint.GetTouchType() == TouchType::DOWN ||
1415 changedPoint.GetTouchType() == TouchType::UP) {
1416 if (touchEventQueue_.size() < TOUCH_EVENT_MAX_SIZE) {
1417 touchEventQueue_.push(info);
1418 }
1419 }
1420
1421 if (changedPoint.GetTouchType() == TouchType::DOWN) {
1422 HandleTouchDown(info, false);
1423 return;
1424 }
1425 if (changedPoint.GetTouchType() == TouchType::MOVE) {
1426 HandleTouchMove(info, false);
1427 return;
1428 }
1429 if (changedPoint.GetTouchType() == TouchType::UP) {
1430 HandleTouchUp(info, false);
1431 return;
1432 }
1433 if (changedPoint.GetTouchType() == TouchType::CANCEL) {
1434 HandleTouchCancel(info);
1435 return;
1436 }
1437 }
1438
HandleMouseEvent(MouseInfo & info)1439 void WebPattern::HandleMouseEvent(MouseInfo& info)
1440 {
1441 isMouseEvent_ = true;
1442 WebOnMouseEvent(info);
1443
1444 auto host = GetHost();
1445 CHECK_NULL_VOID(host);
1446 auto eventHub = host->GetEventHub<WebEventHub>();
1447 CHECK_NULL_VOID(eventHub);
1448 auto mouseEventCallback = eventHub->GetOnMouseEvent();
1449 CHECK_NULL_VOID(mouseEventCallback);
1450 mouseEventCallback(info);
1451 }
1452
WebOnMouseEvent(const MouseInfo & info)1453 void WebPattern::WebOnMouseEvent(const MouseInfo& info)
1454 {
1455 if (mouseEventDeviceId_ != info.GetDeviceId()) {
1456 mouseEventDeviceId_ = info.GetDeviceId();
1457 }
1458 CHECK_NULL_VOID(delegate_);
1459 auto localLocation = info.GetLocalLocation();
1460 if ((info.GetAction() == MouseAction::PRESS) ||
1461 (info.GetButton() == MouseButton::LEFT_BUTTON) ||
1462 (info.GetButton() == MouseButton::RIGHT_BUTTON) ||
1463 (info.GetButton() == MouseButton::BACK_BUTTON) ||
1464 (info.GetButton() == MouseButton::FORWARD_BUTTON)) {
1465 OnTooltip("");
1466 }
1467 if (info.GetAction() == MouseAction::PRESS) {
1468 delegate_->OnContextMenuHide("");
1469 WebRequestFocus();
1470 }
1471
1472 // set touchup false when using mouse
1473 isTouchUpEvent_ = false;
1474 if (info.GetButton() == MouseButton::LEFT_BUTTON && info.GetAction() == MouseAction::RELEASE) {
1475 if (isReceivedArkDrag_) {
1476 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop Do not reset drag action when dragging,"
1477 "drop/cancel/end event will do this");
1478 return;
1479 }
1480 ResetDragAction();
1481 }
1482 isHoverExit_ = false;
1483 if (info.GetAction() == MouseAction::HOVER_EXIT) {
1484 TAG_LOGI(AceLogTag::ACE_WEB,
1485 "Set cursor to pointer when mouse pointer is hover exit.");
1486 OnCursorChange(OHOS::NWeb::CursorType::CT_POINTER, nullptr);
1487 isHoverExit_ = true;
1488 MouseInfo changedInfo;
1489 changedInfo.SetAction(MouseAction::HOVER_EXIT);
1490 changedInfo.SetLocalLocation(Offset(mouseHoveredX_, mouseHoveredY_));
1491 WebSendMouseEvent(changedInfo, SINGLE_CLICK_NUM);
1492 return;
1493 } else if (info.GetAction() == MouseAction::HOVER && isMouseLocked_) {
1494 OnCursorChange(OHOS::NWeb::CursorType::CT_LOCK, nullptr);
1495 }
1496 int32_t clickNum = HandleMouseClickEvent(info);
1497
1498 WebSendMouseEvent(info, clickNum);
1499
1500 if (info.GetAction() == MouseAction::MOVE) {
1501 mouseHoveredX_ = localLocation.GetX();
1502 mouseHoveredY_ = localLocation.GetY();
1503 }
1504 }
1505
WebSendMouseEvent(const MouseInfo & info,int32_t clickNum)1506 void WebPattern::WebSendMouseEvent(const MouseInfo& info, int32_t clickNum)
1507 {
1508 std::vector<int32_t> pressedCodes {};
1509 std::vector<KeyCode> keyCode = info.GetPressedKeyCodes();
1510 for (auto pCode : keyCode) {
1511 pressedCodes.push_back(static_cast<int32_t>(pCode));
1512 }
1513
1514 std::shared_ptr<NWebMouseEventImpl> mouseEvent =
1515 std::make_shared<NWebMouseEventImpl>(info.GetLocalLocation().GetX(), info.GetLocalLocation().GetY(),
1516 info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY(),
1517 static_cast<int32_t>(info.GetButton()), static_cast<int32_t>(info.GetAction()),
1518 clickNum, pressedCodes);
1519 delegate_->WebOnMouseEvent(mouseEvent);
1520 }
1521
ResetDragAction()1522 void WebPattern::ResetDragAction()
1523 {
1524 auto frameNode = GetHost();
1525 CHECK_NULL_VOID(frameNode);
1526 frameNode->SetDraggable(false);
1527 auto eventHub = frameNode->GetEventHub<WebEventHub>();
1528 CHECK_NULL_VOID(eventHub);
1529 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
1530 CHECK_NULL_VOID(gestureHub);
1531 gestureHub->ResetDragActionForWeb();
1532
1533 if (!isDragging_) {
1534 return;
1535 }
1536
1537 isDragging_ = false;
1538 isReceivedArkDrag_ = false;
1539 isDragStartFromWeb_ = false;
1540 // cancel drag action to avoid web kernel can't process other input event
1541 CHECK_NULL_VOID(delegate_);
1542 delegate_->HandleDragEvent(0, 0, DragAction::DRAG_CANCEL);
1543 gestureHub->CancelDragForWeb();
1544 }
1545
GetDragOffset() const1546 Offset WebPattern::GetDragOffset() const
1547 {
1548 Offset webDragOffset;
1549 int x = 0;
1550 int y = 0;
1551 if (delegate_ && delegate_->dragData_) {
1552 delegate_->dragData_->GetDragStartPosition(x, y);
1553 }
1554
1555 webDragOffset.SetX(x);
1556 webDragOffset.SetY(y);
1557
1558 return webDragOffset;
1559 }
1560
GetDragPixelMapSize() const1561 SizeF WebPattern::GetDragPixelMapSize() const
1562 {
1563 SizeF pixelMapSize;
1564 int32_t width = 0;
1565 int32_t height = 0;
1566 RefPtr<PixelMap> pixelMap = nullptr;
1567 if (delegate_) {
1568 pixelMap = delegate_->GetDragPixelMap();
1569 }
1570 if (pixelMap) {
1571 width = pixelMap->GetWidth();
1572 height = pixelMap->GetHeight();
1573 }
1574 pixelMapSize = SizeF(width, height);
1575 return pixelMapSize;
1576 }
1577
HandleMouseClickEvent(const MouseInfo & info)1578 int32_t WebPattern::HandleMouseClickEvent(const MouseInfo& info)
1579 {
1580 if (info.GetButton() != MouseButton::LEFT_BUTTON || info.GetAction() != MouseAction::PRESS) {
1581 return SINGLE_CLICK_NUM;
1582 }
1583 auto localLocation = info.GetLocalLocation();
1584 MouseClickInfo clickInfo;
1585 clickInfo.x = localLocation.GetX();
1586 clickInfo.y = localLocation.GetY();
1587 clickInfo.start = info.GetTimeStamp();
1588 if (mouseClickQueue_.empty()) {
1589 mouseClickQueue_.push(clickInfo);
1590 return SINGLE_CLICK_NUM;
1591 }
1592 std::chrono::duration<float> timeout_ = clickInfo.start - mouseClickQueue_.back().start;
1593 double offsetX = clickInfo.x - mouseClickQueue_.back().x;
1594 double offsetY = clickInfo.y - mouseClickQueue_.back().y;
1595 double offset = sqrt(offsetX * offsetX + offsetY * offsetY);
1596 if (timeout_.count() < DEFAULT_DBCLICK_INTERVAL && offset < DEFAULT_DBCLICK_OFFSET) {
1597 if (mouseClickQueue_.size() == SINGLE_CLICK_NUM) {
1598 mouseClickQueue_.push(clickInfo);
1599 return DOUBLE_CLICK_NUM;
1600 } else if (mouseClickQueue_.size() == DOUBLE_CLICK_NUM) {
1601 mouseClickQueue_.push(clickInfo);
1602 return TRIPLE_CLICK_NUM;
1603 } else if (mouseClickQueue_.size() == TRIPLE_CLICK_NUM) {
1604 mouseClickQueue_.pop();
1605 mouseClickQueue_.push(clickInfo);
1606 return TRIPLE_CLICK_NUM;
1607 }
1608 }
1609 if (mouseClickQueue_.size()) {
1610 std::queue<MouseClickInfo> empty;
1611 swap(empty, mouseClickQueue_);
1612 mouseClickQueue_.push(clickInfo);
1613 }
1614 return SINGLE_CLICK_NUM;
1615 }
1616
HandleDoubleClickEvent(const MouseInfo & info)1617 bool WebPattern::HandleDoubleClickEvent(const MouseInfo& info)
1618 {
1619 if (info.GetButton() != MouseButton::LEFT_BUTTON || info.GetAction() != MouseAction::PRESS) {
1620 return false;
1621 }
1622 auto localLocation = info.GetLocalLocation();
1623 MouseClickInfo clickInfo;
1624 clickInfo.x = localLocation.GetX();
1625 clickInfo.y = localLocation.GetY();
1626 clickInfo.start = info.GetTimeStamp();
1627 if (mouseClickQueue_.empty()) {
1628 mouseClickQueue_.push(clickInfo);
1629 return false;
1630 }
1631 std::chrono::duration<float> timeout_ = clickInfo.start - mouseClickQueue_.back().start;
1632 double offsetX = clickInfo.x - mouseClickQueue_.back().x;
1633 double offsetY = clickInfo.y - mouseClickQueue_.back().y;
1634 double offset = sqrt(offsetX * offsetX + offsetY * offsetY);
1635 if (timeout_.count() < DEFAULT_DBCLICK_INTERVAL && offset < DEFAULT_DBCLICK_OFFSET) {
1636 SendDoubleClickEvent(clickInfo);
1637 std::queue<MouseClickInfo> empty;
1638 swap(empty, mouseClickQueue_);
1639 return true;
1640 }
1641 if (mouseClickQueue_.size() == 1) {
1642 mouseClickQueue_.push(clickInfo);
1643 return false;
1644 }
1645 mouseClickQueue_.pop();
1646 mouseClickQueue_.push(clickInfo);
1647 return false;
1648 }
1649
SendDoubleClickEvent(const MouseClickInfo & info)1650 void WebPattern::SendDoubleClickEvent(const MouseClickInfo& info)
1651 {
1652 CHECK_NULL_VOID(delegate_);
1653 delegate_->OnMouseEvent(info.x, info.y, MouseButton::LEFT_BUTTON, MouseAction::PRESS, DOUBLE_CLICK_NUM);
1654 }
1655
GenerateDragDropInfo(NG::DragDropInfo & dragDropInfo)1656 bool WebPattern::GenerateDragDropInfo(NG::DragDropInfo& dragDropInfo)
1657 {
1658 if (delegate_) {
1659 dragDropInfo.pixelMap = delegate_->GetDragPixelMap();
1660 }
1661
1662 if (dragDropInfo.pixelMap) {
1663 isW3cDragEvent_ = true;
1664 return true;
1665 }
1666
1667 return false;
1668 }
1669
HandleOnDragStart(const RefPtr<OHOS::Ace::DragEvent> & info)1670 NG::DragDropInfo WebPattern::HandleOnDragStart(const RefPtr<OHOS::Ace::DragEvent>& info)
1671 {
1672 isDragging_ = true;
1673 isReceivedArkDrag_ = true;
1674 isDragStartFromWeb_ = true;
1675 NG::DragDropInfo dragDropInfo;
1676 if (GenerateDragDropInfo(dragDropInfo)) {
1677 auto frameNode = GetHost();
1678 CHECK_NULL_RETURN(frameNode, dragDropInfo);
1679 CHECK_NULL_RETURN(delegate_, dragDropInfo);
1680 CHECK_NULL_RETURN(delegate_->dragData_, dragDropInfo);
1681 // get drag pixel map successfully, disable next drag util received web kernel drag callback
1682 frameNode->SetDraggable(false);
1683 RefPtr<UnifiedData> aceUnifiedData = UdmfClient::GetInstance()->CreateUnifiedData();
1684 std::string fileName = delegate_->dragData_->GetImageFileName();
1685 std::string plainContent = delegate_->dragData_->GetFragmentText();
1686 std::string htmlContent = delegate_->dragData_->GetFragmentHtml();
1687 std::string linkUrl = delegate_->dragData_->GetLinkURL();
1688 std::string linkTitle = delegate_->dragData_->GetLinkTitle();
1689 if (!fileName.empty()) {
1690 OnDragFileNameStart(aceUnifiedData, fileName);
1691 } else {
1692 TAG_LOGW(AceLogTag::ACE_WEB, "DragDrop event start, dragdata has no image file uri, just pass");
1693 }
1694 if (!plainContent.empty()) {
1695 isDragEndMenuShow_ = true;
1696 UdmfClient::GetInstance()->AddPlainTextRecord(aceUnifiedData, plainContent);
1697 }
1698 if (!htmlContent.empty()) {
1699 isDragEndMenuShow_ = true;
1700 UdmfClient::GetInstance()->AddHtmlRecord(aceUnifiedData, htmlContent, "");
1701 }
1702 if (!linkUrl.empty()) {
1703 isDragEndMenuShow_ = false;
1704 UdmfClient::GetInstance()->AddLinkRecord(aceUnifiedData, linkUrl, linkTitle);
1705 TAG_LOGI(AceLogTag::ACE_WEB, "web DragDrop event Start, linkUrl size:%{public}zu", linkUrl.size());
1706 }
1707 UdmfClient::GetInstance()->SetTagProperty(aceUnifiedData, "records_to_entries_data_format");
1708 info->SetData(aceUnifiedData);
1709 HandleOnDragEnter(info);
1710 return dragDropInfo;
1711 }
1712 return dragDropInfo;
1713 }
1714
OnDragFileNameStart(const RefPtr<UnifiedData> & aceUnifiedData,const std::string & fileName)1715 void WebPattern::OnDragFileNameStart(const RefPtr<UnifiedData>& aceUnifiedData, const std::string& fileName)
1716 {
1717 isDragEndMenuShow_ = false;
1718 std::string fullName;
1719 if (delegate_->tempDir_.empty()) {
1720 fullName = "/data/storage/el2/base/haps/entry/temp/dragdrop/" + fileName;
1721 } else {
1722 fullName = delegate_->tempDir_ + "/dragdrop/" + fileName;
1723 }
1724 AppFileService::ModuleFileUri::FileUri fileUri(fullName);
1725 TAG_LOGI(AceLogTag::ACE_WEB, "web DragDrop event Start, FileUri:%{public}s, image path:%{public}s",
1726 fileUri.ToString().c_str(), fullName.c_str());
1727 std::vector<std::string> urlVec;
1728 std::string udmfUri = fileUri.ToString();
1729 urlVec.emplace_back(udmfUri);
1730 UdmfClient::GetInstance()->AddFileUriRecord(aceUnifiedData, urlVec);
1731 }
1732
HandleOnDropMove(const RefPtr<OHOS::Ace::DragEvent> & info)1733 void WebPattern::HandleOnDropMove(const RefPtr<OHOS::Ace::DragEvent>& info)
1734 {
1735 if (!isDragging_) {
1736 return;
1737 }
1738
1739 if (!isW3cDragEvent_) {
1740 return;
1741 }
1742
1743 CHECK_NULL_VOID(delegate_);
1744 auto host = GetHost();
1745 CHECK_NULL_VOID(host);
1746 auto pipelineContext = host->GetContextRefPtr();
1747 CHECK_NULL_VOID(pipelineContext);
1748 auto viewScale = pipelineContext->GetViewScale();
1749 int32_t globalX = static_cast<int32_t>(info->GetX()) * viewScale;
1750 int32_t globalY = static_cast<int32_t>(info->GetY()) * viewScale;
1751 auto offset = GetCoordinatePoint();
1752 globalX = static_cast<int32_t>(globalX - offset.value_or(OffsetF()).GetX());
1753 globalY = static_cast<int32_t>(globalY - offset.value_or(OffsetF()).GetY());
1754 delegate_->HandleDragEvent(globalX, globalY, DragAction::DRAG_OVER);
1755 }
1756
InitCommonDragDropEvent(const RefPtr<GestureEventHub> & gestureHub)1757 void WebPattern::InitCommonDragDropEvent(const RefPtr<GestureEventHub>& gestureHub)
1758 {
1759 auto frameNode = GetHost();
1760 CHECK_NULL_VOID(frameNode);
1761 auto eventHub = frameNode->GetEventHub<WebEventHub>();
1762 CHECK_NULL_VOID(eventHub);
1763
1764 isDisableDrag_ = false;
1765 // disable drag
1766 frameNode->SetDraggable(false);
1767 // init common drag drop event
1768 gestureHub->InitDragDropEvent();
1769 InitWebEventHubDragDropStart(eventHub);
1770 InitWebEventHubDragDropEnd(eventHub);
1771 InitWebEventHubDragMove(eventHub);
1772 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub init drag event ok");
1773 }
1774
InitWebEventHubDragDropStart(const RefPtr<WebEventHub> & eventHub)1775 void WebPattern::InitWebEventHubDragDropStart(const RefPtr<WebEventHub>& eventHub)
1776 {
1777 auto onDragStartId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info,
1778 const std::string& extraParams) -> NG::DragDropInfo {
1779 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag start,"
1780 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1781 NG::DragDropInfo dragDropInfo;
1782 auto pattern = weak.Upgrade();
1783 if (pattern) {
1784 TAG_LOGI(AceLogTag::ACE_WEB,
1785 "DragDrop event WebEventHub onDragStartId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1786 info->GetX(), info->GetY(), pattern->GetWebId());
1787 pattern->dropX_ = 0;
1788 pattern->dropY_ = 0;
1789 return pattern->HandleOnDragStart(info);
1790 }
1791 return dragDropInfo;
1792 };
1793
1794 auto onDragEnterId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info,
1795 const std::string& extraParams) {
1796 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag enter,"
1797 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1798 auto pattern = weak.Upgrade();
1799 CHECK_NULL_VOID(pattern);
1800 TAG_LOGI(AceLogTag::ACE_WEB,
1801 "DragDrop event WebEventHub onDragEnterId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1802 info->GetX(), info->GetY(), pattern->GetWebId());
1803 pattern->isW3cDragEvent_ = true;
1804 pattern->isDragging_ = true;
1805 pattern->isReceivedArkDrag_ = true;
1806 pattern->dropX_ = 0;
1807 pattern->dropY_ = 0;
1808 return pattern->HandleOnDragEnter(info);
1809 };
1810
1811 // set custom OnDragStart function
1812 eventHub->SetOnDragStart(std::move(onDragStartId));
1813 eventHub->SetOnDragEnter(std::move(onDragEnterId));
1814 }
1815
InitWebEventHubDragMove(const RefPtr<WebEventHub> & eventHub)1816 void WebPattern::InitWebEventHubDragMove(const RefPtr<WebEventHub>& eventHub)
1817 {
1818 auto onDragMoveId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info,
1819 const std::string& extraParams) {
1820 static uint32_t dragMoveCnt = 0;
1821 if ((dragMoveCnt % DEBUG_DRAGMOVEID_TIMER) == 0) {
1822 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag move,"
1823 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1824 }
1825 auto pattern = weak.Upgrade();
1826 CHECK_NULL_VOID(pattern);
1827 if ((dragMoveCnt++ % DEBUG_DRAGMOVEID_TIMER) == 0) {
1828 TAG_LOGI(AceLogTag::ACE_WEB,
1829 "DragDrop event WebEventHub onDragMoveId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1830 info->GetX(), info->GetY(), pattern->GetWebId());
1831 }
1832 if (!pattern->isDragging_) {
1833 return;
1834 }
1835
1836 // update drag status
1837 info->SetResult(pattern->GetDragAcceptableStatus());
1838
1839 pattern->HandleOnDropMove(info);
1840 };
1841 // set custom OnDragStart function
1842 eventHub->SetOnDragMove(std::move(onDragMoveId));
1843 }
1844
InitWebEventHubDragDropEnd(const RefPtr<WebEventHub> & eventHub)1845 void WebPattern::InitWebEventHubDragDropEnd(const RefPtr<WebEventHub>& eventHub)
1846 {
1847 auto onDragDropId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info,
1848 const std::string& extraParams) {
1849 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag drop,"
1850 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1851 auto pattern = weak.Upgrade();
1852 CHECK_NULL_VOID(pattern);
1853 TAG_LOGI(AceLogTag::ACE_WEB,
1854 "DragDrop event WebEventHub onDragDropId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1855 info->GetX(), info->GetY(), pattern->GetWebId());
1856 if (!pattern->isDragging_) {
1857 return;
1858 }
1859 pattern->dropX_ = info->GetX();
1860 pattern->dropY_ = info->GetY();
1861 pattern->HandleOnDragDrop(info);
1862 };
1863
1864 auto onDragLeaveId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info,
1865 const std::string& extraParams) {
1866 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag leave,"
1867 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1868 auto pattern = weak.Upgrade();
1869 CHECK_NULL_VOID(pattern);
1870 TAG_LOGI(AceLogTag::ACE_WEB,
1871 "DragDrop event WebEventHub onDragLeaveId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1872 info->GetX(), info->GetY(), pattern->GetWebId());
1873 pattern->HandleOnDragLeave(info->GetX(), info->GetY());
1874 };
1875
1876 auto onDragEndId = [weak = WeakClaim(this)](const RefPtr<OHOS::Ace::DragEvent>& info) {
1877 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop WebEventHub drag end,"
1878 " x:%{public}lf, y:%{public}lf", info->GetX(), info->GetY());
1879 auto pattern = weak.Upgrade();
1880 CHECK_NULL_VOID(pattern);
1881 TAG_LOGI(AceLogTag::ACE_WEB,
1882 "DragDrop event WebEventHub onDragEndId, x:%{public}lf, y:%{public}lf, webId:%{public}d",
1883 info->GetX(), info->GetY(), pattern->GetWebId());
1884 pattern->HandleDragEnd(pattern->dropX_, pattern->dropY_);
1885 };
1886 // set custom OnDragStart function
1887 eventHub->SetOnDragEnd(std::move(onDragEndId));
1888 eventHub->SetOnDragLeave(std::move(onDragLeaveId));
1889 eventHub->SetOnDrop(std::move(onDragDropId));
1890 }
1891
IsImageDrag()1892 bool WebPattern::IsImageDrag()
1893 {
1894 if (delegate_) {
1895 return delegate_->IsImageDrag();
1896 }
1897 return false;
1898 }
1899
GetDragAcceptableStatus()1900 DragRet WebPattern::GetDragAcceptableStatus()
1901 {
1902 OHOS::NWeb::NWebDragData::DragOperation status = delegate_->GetDragAcceptableStatus();
1903 if (status == OHOS::NWeb::NWebDragData::DragOperation::DRAG_OPERATION_MOVE ||
1904 status == OHOS::NWeb::NWebDragData::DragOperation::DRAG_OPERATION_LINK) {
1905 return DragRet::DRAG_DEFAULT;
1906 } else if (status == OHOS::NWeb::NWebDragData::DragOperation::DRAG_OPERATION_COPY) {
1907 return DragRet::DRAG_DEFAULT;
1908 }
1909 return DragRet::DRAG_DEFAULT;
1910 }
1911
NotifyStartDragTask(bool isDelayed)1912 bool WebPattern::NotifyStartDragTask(bool isDelayed)
1913 {
1914 if (isDisableDrag_ || isTouchUpEvent_) {
1915 TAG_LOGW(AceLogTag::ACE_WEB, "DragDrop disable drag in web. isDisableDrag_:%{public}d,"
1916 "isTouchUpEvent_:%{public}d, isDelayed:%{public}d", isDisableDrag_, isTouchUpEvent_, isDelayed);
1917 if (isDelayed) {
1918 CHECK_NULL_RETURN(delegate_, false);
1919 delegate_->HandleDragEvent(0, 0, DragAction::DRAG_CANCEL);
1920 }
1921 return false;
1922 }
1923 isDragging_ = true;
1924 auto frameNode = GetHost();
1925 CHECK_NULL_RETURN(frameNode, false);
1926 auto eventHub = frameNode->GetEventHub<WebEventHub>();
1927 CHECK_NULL_RETURN(eventHub, false);
1928 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
1929 CHECK_NULL_RETURN(gestureHub, false);
1930 CHECK_NULL_RETURN(delegate_, false);
1931 if (curContextMenuResult_ && (!isNewDragStyle_ || !previewImageNodeId_.has_value())) {
1932 TAG_LOGI(AceLogTag::ACE_WEB,
1933 "preview menu is not displayed, and the app is notified to close the long-press menu");
1934 delegate_->OnContextMenuHide("");
1935 }
1936 // received web kernel drag callback, enable drag
1937 frameNode->SetDraggable(true);
1938 gestureHub->SetPixelMap(delegate_->GetDragPixelMap());
1939 if (!IsPreviewImageNodeExist()) {
1940 StartVibraFeedback("longPress.light");
1941 }
1942 if (!isMouseEvent_) {
1943 // mouse drag does not need long press action
1944 gestureHub->StartLongPressActionForWeb();
1945 }
1946 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop enable drag and start drag task for web,"
1947 "is mouse event: %{public}d", isMouseEvent_);
1948 bool result = gestureHub->StartDragTaskForWeb();
1949 if (!result && isMouseEvent_) {
1950 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop start drag task for web fail, reset drag action");
1951 ResetDragAction();
1952 }
1953 return true;
1954 }
1955
InitDragEvent(const RefPtr<GestureEventHub> & gestureHub)1956 void WebPattern::InitDragEvent(const RefPtr<GestureEventHub>& gestureHub)
1957 {
1958 if (dragEvent_) {
1959 return;
1960 }
1961
1962 auto host = GetHost();
1963 CHECK_NULL_VOID(host);
1964 auto eventHub = host->GetEventHub<WebEventHub>();
1965 CHECK_NULL_VOID(eventHub);
1966
1967 auto userOnDragStartFunc = eventHub->GetOnDragStart();
1968 if (userOnDragStartFunc) {
1969 isDisableDrag_ = true;
1970 return;
1971 }
1972
1973 InitCommonDragDropEvent(gestureHub);
1974
1975 auto actionStartTask = [weak = WeakClaim(this)](const GestureEvent& info) {
1976 int32_t x = info.GetGlobalPoint().GetX();
1977 int32_t y = info.GetGlobalPoint().GetY();
1978 auto pattern = weak.Upgrade();
1979 CHECK_NULL_VOID(pattern);
1980 TAG_LOGI(AceLogTag::ACE_WEB,
1981 "DragDrop event gestureHub actionStartTask x:%{public}d, y:%{public}d, webId:%{public}d",
1982 x, y, pattern->GetWebId());
1983 pattern->HandleDragStart(x, y);
1984 };
1985
1986 auto actionUpdateTask = [weak = WeakClaim(this)](const GestureEvent& info) {
1987 return;
1988 };
1989
1990 auto actionEndTask = [weak = WeakClaim(this)](const GestureEvent& info) {
1991 int32_t x = info.GetGlobalPoint().GetX();
1992 int32_t y = info.GetGlobalPoint().GetY();
1993 auto pattern = weak.Upgrade();
1994 CHECK_NULL_VOID(pattern);
1995 TAG_LOGI(AceLogTag::ACE_WEB,
1996 "DragDrop event gestureHub actionEndTask x:%{public}d, y:%{public}d, webId:%{public}d",
1997 x, y, pattern->GetWebId());
1998 pattern->HandleDragEnd(x, y);
1999 };
2000
2001 auto actionCancelTask = [weak = WeakClaim(this)]() {
2002 };
2003
2004 dragEvent_ = MakeRefPtr<DragEvent>(
2005 std::move(actionStartTask), std::move(actionUpdateTask), std::move(actionEndTask), std::move(actionCancelTask));
2006 gestureHub->SetCustomDragEvent(dragEvent_, { PanDirection::ALL }, DEFAULT_PAN_FINGER, DEFAULT_PAN_DISTANCE);
2007 }
2008
HandleDragStart(int32_t x,int32_t y)2009 void WebPattern::HandleDragStart(int32_t x, int32_t y)
2010 {
2011 TAG_LOGI(AceLogTag::ACE_WEB,
2012 "HandleDragStart DragDrop event actionStart, isDragStartFromWeb_:%{public}d, isMouseEvent_:%{public}d",
2013 (int)isDragStartFromWeb_, (int)isMouseEvent_);
2014 if (!isDragStartFromWeb_ && !isMouseEvent_) {
2015 auto frameNode = GetHost();
2016 CHECK_NULL_VOID(frameNode);
2017 frameNode->SetDraggable(false);
2018 auto eventHub = frameNode->GetEventHub<WebEventHub>();
2019 CHECK_NULL_VOID(eventHub);
2020 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
2021 CHECK_NULL_VOID(gestureHub);
2022 gestureHub->ResetDragActionForWeb();
2023 isDragging_ = false;
2024 isReceivedArkDrag_ = false;
2025 // cancel drag action to avoid web kernel can't process other input event
2026 CHECK_NULL_VOID(delegate_);
2027 delegate_->HandleDragEvent(0, 0, DragAction::DRAG_CANCEL);
2028 gestureHub->CancelDragForWeb();
2029 }
2030 if (!isDragStartFromWeb_ && isMouseEvent_) {
2031 auto frameNode = GetHost();
2032 CHECK_NULL_VOID(frameNode);
2033 auto eventHub = frameNode->GetEventHub<WebEventHub>();
2034 CHECK_NULL_VOID(eventHub);
2035 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
2036 CHECK_NULL_VOID(gestureHub);
2037 gestureHub->SetMouseDragMonitorState(true);
2038 isSetMouseDragMonitorState = true;
2039 }
2040 }
2041
HandleOnDragEnter(const RefPtr<OHOS::Ace::DragEvent> & info)2042 void WebPattern::HandleOnDragEnter(const RefPtr<OHOS::Ace::DragEvent>& info)
2043 {
2044 if (!delegate_) {
2045 return;
2046 }
2047
2048 auto host = GetHost();
2049 CHECK_NULL_VOID(host);
2050 auto pipelineContext = host->GetContextRefPtr();
2051 CHECK_NULL_VOID(pipelineContext);
2052 int32_t globalX = static_cast<int32_t>(info->GetX());
2053 int32_t globalY = static_cast<int32_t>(info->GetY());
2054 auto viewScale = pipelineContext->GetViewScale();
2055 auto offset = GetCoordinatePoint();
2056 int32_t localX = static_cast<int32_t>(globalX - offset.value_or(OffsetF()).GetX()) * viewScale;
2057 int32_t localY = static_cast<int32_t>(globalY - offset.value_or(OffsetF()).GetY()) * viewScale;
2058
2059 // fake drag data when enter
2060 delegate_->GetOrCreateDragData();
2061 // use summary to set fake data
2062 if (!isDragStartFromWeb_) {
2063 ClearDragData();
2064 SetFakeDragData(info);
2065 }
2066 delegate_->HandleDragEvent(localX, localY, DragAction::DRAG_ENTER);
2067 // RequestFocus to show the carret frame_caret
2068 WebRequestFocus();
2069 }
2070
HandleOnDragDropLink(RefPtr<UnifiedData> aceData)2071 void WebPattern::HandleOnDragDropLink(RefPtr<UnifiedData> aceData)
2072 {
2073 CHECK_NULL_VOID(aceData);
2074 CHECK_NULL_VOID(delegate_);
2075 CHECK_NULL_VOID(delegate_->dragData_);
2076 // hyperlink
2077 std::string linkUrl;
2078 std::string linkTitle;
2079 UdmfClient::GetInstance()->GetLinkEntry(aceData, linkUrl, linkTitle);
2080 if (!linkUrl.empty()) {
2081 delegate_->dragData_->SetLinkURL(linkUrl);
2082 delegate_->dragData_->SetLinkTitle(linkTitle);
2083 TAG_LOGI(AceLogTag::ACE_WEB,
2084 "DragDrop event WebEventHub onDragDropId, linkUrl size:%{public}zu", linkUrl.size());
2085 } else {
2086 TAG_LOGW(AceLogTag::ACE_WEB,
2087 "DragDrop event WebEventHub onDragDropId, linkUrl is empty");
2088 }
2089 }
2090
HandleOnDragDropFile(RefPtr<UnifiedData> aceData)2091 void WebPattern::HandleOnDragDropFile(RefPtr<UnifiedData> aceData)
2092 {
2093 CHECK_NULL_VOID(aceData);
2094 CHECK_NULL_VOID(delegate_);
2095 CHECK_NULL_VOID(delegate_->dragData_);
2096 // file
2097 std::vector<std::string> urlVec;
2098 UdmfClient::GetInstance()->GetFileUriEntry(aceData, urlVec);
2099 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId,"
2100 "url array size is:%{public}zu", urlVec.size());
2101 delegate_->dragData_->ClearImageFileNames();
2102 for (std::string url : urlVec) {
2103 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId,"
2104 "url get from udmf:%{public}zu", url.length());
2105 AppFileService::ModuleFileUri::FileUri fileUri(url);
2106 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId,"
2107 "fileUri ToString:%{public}zu", fileUri.ToString().length());
2108 std::string uriRealPath = FileUriHelper::GetRealPath(url);
2109 if (!uriRealPath.empty() && access(uriRealPath.c_str(), F_OK) == 0) { // file exist
2110 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId,"
2111 "url real path:%{public}zu", uriRealPath.length());
2112 delegate_->dragData_->SetFileUri(uriRealPath);
2113 } else {
2114 TAG_LOGW(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId,"
2115 "url is empty or not exist, uriRealPath:%{public}zu", uriRealPath.length());
2116 }
2117 }
2118 }
2119
ResetDragStateValue()2120 void WebPattern::ResetDragStateValue()
2121 {
2122 isDragging_ = false;
2123 isReceivedArkDrag_ = false;
2124 isW3cDragEvent_ = false;
2125 isDragStartFromWeb_ = false;
2126 }
2127
HandleOnDragDrop(const RefPtr<OHOS::Ace::DragEvent> & info)2128 void WebPattern::HandleOnDragDrop(const RefPtr<OHOS::Ace::DragEvent>& info)
2129 {
2130 ResetDragStateValue();
2131 CHECK_NULL_VOID(delegate_);
2132 auto host = GetHost();
2133 CHECK_NULL_VOID(host);
2134 auto pipelineContext = host->GetContextRefPtr();
2135 CHECK_NULL_VOID(pipelineContext);
2136 auto viewScale = pipelineContext->GetViewScale();
2137 auto offset = GetCoordinatePoint();
2138 int32_t localX = static_cast<int32_t>(info->GetX() - offset.value_or(OffsetF()).GetX()) * viewScale;
2139 int32_t localY = static_cast<int32_t>(info->GetY() - offset.value_or(OffsetF()).GetY()) * viewScale;
2140 ClearDragData();
2141 RefPtr<UnifiedData> aceData = info->GetData();
2142 // get data from ace(from udmf), and send it to chromium
2143 if (aceData && aceData->GetSize() >= 1) {
2144 TAG_LOGI(AceLogTag::ACE_WEB,
2145 "DragDrop event WebEventHub onDragDropId, size:%{public}" PRId64 "", aceData->GetSize());
2146 CHECK_NULL_VOID(delegate_->dragData_);
2147 // plain text
2148 std::string plain = UdmfClient::GetInstance()->GetPlainTextEntry(aceData);
2149 if (!plain.empty()) {
2150 delegate_->dragData_->SetFragmentText(plain);
2151 TAG_LOGI(AceLogTag::ACE_WEB,
2152 "DragDrop event WebEventHub onDragDropId, plain size:%{public}zu", plain.size());
2153 }
2154 // html
2155 std::string htmlContent;
2156 std::string plainContent;
2157 UdmfClient::GetInstance()->GetHtmlEntry(aceData, htmlContent, plainContent);
2158 if (!htmlContent.empty()) {
2159 delegate_->dragData_->SetFragmentHtml(htmlContent);
2160 TAG_LOGI(AceLogTag::ACE_WEB,
2161 "DragDrop event WebEventHub onDragDropId, htmlContent size:%{public}zu", htmlContent.size());
2162 }
2163 // spanstring
2164 std::vector<uint8_t> spanString = UdmfClient::GetInstance()->GetSpanStringEntry(aceData);
2165 if (!spanString.empty()) {
2166 std::string htmlStr = OHOS::Ace::SpanToHtml::ToHtml(spanString);
2167 delegate_->dragData_->SetFragmentHtml(htmlStr);
2168 TAG_LOGI(AceLogTag::ACE_WEB,
2169 "DragDrop event WebEventHub onDragDropId, spanstring to html success, html size:%{public}zu",
2170 htmlStr.size());
2171 }
2172 // link
2173 HandleOnDragDropLink(aceData);
2174 // file
2175 HandleOnDragDropFile(aceData);
2176 } else {
2177 TAG_LOGW(AceLogTag::ACE_WEB, "DragDrop event WebEventHub onDragDropId get data failed");
2178 }
2179
2180 delegate_->HandleDragEvent(localX, localY, DragAction::DRAG_DROP);
2181 delegate_->RegisterWebWindowFocusChangedListener();
2182 }
2183
HandleOnDragLeave(int32_t x,int32_t y)2184 void WebPattern::HandleOnDragLeave(int32_t x, int32_t y)
2185 {
2186 CHECK_NULL_VOID(delegate_);
2187 isDragging_ = false;
2188 isW3cDragEvent_ = false;
2189 isReceivedArkDrag_ = isDragStartFromWeb_ ? isReceivedArkDrag_ : false;
2190 auto host = GetHost();
2191 CHECK_NULL_VOID(host);
2192 auto pipelineContext = host->GetContextRefPtr();
2193 CHECK_NULL_VOID(pipelineContext);
2194 auto viewScale = pipelineContext->GetViewScale();
2195 auto offset = GetCoordinatePoint();
2196 int32_t localX = static_cast<int32_t>(x - offset.value_or(OffsetF()).GetX());
2197 int32_t localY = static_cast<int32_t>(y - offset.value_or(OffsetF()).GetY());
2198 delegate_->HandleDragEvent(localX * viewScale, localY * viewScale, DragAction::DRAG_LEAVE);
2199 }
2200
HandleDragEnd(int32_t x,int32_t y)2201 void WebPattern::HandleDragEnd(int32_t x, int32_t y)
2202 {
2203 CHECK_NULL_VOID(delegate_);
2204
2205 isDragging_ = false;
2206 isReceivedArkDrag_ = false;
2207 isW3cDragEvent_ = false;
2208 isDragStartFromWeb_ = false;
2209 ClearDragData();
2210
2211 auto host = GetHost();
2212 CHECK_NULL_VOID(host);
2213 auto pipelineContext = host->GetContextRefPtr();
2214 CHECK_NULL_VOID(pipelineContext);
2215 auto viewScale = pipelineContext->GetViewScale();
2216 auto offset = GetCoordinatePoint();
2217 int32_t localX = static_cast<int32_t>(x - offset.value_or(OffsetF()).GetX()) * viewScale;
2218 int32_t localY = static_cast<int32_t>(y - offset.value_or(OffsetF()).GetY()) * viewScale;
2219 if (x == 0 && y == 0) {
2220 delegate_->HandleDragEvent(0, 0, DragAction::DRAG_END);
2221 } else {
2222 delegate_->HandleDragEvent(localX, localY, DragAction::DRAG_END);
2223 }
2224 if (isSetMouseDragMonitorState) {
2225 auto eventHub = host->GetEventHub<WebEventHub>();
2226 CHECK_NULL_VOID(eventHub);
2227 auto gestureHub = eventHub->GetOrCreateGestureEventHub();
2228 CHECK_NULL_VOID(gestureHub);
2229 gestureHub->SetMouseDragMonitorState(false);
2230 isSetMouseDragMonitorState = false;
2231 }
2232 }
2233
HandleDragCancel()2234 void WebPattern::HandleDragCancel()
2235 {
2236 auto frameNode = GetHost();
2237 CHECK_NULL_VOID(frameNode);
2238 // disable drag
2239 frameNode->SetDraggable(false);
2240 CHECK_NULL_VOID(delegate_);
2241 isDragging_ = false;
2242 isReceivedArkDrag_ = false;
2243 isW3cDragEvent_ = false;
2244 isDragStartFromWeb_ = false;
2245 ClearDragData();
2246 delegate_->HandleDragEvent(0, 0, DragAction::DRAG_CANCEL);
2247 }
2248
ClearDragData()2249 void WebPattern::ClearDragData()
2250 {
2251 CHECK_NULL_VOID(delegate_);
2252 std::string plain = "";
2253 std::string htmlContent = "";
2254 std::string linkUrl = "";
2255 std::string linkTitle = "";
2256 if (delegate_->dragData_) {
2257 delegate_->dragData_->SetFragmentText(plain);
2258 delegate_->dragData_->SetFragmentHtml(htmlContent);
2259 delegate_->dragData_->SetLinkURL(linkUrl);
2260 delegate_->dragData_->SetLinkTitle(linkTitle);
2261 delegate_->dragData_->ClearImageFileNames();
2262 }
2263 }
2264
SetFakeDragData(const RefPtr<OHOS::Ace::DragEvent> & info)2265 void WebPattern::SetFakeDragData(const RefPtr<OHOS::Ace::DragEvent>& info)
2266 {
2267 CHECK_NULL_VOID(delegate_);
2268 CHECK_NULL_VOID(delegate_->dragData_);
2269 if (info && !info->GetSummary().empty()) {
2270 std::map<std::string, int64_t> dragDataSummary = info->GetSummary();
2271 TAG_LOGI(AceLogTag::ACE_WEB, "DragDrop, set fake drag data by summary, summary size is %{public}zu",
2272 dragDataSummary.size());
2273 std::map<std::string, int64_t>::iterator iter;
2274 for (iter = dragDataSummary.begin(); iter != dragDataSummary.end(); iter++) {
2275 if (FILE_TYPE_SET.find(iter->first) != FILE_TYPE_SET.end()) {
2276 delegate_->dragData_->SetFileUri(FAKE_DRAG_DATA_VAL);
2277 } else if (DRAG_DATA_TYPE_TEXT == iter->first) {
2278 delegate_->dragData_->SetFragmentText(FAKE_DRAG_DATA_VAL);
2279 } else if (DRAG_DATA_TYPE_HTML == iter->first) {
2280 delegate_->dragData_->SetFragmentHtml(FAKE_DRAG_DATA_VAL);
2281 } else if (DRAG_DATA_TYPE_LINK == iter->first) {
2282 delegate_->dragData_->SetLinkURL(FAKE_LINK_VAL);
2283 delegate_->dragData_->SetLinkTitle(FAKE_LINK_VAL);
2284 }
2285 }
2286 return;
2287 }
2288 delegate_->dragData_->SetFragmentText(FAKE_DRAG_DATA_VAL);
2289 delegate_->dragData_->SetFragmentHtml(FAKE_DRAG_DATA_VAL);
2290 }
2291
InitFocusEvent(const RefPtr<FocusHub> & focusHub)2292 void WebPattern::InitFocusEvent(const RefPtr<FocusHub>& focusHub)
2293 {
2294 auto focusTask = [weak = WeakClaim(this)]() {
2295 auto pattern = weak.Upgrade();
2296 CHECK_NULL_VOID(pattern);
2297 pattern->HandleFocusEvent();
2298 };
2299 focusHub->SetOnFocusInternal(focusTask);
2300
2301 auto blurTask = [weak = WeakClaim(this)](const BlurReason& blurReason) {
2302 auto pattern = weak.Upgrade();
2303 CHECK_NULL_VOID(pattern);
2304 pattern->HandleBlurEvent(blurReason);
2305 };
2306 focusHub->SetOnBlurReasonInternal(blurTask);
2307
2308 auto keyTask = [weak = WeakClaim(this)](const KeyEvent& keyEvent) -> bool {
2309 auto pattern = weak.Upgrade();
2310 CHECK_NULL_RETURN(pattern, false);
2311 return pattern->HandleKeyEvent(keyEvent);
2312 };
2313 focusHub->SetOnKeyEventInternal(keyTask);
2314 }
2315
HandleFocusEvent()2316 void WebPattern::HandleFocusEvent()
2317 {
2318 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::HandleFocusEvent webId:%{public}d, needOnFocus: %{public}d.", GetWebId(),
2319 needOnFocus_);
2320 CHECK_NULL_VOID(delegate_);
2321 isFocus_ = true;
2322 if (needOnFocus_) {
2323 delegate_->OnFocus();
2324 } else {
2325 delegate_->OnFocus(OHOS::NWeb::FocusReason::FOCUS_DEFAULT);
2326 needOnFocus_ = true;
2327 }
2328 }
2329
HandleBlurEvent(const BlurReason & blurReason)2330 void WebPattern::HandleBlurEvent(const BlurReason& blurReason)
2331 {
2332 TAG_LOGI(AceLogTag::ACE_WEB,
2333 "HandleBlurEvent webId:%{public}d, selectPopupMenuShowing: %{public}d, isDragStartFromWeb: %{public}d",
2334 GetWebId(), selectPopupMenuShowing_, isDragStartFromWeb_);
2335 CHECK_NULL_VOID(delegate_);
2336 isFocus_ = false;
2337
2338 if (isDragStartFromWeb_) {
2339 return;
2340 }
2341 if (!selectPopupMenuShowing_) {
2342 delegate_->SetBlurReason(static_cast<OHOS::NWeb::BlurReason>(blurReason));
2343 delegate_->OnBlur();
2344 }
2345 OnQuickMenuDismissed();
2346 CloseContextSelectionMenu();
2347 if (!isVisible_ && isActive_ && IsDialogNested()) {
2348 TAG_LOGI(AceLogTag::ACE_WEB, "HandleBlurEvent, dialog nested blur but invisible while active, set inactive.");
2349 OnInActive();
2350 }
2351 HideMagnifier();
2352 }
2353
HandleKeyEvent(const KeyEvent & keyEvent)2354 bool WebPattern::HandleKeyEvent(const KeyEvent& keyEvent)
2355 {
2356 bool ret = false;
2357
2358 auto host = GetHost();
2359 CHECK_NULL_RETURN(host, ret);
2360 auto eventHub = host->GetEventHub<WebEventHub>();
2361 CHECK_NULL_RETURN(eventHub, ret);
2362
2363 KeyEventInfo info(keyEvent);
2364 auto keyEventCallback = eventHub->GetOnKeyEvent();
2365 if (keyEventCallback) {
2366 keyEventCallback(info);
2367 }
2368
2369 auto preKeyEventCallback = eventHub->GetOnPreKeyEvent();
2370 if (preKeyEventCallback) {
2371 ret = preKeyEventCallback(info);
2372 if (ret) {
2373 return ret;
2374 }
2375 }
2376
2377 ret = WebOnKeyEvent(keyEvent);
2378 return ret;
2379 }
2380
ClearKeyEventByKeyCode(int32_t keyCode)2381 void WebPattern::ClearKeyEventByKeyCode(int32_t keyCode)
2382 {
2383 auto keyEvent = webKeyEvent_.begin();
2384 for (; keyEvent != webKeyEvent_.end();) {
2385 if (static_cast<int32_t>(keyEvent->code) == keyCode) {
2386 keyEvent = webKeyEvent_.erase(keyEvent);
2387 } else {
2388 ++keyEvent;
2389 }
2390 }
2391
2392 if (webKeyEvent_.size() >= KEYEVENT_MAX_NUM) {
2393 webKeyEvent_.clear();
2394 TAG_LOGW(AceLogTag::ACE_WEB,
2395 "WebPattern::ClearKeyEventByKeyCode clear all keyevent.");
2396 } else {
2397 TAG_LOGW(AceLogTag::ACE_WEB,
2398 "WebPattern::ClearKeyEventByKeyCode clear all tab keyevent.");
2399 }
2400 }
2401
WebOnKeyEvent(const KeyEvent & keyEvent)2402 bool WebPattern::WebOnKeyEvent(const KeyEvent& keyEvent)
2403 {
2404 CHECK_NULL_RETURN(delegate_, false);
2405 if (webKeyEvent_.size() >= KEYEVENT_MAX_NUM) {
2406 ClearKeyEventByKeyCode(static_cast<int32_t>(KeyCode::KEY_TAB));
2407 }
2408 TAG_LOGD(AceLogTag::ACE_WEB,
2409 "WebPattern::WebOnKeyEvent keyEvent:%{public}s", keyEvent.ToString().c_str());
2410 webKeyEvent_.push_back(keyEvent);
2411 std::vector<int32_t> pressedCodes;
2412 for (auto pCode : keyEvent.pressedCodes) {
2413 pressedCodes.push_back(static_cast<int32_t>(pCode));
2414 }
2415 KeyCode code = keyEvent.code;
2416 auto item = g_numPadFunctionMap.find(code);
2417 if (!keyEvent.numLock && item != g_numPadFunctionMap.end()) {
2418 code = item->second;
2419 }
2420 std::shared_ptr<NWebKeyboardEventImpl> keyboardEvent =
2421 std::make_shared<NWebKeyboardEventImpl>(static_cast<int32_t>(code),
2422 static_cast<int32_t>(keyEvent.action),
2423 keyEvent.unicode,
2424 keyEvent.enableCapsLock,
2425 pressedCodes);
2426 return delegate_->SendKeyboardEvent(keyboardEvent);
2427 }
2428
KeyboardReDispatch(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent> & event,bool isUsed)2429 void WebPattern::KeyboardReDispatch(
2430 const std::shared_ptr<OHOS::NWeb::NWebKeyEvent>& event, bool isUsed)
2431 {
2432 CHECK_NULL_VOID(event);
2433 auto container = Container::Current();
2434 CHECK_NULL_VOID(container);
2435 auto host = GetHost();
2436 CHECK_NULL_VOID(host);
2437 auto pipelineContext = host->GetContext();
2438 CHECK_NULL_VOID(pipelineContext);
2439 auto taskExecutor = pipelineContext->GetTaskExecutor();
2440 CHECK_NULL_VOID(taskExecutor);
2441 auto keyEvent = webKeyEvent_.rbegin();
2442 for (; keyEvent != webKeyEvent_.rend(); ++keyEvent) {
2443 if (static_cast<int32_t>(keyEvent->code) == event->GetKeyCode() &&
2444 static_cast<int32_t>(keyEvent->action) == event->GetAction()) {
2445 break;
2446 }
2447 }
2448 if (keyEvent == webKeyEvent_.rend()) {
2449 TAG_LOGW(AceLogTag::ACE_WEB,
2450 "KeyEvent is not find keycode:%{public}d, action:%{public}d", event->GetKeyCode(), event->GetAction());
2451 return;
2452 }
2453 if (!isUsed) {
2454 taskExecutor->PostTask([context = AceType::WeakClaim(pipelineContext),
2455 event = *keyEvent] () {
2456 auto pipelineContext = context.Upgrade();
2457 CHECK_NULL_VOID(pipelineContext);
2458 TAG_LOGD(AceLogTag::ACE_WEB,
2459 "WebPattern::KeyboardReDispatch key:%{public}s", event.ToString().c_str());
2460 pipelineContext->ReDispatch(const_cast<KeyEvent&>(event));
2461 },
2462 TaskExecutor::TaskType::UI, "ArkUIWebKeyboardReDispatch");
2463 }
2464 TAG_LOGD(AceLogTag::ACE_WEB,
2465 "WebPattern::KeyboardReDispatch erase key:%{public}s", keyEvent->ToString().c_str());
2466 webKeyEvent_.erase((++keyEvent).base());
2467 }
2468
WebRequestFocus()2469 void WebPattern::WebRequestFocus()
2470 {
2471 auto host = GetHost();
2472 CHECK_NULL_VOID(host);
2473 auto eventHub = host->GetEventHub<WebEventHub>();
2474 CHECK_NULL_VOID(eventHub);
2475 auto focusHub = eventHub->GetOrCreateFocusHub();
2476 CHECK_NULL_VOID(focusHub);
2477
2478 focusHub->RequestFocusImmediately();
2479 }
2480
UpdateContentOffset(const RefPtr<LayoutWrapper> & dirty)2481 void WebPattern::UpdateContentOffset(const RefPtr<LayoutWrapper>& dirty)
2482 {
2483 CHECK_NULL_VOID(dirty);
2484 auto geometryNode = dirty->GetGeometryNode();
2485 CHECK_NULL_VOID(geometryNode);
2486 auto host = GetHost();
2487 CHECK_NULL_VOID(host);
2488 auto renderContext = host->GetRenderContext();
2489 CHECK_NULL_VOID(renderContext);
2490 auto paddingOffset = geometryNode->GetPaddingOffset();
2491 auto webContentSize = geometryNode->GetContentSize();
2492
2493 auto positionProperty = renderContext->GetPropertyOfPosition();
2494 renderContext->SetBounds(
2495 paddingOffset.GetX() + positionProperty.GetX(), paddingOffset.GetY() + positionProperty.GetY(),
2496 webContentSize.Width(), webContentSize.Height());
2497 }
2498
OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper> & dirty,const DirtySwapConfig & config)2499 bool WebPattern::OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config)
2500 {
2501 UpdateImagePreviewParam();
2502 if (selectOverlayProxy_) {
2503 selectOverlayProxy_->UpdateAncestorViewPort(GetViewPort());
2504 }
2505 if (!config.contentSizeChange || isInWindowDrag_) {
2506 if (isLayoutModeChanged_) {
2507 isLayoutModeChanged_ = false;
2508 } else {
2509 return false;
2510 }
2511 }
2512 CHECK_NULL_RETURN(delegate_, false);
2513 CHECK_NULL_RETURN(dirty, false);
2514
2515 Size drawSize = Size(1, 1);
2516 auto frameNode = GetHost();
2517 CHECK_NULL_RETURN(frameNode, false);
2518 auto renderContext = frameNode->GetRenderContext();
2519 CHECK_NULL_RETURN(renderContext, false);
2520 auto rect = renderContext->GetPaintRectWithoutTransform();
2521 drawSize = Size(rect.Width(), rect.Height());
2522 if (drawSize.IsInfinite() || drawSize.IsEmpty()) {
2523 return false;
2524 }
2525
2526 if (GreatOrEqual(drawSize.Width(), Infinity<double>())) {
2527 drawSize.SetWidth(DEFAULT_WEB_WIDTH);
2528 }
2529 if (GreatOrEqual(drawSize.Height(), Infinity<double>())) {
2530 drawSize.SetHeight(DEFAULT_WEB_HEIGHT);
2531 }
2532
2533 drawSize_ = drawSize;
2534 drawSizeCache_ = drawSize_;
2535 auto offset = Offset(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY());
2536 if (!CheckSafeAreaIsExpand()) {
2537 TAG_LOGI(AceLogTag::ACE_WEB, "Not safe area, drawsize_ : %{public}s, web id : %{public}d",
2538 drawSize_.ToString().c_str(), GetWebId());
2539 ACE_SCOPED_TRACE("WebPattern::OnDirtyLayoutWrapperSwap, drawsize_ : %s, web id : %d",
2540 drawSize_.ToString().c_str(), GetWebId());
2541 if (isVirtualKeyBoardShow_ == VkState::VK_SHOW) {
2542 auto pipeline = PipelineContext::GetCurrentContext();
2543 CHECK_NULL_RETURN(pipeline, false);
2544 ProcessVirtualKeyBoard(pipeline->GetRootWidth(), pipeline->GetRootHeight(), lastKeyboardHeight_);
2545 }
2546 delegate_->SetBoundsOrResize(drawSize_, offset, isKeyboardInSafeArea_ || keyboardGetready_);
2547 IsNeedResizeVisibleViewport();
2548 isKeyboardInSafeArea_ = false;
2549 } else {
2550 TAG_LOGD(AceLogTag::ACE_WEB, "OnDirtyLayoutWrapperSwap safeArea is set, no need setbounds");
2551 }
2552 if (offlineWebInited_ && !offlineWebRendered_) {
2553 TAG_LOGI(AceLogTag::ACE_WEB,
2554 "OnDirtyLayoutWrapperSwap; WebPattern is Offline Mode, WebId:%{public}d", GetWebId());
2555 offlineWebRendered_ = true;
2556 delegate_->ShowWebView();
2557 }
2558
2559 // first update size to load url.
2560 if (!isUrlLoaded_) {
2561 isUrlLoaded_ = true;
2562 if (webSrc_) {
2563 delegate_->LoadUrl();
2564 } else if (webData_) {
2565 delegate_->LoadDataWithRichText();
2566 }
2567 }
2568
2569 if (renderMode_ == RenderMode::SYNC_RENDER) {
2570 return true;
2571 }
2572 return false;
2573 }
2574
BeforeSyncGeometryProperties(const DirtySwapConfig & config)2575 void WebPattern::BeforeSyncGeometryProperties(const DirtySwapConfig& config)
2576 {
2577 auto frameNode = GetHost();
2578 CHECK_NULL_VOID(frameNode);
2579 auto renderContext = frameNode->GetRenderContext();
2580 CHECK_NULL_VOID(renderContext);
2581 auto rect = renderContext->GetPaintRectWithoutTransform();
2582 auto heightBeforeUpdate = rect.Height();
2583 if (isResizeContentAvoid_ && frameNode->SelfExpansive()) {
2584 rect.SetHeight(heightAfterAvoid_);
2585 renderContext->UpdatePaintRect(rect);
2586 rect.SetHeight(heightBeforeUpdate);
2587 }
2588
2589 if (!config.contentSizeChange || isInWindowDrag_) {
2590 return;
2591 }
2592 auto drawSize = Size(rect.Width(), rect.Height());
2593 if (drawSize.IsInfinite() || drawSize.IsEmpty()) {
2594 return;
2595 }
2596
2597 if (GreatOrEqual(drawSize.Width(), Infinity<double>())) {
2598 drawSize.SetWidth(DEFAULT_WEB_WIDTH);
2599 }
2600 if (GreatOrEqual(drawSize.Height(), Infinity<double>())) {
2601 drawSize.SetHeight(DEFAULT_WEB_HEIGHT);
2602 }
2603
2604 TAG_LOGD(AceLogTag::ACE_WEB, "BeforeSync, drawsize_ : %{public}s", drawSize.ToString().c_str());
2605 if (layoutMode_ != WebLayoutMode::FIT_CONTENT) {
2606 drawSize_ = drawSize;
2607 drawSizeCache_ = drawSize_;
2608 }
2609 }
2610
UpdateLayoutAfterKeyboardShow(int32_t width,int32_t height,double keyboard,double oldWebHeight)2611 void WebPattern::UpdateLayoutAfterKeyboardShow(int32_t width, int32_t height, double keyboard, double oldWebHeight)
2612 {
2613 lastKeyboardHeight_ = keyboard;
2614 if (isVirtualKeyBoardShow_ != VkState::VK_SHOW) {
2615 return;
2616 }
2617
2618 TAG_LOGI(AceLogTag::ACE_WEB,
2619 "KeyboardShow height:%{public}d, keyboard:%{public}f, offset:%{public}f, oldWebHeight:%{public}f",
2620 height, keyboard, GetCoordinatePoint()->GetY(), oldWebHeight);
2621 if (CheckSafeAreaKeyBoard()) {
2622 TAG_LOGI(AceLogTag::ACE_WEB, "CheckSafeAreaKeyBoard, no need resize");
2623 return;
2624 }
2625 if (GreatOrEqual(height, keyboard + GetCoordinatePoint()->GetY())) {
2626 double newHeight = height - keyboard - GetCoordinatePoint()->GetY();
2627 if (NearEqual(newHeight, oldWebHeight)) {
2628 return;
2629 }
2630 bool isUpdate = true;
2631 if (keyBoardAvoidMode_ == WebKeyboardAvoidMode::RESIZE_VISUAL) {
2632 visibleViewportSize_.SetWidth(drawSize_.Width());
2633 visibleViewportSize_.SetHeight(newHeight);
2634 isUpdate = false;
2635 } else if (keyBoardAvoidMode_ == WebKeyboardAvoidMode::OVERLAYS_CONTENT) {
2636 return;
2637 } else {
2638 TAG_LOGI(AceLogTag::ACE_WEB, "KeyboardShow newHeight: %{public}f", newHeight);
2639 drawSize_.SetHeight(newHeight);
2640 visibleViewportSize_.SetWidth(-1.0);
2641 visibleViewportSize_.SetHeight(-1.0);
2642 isResizeContentAvoid_ = true;
2643 heightAfterAvoid_ = newHeight;
2644 }
2645 UpdateWebLayoutSize(width, height, true, isUpdate);
2646 }
2647 }
2648
OnAreaChangedInner()2649 void WebPattern::OnAreaChangedInner()
2650 {
2651 auto offset = GetCoordinatePoint().value_or(OffsetF());
2652 auto resizeOffset = Offset(offset.GetX(), offset.GetY());
2653
2654 auto frameNode = GetHost();
2655 CHECK_NULL_VOID(frameNode);
2656 auto renderContext = frameNode->GetRenderContext();
2657 CHECK_NULL_VOID(renderContext);
2658 auto geometryNode = frameNode->GetGeometryNode();
2659 CHECK_NULL_VOID(geometryNode);
2660 auto rect = renderContext->GetPaintRectWithoutTransform();
2661 auto size = Size(rect.Width(), rect.Height());
2662 delegate_->OnAreaChange({ resizeOffset.GetX(), resizeOffset.GetY(), size.Width(), size.Height() });
2663 if (CheckSafeAreaIsExpand() &&
2664 ((size.Width() != areaChangeSize_.Width()) || (size.Height() != areaChangeSize_.Height()))) {
2665 TAG_LOGD(AceLogTag::ACE_WEB, "OnAreaChangedInner setbounds: height:%{public}f, offsetY:%{public}f",
2666 size.Height(), resizeOffset.GetY());
2667 areaChangeSize_ = size;
2668 drawSize_ = size;
2669 if (renderMode_ != RenderMode::SYNC_RENDER) {
2670 drawSizeCache_ = drawSize_;
2671 }
2672 TAG_LOGD(AceLogTag::ACE_WEB, "Safe area, drawsize_ : %{public}s", drawSize_.ToString().c_str());
2673 delegate_->SetBoundsOrResize(drawSize_, resizeOffset, isKeyboardInSafeArea_);
2674 IsNeedResizeVisibleViewport();
2675 isKeyboardInSafeArea_ = false;
2676 }
2677 if (layoutMode_ == WebLayoutMode::NONE && renderMode_ == RenderMode::ASYNC_RENDER) {
2678 if (isVirtualKeyBoardShow_ != VkState::VK_SHOW) {
2679 drawSize_ = size;
2680 TAG_LOGD(AceLogTag::ACE_WEB, "ASYNC_RENDER, drawsize_ : %{public}s", drawSize_.ToString().c_str());
2681 }
2682 if (webOffset_ == offset) {
2683 return;
2684 }
2685 }
2686 if (offset != webOffset_) {
2687 webOffset_ = offset;
2688 if (webSelectOverlay_ && webSelectOverlay_->IsShowHandle())
2689 webSelectOverlay_->UpdateTouchHandleForOverlay();
2690 }
2691 if (isInWindowDrag_)
2692 return;
2693 TAG_LOGD(AceLogTag::ACE_WEB, "Normal state, drawsize_ : %{public}s", drawSize_.ToString().c_str());
2694 delegate_->SetBoundsOrResize(drawSize_, resizeOffset, isKeyboardInSafeArea_);
2695 IsNeedResizeVisibleViewport();
2696 isKeyboardInSafeArea_ = false;
2697 if (renderMode_ == RenderMode::SYNC_RENDER) {
2698 UpdateSlideOffset();
2699 }
2700 }
2701
OnWebSrcUpdate()2702 void WebPattern::OnWebSrcUpdate()
2703 {
2704 if (delegate_ && isUrlLoaded_) {
2705 delegate_->LoadUrl();
2706 }
2707 }
2708
OnWebDataUpdate()2709 void WebPattern::OnWebDataUpdate()
2710 {
2711 if (delegate_ && isUrlLoaded_) {
2712 delegate_->LoadDataWithRichText();
2713 }
2714 }
2715
OnJsEnabledUpdate(bool value)2716 void WebPattern::OnJsEnabledUpdate(bool value)
2717 {
2718 if (delegate_) {
2719 delegate_->UpdateJavaScriptEnabled(value);
2720 }
2721 }
2722
OnMediaPlayGestureAccessUpdate(bool value)2723 void WebPattern::OnMediaPlayGestureAccessUpdate(bool value)
2724 {
2725 if (delegate_) {
2726 delegate_->UpdateMediaPlayGestureAccess(value);
2727 }
2728 }
2729
OnFileAccessEnabledUpdate(bool value)2730 void WebPattern::OnFileAccessEnabledUpdate(bool value)
2731 {
2732 if (delegate_) {
2733 delegate_->UpdateAllowFileAccess(value);
2734 }
2735 }
2736
OnOnLineImageAccessEnabledUpdate(bool value)2737 void WebPattern::OnOnLineImageAccessEnabledUpdate(bool value)
2738 {
2739 if (delegate_) {
2740 delegate_->UpdateBlockNetworkImage(!value);
2741 }
2742 }
2743
OnDomStorageAccessEnabledUpdate(bool value)2744 void WebPattern::OnDomStorageAccessEnabledUpdate(bool value)
2745 {
2746 if (delegate_) {
2747 delegate_->UpdateDomStorageEnabled(value);
2748 }
2749 }
2750
OnImageAccessEnabledUpdate(bool value)2751 void WebPattern::OnImageAccessEnabledUpdate(bool value)
2752 {
2753 if (delegate_) {
2754 delegate_->UpdateLoadsImagesAutomatically(value);
2755 }
2756 }
2757
OnMixedModeUpdate(MixedModeContent value)2758 void WebPattern::OnMixedModeUpdate(MixedModeContent value)
2759 {
2760 if (delegate_) {
2761 delegate_->UpdateMixedContentMode(value);
2762 }
2763 }
2764
OnZoomAccessEnabledUpdate(bool value)2765 void WebPattern::OnZoomAccessEnabledUpdate(bool value)
2766 {
2767 if ((layoutMode_ == WebLayoutMode::FIT_CONTENT) || isEmbedModeEnabled_) {
2768 TAG_LOGI(AceLogTag::ACE_WEB, "When layoutMode is fit-content or EmbedMode is on, turn off zoom access.");
2769 value = false;
2770 }
2771 if (delegate_) {
2772 delegate_->UpdateSupportZoom(value);
2773 }
2774 }
2775
OnGeolocationAccessEnabledUpdate(bool value)2776 void WebPattern::OnGeolocationAccessEnabledUpdate(bool value)
2777 {
2778 if (delegate_) {
2779 delegate_->UpdateGeolocationEnabled(value);
2780 }
2781 }
2782
OnUserAgentUpdate(const std::string & value)2783 void WebPattern::OnUserAgentUpdate(const std::string& value)
2784 {
2785 if (delegate_) {
2786 delegate_->UpdateUserAgent(value);
2787 }
2788 }
2789
OnCacheModeUpdate(WebCacheMode value)2790 void WebPattern::OnCacheModeUpdate(WebCacheMode value)
2791 {
2792 if (delegate_) {
2793 delegate_->UpdateCacheMode(value);
2794 }
2795 }
2796
OnDarkModeUpdate(WebDarkMode mode)2797 void WebPattern::OnDarkModeUpdate(WebDarkMode mode)
2798 {
2799 if (delegate_) {
2800 delegate_->UpdateDarkMode(mode);
2801 }
2802 }
2803
OnOverScrollModeUpdate(int mode)2804 void WebPattern::OnOverScrollModeUpdate(int mode)
2805 {
2806 if (delegate_) {
2807 delegate_->UpdateOverScrollMode(mode);
2808 }
2809 }
2810
OnBlurOnKeyboardHideModeUpdate(int mode)2811 void WebPattern::OnBlurOnKeyboardHideModeUpdate(int mode)
2812 {
2813 if (delegate_) {
2814 delegate_->UpdateBlurOnKeyboardHideMode(mode);
2815 }
2816 }
2817
OnCopyOptionModeUpdate(int32_t mode)2818 void WebPattern::OnCopyOptionModeUpdate(int32_t mode)
2819 {
2820 if (delegate_) {
2821 delegate_->UpdateCopyOptionMode(mode);
2822 }
2823 }
2824
OnMetaViewportUpdate(bool value)2825 void WebPattern::OnMetaViewportUpdate(bool value)
2826 {
2827 if (delegate_) {
2828 delegate_->UpdateMetaViewport(value);
2829 }
2830 }
2831
OnForceDarkAccessUpdate(bool access)2832 void WebPattern::OnForceDarkAccessUpdate(bool access)
2833 {
2834 if (delegate_) {
2835 delegate_->UpdateForceDarkAccess(access);
2836 }
2837 }
2838
OnAudioResumeIntervalUpdate(int32_t resumeInterval)2839 void WebPattern::OnAudioResumeIntervalUpdate(int32_t resumeInterval)
2840 {
2841 if (delegate_) {
2842 delegate_->UpdateAudioResumeInterval(resumeInterval);
2843 }
2844 }
2845
OnAudioExclusiveUpdate(bool audioExclusive)2846 void WebPattern::OnAudioExclusiveUpdate(bool audioExclusive)
2847 {
2848 if (delegate_) {
2849 delegate_->UpdateAudioExclusive(audioExclusive);
2850 }
2851 }
2852
OnOverviewModeAccessEnabledUpdate(bool value)2853 void WebPattern::OnOverviewModeAccessEnabledUpdate(bool value)
2854 {
2855 if (delegate_) {
2856 delegate_->UpdateOverviewModeEnabled(value);
2857 }
2858 }
2859
OnFileFromUrlAccessEnabledUpdate(bool value)2860 void WebPattern::OnFileFromUrlAccessEnabledUpdate(bool value)
2861 {
2862 if (delegate_) {
2863 delegate_->UpdateFileFromUrlEnabled(value);
2864 }
2865 }
2866
OnDatabaseAccessEnabledUpdate(bool value)2867 void WebPattern::OnDatabaseAccessEnabledUpdate(bool value)
2868 {
2869 if (delegate_) {
2870 delegate_->UpdateDatabaseEnabled(value);
2871 }
2872 }
2873
OnTextZoomRatioUpdate(int32_t value)2874 void WebPattern::OnTextZoomRatioUpdate(int32_t value)
2875 {
2876 if (delegate_) {
2877 delegate_->UpdateTextZoomRatio(value);
2878 }
2879 }
2880
OnWebDebuggingAccessEnabledUpdate(bool value)2881 void WebPattern::OnWebDebuggingAccessEnabledUpdate(bool value)
2882 {
2883 if (delegate_) {
2884 delegate_->UpdateWebDebuggingAccess(value);
2885 }
2886 }
2887
OnPinchSmoothModeEnabledUpdate(bool value)2888 void WebPattern::OnPinchSmoothModeEnabledUpdate(bool value)
2889 {
2890 if (delegate_) {
2891 delegate_->UpdatePinchSmoothModeEnabled(value);
2892 }
2893 }
2894
OnBackgroundColorUpdate(int32_t value)2895 void WebPattern::OnBackgroundColorUpdate(int32_t value)
2896 {
2897 UpdateBackgroundColorRightNow(value);
2898 if (delegate_) {
2899 delegate_->UpdateBackgroundColor(value);
2900 }
2901 }
2902
OnInitialScaleUpdate(float value)2903 void WebPattern::OnInitialScaleUpdate(float value)
2904 {
2905 if ((layoutMode_ == WebLayoutMode::FIT_CONTENT) || isEmbedModeEnabled_) {
2906 TAG_LOGI(AceLogTag::ACE_WEB, "When layoutMode is fit-content or EmbedMode is on, Not allow to update scale.");
2907 return;
2908 }
2909 if (delegate_) {
2910 delegate_->UpdateInitialScale(value);
2911 }
2912 }
2913
OnMultiWindowAccessEnabledUpdate(bool value)2914 void WebPattern::OnMultiWindowAccessEnabledUpdate(bool value)
2915 {
2916 if (delegate_) {
2917 delegate_->UpdateMultiWindowAccess(value);
2918 }
2919 }
2920
OnAllowWindowOpenMethodUpdate(bool value)2921 void WebPattern::OnAllowWindowOpenMethodUpdate(bool value)
2922 {
2923 if (delegate_) {
2924 delegate_->UpdateAllowWindowOpenMethod(value);
2925 }
2926 }
2927
OnWebCursiveFontUpdate(const std::string & value)2928 void WebPattern::OnWebCursiveFontUpdate(const std::string& value)
2929 {
2930 if (delegate_) {
2931 delegate_->UpdateWebCursiveFont(value);
2932 }
2933 }
2934
OnWebFantasyFontUpdate(const std::string & value)2935 void WebPattern::OnWebFantasyFontUpdate(const std::string& value)
2936 {
2937 if (delegate_) {
2938 delegate_->UpdateWebFantasyFont(value);
2939 }
2940 }
2941
OnWebFixedFontUpdate(const std::string & value)2942 void WebPattern::OnWebFixedFontUpdate(const std::string& value)
2943 {
2944 if (delegate_) {
2945 delegate_->UpdateWebFixedFont(value);
2946 }
2947 }
2948
OnWebSansSerifFontUpdate(const std::string & value)2949 void WebPattern::OnWebSansSerifFontUpdate(const std::string& value)
2950 {
2951 if (delegate_) {
2952 delegate_->UpdateWebSansSerifFont(value);
2953 }
2954 }
2955
OnWebSerifFontUpdate(const std::string & value)2956 void WebPattern::OnWebSerifFontUpdate(const std::string& value)
2957 {
2958 if (delegate_) {
2959 delegate_->UpdateWebSerifFont(value);
2960 }
2961 }
2962
OnWebStandardFontUpdate(const std::string & value)2963 void WebPattern::OnWebStandardFontUpdate(const std::string& value)
2964 {
2965 if (delegate_) {
2966 delegate_->UpdateWebStandardFont(value);
2967 }
2968 }
2969
OnDefaultFixedFontSizeUpdate(int32_t value)2970 void WebPattern::OnDefaultFixedFontSizeUpdate(int32_t value)
2971 {
2972 if (delegate_) {
2973 delegate_->UpdateDefaultFixedFontSize(value);
2974 }
2975 }
2976
OnDefaultFontSizeUpdate(int32_t value)2977 void WebPattern::OnDefaultFontSizeUpdate(int32_t value)
2978 {
2979 if (delegate_) {
2980 delegate_->UpdateDefaultFontSize(value);
2981 }
2982 }
2983
OnMinFontSizeUpdate(int32_t value)2984 void WebPattern::OnMinFontSizeUpdate(int32_t value)
2985 {
2986 if (delegate_) {
2987 delegate_->UpdateMinFontSize(value);
2988 }
2989 }
2990
OnMinLogicalFontSizeUpdate(int32_t value)2991 void WebPattern::OnMinLogicalFontSizeUpdate(int32_t value)
2992 {
2993 if (delegate_) {
2994 delegate_->UpdateMinLogicalFontSize(value);
2995 }
2996 }
2997
OnBlockNetworkUpdate(bool value)2998 void WebPattern::OnBlockNetworkUpdate(bool value)
2999 {
3000 if (delegate_) {
3001 delegate_->UpdateBlockNetwork(value);
3002 }
3003 }
3004
OnHorizontalScrollBarAccessEnabledUpdate(bool value)3005 void WebPattern::OnHorizontalScrollBarAccessEnabledUpdate(bool value)
3006 {
3007 if (delegate_) {
3008 delegate_->UpdateHorizontalScrollBarAccess(value);
3009 }
3010 }
3011
OnVerticalScrollBarAccessEnabledUpdate(bool value)3012 void WebPattern::OnVerticalScrollBarAccessEnabledUpdate(bool value)
3013 {
3014 if (delegate_) {
3015 delegate_->UpdateVerticalScrollBarAccess(value);
3016 }
3017 }
3018
OnOverlayScrollbarEnabledUpdate(bool enable)3019 void WebPattern::OnOverlayScrollbarEnabledUpdate(bool enable)
3020 {
3021 if (delegate_) {
3022 delegate_->UpdateOverlayScrollbarEnabled(enable);
3023 }
3024 }
3025
OnNativeEmbedModeEnabledUpdate(bool value)3026 void WebPattern::OnNativeEmbedModeEnabledUpdate(bool value)
3027 {
3028 if (delegate_) {
3029 delegate_->UpdateNativeEmbedModeEnabled(value);
3030 }
3031 }
3032
OnIntrinsicSizeEnabledUpdate(bool value)3033 void WebPattern::OnIntrinsicSizeEnabledUpdate(bool value)
3034 {
3035 if (delegate_) {
3036 delegate_->UpdateIntrinsicSizeEnabled(value);
3037 }
3038 }
3039
OnNativeEmbedRuleTagUpdate(const std::string & tag)3040 void WebPattern::OnNativeEmbedRuleTagUpdate(const std::string& tag)
3041 {
3042 if (delegate_) {
3043 delegate_->UpdateNativeEmbedRuleTag(tag);
3044 }
3045 }
3046
OnNativeEmbedRuleTypeUpdate(const std::string & type)3047 void WebPattern::OnNativeEmbedRuleTypeUpdate(const std::string& type)
3048 {
3049 if (delegate_) {
3050 delegate_->UpdateNativeEmbedRuleType(type);
3051 }
3052 }
3053
OnTextAutosizingUpdate(bool isTextAutosizing)3054 void WebPattern::OnTextAutosizingUpdate(bool isTextAutosizing)
3055 {
3056 if (delegate_) {
3057 delegate_->UpdateTextAutosizing(isTextAutosizing);
3058 }
3059 }
3060
OnKeyboardAvoidModeUpdate(const WebKeyboardAvoidMode & mode)3061 void WebPattern::OnKeyboardAvoidModeUpdate(const WebKeyboardAvoidMode& mode)
3062 {
3063 keyBoardAvoidMode_ = mode;
3064 }
3065
OnEnabledHapticFeedbackUpdate(bool enable)3066 void WebPattern::OnEnabledHapticFeedbackUpdate(bool enable)
3067 {
3068 isEnabledHapticFeedback_ = enable;
3069 }
3070
IsRootNeedExportTexture()3071 bool WebPattern::IsRootNeedExportTexture()
3072 {
3073 auto host = GetHost();
3074 CHECK_NULL_RETURN(host, false);
3075 bool isNeedExportTexture = false;
3076 for (auto parent = host->GetParent(); parent != nullptr; parent = parent->GetParent()) {
3077 RefPtr<FrameNode> frameNode = AceType::DynamicCast<FrameNode>(parent);
3078 if (!frameNode) {
3079 continue;
3080 }
3081 isNeedExportTexture = frameNode->IsNeedExportTexture();
3082 if (isNeedExportTexture) {
3083 return isNeedExportTexture;
3084 }
3085 }
3086 return isNeedExportTexture;
3087 }
3088
OnAttachContext(PipelineContext * context)3089 void WebPattern::OnAttachContext(PipelineContext *context)
3090 {
3091 nodeAttach_ = true;
3092 auto pipelineContext = Claim(context);
3093 int32_t newId = pipelineContext->GetInstanceId();
3094 instanceId_ = newId;
3095 if (delegate_) {
3096 delegate_->OnAttachContext(pipelineContext);
3097 }
3098
3099 if (observer_) {
3100 observer_->OnAttachContext(pipelineContext);
3101 }
3102
3103 if (updateInstanceIdCallback_) {
3104 updateInstanceIdCallback_(newId);
3105 }
3106
3107 if (renderSurface_) {
3108 renderSurface_->SetInstanceId(newId);
3109 }
3110
3111 auto host = GetHost();
3112 CHECK_NULL_VOID(host);
3113 int32_t nodeId = host->GetId();
3114 auto dragDropManager = pipelineContext->GetDragDropManager();
3115 if (dragDropManager) {
3116 dragDropManager->AddDragFrameNode(host->GetId(), AceType::WeakClaim(AceType::RawPtr(host)));
3117 }
3118
3119 pipelineContext->AddWindowStateChangedCallback(nodeId);
3120 pipelineContext->AddWindowSizeChangeCallback(nodeId);
3121 pipelineContext->AddOnAreaChangeNode(nodeId);
3122 RegisterVisibleAreaChangeCallback(pipelineContext);
3123 needUpdateWeb_ = true;
3124 RegistVirtualKeyBoardListener(pipelineContext);
3125 InitConfigChangeCallback(pipelineContext);
3126 InitializeAccessibility();
3127 }
3128
OnDetachContext(PipelineContext * contextPtr)3129 void WebPattern::OnDetachContext(PipelineContext *contextPtr)
3130 {
3131 nodeAttach_ = false;
3132 auto context = AceType::Claim(contextPtr);
3133 CHECK_NULL_VOID(context);
3134
3135 auto host = GetHost();
3136 int32_t nodeId = host->GetId();
3137 UninitializeAccessibility();
3138 context->RemoveWindowStateChangedCallback(nodeId);
3139 context->RemoveWindowSizeChangeCallback(nodeId);
3140 context->RemoveOnAreaChangeNode(nodeId);
3141 context->RemoveVisibleAreaChangeNode(nodeId);
3142 context->RemoveVirtualKeyBoardCallback(nodeId);
3143 context->RemoveConfigChangedCallback(nodeId);
3144
3145 if (delegate_) {
3146 delegate_->OnDetachContext();
3147 }
3148
3149 if (observer_) {
3150 observer_->OnDetachContext();
3151 }
3152
3153 auto dragDropManager = context->GetDragDropManager();
3154 if (dragDropManager) {
3155 dragDropManager->RemoveDragFrameNode(nodeId);
3156 }
3157
3158 if (tooltipId_ != -1) {
3159 auto overlayManager = context->GetOverlayManager();
3160 if (overlayManager) {
3161 overlayManager->RemoveIndexerPopupById(tooltipId_);
3162 }
3163 tooltipId_ = -1;
3164 }
3165 }
3166
SetUpdateInstanceIdCallback(std::function<void (int32_t)> && callback)3167 void WebPattern::SetUpdateInstanceIdCallback(std::function<void(int32_t)>&& callback)
3168 {
3169 updateInstanceIdCallback_ = callback;
3170 }
3171
OnScrollBarColorUpdate(const std::string & value)3172 void WebPattern::OnScrollBarColorUpdate(const std::string& value)
3173 {
3174 if (delegate_) {
3175 delegate_->UpdateScrollBarColor(value);
3176 }
3177 }
3178
OnDefaultTextEncodingFormatUpdate(const std::string & value)3179 void WebPattern::OnDefaultTextEncodingFormatUpdate(const std::string& value)
3180 {
3181 if (delegate_) {
3182 delegate_->UpdateDefaultTextEncodingFormat(value);
3183 }
3184 }
3185
OnNativeVideoPlayerConfigUpdate(const std::tuple<bool,bool> & config)3186 void WebPattern::OnNativeVideoPlayerConfigUpdate(const std::tuple<bool, bool>& config)
3187 {
3188 if (delegate_) {
3189 delegate_->UpdateNativeVideoPlayerConfig(
3190 std::get<0>(config), std::get<1>(config));
3191 }
3192 }
3193
RegistVirtualKeyBoardListener(const RefPtr<PipelineContext> & pipelineContext)3194 void WebPattern::RegistVirtualKeyBoardListener(const RefPtr<PipelineContext> &pipelineContext)
3195 {
3196 if (!needUpdateWeb_) {
3197 return;
3198 }
3199 pipelineContext->SetVirtualKeyBoardCallback(GetHost()->GetId(),
3200 [weak = AceType::WeakClaim(this)](int32_t width, int32_t height, double keyboard, bool isCustomKeyboard) {
3201 auto webPattern = weak.Upgrade();
3202 CHECK_NULL_RETURN(webPattern, false);
3203 return webPattern->ProcessVirtualKeyBoard(width, height, keyboard, isCustomKeyboard);
3204 });
3205 needUpdateWeb_ = false;
3206 }
3207
InitEnhanceSurfaceFlag()3208 void WebPattern::InitEnhanceSurfaceFlag()
3209 {
3210 if (SystemProperties::GetExtSurfaceEnabled()) {
3211 isEnhanceSurface_ = true;
3212 } else {
3213 isEnhanceSurface_ = false;
3214 }
3215 }
3216
OnColorConfigurationUpdate()3217 void WebPattern::OnColorConfigurationUpdate()
3218 {
3219 auto host = GetHost();
3220 CHECK_NULL_VOID(host);
3221 if (magnifierController_) {
3222 magnifierController_->SetColorModeChange(true);
3223 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
3224 }
3225 }
3226
OnModifyDone()3227 void WebPattern::OnModifyDone()
3228 {
3229 Pattern::OnModifyDone();
3230 // called in each update function.
3231 auto host = GetHost();
3232 CHECK_NULL_VOID(host);
3233 auto renderContext = host->GetRenderContext();
3234 CHECK_NULL_VOID(renderContext);
3235 renderContext->SetHandleChildBounds(true);
3236 if (!delegate_) {
3237 // first create case,
3238 delegate_ = AceType::MakeRefPtr<WebDelegate>(PipelineContext::GetCurrentContext(), nullptr, "",
3239 Container::CurrentId());
3240 instanceId_ = Container::CurrentId();
3241 CHECK_NULL_VOID(delegate_);
3242 observer_ = AceType::MakeRefPtr<WebDelegateObserver>(delegate_, PipelineContext::GetCurrentContext());
3243 CHECK_NULL_VOID(observer_);
3244 delegate_->SetObserver(observer_);
3245 delegate_->SetRenderMode(renderMode_);
3246 delegate_->SetFitContentMode(layoutMode_);
3247 InitEnhanceSurfaceFlag();
3248 delegate_->SetNGWebPattern(Claim(this));
3249 delegate_->SetEnhanceSurfaceFlag(isEnhanceSurface_);
3250 delegate_->SetPopup(isPopup_);
3251 delegate_->SetParentNWebId(parentNWebId_);
3252 delegate_->SetBackgroundColor(GetBackgroundColorValue(
3253 static_cast<int32_t>(renderContext->GetBackgroundColor().value_or(Color::WHITE).GetValue())));
3254 if (isEnhanceSurface_) {
3255 auto drawSize = Size(1, 1);
3256 delegate_->SetDrawSize(drawSize);
3257 delegate_->InitOHOSWeb(PipelineContext::GetCurrentContext());
3258 } else {
3259 auto drawSize = Size(1, 1);
3260 delegate_->SetDrawSize(drawSize);
3261 int32_t instanceId = Container::CurrentId();
3262 CHECK_NULL_VOID(renderSurface_);
3263 CHECK_NULL_VOID(popupRenderSurface_);
3264 CHECK_NULL_VOID(renderContextForSurface_);
3265 CHECK_NULL_VOID(renderContextForPopupSurface_);
3266 renderSurface_->SetInstanceId(instanceId);
3267 popupRenderSurface_->SetInstanceId(instanceId);
3268 renderSurface_->SetRenderContext(host->GetRenderContext());
3269 if (renderMode_ == RenderMode::SYNC_RENDER) {
3270 renderSurface_->SetIsTexture(true);
3271 renderSurface_->SetPatternType(PATTERN_TYPE_WEB);
3272 renderSurface_->SetSurfaceQueueSize(SYNC_SURFACE_QUEUE_SIZE);
3273 renderContextForSurface_->SetOpacity(0.0f);
3274 } else {
3275 renderSurface_->SetIsTexture(false);
3276 renderSurface_->SetBufferUsage(BUFFER_USAGE_WEB);
3277 renderSurface_->SetSurfaceQueueSize(GetBufferSizeByDeviceType());
3278 renderSurface_->SetRenderContext(renderContextForSurface_);
3279 }
3280 popupRenderSurface_->SetIsTexture(false);
3281 popupRenderSurface_->SetSurfaceQueueSize(GetBufferSizeByDeviceType());
3282 popupRenderSurface_->SetRenderContext(renderContextForPopupSurface_);
3283 renderContext->AddChild(renderContextForSurface_, 0);
3284 if (SystemProperties::GetDeviceType() == DeviceType::TWO_IN_ONE) {
3285 renderContext->AddChild(renderContextForPopupSurface_, 1);
3286 }
3287 popupRenderSurface_->InitSurface();
3288 popupRenderSurface_->SetTransformHint(rotation_);
3289 popupRenderSurface_->UpdateSurfaceConfig();
3290 renderSurface_->InitSurface();
3291 renderSurface_->SetTransformHint(rotation_);
3292 TAG_LOGD(AceLogTag::ACE_WEB, "OnModify done, set rotation %{public}u", rotation_);
3293 renderSurface_->UpdateSurfaceConfig();
3294 delegate_->InitOHOSWeb(PipelineContext::GetCurrentContext(), renderSurface_);
3295 #if defined(ENABLE_ROSEN_BACKEND)
3296 delegate_->SetPopupSurface(popupRenderSurface_);
3297 #endif
3298 if (renderMode_ == RenderMode::ASYNC_RENDER) {
3299 std::string surfaceId = renderSurface_->GetUniqueId();
3300 delegate_->SetSurfaceId(surfaceId);
3301 TAG_LOGD(AceLogTag::ACE_WEB, "[getSurfaceId] set surfaceId is %{public}s", surfaceId.c_str());
3302 }
3303 }
3304 RecordWebEvent(true);
3305
3306 UpdateJavaScriptOnDocumentStartByOrder();
3307 UpdateJavaScriptOnDocumentEndByOrder();
3308 UpdateJavaScriptOnDocumentStart();
3309 UpdateJavaScriptOnDocumentEnd();
3310 UpdateJavaScriptOnHeadReadyByOrder();
3311
3312 bool isApiGteTwelve =
3313 AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE);
3314 delegate_->UpdateBackgroundColor(GetBackgroundColorValue(
3315 static_cast<int32_t>(renderContext->GetBackgroundColor().value_or(Color::WHITE).GetValue())));
3316 delegate_->UpdateJavaScriptEnabled(GetJsEnabledValue(true));
3317 delegate_->UpdateBlockNetworkImage(!GetOnLineImageAccessEnabledValue(true));
3318 delegate_->UpdateLoadsImagesAutomatically(GetImageAccessEnabledValue(true));
3319 delegate_->UpdateMixedContentMode(GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW));
3320 isEmbedModeEnabled_ = GetNativeEmbedModeEnabledValue(false);
3321 if ((layoutMode_ == WebLayoutMode::FIT_CONTENT) || isEmbedModeEnabled_) {
3322 delegate_->UpdateSupportZoom(false);
3323 } else {
3324 delegate_->UpdateSupportZoom(GetZoomAccessEnabledValue(true));
3325 }
3326 delegate_->UpdateDomStorageEnabled(GetDomStorageAccessEnabledValue(false));
3327 delegate_->UpdateGeolocationEnabled(GetGeolocationAccessEnabledValue(true));
3328 delegate_->UpdateCacheMode(GetCacheModeValue(WebCacheMode::DEFAULT));
3329 if (webData_) {
3330 // Created a richtext component
3331 delegate_->SetRichtextIdentifier(webData_);
3332 delegate_->UpdateDarkMode(GetDarkModeValue(WebDarkMode::Auto));
3333 delegate_->UpdateForceDarkAccess(GetForceDarkAccessValue(true));
3334 delegate_->UpdateOverviewModeEnabled(GetOverviewModeAccessEnabledValue(false));
3335 } else {
3336 delegate_->UpdateDarkMode(GetDarkModeValue(WebDarkMode::Off));
3337 delegate_->UpdateForceDarkAccess(GetForceDarkAccessValue(false));
3338 delegate_->UpdateOverviewModeEnabled(GetOverviewModeAccessEnabledValue(true));
3339 }
3340 delegate_->UpdateAudioResumeInterval(GetAudioResumeIntervalValue(-1));
3341 delegate_->UpdateAudioExclusive(GetAudioExclusiveValue(true));
3342 delegate_->UpdateFileFromUrlEnabled(GetFileFromUrlAccessEnabledValue(false));
3343 delegate_->UpdateDatabaseEnabled(GetDatabaseAccessEnabledValue(false));
3344 delegate_->UpdateTextZoomRatio(GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
3345 delegate_->UpdateWebDebuggingAccess(GetWebDebuggingAccessEnabledValue(false));
3346 delegate_->UpdateMediaPlayGestureAccess(GetMediaPlayGestureAccessValue(true));
3347 delegate_->UpdatePinchSmoothModeEnabled(GetPinchSmoothModeEnabledValue(false));
3348 delegate_->UpdateMultiWindowAccess(GetMultiWindowAccessEnabledValue(false));
3349 delegate_->UpdateWebCursiveFont(GetWebCursiveFontValue(DEFAULT_CURSIVE_FONT_FAMILY));
3350 delegate_->UpdateWebFantasyFont(GetWebFantasyFontValue(DEFAULT_FANTASY_FONT_FAMILY));
3351 delegate_->UpdateWebFixedFont(GetWebFixedFontValue(DEFAULT_FIXED_fONT_FAMILY));
3352 delegate_->UpdateWebSansSerifFont(GetWebSansSerifFontValue(DEFAULT_SANS_SERIF_FONT_FAMILY));
3353 delegate_->UpdateWebSerifFont(GetWebSerifFontValue(DEFAULT_SERIF_FONT_FAMILY));
3354 delegate_->UpdateWebStandardFont(GetWebStandardFontValue(DEFAULT_STANDARD_FONT_FAMILY));
3355 delegate_->UpdateDefaultFixedFontSize(GetDefaultFixedFontSizeValue(DEFAULT_FIXED_FONT_SIZE));
3356 delegate_->UpdateDefaultFontSize(GetDefaultFontSizeValue(DEFAULT_FONT_SIZE));
3357 delegate_->UpdateDefaultTextEncodingFormat(GetDefaultTextEncodingFormatValue(DEFAULT_WEB_TEXT_ENCODING_FORMAT));
3358 delegate_->UpdateMinFontSize(GetMinFontSizeValue(DEFAULT_MINIMUM_FONT_SIZE));
3359 delegate_->UpdateMinLogicalFontSize(GetMinLogicalFontSizeValue(DEFAULT_MINIMUM_LOGICAL_FONT_SIZE));
3360 delegate_->UpdateHorizontalScrollBarAccess(GetHorizontalScrollBarAccessEnabledValue(true));
3361 delegate_->UpdateVerticalScrollBarAccess(GetVerticalScrollBarAccessEnabledValue(true));
3362 delegate_->UpdateScrollBarColor(GetScrollBarColorValue(DEFAULT_SCROLLBAR_COLOR));
3363 delegate_->UpdateOverlayScrollbarEnabled(GetOverlayScrollbarEnabledValue(false));
3364 delegate_->UpdateOverScrollMode(GetOverScrollModeValue(OverScrollMode::NEVER));
3365 delegate_->UpdateBlurOnKeyboardHideMode(GetBlurOnKeyboardHideModeValue(BlurOnKeyboardHideMode::SILENT));
3366 delegate_->UpdateCopyOptionMode(GetCopyOptionModeValue(static_cast<int32_t>(CopyOptions::Distributed)));
3367 delegate_->UpdateTextAutosizing(GetTextAutosizingValue(true));
3368 delegate_->UpdateAllowFileAccess(GetFileAccessEnabledValue(isApiGteTwelve ? false : true));
3369 delegate_->UpdateOptimizeParserBudgetEnabled(GetOptimizeParserBudgetEnabledValue(false));
3370 delegate_->UpdateWebMediaAVSessionEnabled(GetWebMediaAVSessionEnabledValue(true));
3371 if (GetMetaViewport()) {
3372 delegate_->UpdateMetaViewport(GetMetaViewport().value());
3373 }
3374 if (GetBlockNetwork()) {
3375 delegate_->UpdateBlockNetwork(GetBlockNetwork().value());
3376 }
3377 if (GetUserAgent()) {
3378 delegate_->UpdateUserAgent(GetUserAgent().value());
3379 }
3380 if (GetInitialScale()) {
3381 delegate_->UpdateInitialScale(GetInitialScale().value());
3382 }
3383 isAllowWindowOpenMethod_ = SystemProperties::GetAllowWindowOpenMethodEnabled();
3384 delegate_->UpdateAllowWindowOpenMethod(GetAllowWindowOpenMethodValue(isAllowWindowOpenMethod_));
3385 delegate_->UpdateNativeEmbedModeEnabled(GetNativeEmbedModeEnabledValue(false));
3386 delegate_->UpdateIntrinsicSizeEnabled(GetIntrinsicSizeEnabledValue(false));
3387 delegate_->UpdateNativeEmbedRuleTag(GetNativeEmbedRuleTagValue(""));
3388 delegate_->UpdateNativeEmbedRuleType(GetNativeEmbedRuleTypeValue(""));
3389
3390 std::tuple<bool, bool> config = GetNativeVideoPlayerConfigValue({false, false});
3391 delegate_->UpdateNativeVideoPlayerConfig(std::get<0>(config), std::get<1>(config));
3392
3393 if (GetEnableFollowSystemFontWeight()) {
3394 delegate_->UpdateEnableFollowSystemFontWeight(GetEnableFollowSystemFontWeight().value());
3395 }
3396 }
3397
3398 if (!GetBackgroundColor()) {
3399 UpdateBackgroundColorRightNow(GetDefaultBackgroundColor().GetValue());
3400 }
3401
3402 // Initialize events such as keyboard, focus, etc.
3403 InitEvent();
3404 // Initialize web params.
3405 InitFeatureParam();
3406 InitializeAccessibility();
3407 // Initialize scrollupdate listener
3408 if (renderMode_ == RenderMode::SYNC_RENDER) {
3409 auto task = [weak = AceType::WeakClaim(this)]() {
3410 auto webPattern = weak.Upgrade();
3411 CHECK_NULL_VOID(webPattern);
3412 webPattern->InitSlideUpdateListener();
3413 };
3414 PostTaskToUI(std::move(task), "ArkUIWebInitSlideUpdateListener");
3415 }
3416
3417 auto embedEnabledTask = [weak = AceType::WeakClaim(this)]() {
3418 auto webPattern = weak.Upgrade();
3419 CHECK_NULL_VOID(webPattern);
3420 if (webPattern->IsRootNeedExportTexture() && webPattern->delegate_) {
3421 webPattern->delegate_->UpdateNativeEmbedModeEnabled(false);
3422 webPattern->delegate_->SetNativeInnerWeb(true);
3423 }
3424 };
3425 PostTaskToUI(std::move(embedEnabledTask), "ArkUIWebUpdateNativeEmbedModeEnabled");
3426
3427 auto pipelineContext = PipelineContext::GetCurrentContext();
3428 CHECK_NULL_VOID(pipelineContext);
3429 if (nodeAttach_) {
3430 pipelineContext->AddOnAreaChangeNode(host->GetId());
3431 }
3432 // offline mode
3433 if (host->GetNodeStatus() != NodeStatus::NORMAL_NODE) {
3434 InitInOfflineMode();
3435 }
3436 if (delegate_) {
3437 delegate_->SetSurfaceDensity(density_);
3438 }
3439 }
3440
SetSurfaceDensity(double density)3441 void WebPattern::SetSurfaceDensity(double density)
3442 {
3443 density_ = density;
3444 }
3445
3446 extern "C" {
HandleWebMessage(const char ** params,int32_t size)3447 char* HandleWebMessage(const char** params, int32_t size)
3448 {
3449 #if defined(PREVIEW) || defined(ACE_UNITTEST)
3450 return nullptr;
3451 #else
3452 if (!EventRecorder::Get().IsRecordEnable(Recorder::EventCategory::CATEGORY_WEB)) {
3453 return nullptr;
3454 }
3455 if (size < Recorder::WEB_PARAM_SIZE) {
3456 return nullptr;
3457 }
3458 for (int32_t i = 0; i < Recorder::WEB_PARAM_SIZE; i++) {
3459 if (params[i] == nullptr) {
3460 return nullptr;
3461 }
3462 }
3463 if (!EventRecorder::Get().IsMessageValid(
3464 params[Recorder::WEB_PARAM_INDEX_CATEGORY], params[Recorder::WEB_PARAM_INDEX_IDENTIFIER])) {
3465 return nullptr;
3466 }
3467 Recorder::EventParamsBuilder builder;
3468 builder.SetEventType(Recorder::EventType::WEB_ACTION)
3469 .SetEventCategory(Recorder::EventCategory::CATEGORY_WEB)
3470 .SetType(V2::WEB_ETS_TAG)
3471 .SetExtra(Recorder::KEY_WEB_CATEGORY, params[Recorder::WEB_PARAM_INDEX_CATEGORY])
3472 .SetText(params[Recorder::WEB_PARAM_INDEX_CONTENT]);
3473 EventRecorder::Get().OnEvent(std::move(builder));
3474 return nullptr;
3475 #endif
3476 }
3477 }
3478
RecordWebEvent(bool isInit)3479 void WebPattern::RecordWebEvent(bool isInit)
3480 {
3481 #if !defined(PREVIEW) && !defined(ACE_UNITTEST)
3482 TAG_LOGI(AceLogTag::ACE_WEB, "Web isInit %{public}d", isInit);
3483 CHECK_NULL_VOID(delegate_);
3484 if (isInit) {
3485 std::vector<std::pair<std::string, NativeMethodCallback>> methodList = {
3486 std::make_pair<std::string, NativeMethodCallback>(Recorder::WEB_METHOD_NAME, HandleWebMessage)
3487 };
3488 delegate_->RegisterNativeArkJSFunction(Recorder::WEB_OBJ_NAME, methodList, false);
3489 EventRecorder::Get().FillWebJsCode(onDocumentEndScriptItems_);
3490 }
3491 #endif
3492 }
3493
RunJavascriptAsync(const std::string & jsCode,std::function<void (const std::string &)> && callback)3494 bool WebPattern::RunJavascriptAsync(const std::string& jsCode, std::function<void(const std::string&)>&& callback)
3495 {
3496 #if !defined(PREVIEW) && !defined(ACE_UNITTEST)
3497 CHECK_NULL_RETURN(delegate_, false);
3498 delegate_->ExecuteTypeScript(jsCode, [cb = std::move(callback)](std::string result) { cb(result); });
3499 return true;
3500 #else
3501 return false;
3502 #endif
3503 }
3504
LoadUrlInOfflineMode()3505 void WebPattern::LoadUrlInOfflineMode()
3506 {
3507 if (!isUrlLoaded_) {
3508 isUrlLoaded_ = true;
3509 if (webSrc_) {
3510 delegate_->LoadUrl();
3511 } else if (webData_) {
3512 delegate_->LoadDataWithRichText();
3513 }
3514 }
3515 }
3516
InitInOfflineMode()3517 void WebPattern::InitInOfflineMode()
3518 {
3519 if (offlineWebInited_) {
3520 return;
3521 }
3522 ACE_SCOPED_TRACE("WebPattern::InitInOfflineMode");
3523 TAG_LOGI(AceLogTag::ACE_WEB, "Web offline mode type, webId:%{public}d", GetWebId());
3524 delegate_->OnRenderToBackground();
3525 offlineWebInited_ = true;
3526 isActive_ = false;
3527 isVisible_ = false;
3528 auto host = GetHost();
3529 CHECK_NULL_VOID(host);
3530 int width = 0;
3531 int height = 0;
3532 auto layoutProperty = host->GetLayoutProperty();
3533 CHECK_NULL_VOID(layoutProperty);
3534 auto& calcLayout = layoutProperty->GetCalcLayoutConstraint();
3535 if (calcLayout) {
3536 width = calcLayout->selfIdealSize ?
3537 calcLayout->selfIdealSize->Width()->GetDimension().ConvertToPx() : 0;
3538 height = calcLayout->selfIdealSize ?
3539 calcLayout->selfIdealSize->Height()->GetDimension().ConvertToPx() : 0;
3540 }
3541 bool isUnSetSize = (width == 0) && (height == 0);
3542 auto container = Container::Current();
3543 uint64_t displayId = 0;
3544 if (container && container->GetCurrentDisplayId() != Rosen::DISPLAY_ID_INVALID) {
3545 displayId = container->GetCurrentDisplayId();
3546 }
3547 auto defaultDisplay = OHOS::Rosen::DisplayManager::GetInstance().GetDisplayById(displayId);
3548 if (isUnSetSize && defaultDisplay) {
3549 width = defaultDisplay->GetWidth();
3550 height = defaultDisplay->GetHeight();
3551 }
3552 Size drawSize = Size(width, height);
3553 Offset offset = Offset(0, 0);
3554 TAG_LOGD(AceLogTag::ACE_WEB, "InitInOfflineMode displayId : %{public}u, drawsize_ : %{public}s",
3555 (uint32_t)displayId, drawSize_.ToString().c_str());
3556 delegate_->SetBoundsOrResize(drawSize, offset);
3557
3558 LoadUrlInOfflineMode();
3559 if (delegate_->IsActivePolicyDisable()) {
3560 // if active policy disable, must force it Inactive, otherwise HideWebView will inactive it.
3561 delegate_->OnInactive();
3562 }
3563 delegate_->HideWebView();
3564 CloseContextSelectionMenu();
3565 }
3566
IsNeedResizeVisibleViewport()3567 bool WebPattern::IsNeedResizeVisibleViewport()
3568 {
3569 if (visibleViewportSize_.Width() < 0 || visibleViewportSize_.Height() < 0 ||
3570 isVirtualKeyBoardShow_ != VkState::VK_SHOW || NearZero(lastKeyboardHeight_)) {
3571 return false;
3572 }
3573 auto context = PipelineContext::GetCurrentContext();
3574 CHECK_NULL_RETURN(context, false);
3575 int32_t height = context->GetRootRect().Height();
3576 auto y = GetCoordinatePoint()->GetY();
3577 if (GreatOrEqual(height, lastKeyboardHeight_ + y)) {
3578 double newHeight = height - lastKeyboardHeight_ - y;
3579 if (GreatOrEqual(newHeight, drawSize_.Height()) ||
3580 NearEqual(newHeight, drawSize_.Height())) {
3581 visibleViewportSize_.SetWidth(-1.0);
3582 visibleViewportSize_.SetHeight(-1.0);
3583 } else {
3584 return false;
3585 }
3586 } else {
3587 visibleViewportSize_.SetWidth(-1.0);
3588 visibleViewportSize_.SetHeight(-1.0);
3589 }
3590 delegate_->ResizeVisibleViewport(visibleViewportSize_, false);
3591 return true;
3592 }
3593
ProcessVirtualKeyBoardHide(int32_t width,int32_t height,bool safeAreaEnabled)3594 bool WebPattern::ProcessVirtualKeyBoardHide(int32_t width, int32_t height, bool safeAreaEnabled)
3595 {
3596 isResizeContentAvoid_ = false;
3597 isKeyboardInSafeArea_ = false;
3598 if (safeAreaEnabled) {
3599 isVirtualKeyBoardShow_ = VkState::VK_HIDE;
3600 return false;
3601 }
3602 if (isVirtualKeyBoardShow_ != VkState::VK_SHOW) {
3603 return false;
3604 }
3605 if (layoutMode_ == WebLayoutMode::FIT_CONTENT) {
3606 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardHide layoutMode is FIT_CONTENT");
3607 isVirtualKeyBoardShow_ = VkState::VK_HIDE;
3608 return true;
3609 }
3610 drawSize_.SetSize(drawSizeCache_);
3611 visibleViewportSize_.SetWidth(-1.0);
3612 visibleViewportSize_.SetHeight(-1.0);
3613 UpdateWebLayoutSize(width, height, false);
3614 isVirtualKeyBoardShow_ = VkState::VK_HIDE;
3615 return true;
3616 }
3617
UpdateLayoutAfterKeyboard(int32_t width,int32_t height,double keyboard)3618 bool WebPattern::UpdateLayoutAfterKeyboard(int32_t width, int32_t height, double keyboard)
3619 {
3620 auto frameNode = GetHost();
3621 CHECK_NULL_RETURN(frameNode, false);
3622 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
3623 auto context = PipelineContext::GetCurrentContext();
3624 CHECK_NULL_RETURN(context, false);
3625 auto taskExecutor = context->GetTaskExecutor();
3626 CHECK_NULL_RETURN(taskExecutor, false);
3627 lastKeyboardHeight_ = keyboard;
3628 keyboardGetready_ = true;
3629 taskExecutor->PostDelayedTask(
3630 [weak = WeakClaim(this), width, height]() {
3631 auto webPattern = weak.Upgrade();
3632 CHECK_NULL_VOID(webPattern);
3633 // In split-screen mode, the keyboard height is reported multiple times and is not the same.
3634 // Use the last height.
3635 webPattern->UpdateLayoutAfterKeyboardShow(width,
3636 height,
3637 webPattern->lastKeyboardHeight_,
3638 webPattern->GetDrawSize().Height());
3639 webPattern->keyboardGetready_ = false;
3640 }, TaskExecutor::TaskType::UI, UPDATE_WEB_LAYOUT_DELAY_TIME, "ArkUIWebUpdateLayoutAfterKeyboardShow");
3641 return true;
3642 }
3643
ProcessVirtualKeyBoardShow(int32_t width,int32_t height,double keyboard,bool safeAreaEnabled)3644 bool WebPattern::ProcessVirtualKeyBoardShow(int32_t width, int32_t height, double keyboard, bool safeAreaEnabled)
3645 {
3646 if (IsDialogNested()) {
3647 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardShow, dialog nested, web don't consume keyboard event.");
3648 isKeyboardInSafeArea_ = true;
3649 return false;
3650 }
3651 if (isVirtualKeyBoardShow_ != VkState::VK_SHOW) {
3652 drawSizeCache_.SetSize(drawSize_);
3653 }
3654 if (drawSizeCache_.Height() <= (height - keyboard - GetCoordinatePoint()->GetY())) {
3655 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardShow not obstruct");
3656 isVirtualKeyBoardShow_ = VkState::VK_SHOW;
3657 lastKeyboardHeight_ = keyboard;
3658 return !safeAreaEnabled;
3659 }
3660 if (height - GetCoordinatePoint()->GetY() < keyboard) {
3661 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardShow Complete occlusion");
3662 isVirtualKeyBoardShow_ = VkState::VK_SHOW;
3663 return true;
3664 }
3665 if (!delegate_->NeedSoftKeyboard()) {
3666 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardShow not NeedSoftKeyboard");
3667 return false;
3668 }
3669 isVirtualKeyBoardShow_ = VkState::VK_SHOW;
3670 if (layoutMode_ == WebLayoutMode::FIT_CONTENT) {
3671 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoardShow layoutMode is FIT_CONTENT");
3672 lastKeyboardHeight_ = keyboard;
3673 return true;
3674 }
3675 if (safeAreaEnabled) {
3676 isKeyboardInSafeArea_ = true;
3677 lastKeyboardHeight_ = keyboard;
3678 return false;
3679 }
3680
3681 if (!UpdateLayoutAfterKeyboard(width, height, keyboard)) {
3682 return false;
3683 }
3684 return true;
3685 }
3686
ProcessVirtualKeyBoard(int32_t width,int32_t height,double keyboard,bool isCustomKeyboard)3687 bool WebPattern::ProcessVirtualKeyBoard(int32_t width, int32_t height, double keyboard, bool isCustomKeyboard)
3688 {
3689 if (isUsingCustomKeyboardAvoid_) {
3690 if (!isCustomKeyboard) {
3691 // if use custom keyboard, no need to handle the system keyboard event.
3692 TAG_LOGI(AceLogTag::ACE_WEB, "ProcessVirtualKeyBoard no need to handle the system keyboard event.");
3693 return false;
3694 }
3695 }
3696 CHECK_NULL_RETURN(delegate_, false);
3697 if (delegate_->ShouldVirtualKeyboardOverlay()) {
3698 if (!IsDialogNested()) {
3699 double webKeyboard = keyboard - (height - GetCoordinatePoint()->GetY() - drawSize_.Height());
3700 webKeyboard = (webKeyboard < 0) ? 0 : webKeyboard;
3701 TAG_LOGW(AceLogTag::ACE_WEB, "VirtualKeyboard Overlaycontent is true webKeyboard:%{public}f", webKeyboard);
3702 delegate_->SetVirtualKeyBoardArg(width, height, webKeyboard);
3703 } else {
3704 delegate_->SetVirtualKeyBoardArg(width, height, 0);
3705 }
3706 } else {
3707 delegate_->SetVirtualKeyBoardArg(width, height, keyboard);
3708 }
3709
3710 auto host = GetHost();
3711 CHECK_NULL_RETURN(host, false);
3712 auto pipelineContext = host->GetContextRefPtr();
3713 CHECK_NULL_RETURN(pipelineContext, false);
3714 auto safeAreaManager = pipelineContext->GetSafeAreaManager();
3715 CHECK_NULL_RETURN(safeAreaManager, false);
3716 bool keyboardSafeAreaEnabled = safeAreaManager->KeyboardSafeAreaEnabled();
3717 TAG_LOGI(AceLogTag::ACE_WEB,
3718 "ProcessVirtualKeyBoard width:%{public}d, height:%{public}d, keyboard:%{public}f, safeArea:%{public}d",
3719 width, height, keyboard, keyboardSafeAreaEnabled);
3720
3721 if (!isFocus_ || !isVisible_) {
3722 UpdateOnFocusTextField(false);
3723 ProcessVirtualKeyBoardHide(width, height, keyboardSafeAreaEnabled);
3724 return false;
3725 }
3726 UpdateOnFocusTextField(!NearZero(keyboard));
3727 if (NearZero(keyboard)) {
3728 return ProcessVirtualKeyBoardHide(width, height, keyboardSafeAreaEnabled);
3729 }
3730 return ProcessVirtualKeyBoardShow(width, height, keyboard, keyboardSafeAreaEnabled);
3731 }
3732
UpdateWebLayoutSize(int32_t width,int32_t height,bool isKeyboard,bool isUpdate)3733 void WebPattern::UpdateWebLayoutSize(int32_t width, int32_t height, bool isKeyboard, bool isUpdate)
3734 {
3735 CHECK_NULL_VOID(delegate_);
3736 if (delegate_->ShouldVirtualKeyboardOverlay()) {
3737 TAG_LOGW(AceLogTag::ACE_WEB, "VirtualKeyboard Overlaycontent is true and does not require resizing");
3738 return;
3739 }
3740 auto frameNode = GetHost();
3741 CHECK_NULL_VOID(frameNode);
3742 auto rect = frameNode->GetRenderContext()->GetPaintRectWithoutTransform();
3743 auto offset = Offset(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY());
3744
3745 // Scroll focused node into view when keyboard show.
3746 TAG_LOGI(AceLogTag::ACE_WEB, "UpdateWebLayoutSize drawsize_ : %{public}s, web id : %{public}d",
3747 drawSize_.ToString().c_str(), GetWebId());
3748 delegate_->SetBoundsOrResize(drawSize_, offset, isKeyboard);
3749 delegate_->ResizeVisibleViewport(visibleViewportSize_, isKeyboard);
3750
3751 if (isUpdate) {
3752 ACE_SCOPED_TRACE("WebPattern::UpdateWebLayoutSize rect: %s", rect.ToString().c_str());
3753 if (renderMode_ == RenderMode::SYNC_RENDER) {
3754 renderSurface_->SetIsNeedSyncGeometryProperties(true);
3755 renderSurface_->SetKeyBoardAvoidRect(rect);
3756 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF | PROPERTY_UPDATE_RENDER);
3757 } else {
3758 rect.SetSize(SizeF(drawSize_.Width(), drawSize_.Height()));
3759 frameNode->GetRenderContext()->SyncGeometryProperties(rect);
3760 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
3761 }
3762 }
3763 }
3764
HandleTouchDown(const TouchEventInfo & info,bool fromOverlay)3765 void WebPattern::HandleTouchDown(const TouchEventInfo& info, bool fromOverlay)
3766 {
3767 isTouchUpEvent_ = false;
3768 InitTouchEventListener();
3769 CHECK_NULL_VOID(delegate_);
3770 Offset touchOffset = Offset(0, 0);
3771 std::list<TouchInfo> touchInfos;
3772 if (!ParseTouchInfo(info, touchInfos)) {
3773 return;
3774 }
3775 for (auto& touchPoint : touchInfos) {
3776 if (fromOverlay) {
3777 touchPoint.x -= webOffset_.GetX();
3778 touchPoint.y -= webOffset_.GetY();
3779 TAG_LOGI(AceLogTag::ACE_WEB,
3780 "SelectOverlay touch down add id:%{public}d.", touchPoint.id);
3781 touchOverlayInfo_.push_back(touchPoint);
3782 }
3783 touchPointX = touchPoint.x;
3784 touchPointY = touchPoint.y;
3785 if (info.GetSourceTool() == SourceTool::PEN &&
3786 delegate_->SetFocusByPosition(touchPointX, touchPointY) &&
3787 StylusDetectorMgr::GetInstance()->IsNeedInterceptedTouchEventForWeb(touchPointX, touchPointY)) {
3788 TAG_LOGI(AceLogTag::ACE_WEB, "stylus touch down is editable.");
3789 isNeedInterceptedTouchEvent_ = true;
3790 WebRequestFocus();
3791 return;
3792 }
3793 delegate_->HandleTouchDown(touchPoint.id, touchPoint.x, touchPoint.y, fromOverlay);
3794 if (overlayCreating_) {
3795 imageAnalyzerManager_->UpdateOverlayTouchInfo(touchPoint.x, touchPoint.y, TouchType::DOWN);
3796 }
3797 }
3798 }
3799
HandleTouchUp(const TouchEventInfo & info,bool fromOverlay)3800 void WebPattern::HandleTouchUp(const TouchEventInfo& info, bool fromOverlay)
3801 {
3802 isTouchUpEvent_ = true;
3803 UninitTouchEventListener();
3804 if (isNeedInterceptedTouchEvent_ && info.GetSourceTool() == SourceTool::PEN) {
3805 isNeedInterceptedTouchEvent_ = false;
3806 return;
3807 }
3808 CHECK_NULL_VOID(delegate_);
3809 if (!isReceivedArkDrag_) {
3810 ResetDragAction();
3811 }
3812 HideMagnifier();
3813 std::list<TouchInfo> touchInfos;
3814 if (!ParseTouchInfo(info, touchInfos)) {
3815 return;
3816 }
3817 touchEventInfoList_.clear();
3818 for (auto& touchPoint : touchInfos) {
3819 if (fromOverlay) {
3820 touchPoint.x -= webOffset_.GetX();
3821 touchPoint.y -= webOffset_.GetY();
3822 DelTouchOverlayInfoByTouchId(touchPoint.id);
3823 }
3824 delegate_->HandleTouchUp(touchPoint.id, touchPoint.x, touchPoint.y, fromOverlay);
3825 if (overlayCreating_) {
3826 if (imageAnalyzerManager_) {
3827 imageAnalyzerManager_->UpdateOverlayTouchInfo(touchPoint.x, touchPoint.y, TouchType::UP);
3828 }
3829 overlayCreating_ = false;
3830 }
3831 }
3832 }
3833
OnMagnifierHandleMove(const RectF & handleRect,bool isFirst)3834 void WebPattern::OnMagnifierHandleMove(const RectF& handleRect, bool isFirst)
3835 {
3836 auto localX = handleRect.GetX() - webOffset_.GetX() + handleRect.Width() / HALF;
3837 auto localY = handleRect.GetY() - webOffset_.GetY() + handleRect.Height() / HALF;
3838 ShowMagnifier(localX, localY);
3839 }
3840
HandleTouchMove(const TouchEventInfo & info,bool fromOverlay)3841 void WebPattern::HandleTouchMove(const TouchEventInfo& info, bool fromOverlay)
3842 {
3843 CHECK_EQUAL_VOID(isNeedInterceptedTouchEvent_ && info.GetSourceTool() == SourceTool::PEN, true);
3844 if (isDragging_) {
3845 return;
3846 }
3847 auto pipeline = PipelineContext::GetCurrentContext();
3848 CHECK_NULL_VOID(pipeline);
3849 auto manager = pipeline->GetDragDropManager();
3850 CHECK_NULL_VOID(manager);
3851 if (manager->IsDragged()) {
3852 return;
3853 }
3854 CHECK_NULL_VOID(delegate_);
3855 std::list<TouchInfo> touchInfos;
3856
3857 touchEventInfoList_.emplace_back(info);
3858 for (const auto& touchEventInfo : touchEventInfoList_) {
3859 ParseTouchInfo(touchEventInfo, touchInfos);
3860 }
3861
3862 if (touchInfos.empty()) {
3863 return;
3864 }
3865 if (!info.GetTouchEventsEnd()) {
3866 return;
3867 }
3868 touchEventInfoList_.clear();
3869
3870 touchInfos.sort([](const TouchInfo &point1, const TouchInfo &point2) {
3871 return point1.id < point2.id;
3872 });
3873
3874 std::vector<std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo>> touch_point_infos;
3875 for (auto& touchPoint : touchInfos) {
3876 if (fromOverlay) {
3877 touchPoint.x -= webOffset_.GetX();
3878 touchPoint.y -= webOffset_.GetY();
3879 }
3880 touchPointX = touchPoint.x;
3881 touchPointY = touchPoint.y;
3882 if (magnifierController_ && magnifierController_->GetMagnifierNodeExist()) {
3883 ShowMagnifier(touchPoint.x, touchPoint.y);
3884 }
3885 std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo> touch_point_info =
3886 std::make_shared<NWebTouchPointInfoImpl>(touchPoint.id, touchPoint.x, touchPoint.y);
3887 touch_point_infos.emplace_back(touch_point_info);
3888 if (overlayCreating_) {
3889 imageAnalyzerManager_->UpdateOverlayTouchInfo(touchPoint.x, touchPoint.y, TouchType::MOVE);
3890 }
3891 }
3892
3893 if (!overlayCreating_) {
3894 delegate_->HandleTouchMove(touch_point_infos, fromOverlay);
3895 }
3896 }
3897
HandleTouchCancel(const TouchEventInfo & info)3898 void WebPattern::HandleTouchCancel(const TouchEventInfo& info)
3899 {
3900 UninitTouchEventListener();
3901 if (isNeedInterceptedTouchEvent_ && info.GetSourceTool() == SourceTool::PEN) {
3902 isNeedInterceptedTouchEvent_ = false;
3903 return;
3904 }
3905 if (IsRootNeedExportTexture()) {
3906 HandleTouchUp(info, false);
3907 }
3908 CHECK_NULL_VOID(delegate_);
3909 delegate_->HandleTouchCancel();
3910 touchEventInfoList_.clear();
3911 if (overlayCreating_) {
3912 imageAnalyzerManager_->UpdateOverlayTouchInfo(0, 0, TouchType::CANCEL);
3913 overlayCreating_ = false;
3914 }
3915 HideMagnifier();
3916 }
3917
ParseTouchInfo(const TouchEventInfo & info,std::list<TouchInfo> & touchInfos)3918 bool WebPattern::ParseTouchInfo(const TouchEventInfo& info, std::list<TouchInfo>& touchInfos)
3919 {
3920 auto context = PipelineContext::GetCurrentContext();
3921 CHECK_NULL_RETURN(context, false);
3922 auto viewScale = context->GetViewScale();
3923 if (info.GetChangedTouches().empty()) {
3924 return false;
3925 }
3926 for (const auto& point : info.GetChangedTouches()) {
3927 TouchInfo touchInfo;
3928 touchInfo.id = point.GetFingerId();
3929 const Offset& location = point.GetLocalLocation();
3930 touchInfo.x = static_cast<float>(location.GetX() * viewScale);
3931 touchInfo.y = static_cast<float>(location.GetY() * viewScale);
3932 touchInfos.emplace_back(touchInfo);
3933 }
3934 return true;
3935 }
3936
RequestFullScreen()3937 void WebPattern::RequestFullScreen()
3938 {
3939 isFullScreen_ = true;
3940 }
3941
ExitFullScreen()3942 void WebPattern::ExitFullScreen()
3943 {
3944 isFullScreen_ = false;
3945 }
3946
GetCoordinatePoint()3947 std::optional<OffsetF> WebPattern::GetCoordinatePoint()
3948 {
3949 auto frameNode = GetHost();
3950 CHECK_NULL_RETURN(frameNode, std::nullopt);
3951 return frameNode->GetTransformRelativeOffset();
3952 }
3953
DelTouchOverlayInfoByTouchId(int32_t touchId)3954 void WebPattern::DelTouchOverlayInfoByTouchId(int32_t touchId)
3955 {
3956 std::list<TouchInfo>::iterator iter;
3957 for (iter = touchOverlayInfo_.begin(); iter != touchOverlayInfo_.end();) {
3958 if (iter->id == touchId) {
3959 TAG_LOGI(AceLogTag::ACE_WEB,
3960 "SelectOverlay del touch overlay info by id:%{public}d", iter->id);
3961 iter = touchOverlayInfo_.erase(iter);
3962 } else {
3963 ++iter;
3964 }
3965 }
3966 }
3967
CloseSelectOverlay()3968 void WebPattern::CloseSelectOverlay()
3969 {
3970 auto pipeline = PipelineContext::GetCurrentContext();
3971 CHECK_NULL_VOID(pipeline);
3972 if (webSelectOverlay_ && webSelectOverlay_->IsShowHandle()) {
3973 webSelectOverlay_->CloseOverlay(false, CloseReason::CLOSE_REASON_CLICK_OUTSIDE);
3974 webSelectOverlay_->SetIsShowHandle(false);
3975 for (auto& touchOverlayInfo : touchOverlayInfo_) {
3976 TAG_LOGI(AceLogTag::ACE_WEB, "SelectOverlay send touch up id:%{public}d", touchOverlayInfo.id);
3977 delegate_->HandleTouchUp(touchOverlayInfo.id, touchOverlayInfo.x, touchOverlayInfo.y, true);
3978 HideMagnifier();
3979 }
3980 touchOverlayInfo_.clear();
3981 }
3982 }
3983
ComputeMouseClippedSelectionBounds(int32_t x,int32_t y,int32_t w,int32_t h)3984 RectF WebPattern::ComputeMouseClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h)
3985 {
3986 auto offset = GetCoordinatePoint().value_or(OffsetF());
3987 float selectX = offset.GetX() + x;
3988 float selectY = offset.GetY();
3989 float selectWidth = w;
3990 float selectHeight = h;
3991 if (LessOrEqual(GetHostFrameSize().value_or(SizeF()).Height(), y)) {
3992 selectY += GetHostFrameSize().value_or(SizeF()).Height();
3993 } else if (y + h <= 0) {
3994 selectY -= h;
3995 } else {
3996 selectY += y;
3997 }
3998 return RectF(selectX, selectY, selectWidth, selectHeight);
3999 }
4000
UpdateClippedSelectionBounds(int32_t x,int32_t y,int32_t w,int32_t h)4001 void WebPattern::UpdateClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h)
4002 {
4003 selectArea_ = ComputeMouseClippedSelectionBounds(x, y, w, h);
4004 if (webSelectOverlay_) {
4005 webSelectOverlay_->UpdateClippedSelectionBounds(x, y, w, h);
4006 }
4007 }
4008
SelectCancel() const4009 void WebPattern::SelectCancel() const
4010 {
4011 if (isReceivedArkDrag_) {
4012 return;
4013 }
4014 if (webSelectOverlay_) {
4015 webSelectOverlay_->SelectCancel();
4016 }
4017 }
4018
IsSelectInfoValid()4019 bool WebPattern::IsSelectInfoValid()
4020 {
4021 auto info = GetSelectInfo();
4022 return !info.empty() && info != STRING_LF;
4023 }
4024
GetViewPort() const4025 std::optional<RectF> WebPattern::GetViewPort() const
4026 {
4027 CHECK_NULL_RETURN(GetHost(), std::nullopt);
4028 auto parentNode = GetHost()->GetAncestorNodeOfFrame(true);
4029 while (parentNode) {
4030 auto scrollablePattern = AceType::DynamicCast<NestableScrollContainer>(parentNode->GetPattern());
4031 auto geometryNode = parentNode->GetGeometryNode();
4032 if (scrollablePattern && geometryNode) {
4033 auto offsetRelativeToWindow = parentNode->GetOffsetRelativeToWindow();
4034 return RectF(offsetRelativeToWindow, geometryNode->GetFrameRect().GetSize());
4035 }
4036 parentNode = parentNode->GetAncestorNodeOfFrame(true);
4037 }
4038 return std::nullopt;
4039 }
4040
GetSelectInfo() const4041 std::string WebPattern::GetSelectInfo() const
4042 {
4043 CHECK_NULL_RETURN(delegate_, std::string());
4044 return delegate_->GetSelectInfo();
4045 }
4046
OnSelectionMenuOptionsUpdate(const WebMenuOptionsParam & webMenuOption)4047 void WebPattern::OnSelectionMenuOptionsUpdate(const WebMenuOptionsParam& webMenuOption)
4048 {
4049 menuOptionParam_ = std::move(webMenuOption.menuOption);
4050 for (auto& menuOption : menuOptionParam_) {
4051 std::function<void(const std::string&)> action = std::move(menuOption.action);
4052 menuOption.action = [weak = AceType::WeakClaim(this), action] (
4053 const std::string selectInfo) {
4054 auto webPattern = weak.Upgrade();
4055 CHECK_NULL_VOID(webPattern);
4056 webPattern->SelectCancel();
4057 std::string selectStr = webPattern->GetSelectInfo();
4058 if (action) {
4059 action(selectStr);
4060 }
4061 };
4062 }
4063 }
4064
UpdateEditMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)4065 void WebPattern::UpdateEditMenuOptions(
4066 const NG::OnCreateMenuCallback&& onCreateMenuCallback,
4067 const NG::OnMenuItemClickCallback&& onMenuItemClick)
4068 {
4069 onCreateMenuCallback_ = std::move(onCreateMenuCallback);
4070 onMenuItemClick_ = [weak = AceType::WeakClaim(this), action = std::move(onMenuItemClick)] (
4071 const OHOS::Ace::NG::MenuItemParam& menuItem) -> bool {
4072 auto webPattern = weak.Upgrade();
4073 bool result = false;
4074 if (action) {
4075 result = action(menuItem);
4076 }
4077 CHECK_NULL_RETURN(webPattern, result);
4078 if (!result && webPattern->IsQuickMenuShow()) {
4079 webPattern->webSelectOverlay_->HideMenu(true);
4080 }
4081 return result;
4082 };
4083 }
4084
HideHandleAndQuickMenuIfNecessary(bool hide,bool isScroll)4085 void WebPattern::HideHandleAndQuickMenuIfNecessary(bool hide, bool isScroll)
4086 {
4087 if (webSelectOverlay_) {
4088 webSelectOverlay_->HideHandleAndQuickMenuIfNecessary(hide, isScroll);
4089 }
4090 }
4091
ChangeVisibilityOfQuickMenu()4092 void WebPattern::ChangeVisibilityOfQuickMenu()
4093 {
4094 CHECK_NULL_VOID(webSelectOverlay_);
4095 webSelectOverlay_->ChangeVisibilityOfQuickMenu();
4096 }
4097
IsQuickMenuShow()4098 bool WebPattern::IsQuickMenuShow()
4099 {
4100 CHECK_NULL_RETURN(webSelectOverlay_, false);
4101 return webSelectOverlay_->IsShowMenu();
4102 }
4103
RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)4104 bool WebPattern::RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,
4105 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)
4106 {
4107 if (!webSelectOverlay_) {
4108 webSelectOverlay_ = AceType::MakeRefPtr<WebSelectOverlay>(WeakClaim(this));
4109 }
4110 if (webSelectOverlay_->RunQuickMenu(params, callback)) {
4111 DestroyAnalyzerOverlay();
4112 return true;
4113 }
4114 return false;
4115 }
4116
ShowMagnifier(int centerOffsetX,int centerOffsetY)4117 void WebPattern::ShowMagnifier(int centerOffsetX, int centerOffsetY)
4118 {
4119 if (magnifierController_) {
4120 OffsetF localOffset = OffsetF(centerOffsetX, centerOffsetY);
4121 magnifierController_->SetLocalOffset(localOffset);
4122 }
4123 }
4124
HideMagnifier()4125 void WebPattern::HideMagnifier()
4126 {
4127 TAG_LOGD(AceLogTag::ACE_WEB, "HideMagnifier");
4128 if (magnifierController_) {
4129 magnifierController_->RemoveMagnifierFrameNode();
4130 }
4131 }
4132
GetTextPaintOffset() const4133 OffsetF WebPattern::GetTextPaintOffset() const
4134 {
4135 auto frameNode = GetHost();
4136 CHECK_NULL_RETURN(frameNode, OffsetF());
4137 return frameNode->GetTransformRelativeOffset();
4138 }
4139
OnQuickMenuDismissed()4140 void WebPattern::OnQuickMenuDismissed()
4141 {
4142 CloseSelectOverlay();
4143 }
4144
DumpViewDataPageNode(RefPtr<ViewDataWrap> viewDataWrap,bool needsRecordData)4145 void WebPattern::DumpViewDataPageNode(RefPtr<ViewDataWrap> viewDataWrap, bool needsRecordData)
4146 {
4147 TAG_LOGI(AceLogTag::ACE_WEB, "called");
4148 CHECK_NULL_VOID(viewDataWrap);
4149 for (const auto& nodeInfo : pageNodeInfo_) {
4150 if (nodeInfo) {
4151 viewDataWrap->AddPageNodeInfoWrap(nodeInfo);
4152 }
4153 }
4154 viewDataWrap->SetPageUrl(viewDataCommon_->GetPageUrl());
4155 viewDataWrap->SetUserSelected(viewDataCommon_->IsUserSelected());
4156 viewDataWrap->SetOtherAccount(viewDataCommon_->IsOtherAccount());
4157 }
4158
NotifyFillRequestSuccess(RefPtr<ViewDataWrap> viewDataWrap,RefPtr<PageNodeInfoWrap> nodeWrap,AceAutoFillType autoFillType)4159 void WebPattern::NotifyFillRequestSuccess(RefPtr<ViewDataWrap> viewDataWrap,
4160 RefPtr<PageNodeInfoWrap> nodeWrap, AceAutoFillType autoFillType)
4161 {
4162 TAG_LOGI(AceLogTag::ACE_WEB, "called");
4163 CHECK_NULL_VOID(viewDataWrap);
4164 auto nodeInfoWraps = viewDataWrap->GetPageNodeInfoWraps();
4165 auto jsonNode = JsonUtil::Create(true);
4166 AceAutoFillType focusType = AceAutoFillType::ACE_UNSPECIFIED;
4167 for (const auto& nodeInfoWrap : nodeInfoWraps) {
4168 if (nodeInfoWrap == nullptr) {
4169 continue;
4170 }
4171 auto type = nodeInfoWrap->GetAutoFillType();
4172 // white list check
4173 if (ACE_AUTOFILL_TYPE_TO_NWEB.count(type) != 0) {
4174 std::string key = ACE_AUTOFILL_TYPE_TO_NWEB.at(type);
4175 if (nodeInfoWrap->GetMetadata() != IS_HINT_TYPE) {
4176 jsonNode->Put(key.c_str(), nodeInfoWrap->GetValue().c_str());
4177 } else {
4178 auto json = JsonUtil::Create(true);
4179 json->Put(OHOS::NWeb::NWEB_VIEW_DATA_KEY_PLACEHOLDER.c_str(), nodeInfoWrap->GetId());
4180 json->Put(OHOS::NWeb::NWEB_VIEW_DATA_KEY_VALUE.c_str(), nodeInfoWrap->GetValue().c_str());
4181 jsonNode->Put(key.c_str(), std::move(json));
4182 }
4183 }
4184 if (nodeInfoWrap->GetIsFocus()) {
4185 focusType = type;
4186 }
4187 }
4188 auto pageUrl = viewDataWrap->GetPageUrl();
4189 jsonNode->Put(AUTO_FILL_VIEW_DATA_PAGE_URL.c_str(), pageUrl.c_str());
4190 auto otherAccount = viewDataWrap->GetOtherAccount();
4191 jsonNode->Put(AUTO_FILL_VIEW_DATA_OTHER_ACCOUNT.c_str(), otherAccount);
4192 delegate_->NotifyAutoFillViewData(jsonNode->ToString());
4193
4194 // shift focus after autofill
4195 if (focusType != AceAutoFillType::ACE_UNSPECIFIED && !isPasswordFill_) {
4196 for (const auto& nodeInfo : pageNodeInfo_) {
4197 if (nodeInfo && nodeInfo->GetAutoFillType() == focusType) {
4198 TouchEventInfo info("autofill");
4199 TouchLocationInfo location("autofill", 0);
4200 auto rectF = nodeInfo->GetPageNodeRect();
4201 location.SetLocalLocation(Offset(rectF.GetX() + (rectF.Width() / POPUP_CALCULATE_RATIO),
4202 rectF.GetY() + (rectF.Height() / POPUP_CALCULATE_RATIO)));
4203 info.AddChangedTouchLocationInfo(std::move(location));
4204 HandleTouchDown(info, false);
4205 HandleTouchUp(info, false);
4206 break;
4207 }
4208 }
4209 }
4210 }
4211
NotifyFillRequestFailed(int32_t errCode,const std::string & fillContent,bool isPopup)4212 void WebPattern::NotifyFillRequestFailed(int32_t errCode, const std::string& fillContent, bool isPopup)
4213 {
4214 TAG_LOGI(AceLogTag::ACE_WEB, "called, errCode:%{public}d", errCode);
4215 if (isPasswordFill_) {
4216 delegate_->AutofillCancel(fillContent);
4217 }
4218 }
4219
ParseViewDataNumber(const std::string & key,int32_t value,RefPtr<PageNodeInfoWrap> node,RectT<float> & rect,float viewScale)4220 void WebPattern::ParseViewDataNumber(const std::string& key, int32_t value,
4221 RefPtr<PageNodeInfoWrap> node, RectT<float>& rect, float viewScale)
4222 {
4223 CHECK_NULL_VOID(viewScale > FLT_EPSILON);
4224 CHECK_NULL_VOID(node);
4225 if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_FOCUS) {
4226 node->SetIsFocus(static_cast<bool>(value));
4227 } else if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_RECT_X) {
4228 rect.SetLeft(value / viewScale);
4229 } else if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_RECT_Y) {
4230 rect.SetTop(value / viewScale);
4231 } else if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_RECT_W) {
4232 rect.SetWidth(value / viewScale);
4233 } else if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_RECT_H) {
4234 rect.SetHeight(value / viewScale);
4235 }
4236 }
4237
ParseViewDataString(const std::string & key,const std::string & value,RefPtr<PageNodeInfoWrap> node)4238 void ParseViewDataString(const std::string& key,
4239 const std::string& value, RefPtr<PageNodeInfoWrap> node)
4240 {
4241 CHECK_NULL_VOID(node);
4242 if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_VALUE) {
4243 node->SetValue(value);
4244 } else if (key == OHOS::NWeb::NWEB_VIEW_DATA_KEY_PLACEHOLDER) {
4245 node->SetPlaceholder(value);
4246 }
4247 }
4248
GetHintTypeAndMetadata(const std::string & attribute,RefPtr<PageNodeInfoWrap> node)4249 HintToTypeWrap WebPattern::GetHintTypeAndMetadata(const std::string& attribute, RefPtr<PageNodeInfoWrap> node)
4250 {
4251 HintToTypeWrap hintToTypeWrap;
4252 if (NWEB_AUTOFILL_TYPE_OFF == attribute) {
4253 return hintToTypeWrap;
4254 }
4255 auto placeholder = node->GetPlaceholder();
4256 if (NWEB_AUTOFILL_TYPE_TO_ACE.count(attribute) != 0) {
4257 AceAutoFillType type = NWEB_AUTOFILL_TYPE_TO_ACE.at(attribute);
4258 if (node->GetIsFocus()) {
4259 if (type == AceAutoFillType::ACE_USER_NAME || type == AceAutoFillType::ACE_PASSWORD ||
4260 type == AceAutoFillType::ACE_NEW_PASSWORD) {
4261 TAG_LOGI(AceLogTag::ACE_WEB, "The form is login fill form");
4262 isPasswordFill_ = true;
4263 }
4264 }
4265 hintToTypeWrap.autoFillType = type;
4266 } else if (!placeholder.empty()) {
4267 // try hint2Type
4268 auto host = GetHost();
4269 CHECK_NULL_RETURN(host, hintToTypeWrap);
4270 auto container = Container::Current();
4271 if (container == nullptr) {
4272 container = Container::GetActive();
4273 }
4274 CHECK_NULL_RETURN(container, hintToTypeWrap);
4275 hintToTypeWrap = container->PlaceHolderToType(placeholder);
4276 }
4277 return hintToTypeWrap;
4278 }
4279
ParseNWebViewDataNode(std::unique_ptr<JsonValue> child,std::vector<RefPtr<PageNodeInfoWrap>> & nodeInfos,int32_t nodeId)4280 void WebPattern::ParseNWebViewDataNode(std::unique_ptr<JsonValue> child,
4281 std::vector<RefPtr<PageNodeInfoWrap>>& nodeInfos, int32_t nodeId)
4282 {
4283 auto host = GetHost();
4284 CHECK_NULL_VOID(host);
4285 auto pipelineContext = host->GetContextRefPtr();
4286 CHECK_NULL_VOID(pipelineContext);
4287 float viewScale = pipelineContext->GetViewScale();
4288 CHECK_NULL_VOID(viewScale > FLT_EPSILON);
4289
4290 RefPtr<PageNodeInfoWrap> node = PageNodeInfoWrap::CreatePageNodeInfoWrap();
4291 std::string attribute = child->GetKey();
4292
4293 RectT<float> rect;
4294 int32_t len = child->GetArraySize();
4295 for (int32_t index = 0; index < len; index++) {
4296 auto object = child->GetArrayItem(index);
4297 if (object == nullptr || !object->IsObject()) {
4298 continue;
4299 }
4300 for (auto child = object->GetChild(); child && !child->IsNull(); child = child->GetNext()) {
4301 if (child->IsString()) {
4302 ParseViewDataString(child->GetKey(), child->GetString(), node);
4303 } else if (child->IsNumber()) {
4304 ParseViewDataNumber(child->GetKey(), child->GetInt(), node, rect, viewScale);
4305 }
4306 }
4307 }
4308
4309 HintToTypeWrap hintToTypeWrap = GetHintTypeAndMetadata(attribute, node);
4310 auto type = hintToTypeWrap.autoFillType;
4311 if (type != AceAutoFillType::ACE_UNSPECIFIED) {
4312 node->SetAutoFillType(type);
4313 node->SetMetadata(hintToTypeWrap.metadata);
4314 } else {
4315 return;
4316 }
4317
4318 NG::RectF rectF;
4319 rectF.SetRect(rect.GetX(), rect.GetY(), rect.Width(), rect.Height());
4320 node->SetPageNodeRect(rectF);
4321 node->SetId(nodeId);
4322 node->SetDepth(-1);
4323 nodeInfos.emplace_back(node);
4324 }
4325
ParseNWebViewDataCommonField(std::unique_ptr<JsonValue> child,const std::shared_ptr<ViewDataCommon> & viewDataCommon)4326 void WebPattern::ParseNWebViewDataCommonField(std::unique_ptr<JsonValue> child,
4327 const std::shared_ptr<ViewDataCommon>& viewDataCommon)
4328 {
4329 std::string key = child->GetKey();
4330 if (child->IsString() && key == OHOS::NWeb::NWEB_AUTOFILL_EVENT_TYPE) {
4331 std::string eventType = child->GetString();
4332 if (NWEB_AUTOFILL_EVENTS.count(eventType) != 0) {
4333 OHOS::NWeb::NWebAutofillEvent event = NWEB_AUTOFILL_EVENTS.at(eventType);
4334 viewDataCommon->SetEventType(event);
4335 }
4336 }
4337 if (child->IsString() && key == OHOS::NWeb::NWEB_AUTOFILL_PAGE_URL) {
4338 viewDataCommon->SetPageUrl(child->GetString());
4339 }
4340 if (child->IsBool() && key == OHOS::NWeb::NWEB_AUTOFILL_IS_USER_SELECTED) {
4341 viewDataCommon->SetUserSelectedFlag(child->GetBool());
4342 }
4343 if (child->IsBool() && key == OHOS::NWeb::NWEB_AUTOFILL_IS_OTHER_ACCOUNT) {
4344 viewDataCommon->SetOtherAccountFlag(child->GetBool());
4345 }
4346 if (child->IsString() && key == OHOS::NWeb::NWEB_AUTOFILL_EVENT_SOURCE) {
4347 viewDataCommon->SetSource(child->GetString());
4348 }
4349 }
4350
ParseNWebViewDataJson(const std::shared_ptr<OHOS::NWeb::NWebMessage> & viewDataJson,std::vector<RefPtr<PageNodeInfoWrap>> & nodeInfos,const std::shared_ptr<ViewDataCommon> & viewDataCommon)4351 void WebPattern::ParseNWebViewDataJson(const std::shared_ptr<OHOS::NWeb::NWebMessage>& viewDataJson,
4352 std::vector<RefPtr<PageNodeInfoWrap>>& nodeInfos, const std::shared_ptr<ViewDataCommon>& viewDataCommon)
4353 {
4354 nodeInfos.clear();
4355 auto sourceJson = JsonUtil::ParseJsonString(viewDataJson->GetString());
4356 if (sourceJson == nullptr || sourceJson->IsNull()) {
4357 return;
4358 }
4359
4360 int32_t nodeId = 1;
4361 int32_t len = sourceJson->GetArraySize();
4362 for (int32_t index = 0; index < len; index++) {
4363 auto object = sourceJson->GetArrayItem(index);
4364 if (object == nullptr || !object->IsObject()) {
4365 continue;
4366 }
4367 auto child = object->GetChild();
4368 if (child == nullptr || child->IsNull()) {
4369 continue;
4370 }
4371 if (child->IsArray()) {
4372 ParseNWebViewDataNode(std::move(child), nodeInfos, nodeId);
4373 nodeId++;
4374 } else {
4375 ParseNWebViewDataCommonField(std::move(child), viewDataCommon);
4376 }
4377 }
4378 }
4379
GetFocusedType()4380 AceAutoFillType WebPattern::GetFocusedType()
4381 {
4382 AceAutoFillType type = AceAutoFillType::ACE_UNSPECIFIED;
4383 for (const auto& nodeInfo : pageNodeInfo_) {
4384 if (nodeInfo && nodeInfo->GetIsFocus()) {
4385 type = static_cast<AceAutoFillType>(nodeInfo->GetAutoFillType());
4386 break;
4387 }
4388 }
4389 if (ACE_AUTOFILL_TYPE_TO_NWEB.count(type) != 0) {
4390 std::string key = ACE_AUTOFILL_TYPE_TO_NWEB.at(type);
4391 TAG_LOGI(AceLogTag::ACE_WEB, "type:%{public}s", key.c_str());
4392 }
4393 return type;
4394 }
4395
HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage> & viewDataJson)4396 bool WebPattern::HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage>& viewDataJson)
4397 {
4398 TAG_LOGI(AceLogTag::ACE_WEB, "AutoFillEvent");
4399 viewDataCommon_ = std::make_shared<ViewDataCommon>();
4400 isPasswordFill_ = false;
4401 ParseNWebViewDataJson(viewDataJson, pageNodeInfo_, viewDataCommon_);
4402
4403 if (isPasswordFill_ && viewDataCommon_->GetSource() != OHOS::NWeb::NWEB_AUTOFILL_FOR_LOGIN) {
4404 TAG_LOGI(AceLogTag::ACE_WEB,
4405 "Handle autofill event failed! The form contains a login node, but the soruce is incorrect.");
4406 return false;
4407 }
4408
4409 auto eventType = viewDataCommon_->GetEventType();
4410 if (eventType == OHOS::NWeb::NWebAutofillEvent::FILL) {
4411 if (isPasswordFill_ && !system::GetBoolParameter(AUTO_FILL_START_POPUP_WINDOW, false)) {
4412 return RequestAutoFill(GetFocusedType());
4413 }
4414 auto host = GetHost();
4415 CHECK_NULL_RETURN(host, false);
4416 auto context = host->GetContext();
4417 CHECK_NULL_RETURN(context, false);
4418 auto taskExecutor = context->GetTaskExecutor();
4419 CHECK_NULL_RETURN(taskExecutor, false);
4420 bool fillRet = taskExecutor->PostDelayedTask(
4421 [weak = WeakClaim(this)] () {
4422 auto pattern = weak.Upgrade();
4423 CHECK_NULL_RETURN(pattern, false);
4424 return pattern->RequestAutoFill(pattern->GetFocusedType());
4425 },
4426 TaskExecutor::TaskType::UI, AUTOFILL_DELAY_TIME, "ArkUIWebHandleAutoFillEvent");
4427 return fillRet;
4428 }
4429
4430 if (eventType == OHOS::NWeb::NWebAutofillEvent::SAVE) {
4431 return RequestAutoSave();
4432 } else if (eventType == OHOS::NWeb::NWebAutofillEvent::UPDATE) {
4433 return UpdateAutoFillPopup();
4434 } else if (eventType == OHOS::NWeb::NWebAutofillEvent::CLOSE) {
4435 return CloseAutoFillPopup();
4436 }
4437
4438 return false;
4439 }
4440
RequestAutoFill(AceAutoFillType autoFillType)4441 bool WebPattern::RequestAutoFill(AceAutoFillType autoFillType)
4442 {
4443 TAG_LOGI(AceLogTag::ACE_WEB, "RequestAutoFill");
4444 auto host = GetHost();
4445 CHECK_NULL_RETURN(host, false);
4446 auto context = host->GetContext();
4447 CHECK_NULL_RETURN(context, false);
4448 auto instanceId = context->GetInstanceId();
4449 CHECK_NULL_RETURN(instanceId, false);
4450 ContainerScope scope(instanceId);
4451
4452 auto offset = GetCoordinatePoint().value_or(OffsetF());
4453 for (auto& nodeInfo : pageNodeInfo_) {
4454 auto rect = nodeInfo->GetPageNodeRect();
4455 NG::RectF rectF;
4456 rectF.SetRect(rect.GetX() + offset.GetX(), rect.GetY()+ offset.GetY(), rect.Width(), rect.Height());
4457 nodeInfo->SetPageNodeRect(rectF);
4458 }
4459
4460 auto container = Container::Current();
4461 if (container == nullptr) {
4462 container = Container::GetActive();
4463 }
4464 CHECK_NULL_RETURN(container, false);
4465 isAutoFillClosing_ = false;
4466 bool isPopup = false;
4467 return container->RequestAutoFill(host, autoFillType, false, isPopup, autoFillSessionId_, false) ==
4468 AceAutoFillError::ACE_AUTO_FILL_SUCCESS;
4469 }
4470
RequestAutoSave()4471 bool WebPattern::RequestAutoSave()
4472 {
4473 TAG_LOGI(AceLogTag::ACE_WEB, "RequestAutoSave");
4474 auto host = GetHost();
4475 CHECK_NULL_RETURN(host, false);
4476 auto context = host->GetContext();
4477 CHECK_NULL_RETURN(context, false);
4478 auto instanceId = context->GetInstanceId();
4479 CHECK_NULL_RETURN(instanceId, false);
4480 ContainerScope scope(instanceId);
4481 auto container = Container::Current();
4482 if (container == nullptr) {
4483 container = Container::GetActive();
4484 }
4485 CHECK_NULL_RETURN(container, false);
4486 return container->RequestAutoSave(host, nullptr, nullptr, false);
4487 }
4488
UpdateAutoFillPopup()4489 bool WebPattern::UpdateAutoFillPopup()
4490 {
4491 TAG_LOGI(AceLogTag::ACE_WEB, "UpdateAutoFillPopup");
4492 if (isAutoFillClosing_) {
4493 return false;
4494 }
4495 auto host = GetHost();
4496 CHECK_NULL_RETURN(host, false);
4497 auto context = host->GetContext();
4498 CHECK_NULL_RETURN(context, false);
4499 auto instanceId = context->GetInstanceId();
4500 CHECK_NULL_RETURN(instanceId, false);
4501 ContainerScope scope(instanceId);
4502 auto container = Container::Current();
4503 if (container == nullptr) {
4504 container = Container::GetActive();
4505 }
4506 CHECK_NULL_RETURN(container, false);
4507 return container->UpdatePopupUIExtension(host, autoFillSessionId_, false);
4508 }
4509
CloseAutoFillPopup()4510 bool WebPattern::CloseAutoFillPopup()
4511 {
4512 TAG_LOGI(AceLogTag::ACE_WEB, "CloseAutoFillPopup");
4513 auto host = GetHost();
4514 CHECK_NULL_RETURN(host, false);
4515 auto context = host->GetContext();
4516 CHECK_NULL_RETURN(context, false);
4517 auto instanceId = context->GetInstanceId();
4518 CHECK_NULL_RETURN(instanceId, false);
4519 ContainerScope scope(instanceId);
4520 auto container = Container::Current();
4521 if (container == nullptr) {
4522 container = Container::GetActive();
4523 }
4524 CHECK_NULL_RETURN(container, false);
4525 isAutoFillClosing_ = true;
4526 return container->ClosePopupUIExtension(autoFillSessionId_);
4527 }
4528
4529
OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)4530 void WebPattern::OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,
4531 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,
4532 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)
4533 {
4534 if (!webSelectOverlay_) {
4535 return;
4536 }
4537 webSelectOverlay_->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
4538 }
4539
OnCursorChange(const OHOS::NWeb::CursorType & cursorType,std::shared_ptr<OHOS::NWeb::NWebCursorInfo> cursorInfo)4540 bool WebPattern::OnCursorChange(
4541 const OHOS::NWeb::CursorType& cursorType, std::shared_ptr<OHOS::NWeb::NWebCursorInfo> cursorInfo)
4542 {
4543 auto [type, info] = GetAndUpdateCursorStyleInfo(cursorType, cursorInfo);
4544 if (mouseEventDeviceId_ == RESERVED_DEVICEID1 || mouseEventDeviceId_ == RESERVED_DEVICEID2) {
4545 TAG_LOGD(AceLogTag::ACE_WEB, "OnCursorChange this device id is reserved.");
4546 return false;
4547 }
4548 if (isHoverExit_) {
4549 TAG_LOGD(AceLogTag::ACE_WEB, "OnCursorChange reciving unexpected hide command");
4550 return false;
4551 }
4552 auto pipeline = PipelineContext::GetCurrentContext();
4553 CHECK_NULL_RETURN(pipeline, false);
4554 auto windowId = pipeline->GetWindowId();
4555 auto mouseStyle = MouseStyle::CreateMouseStyle();
4556 int32_t curPointerStyle = 0;
4557 if (mouseStyle->GetPointerStyle(windowId, curPointerStyle) == -1) {
4558 return false;
4559 }
4560
4561 if ((type == OHOS::NWeb::CursorType::CT_CONTEXTMENU) || (type == OHOS::NWeb::CursorType::CT_ALIAS)) {
4562 UpdateLocalCursorStyle(windowId, type);
4563 } else if (type == OHOS::NWeb::CursorType::CT_CUSTOM) {
4564 UpdateCustomCursor(windowId, info);
4565 } else {
4566 MouseFormat pointStyle = MouseFormat::DEFAULT;
4567 int64_t idx = BinarySearchFindIndex(g_cursorTypeMap, ArraySize(g_cursorTypeMap), type);
4568 if (idx >= 0) {
4569 pointStyle = g_cursorTypeMap[idx].value;
4570 }
4571 mouseStyle->SetPointerVisible(pointStyle);
4572 if (static_cast<int32_t>(pointStyle) != curPointerStyle) {
4573 mouseStyle->SetPointerStyle(windowId, pointStyle);
4574 }
4575 }
4576 return true;
4577 }
4578
GetAndUpdateCursorStyleInfo(const OHOS::NWeb::CursorType & cursorType,std::shared_ptr<OHOS::NWeb::NWebCursorInfo> cursorInfo)4579 CursorStyleInfo WebPattern::GetAndUpdateCursorStyleInfo(
4580 const OHOS::NWeb::CursorType& cursorType, std::shared_ptr<OHOS::NWeb::NWebCursorInfo> cursorInfo)
4581 {
4582 auto type = cursorType;
4583 auto info = cursorInfo;
4584 if (type == OHOS::NWeb::CursorType::CT_LOCK) {
4585 type = OHOS::NWeb::CursorType::CT_NONE;
4586 isMouseLocked_ = true;
4587 } else if (type == OHOS::NWeb::CursorType::CT_UNLOCK) {
4588 type = cursorType_;
4589 info = nweb_cursorInfo_;
4590 isMouseLocked_ = false;
4591 } else {
4592 if (cursorType_ != type) {
4593 TAG_LOGI(AceLogTag::ACE_WEB, "OnCursorChange type: %{public}d isHoverExit: %{public}d", type, isHoverExit_);
4594 cursorType_ = type;
4595 }
4596 nweb_cursorInfo_.reset();
4597 if (type == OHOS::NWeb::CursorType::CT_CUSTOM) {
4598 nweb_cursorInfo_ = info;
4599 }
4600 }
4601 return std::make_tuple(type, info);
4602 }
4603
UpdateLocalCursorStyle(int32_t windowId,const OHOS::NWeb::CursorType & type)4604 void WebPattern::UpdateLocalCursorStyle(int32_t windowId, const OHOS::NWeb::CursorType& type)
4605 {
4606 std::shared_ptr<Media::PixelMap> pixelMap;
4607 auto mouseStyle = MouseStyle::CreateMouseStyle();
4608 if (type == NWeb::CursorType::CT_CONTEXTMENU) {
4609 MouseFormat pointStyle = MouseFormat::CONTEXT_MENU;
4610 pixelMap = CreatePixelMapFromString(IMAGE_POINTER_CONTEXT_MENU_PATH);
4611 mouseStyle->SetMouseIcon(windowId, pointStyle, pixelMap);
4612 } else if (type == NWeb::CursorType::CT_ALIAS) {
4613 MouseFormat pointStyle = MouseFormat::ALIAS;
4614 pixelMap = CreatePixelMapFromString(IMAGE_POINTER_ALIAS_PATH);
4615 mouseStyle->SetMouseIcon(windowId, pointStyle, pixelMap);
4616 }
4617 }
4618
UpdateCustomCursor(int32_t windowId,std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)4619 void WebPattern::UpdateCustomCursor(int32_t windowId, std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)
4620 {
4621 int32_t x = 0;
4622 int32_t y = 0;
4623 int32_t width = 0;
4624 int32_t height = 0;
4625 uint8_t *buff = nullptr;
4626 if (info) {
4627 x = info->GetX();
4628 y = info->GetY();
4629 buff = info->GetBuff();
4630 width = info->GetWidth();
4631 height = info->GetHeight();
4632 }
4633 Media::InitializationOptions opt;
4634 opt.size.width = width;
4635 opt.size.height = height;
4636 opt.editable = true;
4637 auto pixelMap = Media::PixelMap::Create(opt);
4638 CHECK_NULL_VOID(pixelMap);
4639 uint64_t bufferSize = static_cast<uint64_t>(width * height * IMAGE_POINTER_CUSTOM_CHANNEL);
4640 uint32_t status = pixelMap->WritePixels(static_cast<const uint8_t*>(buff), bufferSize);
4641 if (status != 0) {
4642 TAG_LOGE(AceLogTag::ACE_WEB, "write pixel map failed %{public}u", status);
4643 return;
4644 }
4645 std::shared_ptr<Media::PixelMap> cursorPixelMap(pixelMap.release());
4646 CHECK_NULL_VOID(cursorPixelMap);
4647 auto mouseStyle = MouseStyle::CreateMouseStyle();
4648 CHECK_NULL_VOID(mouseStyle);
4649 mouseStyle->SetCustomCursor(windowId, x, y, cursorPixelMap);
4650 }
4651
CreatePixelMapFromString(const std::string & filePath)4652 std::shared_ptr<OHOS::Media::PixelMap> WebPattern::CreatePixelMapFromString(const std::string& filePath)
4653 {
4654 OHOS::Media::SourceOptions opts;
4655 opts.formatHint = "image/svg+xml";
4656 uint32_t errCode = 0;
4657 auto imageSource = OHOS::Media::ImageSource::CreateImageSource(filePath, opts, errCode);
4658 CHECK_NULL_RETURN(imageSource, nullptr);
4659 std::set<std::string> formats;
4660 errCode = imageSource->GetSupportedFormats(formats);
4661 Media::DecodeOptions decodeOpts;
4662 std::shared_ptr<OHOS::Media::PixelMap> pixelMap = imageSource->CreatePixelMap(decodeOpts, errCode);
4663 CHECK_NULL_RETURN(pixelMap, nullptr);
4664
4665 return pixelMap;
4666 }
4667
OnTooltip(const std::string & tooltip)4668 void WebPattern::OnTooltip(const std::string& tooltip)
4669 {
4670 auto pipeline = PipelineContext::GetCurrentContext();
4671 CHECK_NULL_VOID(pipeline);
4672 auto overlayManager = pipeline->GetOverlayManager();
4673 CHECK_NULL_VOID(overlayManager);
4674 tooltipTimestamp_ = GetSysTimestamp();
4675 auto tooltipTimestamp = tooltipTimestamp_;
4676
4677 if (tooltipId_ != -1) {
4678 overlayManager->RemoveIndexerPopupById(tooltipId_);
4679 tooltipId_ = -1;
4680 }
4681 auto tooltipText = tooltip;
4682 OHOS::Ace::StringUtils::TrimStrLeadingAndTrailing(tooltipText);
4683 if (tooltipText == "" || mouseHoveredX_ < 0 || mouseHoveredY_ < 0) {
4684 return;
4685 }
4686 ShowTooltip(tooltipText, tooltipTimestamp);
4687 }
4688
OnPopupSize(int32_t x,int32_t y,int32_t width,int32_t height)4689 void WebPattern::OnPopupSize(int32_t x, int32_t y, int32_t width, int32_t height)
4690 {
4691 CHECK_NULL_VOID(renderContextForPopupSurface_);
4692 TAG_LOGI(AceLogTag::ACE_WEB,
4693 "Web %{public}d popup window resize to (x:%{public}d, y:%{public}d, width:%{public}d, height:%{public}d)",
4694 GetWebId(), x, y, width, height);
4695 renderContextForPopupSurface_->SetBounds(x, y, width, height);
4696 }
4697
OnPopupShow(bool show)4698 void WebPattern::OnPopupShow(bool show)
4699 {
4700 if (!show) {
4701 CHECK_NULL_VOID(renderContextForPopupSurface_);
4702 renderContextForPopupSurface_->SetBounds(0, 0, 0, 0);
4703 }
4704
4705 TAG_LOGI(AceLogTag::ACE_WEB, "Web %{public}d show popup window %{public}d", GetWebId(), show);
4706 auto pipeline = GetContext();
4707 CHECK_NULL_VOID(pipeline);
4708 pipeline->RequestFrame();
4709 }
4710
GetVisibleRectToWeb(int & visibleX,int & visibleY,int & visibleWidth,int & visibleHeight)4711 void WebPattern::GetVisibleRectToWeb(int& visibleX, int& visibleY, int& visibleWidth, int& visibleHeight)
4712 {
4713 auto host = GetHost();
4714 CHECK_NULL_VOID(host);
4715 RectF visibleRect;
4716 RectF visibleInnerRect;
4717 RectF frameRect;
4718 host->GetVisibleRectWithClip(visibleRect, visibleInnerRect, frameRect);
4719 auto offset = GetCoordinatePoint().value_or(OffsetF());
4720 visibleX = visibleInnerRect.GetX() - offset.GetX();
4721 visibleY = visibleInnerRect.GetY() - offset.GetY();
4722 visibleWidth = visibleInnerRect.Width();
4723 visibleHeight = visibleInnerRect.Height();
4724 }
4725
RestoreRenderFit()4726 void WebPattern::RestoreRenderFit()
4727 {
4728 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::RestoreRenderFit, webId: %{public}d", GetWebId());
4729 if (renderContextForSurface_) {
4730 renderContextForSurface_->SetRenderFit(RenderFit::TOP_LEFT);
4731 }
4732 }
4733
AttachCustomKeyboard()4734 void WebPattern::AttachCustomKeyboard()
4735 {
4736 TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard AttachCustomKeyboard enter");
4737 CHECK_NULL_VOID(customKeyboardBuilder_);
4738 auto frameNode = GetHost();
4739 CHECK_NULL_VOID(frameNode);
4740 auto pipeline = PipelineContext::GetCurrentContextSafely();
4741 CHECK_NULL_VOID(pipeline);
4742 auto overlayManager = pipeline->GetOverlayManager();
4743 CHECK_NULL_VOID(overlayManager);
4744 overlayManager->SetCustomKeyboardOption(true);
4745 overlayManager->BindKeyboard(customKeyboardBuilder_, frameNode->GetId());
4746 keyboardOverlay_ = overlayManager;
4747 keyboardOverlay_->AvoidCustomKeyboard(frameNode->GetId(), 0);
4748 isUsingCustomKeyboardAvoid_ = true;
4749 TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard AttachCustomKeyboard end");
4750 }
4751
CloseCustomKeyboard()4752 void WebPattern::CloseCustomKeyboard()
4753 {
4754 TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard CloseCustomKeyboard enter");
4755 auto frameNode = GetHost();
4756 CHECK_NULL_VOID(frameNode);
4757 CHECK_NULL_VOID(keyboardOverlay_);
4758 keyboardOverlay_->CloseKeyboard(frameNode->GetId());
4759 isUsingCustomKeyboardAvoid_ = false;
4760 TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard CloseCustomKeyboard end");
4761 }
4762
HandleShowTooltip(const std::string & tooltip,int64_t tooltipTimestamp)4763 void WebPattern::HandleShowTooltip(const std::string& tooltip, int64_t tooltipTimestamp)
4764 {
4765 if ((tooltipTimestamp_ != tooltipTimestamp) || (tooltip == "")) {
4766 return;
4767 }
4768 auto pipeline = PipelineContext::GetCurrentContext();
4769 CHECK_NULL_VOID(pipeline);
4770 auto overlayManager = pipeline->GetOverlayManager();
4771 CHECK_NULL_VOID(overlayManager);
4772 if (tooltipId_ == -1) {
4773 tooltipId_ = ElementRegister::GetInstance()->MakeUniqueId();
4774 }
4775 auto tooltipNode = FrameNode::GetOrCreateFrameNode(V2::TEXT_ETS_TAG, tooltipId_,
4776 []() { return AceType::MakeRefPtr<TextPattern>(); });
4777 CHECK_NULL_VOID(tooltipNode);
4778
4779 auto textRenderContext = tooltipNode->GetRenderContext();
4780 CHECK_NULL_VOID(textRenderContext);
4781 auto textLayoutProperty = tooltipNode->GetLayoutProperty<TextLayoutProperty>();
4782 CHECK_NULL_VOID(textLayoutProperty);
4783 textLayoutProperty->UpdateContent(tooltip);
4784
4785 BorderWidthProperty borderWidth;
4786 borderWidth.SetBorderWidth(TOOLTIP_BORDER_WIDTH);
4787 textLayoutProperty->UpdateBorderWidth(borderWidth);
4788 textLayoutProperty->UpdateFontSize(TOOLTIP_FONT_SIZE);
4789 textLayoutProperty->UpdatePadding({ CalcLength(TOOLTIP_PADDING),
4790 CalcLength(TOOLTIP_PADDING), CalcLength(TOOLTIP_PADDING), CalcLength(TOOLTIP_PADDING) });
4791 textLayoutProperty->UpdateCalcMaxSize(CalcSize(CalcLength(Dimension(
4792 pipeline->GetCurrentRootWidth() * TOOLTIP_MAX_PORTION)), std::nullopt));
4793 UpdateTooltipContentColor(tooltipNode);
4794
4795 OffsetF tooltipOffset;
4796 CalculateTooltipOffset(tooltipNode, tooltipOffset);
4797 textRenderContext->UpdatePosition(OffsetT<Dimension>(Dimension(tooltipOffset.GetX()),
4798 Dimension(tooltipOffset.GetY())));
4799
4800 BorderColorProperty borderColor;
4801 borderColor.SetColor(Color::BLACK);
4802 textRenderContext->UpdateBorderColor(borderColor);
4803 overlayManager->ShowIndexerPopup(tooltipId_, tooltipNode);
4804 }
4805
UpdateTooltipContentColor(const RefPtr<FrameNode> & textNode)4806 void WebPattern::UpdateTooltipContentColor(const RefPtr<FrameNode>& textNode)
4807 {
4808 CHECK_NULL_VOID(textNode);
4809 auto textRenderContext = textNode->GetRenderContext();
4810 CHECK_NULL_VOID(textRenderContext);
4811 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
4812 CHECK_NULL_VOID(textLayoutProperty);
4813
4814 if (Color::BLACK == GetSystemColor()) {
4815 textLayoutProperty->UpdateTextColor(Color::WHITE);
4816 textRenderContext->UpdateBackgroundColor(Color::BLACK);
4817 } else {
4818 textLayoutProperty->UpdateTextColor(Color::BLACK);
4819 textRenderContext->UpdateBackgroundColor(Color::WHITE);
4820 }
4821 }
4822
ShowTooltip(const std::string & tooltip,int64_t tooltipTimestamp)4823 void WebPattern::ShowTooltip(const std::string& tooltip, int64_t tooltipTimestamp)
4824 {
4825 auto tooltipTask = [weak = WeakClaim(this), tooltip, tooltipTimestamp]() {
4826 auto pattern = weak.Upgrade();
4827 CHECK_NULL_VOID(pattern);
4828 pattern->HandleShowTooltip(tooltip, tooltipTimestamp);
4829 };
4830
4831 auto host = GetHost();
4832 CHECK_NULL_VOID(host);
4833 auto context = host->GetContext();
4834 CHECK_NULL_VOID(context);
4835
4836 auto taskExecutor = context->GetTaskExecutor();
4837 CHECK_NULL_VOID(taskExecutor);
4838
4839 taskExecutor->PostDelayedTask(tooltipTask, TaskExecutor::TaskType::UI, TOOLTIP_DELAY_MS, "ArkUIWebShowTooltip");
4840 }
4841
CalculateTooltipOffset(RefPtr<FrameNode> & tooltipNode,OffsetF & tooltipOffset)4842 void WebPattern::CalculateTooltipOffset(RefPtr<FrameNode>& tooltipNode, OffsetF& tooltipOffset)
4843 {
4844 auto textLayoutWrapper = tooltipNode->CreateLayoutWrapper(true);
4845 CHECK_NULL_VOID(textLayoutWrapper);
4846 textLayoutWrapper->Measure(std::nullopt);
4847 auto textGeometryNode = textLayoutWrapper->GetGeometryNode();
4848 CHECK_NULL_VOID(textGeometryNode);
4849 auto textWidth = textGeometryNode->GetMarginFrameSize().Width();
4850 auto textHeight = textGeometryNode->GetMarginFrameSize().Height();
4851
4852 auto offset = GetCoordinatePoint().value_or(OffsetF());
4853 auto pipeline = PipelineContext::GetCurrentContext();
4854 CHECK_NULL_VOID(pipeline);
4855 auto overlayManager = pipeline->GetOverlayManager();
4856 CHECK_NULL_VOID(overlayManager);
4857 auto rootNode = AceType::DynamicCast<FrameNode>(overlayManager->GetRootNode().Upgrade());
4858 CHECK_NULL_VOID(rootNode);
4859 auto root = rootNode->GetTransformRectRelativeToWindow();
4860
4861 auto offsetX = offset.GetX() - root.GetX() + mouseHoveredX_ + TOOLTIP_MARGIN;
4862 auto offsetY = offset.GetY() - root.GetY() + mouseHoveredY_ + TOOLTIP_MARGIN;
4863
4864 ScopedLayout scope(Referenced::RawPtr(pipeline));
4865 if (GreatNotEqual(offsetX + textWidth, root.Width())) {
4866 offsetX = root.Width() - textWidth;
4867 }
4868 if (GreatNotEqual(offsetY + textHeight, root.Height())) {
4869 offsetY = root.Height() - textHeight;
4870 }
4871 tooltipOffset.SetX(offsetX);
4872 tooltipOffset.SetY(offsetY);
4873 TAG_LOGI(AceLogTag::ACE_WEB,
4874 "CalculateTooltipOffset [Tooltip] width: %{public}f height: %{public}f offset:(%{public}f, %{public}f)"
4875 " [Web] width: %{public}f height: %{public}f offset:(%{public}f, %{public}f)",
4876 textWidth, textHeight, offsetX, offsetY, drawSize_.Width(), drawSize_.Height(), offset.GetX(), offset.GetY());
4877 }
4878
OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)4879 void WebPattern::OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,
4880 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)
4881 {
4882 CHECK_NULL_VOID(params);
4883 CHECK_NULL_VOID(callback);
4884 auto host = GetHost();
4885 CHECK_NULL_VOID(host);
4886 auto eventHub = host->GetEventHub<WebEventHub>();
4887 CHECK_NULL_VOID(eventHub);
4888 auto context = PipelineContext::GetCurrentContext();
4889 CHECK_NULL_VOID(context);
4890 auto overlayManager = context->GetOverlayManager();
4891 CHECK_NULL_VOID(overlayManager);
4892
4893 auto id = host->GetId();
4894 std::vector<SelectParam> selectParam;
4895 for (auto& item : params->GetMenuItems()) {
4896 selectParam.push_back({
4897 item->GetLabel(), ""
4898 });
4899 }
4900 bool autoWrapFlag = true;
4901 auto menu = MenuView::Create(selectParam, id, host->GetTag(), autoWrapFlag);
4902 CHECK_NULL_VOID(menu);
4903 auto menuWrapperPattern = menu->GetPattern<MenuWrapperPattern>();
4904 CHECK_NULL_VOID(menuWrapperPattern);
4905 auto destructor = [weak = WeakClaim(this), id]() {
4906 auto pattern = weak.Upgrade();
4907 CHECK_NULL_VOID(pattern);
4908 auto pipeline = NG::PipelineContext::GetCurrentContext();
4909 CHECK_NULL_VOID(pipeline);
4910 auto manager = pipeline->GetOverlayManager();
4911 CHECK_NULL_VOID(manager);
4912 pattern->SetSelectPopupMenuShowing(false);
4913 manager->DeleteMenu(id);
4914 };
4915 eventHub->SetOnDisappear(destructor);
4916
4917 WebPattern::InitSelectPopupMenuView(menu, callback, params, context->GetDipScale());
4918 menuWrapperPattern->RegisterMenuDisappearCallback([weak = WeakClaim(this), callback]() {
4919 auto pattern = weak.Upgrade();
4920 CHECK_NULL_VOID(pattern);
4921 callback->Cancel();
4922 pattern->SetSelectPopupMenuShowing(false);
4923 });
4924 auto offset = GetSelectPopupPostion(params->GetSelectMenuBound());
4925 TAG_LOGI(AceLogTag::ACE_WEB, "OnSelectPopupMenu offset:(%{public}f, %{public}f)", offset.GetX(), offset.GetY());
4926 selectPopupMenuShowing_ = true;
4927 overlayManager->ShowMenu(id, offset, menu);
4928 }
4929
NotifyForNextTouchEvent()4930 void WebPattern::NotifyForNextTouchEvent()
4931 {
4932 CHECK_NULL_VOID(delegate_);
4933 delegate_->NotifyForNextTouchEvent();
4934 }
4935
InitTouchEventListener()4936 void WebPattern::InitTouchEventListener()
4937 {
4938 TAG_LOGD(AceLogTag::ACE_WEB, "WebPattern::InitTouchEventListener");
4939 if (touchEventListener_) {
4940 return;
4941 }
4942 touchEventListener_ = std::make_shared<TouchEventListener>();
4943 touchEventListener_->SetPatternToListener(AceType::WeakClaim(this));
4944
4945 auto host = GetHost();
4946 CHECK_NULL_VOID(host);
4947 auto context = host->GetContext();
4948 CHECK_NULL_VOID(context);
4949
4950 context->RegisterTouchEventListener(touchEventListener_);
4951 }
4952
UninitTouchEventListener()4953 void WebPattern::UninitTouchEventListener()
4954 {
4955 TAG_LOGD(AceLogTag::ACE_WEB, "WebPattern::UninitTouchEventListener");
4956 touchEventListener_ = nullptr;
4957
4958 auto host = GetHost();
4959 CHECK_NULL_VOID(host);
4960 auto context = host->GetContext();
4961 CHECK_NULL_VOID(context);
4962 context->UnregisterTouchEventListener(AceType::WeakClaim(this));
4963 }
4964
OnDateTimeChooserPopup(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>> & suggestions,std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)4965 void WebPattern::OnDateTimeChooserPopup(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
4966 const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
4967 std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)
4968 {
4969 if (!chooser) {
4970 return;
4971 }
4972
4973 bool result = false;
4974 if (suggestions.size() != 0) {
4975 result = ShowDateTimeSuggestionDialog(chooser, suggestions, callback);
4976 } else if (chooser->GetType() == NWeb::DTC_TIME) {
4977 result = ShowTimeDialog(chooser, suggestions, callback);
4978 } else {
4979 result = ShowDateTimeDialog(chooser, suggestions, callback);
4980 }
4981 if (!result) {
4982 callback->Continue(false, OHOS::NWeb::DateTime());
4983 }
4984 }
4985
GetDialogProperties(const RefPtr<DialogTheme> & theme)4986 DialogProperties WebPattern::GetDialogProperties(const RefPtr<DialogTheme>& theme)
4987 {
4988 DialogProperties properties;
4989 if (GetWebInfoType() == WebInfoType::TYPE_MOBILE) {
4990 properties.alignment = DialogAlignment::BOTTOM;
4991 } else {
4992 properties.alignment = DialogAlignment::CENTER;
4993 }
4994 properties.customStyle = false;
4995 properties.offset = DimensionOffset(Offset(0, -theme->GetMarginBottom().ConvertToPx()));
4996 return properties;
4997 }
4998
ShowDateTimeDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>> & suggestions,std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)4999 bool WebPattern::ShowDateTimeDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
5000 const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
5001 std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)
5002 {
5003 auto container = Container::Current();
5004 CHECK_NULL_RETURN(container, false);
5005 auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
5006 CHECK_NULL_RETURN(pipelineContext, false);
5007 auto executor = pipelineContext->GetTaskExecutor();
5008 CHECK_NULL_RETURN(executor, false);
5009 auto context = AccessibilityManager::DynamicCast<NG::PipelineContext>(pipelineContext);
5010 auto overlayManager = context ? context->GetOverlayManager() : nullptr;
5011 CHECK_NULL_RETURN(overlayManager, false);
5012 auto theme = pipelineContext->GetTheme<DialogTheme>();
5013 CHECK_NULL_RETURN(theme, false);
5014 NG::DatePickerSettingData settingData;
5015 settingData.isLunar = false;
5016 settingData.showTime = chooser->GetType() == NWeb::DTC_DATETIME_LOCAL;
5017 settingData.useMilitary = true;
5018 DialogProperties properties = GetDialogProperties(theme);
5019 std::map<std::string, PickerDate> datePickerProperty;
5020 std::map<std::string, PickerTime> timePickerProperty;
5021 OHOS::NWeb::DateTime minimum = chooser->GetMinimum();
5022 OHOS::NWeb::DateTime maximum = chooser->GetMaximum();
5023 OHOS::NWeb::DateTime dialogValue = chooser->GetDialogValue();
5024 settingData.datePickerProperty["start"] = PickerDate(minimum.year, minimum.month + 1, minimum.day);
5025 settingData.datePickerProperty["end"] = PickerDate(maximum.year, maximum.month + 1, maximum.day);
5026 if (chooser->GetHasSelected()) {
5027 int32_t day = (dialogValue.day == 0) ? 1 : dialogValue.day;
5028 settingData.datePickerProperty["selected"] = PickerDate(dialogValue.year, dialogValue.month + 1, day);
5029 }
5030 std::map<std::string, NG::DialogEvent> dialogEvent;
5031 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent;
5032 dialogEvent["acceptId"] = [callback](const std::string& info) {
5033 OHOS::NWeb::DateTime result;
5034 bool success = ParseDateTimeJson(info, result);
5035 callback->Continue(success, result);
5036 };
5037 dialogCancelEvent["cancelId"] =
5038 [callback](const GestureEvent&) { callback->Continue(false, OHOS::NWeb::DateTime()); };
5039 overlayManager->RegisterOnHideDialog([callback] { callback->Continue(false, OHOS::NWeb::DateTime()); });
5040 executor->PostTask(
5041 [properties, settingData, dialogEvent, dialogCancelEvent, weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
5042 auto overlayManager = weak.Upgrade();
5043 CHECK_NULL_VOID(overlayManager);
5044 overlayManager->ShowDateDialog(properties, settingData, dialogEvent, dialogCancelEvent);
5045 },
5046 TaskExecutor::TaskType::UI, "ArkUIWebShowDateDialog");
5047 return true;
5048 }
5049
ShowTimeDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>> & suggestions,std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)5050 bool WebPattern::ShowTimeDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
5051 const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
5052 std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)
5053 {
5054 auto container = Container::Current();
5055 CHECK_NULL_RETURN(container, false);
5056 auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
5057 CHECK_NULL_RETURN(pipelineContext, false);
5058 auto executor = pipelineContext->GetTaskExecutor();
5059 CHECK_NULL_RETURN(executor, false);
5060 auto theme = pipelineContext->GetTheme<DialogTheme>();
5061 CHECK_NULL_RETURN(theme, false);
5062 auto context = AccessibilityManager::DynamicCast<NG::PipelineContext>(pipelineContext);
5063 auto overlayManager = context ? context->GetOverlayManager() : nullptr;
5064 CHECK_NULL_RETURN(overlayManager, false);
5065 NG::TimePickerSettingData settingData;
5066 settingData.isUseMilitaryTime = true;
5067 DialogProperties properties = GetDialogProperties(theme);
5068 std::map<std::string, PickerTime> timePickerProperty;
5069 OHOS::NWeb::DateTime minimum = chooser->GetMinimum();
5070 OHOS::NWeb::DateTime maximum = chooser->GetMaximum();
5071 OHOS::NWeb::DateTime dialogValue = chooser->GetDialogValue();
5072 timePickerProperty["start"] = PickerTime(minimum.hour, minimum.minute, minimum.second);
5073 timePickerProperty["selected"] = PickerTime(maximum.hour, maximum.minute, maximum.second);
5074 if (chooser->GetHasSelected()) {
5075 timePickerProperty["selected"] = PickerTime(dialogValue.hour, dialogValue.minute, dialogValue.second);
5076 } else {
5077 auto timeOfNow = GetTimeOfNow();
5078 timePickerProperty["selected"] =
5079 PickerTime(timeOfNow.hour24_, timeOfNow.minute_, timeOfNow.second_);
5080 }
5081 std::map<std::string, NG::DialogEvent> dialogEvent;
5082 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent;
5083 dialogEvent["acceptId"] = [callback](const std::string& info) {
5084 OHOS::NWeb::DateTime result;
5085 bool success = ParseDateTimeJson(info, result);
5086 callback->Continue(success, result);
5087 };
5088 dialogCancelEvent["cancelId"] =
5089 [callback](const GestureEvent&) { callback->Continue(false, OHOS::NWeb::DateTime()); };
5090 overlayManager->RegisterOnHideDialog([callback] { callback->Continue(false, OHOS::NWeb::DateTime()); });
5091 executor->PostTask(
5092 [properties, settingData, timePickerProperty, dialogEvent, dialogCancelEvent,
5093 weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
5094 auto overlayManager = weak.Upgrade();
5095 CHECK_NULL_VOID(overlayManager);
5096 overlayManager->ShowTimeDialog(properties, settingData, timePickerProperty, dialogEvent, dialogCancelEvent);
5097 },
5098 TaskExecutor::TaskType::UI, "ArkUIWebShowTimeDialog");
5099 return true;
5100 }
5101
ShowDateTimeSuggestionDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>> & suggestions,std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)5102 bool WebPattern::ShowDateTimeSuggestionDialog(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
5103 const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
5104 std::shared_ptr<NWeb::NWebDateTimeChooserCallback> callback)
5105 {
5106 auto container = Container::Current();
5107 CHECK_NULL_RETURN(container, false);
5108 auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
5109 CHECK_NULL_RETURN(pipelineContext, false);
5110 auto executor = pipelineContext->GetTaskExecutor();
5111 CHECK_NULL_RETURN(executor, false);
5112 auto theme = pipelineContext->GetTheme<DialogTheme>();
5113 CHECK_NULL_RETURN(theme, false);
5114 auto context = AccessibilityManager::DynamicCast<NG::PipelineContext>(pipelineContext);
5115 auto overlayManager = context ? context->GetOverlayManager() : nullptr;
5116 CHECK_NULL_RETURN(overlayManager, false);
5117 NG::TextPickerSettingData settingData;
5118 if (memset_s(&settingData, sizeof(NG::TextPickerSettingData), 0, sizeof(NG::TextPickerSettingData)) != EOK) {
5119 return false;
5120 }
5121 std::map<std::string, OHOS::NWeb::DateTime> suggestionMap;
5122 for (size_t i = 0; i < suggestions.size(); i++) {
5123 settingData.rangeVector.push_back({ "", suggestions[i]->GetLocalizedValue() });
5124 settingData.values.push_back(suggestions[i]->GetLocalizedValue());
5125 suggestionMap.emplace(std::make_pair(suggestions[i]->GetLocalizedValue(), suggestions[i]->GetValue()));
5126 }
5127 settingData.columnKind = NG::TEXT;
5128 settingData.selected = chooser->GetSuggestionIndex();
5129 DialogProperties properties = GetDialogProperties(theme);
5130 std::map<std::string, NG::DialogTextEvent> dialogEvent;
5131 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent;
5132 dialogEvent["acceptId"] = [suggestionMap, callback](const std::string& info) {
5133 std::string value = ParseTextJsonValue(info);
5134 if (suggestionMap.find(value) != suggestionMap.end()) {
5135 callback->Continue(true, suggestionMap.at(value));
5136 } else {
5137 callback->Continue(false, OHOS::NWeb::DateTime());
5138 }
5139 };
5140 dialogCancelEvent["cancelId"] =
5141 [callback](const GestureEvent&) { callback->Continue(false, OHOS::NWeb::DateTime()); };
5142 overlayManager->RegisterOnHideDialog([callback] { callback->Continue(false, OHOS::NWeb::DateTime()); });
5143 executor->PostTask(
5144 [properties, settingData, dialogEvent, dialogCancelEvent,
5145 weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
5146 auto overlayManager = weak.Upgrade();
5147 CHECK_NULL_VOID(overlayManager);
5148 overlayManager->ShowTextDialog(properties, settingData, dialogEvent, dialogCancelEvent);
5149 },
5150 TaskExecutor::TaskType::UI, "ArkUIWebShowTextDialog");
5151 return true;
5152 }
5153
OnDateTimeChooserClose()5154 void WebPattern::OnDateTimeChooserClose() {}
5155
InitSelectPopupMenuViewOption(const std::vector<RefPtr<FrameNode>> & options,const std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> & callback,const std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> & params,const double & dipScale)5156 void WebPattern::InitSelectPopupMenuViewOption(const std::vector<RefPtr<FrameNode>>& options,
5157 const std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback>& callback,
5158 const std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam>& params,
5159 const double& dipScale)
5160 {
5161 int32_t optionIndex = -1;
5162 int32_t width = params->GetSelectMenuBound() ? params->GetSelectMenuBound()->GetWidth() : 0;
5163 auto items = params->GetMenuItems();
5164 int32_t selectedIndex = params->GetSelectedItem();
5165 TAG_LOGD(AceLogTag::ACE_WEB, "InitSelectPopupMenuViewOption selectedIndex:%{public}d", selectedIndex);
5166
5167 for (auto &&option : options) {
5168 optionIndex++;
5169 CHECK_NULL_VOID(option);
5170 auto optionPattern = option->GetPattern<MenuItemPattern>();
5171 CHECK_NULL_VOID(optionPattern);
5172 auto optionPaintProperty = option->GetPaintProperty<MenuItemPaintProperty>();
5173 CHECK_NULL_VOID(optionPaintProperty);
5174 optionPaintProperty->SetIdealWidthForWeb(width - OPTION_MARGIN.ConvertToPx());
5175 optionPattern->SetFontSize(Dimension(params->GetItemFontSize() * dipScale));
5176 if (selectedIndex == optionIndex) {
5177 optionPattern->SetFontColor(SELECTED_OPTION_FONT_COLOR);
5178 optionPattern->SetBgColor(SELECTED_OPTION_BACKGROUND_COLOR);
5179 optionPattern->UpdateNextNodeDivider(false);
5180 optionPaintProperty->UpdateNeedDivider(false);
5181 }
5182 auto hub = option->GetEventHub<MenuItemEventHub>();
5183 CHECK_NULL_VOID(hub);
5184 if (optionIndex >= 0 && static_cast<uint32_t>(optionIndex) < items.size()) {
5185 hub->SetEnabled(items[optionIndex]->GetIsEnabled());
5186 auto focusHub = option->GetFocusHub();
5187 if (focusHub) {
5188 focusHub->SetEnabled(items[optionIndex]->GetIsEnabled());
5189 }
5190 }
5191 auto selectCallback = [callback](int32_t index) {
5192 std::vector<int32_t> indices { static_cast<int32_t>(index) };
5193 callback->Continue(indices);
5194 };
5195 hub->SetOnSelect(std::move(selectCallback));
5196 option->MarkModifyDone();
5197 }
5198 }
5199
InitSelectPopupMenuView(RefPtr<FrameNode> & menuWrapper,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,const double & dipScale)5200 void WebPattern::InitSelectPopupMenuView(RefPtr<FrameNode>& menuWrapper,
5201 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback,
5202 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,
5203 const double& dipScale)
5204 {
5205 auto menu = AceType::DynamicCast<FrameNode>(menuWrapper->GetChildAtIndex(0));
5206 CHECK_NULL_VOID(menu);
5207 auto menuPattern = menu->GetPattern<MenuPattern>();
5208 CHECK_NULL_VOID(menuPattern);
5209
5210 InitSelectPopupMenuViewOption(menuPattern->GetOptions(), callback, params, dipScale);
5211 }
5212
GetSelectPopupPostion(std::shared_ptr<OHOS::NWeb::NWebSelectMenuBound> bound)5213 OffsetF WebPattern::GetSelectPopupPostion(std::shared_ptr<OHOS::NWeb::NWebSelectMenuBound> bound)
5214 {
5215 auto offset = GetCoordinatePoint().value_or(OffsetF());
5216 if (bound) {
5217 offset.AddX(bound->GetX());
5218 offset.AddY(bound->GetY() + bound->GetHeight());
5219 }
5220 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
5221 offset.AddX(-CALIBERATE_X.ConvertToPx());
5222 }
5223 return offset;
5224 }
5225
UpdateLocale()5226 void WebPattern::UpdateLocale()
5227 {
5228 CHECK_NULL_VOID(delegate_);
5229 delegate_->UpdateLocale();
5230 }
5231
OnWindowShow()5232 void WebPattern::OnWindowShow()
5233 {
5234 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnWindowShow WebId : %{public}d", GetWebId());
5235 CHECK_NULL_VOID(delegate_);
5236 delegate_->OnRenderToForeground();
5237 delegate_->OnOnlineRenderToForeground();
5238
5239 if (isWindowShow_ || !isVisible_) {
5240 return;
5241 }
5242
5243 auto host = GetHost();
5244 CHECK_NULL_VOID(host);
5245 auto layoutProperty = host->GetLayoutProperty();
5246 CHECK_NULL_VOID(layoutProperty);
5247 componentVisibility_ = layoutProperty->GetVisibility().value_or(VisibleType::GONE);
5248 // When the visibility of web component is invisible, the window notification is not processed
5249 if (componentVisibility_ == VisibleType::INVISIBLE) {
5250 ACE_SCOPED_TRACE("WebPattern::OnWindowShow visibility of web component is invisible, WebId %d", GetWebId());
5251 return;
5252 }
5253 delegate_->ShowWebView();
5254 isWindowShow_ = true;
5255 }
5256
OnWindowHide()5257 void WebPattern::OnWindowHide()
5258 {
5259 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnWindowHide WebId : %{public}d", GetWebId());
5260 CHECK_NULL_VOID(delegate_);
5261 delegate_->OnRenderToBackground();
5262
5263 if (!isWindowShow_ || !isActive_) {
5264 return;
5265 }
5266
5267 CHECK_NULL_VOID(delegate_);
5268 delegate_->HideWebView();
5269 CloseContextSelectionMenu();
5270 needOnFocus_ = false;
5271 isWindowShow_ = false;
5272 }
5273
OnWindowSizeChanged(int32_t width,int32_t height,WindowSizeChangeReason type)5274 void WebPattern::OnWindowSizeChanged(int32_t width, int32_t height, WindowSizeChangeReason type)
5275 {
5276 CHECK_NULL_VOID(delegate_);
5277 TAG_LOGD(AceLogTag::ACE_WEB, "WindowSizeChangeReason type: %{public}d ", type);
5278 if (type == WindowSizeChangeReason::MAXIMIZE) {
5279 WindowMaximize();
5280 return;
5281 }
5282 bool isSmoothDragResizeEnabled = delegate_->GetIsSmoothDragResizeEnabled();
5283 if (!isSmoothDragResizeEnabled) {
5284 return;
5285 }
5286 if (type == WindowSizeChangeReason::DRAG_START || type == WindowSizeChangeReason::DRAG) {
5287 dragWindowFlag_ = true;
5288 delegate_->SetDragResizeStartFlag(true);
5289 WindowDrag(width, height);
5290 }
5291 if (type == WindowSizeChangeReason::DRAG_END) {
5292 delegate_->SetDragResizeStartFlag(false);
5293 auto frameNode = GetHost();
5294 CHECK_NULL_VOID(frameNode);
5295 auto offset = Offset(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY());
5296 delegate_->SetBoundsOrResize(drawSize_, offset, false);
5297 delegate_->ResizeVisibleViewport(visibleViewportSize_, false);
5298 dragWindowFlag_ = false;
5299 lastHeight_ = 0;
5300 lastWidth_ = 0;
5301 }
5302 }
5303
WindowDrag(int32_t width,int32_t height)5304 void WebPattern::WindowDrag(int32_t width, int32_t height)
5305 {
5306 if (delegate_) {
5307 if (lastHeight_ == 0 && lastWidth_ == 0) {
5308 lastHeight_ = height;
5309 lastWidth_ = width;
5310 }
5311 if (!GetPendingSizeStatus() && dragWindowFlag_) {
5312 int64_t pre_height = height - lastHeight_;
5313 int64_t pre_width = width - lastWidth_;
5314 if (pre_height <= CHECK_PRE_SIZE && pre_height > 0) {
5315 pre_height = 0;
5316 }
5317 if (pre_width <= CHECK_PRE_SIZE && pre_width > 0) {
5318 pre_width = 0;
5319 }
5320 lastHeight_ = height;
5321 lastWidth_ = width;
5322 if (pre_width == 0 && pre_height == 0) {
5323 return;
5324 }
5325 delegate_->SetDragResizePreSize(pre_height * ADJUST_RATIO, pre_width * ADJUST_RATIO);
5326 }
5327 }
5328 }
5329
WindowMaximize()5330 void WebPattern::WindowMaximize()
5331 {
5332 if (!SystemProperties::GetWebDebugMaximizeResizeOptimize()) {
5333 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::WindowMaximize not enabled");
5334 return;
5335 }
5336 WebInfoType webInfoType = GetWebInfoType();
5337 if (webInfoType != WebInfoType::TYPE_2IN1) {
5338 return;
5339 }
5340 if (layoutMode_ != WebLayoutMode::NONE || renderMode_ != RenderMode::ASYNC_RENDER) {
5341 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::WindowMaximize not support");
5342 return;
5343 }
5344 if (!isAttachedToMainTree_ || !isVisible_) {
5345 return;
5346 }
5347 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::WindowMaximize, webId: %{public}d", GetWebId());
5348 if (renderContextForSurface_) {
5349 renderContextForSurface_->SetRenderFit(RenderFit::RESIZE_FILL);
5350 }
5351 if (delegate_) {
5352 delegate_->MaximizeResize();
5353 }
5354 }
5355
OnCompleteSwapWithNewSize()5356 void WebPattern::OnCompleteSwapWithNewSize()
5357 {
5358 if (!isInWindowDrag_ || !isWaiting_)
5359 return;
5360
5361 ACE_SCOPED_TRACE("WebPattern::OnCompleteSwapWithNewSize");
5362 isWaiting_ = false;
5363 }
5364
OnResizeNotWork()5365 void WebPattern::OnResizeNotWork()
5366 {
5367 if (!isInWindowDrag_ || !isWaiting_)
5368 return;
5369
5370 ACE_SCOPED_TRACE("WebPattern::OnResizeNotWork");
5371 isWaiting_ = false;
5372 }
5373
UpdateOnFocusTextField(bool isFocus)5374 void WebPattern::UpdateOnFocusTextField(bool isFocus)
5375 {
5376 auto host = GetHost();
5377 CHECK_NULL_VOID(host);
5378 auto context = PipelineContext::GetCurrentContext();
5379 CHECK_NULL_VOID(context);
5380 auto textFieldManager = DynamicCast<TextFieldManagerNG>(context->GetTextFieldManager());
5381 CHECK_NULL_VOID(textFieldManager);
5382 isFocus ? textFieldManager->SetOnFocusTextField(WeakClaim(this))
5383 : textFieldManager->ClearOnFocusTextField(host->GetId());
5384 }
5385
OnBackPressed()5386 bool WebPattern::OnBackPressed()
5387 {
5388 auto host = GetHost();
5389 CHECK_NULL_RETURN(host, false);
5390 TAG_LOGI(AceLogTag::ACE_WEB, "Web %{public}d receives back press event", host->GetId());
5391 if (IsVirtualKeyBoardShow()) {
5392 CloseSelectOverlay();
5393 SelectCancel();
5394 TAG_LOGI(AceLogTag::ACE_WEB, "Request close soft keyboard.");
5395 auto inputMethod = MiscServices::InputMethodController::GetInstance();
5396 CHECK_NULL_RETURN(inputMethod, false);
5397 inputMethod->HideTextInput();
5398 inputMethod->Close();
5399 CHECK_NULL_RETURN(delegate_, true);
5400 delegate_->CloseCustomKeyboard();
5401 delegate_->GestureBackBlur();
5402 return true;
5403 }
5404 return false;
5405 }
5406
OnBackPressedForFullScreen() const5407 bool WebPattern::OnBackPressedForFullScreen() const
5408 {
5409 if (!isFullScreen_) {
5410 return false;
5411 }
5412
5413 TAG_LOGI(AceLogTag::ACE_WEB, "FullScreenBackPressEvent Received");
5414 CHECK_NULL_RETURN(fullScreenExitHandler_, false);
5415 auto webFullScreenExitHandler = fullScreenExitHandler_->GetHandler();
5416 CHECK_NULL_RETURN(webFullScreenExitHandler, false);
5417 webFullScreenExitHandler->ExitFullScreen();
5418 return true;
5419 }
5420
SetFullScreenExitHandler(const std::shared_ptr<FullScreenEnterEvent> & fullScreenExitHandler)5421 void WebPattern::SetFullScreenExitHandler(const std::shared_ptr<FullScreenEnterEvent>& fullScreenExitHandler)
5422 {
5423 fullScreenExitHandler_ = fullScreenExitHandler;
5424 }
5425
OnInActive()5426 void WebPattern::OnInActive()
5427 {
5428 CHECK_NULL_VOID(delegate_);
5429 bool policyDisable = delegate_->IsActivePolicyDisable();
5430 TAG_LOGI(AceLogTag::ACE_WEB,
5431 "WebPattern::OnInActive webId:%{public}d, isActive:%{public}d policyDisable %{public}d",
5432 GetWebId(), isActive_, policyDisable);
5433 if (!isActive_) {
5434 return;
5435 }
5436
5437 if (!policyDisable) {
5438 delegate_->OnInactive();
5439 }
5440 isActive_ = false;
5441 }
5442
OnActive()5443 void WebPattern::OnActive()
5444 {
5445 CHECK_NULL_VOID(delegate_);
5446 bool policyDisable = delegate_->IsActivePolicyDisable();
5447 TAG_LOGI(AceLogTag::ACE_WEB,
5448 "WebPattern::OnActive webId:%{public}d, isActive:%{public}d, policyDisable %{public}d",
5449 GetWebId(), isActive_, policyDisable);
5450 if (isActive_) {
5451 return;
5452 }
5453
5454 if (!policyDisable) {
5455 delegate_->OnActive();
5456 }
5457 isActive_ = true;
5458 }
5459
OnVisibleAreaChange(bool isVisible)5460 void WebPattern::OnVisibleAreaChange(bool isVisible)
5461 {
5462 bool isDialogNested = IsDialogNested();
5463 ACE_SCOPED_TRACE("WebPattern::OnVisibleAreaChange, webId: %d, isVisible: %d", GetWebId(), isVisible);
5464 TAG_LOGI(AceLogTag::ACE_WEB,
5465 "WebPattern::OnVisibleAreaChange webId:%{public}d, isVisible:%{public}d, old_isVisible:%{public}d, "
5466 "isVisibleActiveEnable:%{public}d, isDialogNested:%{public}d, isFocus:%{public}d",
5467 GetWebId(), isVisible, isVisible_, isVisibleActiveEnable_, isDialogNested, isFocus_);
5468 if (isVisible_ == isVisible) {
5469 return;
5470 }
5471
5472 isVisible_ = isVisible;
5473 if (!isVisible_) {
5474 CloseSelectOverlay();
5475 SelectCancel();
5476 DestroyAnalyzerOverlay();
5477 isDragEndMenuShow_ = false;
5478 if (isVisibleActiveEnable_ && (!isDialogNested || !isFocus_)) {
5479 OnInActive();
5480 }
5481 } else {
5482 if (isVisibleActiveEnable_) {
5483 OnActive();
5484 }
5485 }
5486 }
5487
GetDefaultBackgroundColor()5488 Color WebPattern::GetDefaultBackgroundColor()
5489 {
5490 auto darkMode = GetDarkModeValue(webData_ ? (WebDarkMode::Auto) : (WebDarkMode::Off));
5491 if (GetForceDarkAccessValue(false) &&
5492 (darkMode == WebDarkMode::On || ((darkMode == WebDarkMode::Auto) && (GetSystemColor() == Color::BLACK)))) {
5493 return Color::BLACK;
5494 } else {
5495 return Color::WHITE;
5496 }
5497 }
5498
UpdateBackgroundColorRightNow(int32_t color)5499 void WebPattern::UpdateBackgroundColorRightNow(int32_t color)
5500 {
5501 Color bkColor = Color(static_cast<uint32_t>(color));
5502 std::string debugBkgroundColor = GetWebDebugBackGroundColor();
5503 if (debugBkgroundColor != "none") {
5504 // debugBkgroundColor : #FFFFFFFF ARGB format
5505 bkColor = Color::ColorFromString(debugBkgroundColor);
5506 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::UpdateBackgroundColorRightNow, use debug background color," \
5507 " color=%{public}s, web id = %{public}d", bkColor.ToString().c_str(), GetWebId());
5508 }
5509
5510 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::UpdateBackgroundColorRightNow, color=%{public}s, web id = %{public}d",
5511 bkColor.ToString().c_str(), GetWebId());
5512 auto host = GetHost();
5513 CHECK_NULL_VOID(host);
5514 auto renderContext = host->GetRenderContext();
5515 CHECK_NULL_VOID(renderContext);
5516 renderContext->UpdateBackgroundColor(bkColor);
5517 CHECK_NULL_VOID(renderContextForSurface_);
5518 renderContextForSurface_->UpdateBackgroundColor(bkColor);
5519 }
5520
GetSystemColor() const5521 Color WebPattern::GetSystemColor() const
5522 {
5523 Color color = Color::WHITE;
5524 auto appMgrClient = std::make_shared<AppExecFwk::AppMgrClient>();
5525 CHECK_NULL_RETURN(appMgrClient, color);
5526 if (appMgrClient->ConnectAppMgrService()) {
5527 return color;
5528 }
5529 auto systemConfig = OHOS::AppExecFwk::Configuration();
5530 appMgrClient->GetConfiguration(systemConfig);
5531 auto colorMode = systemConfig.GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
5532 if (colorMode == OHOS::AppExecFwk::ConfigurationInner::COLOR_MODE_DARK) {
5533 return Color::BLACK;
5534 }
5535 if (colorMode == OHOS::AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT) {
5536 return Color::WHITE;
5537 }
5538 TAG_LOGW(AceLogTag::ACE_WEB, "no system color mode is found.");
5539 return color;
5540 }
5541
OnNotifyMemoryLevel(int32_t level)5542 void WebPattern::OnNotifyMemoryLevel(int32_t level)
5543 {
5544 if (!isMemoryLevelEnable_) {
5545 return;
5546 }
5547 CHECK_NULL_VOID(delegate_);
5548 delegate_->NotifyMemoryLevel(level);
5549 }
5550
GetWebId()5551 int WebPattern::GetWebId()
5552 {
5553 if (delegate_) {
5554 return delegate_->GetWebId();
5555 }
5556 return -1;
5557 }
5558
HandleScroll(float offset,int32_t source,NestedState state,float velocity)5559 ScrollResult WebPattern::HandleScroll(float offset, int32_t source, NestedState state, float velocity)
5560 {
5561 // If no parent object is specified, the nearest nested scrollable parent is used by default.
5562 return HandleScroll(GetNestedScrollParent(), offset, source, state);
5563 }
5564
HandleScroll(RefPtr<NestableScrollContainer> parent,float offset,int32_t source,NestedState state)5565 ScrollResult WebPattern::HandleScroll(RefPtr<NestableScrollContainer> parent, float offset,
5566 int32_t source, NestedState state)
5567 {
5568 TAG_LOGD(AceLogTag::ACE_WEB,
5569 "WebPattern::HandleScroll scroll direction: %{public}d, find parent component: %{public}d",
5570 expectedScrollAxis_,
5571 (parent != nullptr));
5572 if (parent) {
5573 if (isTouchpadSliding_) {
5574 source = SCROLL_FROM_UPDATE;
5575 } else {
5576 source = isMouseEvent_ ? SCROLL_FROM_AXIS : source;
5577 }
5578 return parent->HandleScroll(offset, source, state);
5579 }
5580 return { 0.0f, false };
5581 }
5582
HandleScrollVelocity(float velocity,const RefPtr<NestableScrollContainer> & child)5583 bool WebPattern::HandleScrollVelocity(float velocity, const RefPtr<NestableScrollContainer>& child)
5584 {
5585 // If no parent object is specified, the nearest nested scrollable parent is used by default.
5586 return HandleScrollVelocity(GetNestedScrollParent(), velocity);
5587 }
5588
HandleScrollVelocity(RefPtr<NestableScrollContainer> parent,float velocity)5589 bool WebPattern::HandleScrollVelocity(RefPtr<NestableScrollContainer> parent, float velocity)
5590 {
5591 CHECK_NULL_RETURN(parent, false);
5592 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::HandleScrollVelocity, to parent scroll velocity=%{public}f", velocity);
5593 if (parent->HandleScrollVelocity(velocity)) {
5594 OnParentScrollDragEndRecursive(parent);
5595 return true;
5596 }
5597 return false;
5598 }
5599
OnScrollStartRecursive(WeakPtr<NestableScrollContainer> child,float position,float velocity)5600 void WebPattern::OnScrollStartRecursive(WeakPtr<NestableScrollContainer> child, float position, float velocity)
5601 {
5602 // If only one position value is passed, it will be notified to the nearest nested scrollable parent.
5603 OnScrollStartRecursive(position);
5604 }
5605
OnScrollStartRecursive(float position)5606 void WebPattern::OnScrollStartRecursive(float position)
5607 {
5608 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnScrollStartRecursive");
5609 SetIsNestedInterrupt(false);
5610 isFirstFlingScrollVelocity_ = true;
5611 isScrollStarted_ = true;
5612 isDragEnd_ = false;
5613 auto it = parentsMap_.find(expectedScrollAxis_);
5614 CHECK_EQUAL_VOID(it, parentsMap_.end());
5615 auto parent = it->second.Upgrade();
5616 if (parent) {
5617 parent->OnScrollStartRecursive(WeakClaim(this), position);
5618 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnScrollStartRecursive parent OnScrollStartRecursive");
5619 }
5620 }
5621
OnAttachToBuilderNode(NodeStatus nodeStatus)5622 void WebPattern::OnAttachToBuilderNode(NodeStatus nodeStatus)
5623 {
5624 TAG_LOGD(AceLogTag::ACE_WEB, "WebPattern::OnAttachToBuilderNode");
5625 if (nodeStatus != NodeStatus::NORMAL_NODE) {
5626 InitInOfflineMode();
5627 }
5628 }
5629
OnScrollEndRecursive(const std::optional<float> & velocity)5630 void WebPattern::OnScrollEndRecursive(const std::optional<float>& velocity)
5631 {
5632 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnScrollEndRecursive");
5633 CHECK_EQUAL_VOID(isScrollStarted_, false);
5634 auto it = parentsMap_.find(expectedScrollAxis_);
5635 if (parentsMap_.find(expectedScrollAxis_) != parentsMap_.end()) {
5636 auto parent = it->second.Upgrade();
5637 if (parent) {
5638 OnParentScrollDragEndRecursive(parent);
5639 parent->OnScrollEndRecursive(std::nullopt);
5640 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnScrollEndRecursive parent OnScrollEndRecursive");
5641 }
5642 }
5643 isScrollStarted_ = false;
5644 SetIsNestedInterrupt(false);
5645 }
5646
OnOverScrollFlingVelocity(float xVelocity,float yVelocity,bool isFling)5647 void WebPattern::OnOverScrollFlingVelocity(float xVelocity, float yVelocity, bool isFling)
5648 {
5649 float velocity = (expectedScrollAxis_ == Axis::HORIZONTAL) ? xVelocity : yVelocity;
5650 OnOverScrollFlingVelocityHandler(velocity, isFling);
5651 }
5652
OnOverScrollFlingVelocityHandler(float velocity,bool isFling)5653 void WebPattern::OnOverScrollFlingVelocityHandler(float velocity, bool isFling)
5654 {
5655 auto it = parentsMap_.find(expectedScrollAxis_);
5656 CHECK_EQUAL_VOID(it, parentsMap_.end());
5657 auto parent = it->second;
5658 ScrollResult result = { 0.f, true };
5659 auto remain = 0.f;
5660 if (!isFling) {
5661 if (scrollState_) {
5662 if (CheckOverParentScroll(velocity, NestedScrollMode::SELF_FIRST)) {
5663 result = HandleScroll(parent.Upgrade(), -velocity, SCROLL_FROM_UPDATE, NestedState::CHILD_SCROLL);
5664 remain = result.remain;
5665 } else if (CheckOverParentScroll(velocity, NestedScrollMode::PARENT_FIRST)) {
5666 remain = -velocity;
5667 }
5668 if (!NearZero(remain)) {
5669 HandleScroll(parent.Upgrade(), remain, SCROLL_FROM_UPDATE, NestedState::CHILD_OVER_SCROLL);
5670 }
5671 }
5672 } else {
5673 if (CheckParentScroll(velocity, NestedScrollMode::SELF_FIRST)) {
5674 if (isFirstFlingScrollVelocity_) {
5675 HandleScrollVelocity(parent.Upgrade(), velocity);
5676 isFirstFlingScrollVelocity_ = false;
5677 }
5678 }
5679 }
5680 }
5681
OnScrollState(bool scrollState)5682 void WebPattern::OnScrollState(bool scrollState)
5683 {
5684 scrollState_ = scrollState;
5685 if (!scrollState) {
5686 OnScrollEndRecursive(std::nullopt);
5687 }
5688 }
5689
OnScrollStart(const float x,const float y)5690 void WebPattern::OnScrollStart(const float x, const float y)
5691 {
5692 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnScrollStart x=%{public}f, y=%{public}f", x, y);
5693 scrollState_ = true;
5694 GetParentAxis();
5695 expectedScrollAxis_ =(abs(x) > abs(y) ? Axis::HORIZONTAL : Axis::VERTICAL);
5696 OnScrollStartRecursive(0.0);
5697 if (imageAnalyzerManager_) {
5698 imageAnalyzerManager_->UpdateOverlayStatus(
5699 false,
5700 0,
5701 0,
5702 0,
5703 0);
5704 }
5705 }
5706
SetLayoutMode(WebLayoutMode mode)5707 void WebPattern::SetLayoutMode(WebLayoutMode mode)
5708 {
5709 if (layoutMode_ == mode) {
5710 return;
5711 }
5712 layoutMode_ = mode;
5713 TAG_LOGI(AceLogTag::ACE_WEB, "layoutMode is: %{public}d.", layoutMode_);
5714 OnZoomAccessEnabledUpdate(GetZoomAccessEnabledValue(true));
5715 if (delegate_) {
5716 delegate_->UpdateLayoutMode(mode);
5717 }
5718 isLayoutModeChanged_ = true;
5719 auto frameNode = GetHost();
5720 CHECK_NULL_VOID(frameNode);
5721 frameNode->MarkDirtyNode(PROPERTY_UPDATE_LAYOUT | PROPERTY_UPDATE_MEASURE | PROPERTY_UPDATE_RENDER);
5722 }
5723
SetRenderMode(RenderMode renderMode)5724 void WebPattern::SetRenderMode(RenderMode renderMode)
5725 {
5726 if (isRenderModeInit_) {
5727 TAG_LOGI(AceLogTag::ACE_WEB, "renderMode not allow to change.");
5728 return;
5729 }
5730 renderMode_ = renderMode;
5731 TAG_LOGI(AceLogTag::ACE_WEB, "renderMode is %{public}d", renderMode_);
5732 isRenderModeInit_ = true;
5733 }
5734
GetParentAxis()5735 void WebPattern::GetParentAxis()
5736 {
5737 auto parent = GetNestedScrollParent();
5738 if (parent) {
5739 axis_ = parent->GetAxis();
5740 parentsMap_ = { { axis_, parent } };
5741 auto oppositeParent = SearchParent(axis_ == Axis::HORIZONTAL ? Axis::VERTICAL : Axis::HORIZONTAL);
5742 if (oppositeParent) {
5743 parentsMap_.emplace(oppositeParent->GetAxis(), oppositeParent);
5744 }
5745 } else {
5746 auto verticalParent = SearchParent(Axis::VERTICAL);
5747 auto horizontalParent = SearchParent(Axis::HORIZONTAL);
5748 if (verticalParent) {
5749 parentsMap_.emplace(verticalParent->GetAxis(), verticalParent);
5750 }
5751 if (horizontalParent) {
5752 parentsMap_.emplace(horizontalParent->GetAxis(), horizontalParent);
5753 }
5754 }
5755 }
5756
SearchParent()5757 RefPtr<NestableScrollContainer> WebPattern::SearchParent()
5758 {
5759 return SearchParent(Axis::NONE);
5760 }
5761
SearchParent(Axis scrollAxis)5762 RefPtr<NestableScrollContainer> WebPattern::SearchParent(Axis scrollAxis)
5763 {
5764 auto host = GetHost();
5765 CHECK_NULL_RETURN(host, nullptr);
5766 for (auto parent = host->GetParent(); parent != nullptr; parent = parent->GetParent()) {
5767 RefPtr<FrameNode> frameNode = AceType::DynamicCast<FrameNode>(parent);
5768 if (!frameNode) {
5769 continue;
5770 }
5771 auto pattern = frameNode->GetPattern<NestableScrollContainer>();
5772 if (!pattern ||
5773 (!AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE) &&
5774 InstanceOf<RefreshPattern>(pattern))) {
5775 continue;
5776 }
5777 if (scrollAxis == Axis::NONE || scrollAxis == pattern->GetAxis()) {
5778 return pattern;
5779 }
5780 }
5781 return nullptr;
5782 }
5783
SetNestedScrollExt(const NestedScrollOptionsExt & nestedScroll)5784 void WebPattern::SetNestedScrollExt(const NestedScrollOptionsExt &nestedScroll)
5785 {
5786 NestedScrollOptions nestedOpt = {
5787 .forward = NestedScrollMode::SELF_FIRST,
5788 .backward = NestedScrollMode::SELF_FIRST,
5789 };
5790 if (nestedScroll.scrollUp == nestedScroll.scrollLeft) {
5791 nestedOpt.backward = nestedScroll.scrollUp;
5792 }
5793 if (nestedScroll.scrollDown == nestedScroll.scrollRight) {
5794 nestedOpt.forward = nestedScroll.scrollDown;
5795 }
5796 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<NestableScrollContainer>();
5797 if (pattern) {
5798 pattern->SetNestedScroll(nestedOpt);
5799 }
5800 TAG_LOGI(
5801 AceLogTag::ACE_WEB, "SetNestedScrollExt nestedScroll: %{public}s", nestedScroll.ToString().c_str());
5802 nestedScroll_ = nestedScroll;
5803 }
5804
IsDialogNested()5805 bool WebPattern::IsDialogNested()
5806 {
5807 auto host = GetHost();
5808 CHECK_NULL_RETURN(host, false);
5809 for (auto parent = host->GetParent(); parent != nullptr; parent = parent->GetParent()) {
5810 RefPtr<FrameNode> frameNode = AceType::DynamicCast<FrameNode>(parent);
5811 if (!frameNode) {
5812 continue;
5813 }
5814 if (frameNode->GetPattern<DialogPattern>()) {
5815 return true;
5816 }
5817 }
5818 return false;
5819 }
5820
OnRootLayerChanged(int width,int height)5821 void WebPattern::OnRootLayerChanged(int width, int height)
5822 {
5823 if ((rootLayerWidth_ == width) && (rootLayerHeight_ == height)) {
5824 return;
5825 }
5826 TAG_LOGI(AceLogTag::ACE_WEB, "OnRootLayerChanged width : %{public}d, height : %{public}d", width, height);
5827 rootLayerWidth_ = width;
5828 rootLayerHeight_ = height;
5829 if (layoutMode_ != WebLayoutMode::FIT_CONTENT) {
5830 return;
5831 }
5832 rootLayerChangeSize_ = Size(width, height);
5833 ReleaseResizeHold();
5834 }
5835
ReleaseResizeHold()5836 void WebPattern::ReleaseResizeHold()
5837 {
5838 if (layoutMode_ != WebLayoutMode::FIT_CONTENT) {
5839 return;
5840 }
5841 drawSize_.SetSize(rootLayerChangeSize_);
5842 auto frameNode = GetHost();
5843 CHECK_NULL_VOID(frameNode);
5844 frameNode->MarkDirtyNode(PROPERTY_UPDATE_LAYOUT | PROPERTY_UPDATE_MEASURE | PROPERTY_UPDATE_RENDER);
5845 }
FilterScrollEvent(const float x,const float y,const float xVelocity,const float yVelocity)5846 bool WebPattern::FilterScrollEvent(const float x, const float y, const float xVelocity, const float yVelocity)
5847 {
5848 float offset = expectedScrollAxis_ == Axis::HORIZONTAL ? x : y;
5849 float velocity = expectedScrollAxis_ == Axis::HORIZONTAL ? xVelocity : yVelocity;
5850 bool isConsumed = offset != 0 ? FilterScrollEventHandleOffset(offset) : FilterScrollEventHandlevVlocity(velocity);
5851 return isConsumed;
5852 }
5853
FilterScrollEventHandleOffset(float offset)5854 bool WebPattern::FilterScrollEventHandleOffset(float offset)
5855 {
5856 auto it = parentsMap_.find(expectedScrollAxis_);
5857 CHECK_EQUAL_RETURN(it, parentsMap_.end(), false);
5858 auto parent = it->second;
5859 if (parent.Upgrade() && !NearZero(offset)) {
5860 auto res = HandleScroll(parent.Upgrade(), offset, SCROLL_FROM_UPDATE, NestedState::CHILD_CHECK_OVER_SCROLL);
5861 if (NearZero(res.remain)) {
5862 return true;
5863 }
5864 offset = res.remain;
5865 }
5866 if (CheckParentScroll(offset, NestedScrollMode::PARENT_FIRST)) {
5867 auto result = HandleScroll(parent.Upgrade(), offset, SCROLL_FROM_UPDATE, NestedState::CHILD_SCROLL);
5868 CHECK_EQUAL_RETURN(isParentReachEdge_ && result.reachEdge, true, false);
5869 isParentReachEdge_ = result.reachEdge;
5870 CHECK_NULL_RETURN(delegate_, false);
5871 expectedScrollAxis_ == Axis::HORIZONTAL ? delegate_->ScrollByRefScreen(-result.remain, 0)
5872 : delegate_->ScrollByRefScreen(0, -result.remain);
5873 return true;
5874 } else if (CheckParentScroll(offset, NestedScrollMode::PARALLEL)) {
5875 HandleScroll(parent.Upgrade(), offset, SCROLL_FROM_UPDATE, NestedState::CHILD_SCROLL);
5876 } else if (CheckParentScroll(offset, NestedScrollMode::SELF_FIRST) && NestedScrollOutOfBoundary()) {
5877 HandleScroll(parent.Upgrade(), offset, SCROLL_FROM_UPDATE, NestedState::CHILD_OVER_SCROLL);
5878 return true;
5879 }
5880 return false;
5881 }
5882
CheckParentScroll(const float & directValue,const NestedScrollMode & scrollMode)5883 bool WebPattern::CheckParentScroll(const float &directValue, const NestedScrollMode &scrollMode)
5884 {
5885 auto nestedScroll = GetNestedScrollExt();
5886 return (directValue > 0 && nestedScroll.scrollUp == scrollMode &&
5887 expectedScrollAxis_ != Axis::HORIZONTAL) ||
5888 (directValue > 0 && nestedScroll.scrollLeft == scrollMode &&
5889 expectedScrollAxis_ == Axis::HORIZONTAL) ||
5890 (directValue < 0 && nestedScroll.scrollDown == scrollMode &&
5891 expectedScrollAxis_ != Axis::HORIZONTAL) ||
5892 (directValue < 0 && nestedScroll.scrollRight == scrollMode &&
5893 expectedScrollAxis_ == Axis::HORIZONTAL);
5894 }
5895
CheckOverParentScroll(const float & directValue,const NestedScrollMode & scrollMode)5896 bool WebPattern::CheckOverParentScroll(const float &directValue, const NestedScrollMode &scrollMode)
5897 {
5898 auto nestedScroll = GetNestedScrollExt();
5899 return (directValue < 0 && nestedScroll.scrollUp == scrollMode &&
5900 expectedScrollAxis_ != Axis::HORIZONTAL) ||
5901 (directValue < 0 && nestedScroll.scrollLeft == scrollMode &&
5902 expectedScrollAxis_ == Axis::HORIZONTAL) ||
5903 (directValue > 0 && nestedScroll.scrollDown == scrollMode &&
5904 expectedScrollAxis_ != Axis::HORIZONTAL) ||
5905 (directValue > 0 && nestedScroll.scrollRight == scrollMode &&
5906 expectedScrollAxis_ == Axis::HORIZONTAL);
5907 }
5908
FilterScrollEventHandlevVlocity(const float velocity)5909 bool WebPattern::FilterScrollEventHandlevVlocity(const float velocity)
5910 {
5911 auto it = parentsMap_.find(expectedScrollAxis_);
5912 CHECK_EQUAL_RETURN(it, parentsMap_.end(), false);
5913 auto parent = it->second;
5914 if (parent.Upgrade() && parent.Upgrade()->NestedScrollOutOfBoundary()) {
5915 return HandleScrollVelocity(parent.Upgrade(), velocity);
5916 }
5917 if (CheckParentScroll(velocity, NestedScrollMode::PARENT_FIRST)) {
5918 if (isParentReachEdge_) {
5919 return false;
5920 }
5921 return HandleScrollVelocity(parent.Upgrade(), velocity);
5922 } else if (CheckParentScroll(velocity, NestedScrollMode::PARALLEL)) {
5923 HandleScrollVelocity(parent.Upgrade(), velocity);
5924 }
5925 return false;
5926 }
5927
IsDefaultFocusNodeExist()5928 bool WebPattern::IsDefaultFocusNodeExist()
5929 {
5930 auto pipeline = PipelineContext::GetCurrentContext();
5931 CHECK_NULL_RETURN(pipeline, false);
5932 auto focusManager = pipeline->GetFocusManager();
5933 CHECK_NULL_RETURN(focusManager, false);
5934 auto focusView = focusManager->GetLastFocusView().Upgrade();
5935 CHECK_NULL_RETURN(focusView, false);
5936 auto focusHub = focusView->GetFocusHub();
5937 CHECK_NULL_RETURN(focusHub, false);
5938 bool result = focusHub->GetChildFocusNodeByType();
5939 return result;
5940 }
5941
InitSlideUpdateListener()5942 void WebPattern::InitSlideUpdateListener()
5943 {
5944 auto host = GetHost();
5945 CHECK_NULL_VOID(host);
5946 for (auto parent = host->GetParent(); parent != nullptr; parent = parent->GetParent()) {
5947 bool hasTargetParent =
5948 std::find(SYNC_RENDER_SLIDE.begin(), SYNC_RENDER_SLIDE.end(), parent->GetTag()) == SYNC_RENDER_SLIDE.end();
5949 if (hasTargetParent) {
5950 continue;
5951 }
5952 RefPtr<FrameNode> frameNode = AceType::DynamicCast<FrameNode>(parent);
5953 CHECK_NULL_VOID(frameNode);
5954 if (parent->GetTag() == V2::LIST_ETS_TAG) {
5955 auto pattern = frameNode->GetPattern<ListPattern>();
5956 CHECK_NULL_VOID(pattern);
5957 syncAxis_ = pattern->GetAxis();
5958 } else {
5959 auto pattern = frameNode->GetPattern<ScrollPattern>();
5960 CHECK_NULL_VOID(pattern);
5961 syncAxis_ = pattern->GetAxis();
5962 }
5963 CHECK_NULL_VOID(renderSurface_);
5964 renderSurface_->SetWebSlideAxis(syncAxis_);
5965 }
5966 }
5967
UpdateSlideOffset()5968 void WebPattern::UpdateSlideOffset()
5969 {
5970 switch (syncAxis_) {
5971 case Axis::HORIZONTAL:
5972 CalculateHorizontalDrawRect();
5973 break;
5974 case Axis::VERTICAL:
5975 CalculateVerticalDrawRect();
5976 break;
5977 default :
5978 break;
5979 }
5980 }
5981
CalculateHorizontalDrawRect()5982 void WebPattern::CalculateHorizontalDrawRect()
5983 {
5984 fitContentOffset_ = OffsetF(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY());
5985 CHECK_NULL_VOID(renderSurface_);
5986 renderSurface_->SetWebOffset(fitContentOffset_.GetX());
5987 if (fitContentOffset_.GetX() >= 0) {
5988 if (isNeedReDrawRect_) {
5989 SetDrawRect(0, 0, ADJUST_WEB_DRAW_LENGTH + ADJUST_WEB_DRAW_LENGTH, drawRectHeight_);
5990 }
5991 isNeedReDrawRect_ = false;
5992 return;
5993 }
5994
5995 int32_t stepGear = (-fitContentOffset_.GetX()) / ADJUST_WEB_DRAW_LENGTH;
5996 int32_t width = ADJUST_WEB_DRAW_LENGTH * 2 + stepGear;
5997 int32_t height = std::min(static_cast<int32_t>(drawSize_.Height()), FIT_CONTENT_LIMIT_LENGTH);
5998 int32_t x = ADJUST_WEB_DRAW_LENGTH * stepGear;
5999 int32_t y = 0;
6000 renderSurface_->SetWebMessage({ x, 0 });
6001 TAG_LOGD(AceLogTag::ACE_WEB, "SetDrawRect x : %{public}d, y : %{public}d, width : %{public}d, height : %{public}d",
6002 x, y, width, height);
6003 SetDrawRect(x, y, width, height);
6004 isNeedReDrawRect_ = true;
6005 }
6006
CalculateVerticalDrawRect()6007 void WebPattern::CalculateVerticalDrawRect()
6008 {
6009 fitContentOffset_ = OffsetF(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY());
6010 CHECK_NULL_VOID(renderSurface_);
6011 renderSurface_->SetWebOffset(fitContentOffset_.GetY());
6012 if (fitContentOffset_.GetY() >= 0) {
6013 if (isNeedReDrawRect_) {
6014 SetDrawRect(0, 0, drawRectWidth_, ADJUST_WEB_DRAW_LENGTH + ADJUST_WEB_DRAW_LENGTH);
6015 }
6016 isNeedReDrawRect_ = false;
6017 return;
6018 }
6019
6020 int32_t stepGear = (-fitContentOffset_.GetY()) / ADJUST_WEB_DRAW_LENGTH;
6021 int32_t width = std::min(static_cast<int32_t>(drawSize_.Width()), FIT_CONTENT_LIMIT_LENGTH);
6022 int32_t height = ADJUST_WEB_DRAW_LENGTH * 2 + stepGear;
6023 int32_t x = 0;
6024 int32_t y = ADJUST_WEB_DRAW_LENGTH * stepGear;
6025 renderSurface_->SetWebMessage({ 0, y });
6026 TAG_LOGD(AceLogTag::ACE_WEB, "SetDrawRect x : %{public}d, y : %{public}d, width : %{public}d, height : %{public}d",
6027 x, y, width, height);
6028 SetDrawRect(x, y, width, height);
6029 isNeedReDrawRect_ = true;
6030 }
6031
PostTaskToUI(const std::function<void ()> && task,const std::string & name) const6032 void WebPattern::PostTaskToUI(const std::function<void()>&& task, const std::string& name) const
6033 {
6034 CHECK_NULL_VOID(task);
6035 auto container = Container::Current();
6036 CHECK_NULL_VOID(container);
6037 auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
6038 CHECK_NULL_VOID(pipelineContext);
6039 auto taskExecutor = pipelineContext->GetTaskExecutor();
6040 CHECK_NULL_VOID(taskExecutor);
6041 taskExecutor->PostTask(task, TaskExecutor::TaskType::UI, name);
6042 }
6043
SetDrawRect(int32_t x,int32_t y,int32_t width,int32_t height)6044 void WebPattern::SetDrawRect(int32_t x, int32_t y, int32_t width, int32_t height)
6045 {
6046 if ((drawRectWidth_ == width) && (drawRectHeight_ == height)) {
6047 return;
6048 }
6049 drawRectWidth_ = width;
6050 drawRectHeight_ = height;
6051 CHECK_NULL_VOID(delegate_);
6052 delegate_->SetDrawRect(x, y, width, height);
6053 }
6054
GetPendingSizeStatus()6055 bool WebPattern::GetPendingSizeStatus()
6056 {
6057 if (delegate_) {
6058 return delegate_->GetPendingSizeStatus();
6059 }
6060 return false;
6061 }
6062
CreateNodePaintMethod()6063 RefPtr<NodePaintMethod> WebPattern::CreateNodePaintMethod()
6064 {
6065 auto paint = MakeRefPtr<WebPaintMethod>(renderSurface_);
6066 return paint;
6067 }
6068
JavaScriptOnDocumentStart(const ScriptItems & scriptItems)6069 void WebPattern::JavaScriptOnDocumentStart(const ScriptItems& scriptItems)
6070 {
6071 onDocumentStartScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6072 onDocumentStartScriptItemsByOrder_ = std::nullopt;
6073 if (delegate_) {
6074 UpdateJavaScriptOnDocumentStart();
6075 delegate_->JavaScriptOnDocumentStart();
6076 }
6077 }
6078
JavaScriptOnDocumentStartByOrder(const ScriptItems & scriptItems,const ScriptItemsByOrder & scriptItemsByOrder)6079 void WebPattern::JavaScriptOnDocumentStartByOrder(const ScriptItems& scriptItems,
6080 const ScriptItemsByOrder& scriptItemsByOrder)
6081 {
6082 onDocumentStartScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6083 onDocumentStartScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
6084 if (delegate_) {
6085 UpdateJavaScriptOnDocumentStartByOrder();
6086 delegate_->JavaScriptOnDocumentStartByOrder();
6087 }
6088 }
6089
JavaScriptOnDocumentEndByOrder(const ScriptItems & scriptItems,const ScriptItemsByOrder & scriptItemsByOrder)6090 void WebPattern::JavaScriptOnDocumentEndByOrder(const ScriptItems& scriptItems,
6091 const ScriptItemsByOrder& scriptItemsByOrder)
6092 {
6093 onDocumentEndScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6094 onDocumentEndScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
6095 EventRecorder::Get().FillWebJsCode(onDocumentEndScriptItems_);
6096 if (delegate_) {
6097 UpdateJavaScriptOnDocumentEndByOrder();
6098 delegate_->JavaScriptOnDocumentEndByOrder();
6099 }
6100 }
6101
JavaScriptOnHeadReadyByOrder(const ScriptItems & scriptItems,const ScriptItemsByOrder & scriptItemsByOrder)6102 void WebPattern::JavaScriptOnHeadReadyByOrder(const ScriptItems& scriptItems,
6103 const ScriptItemsByOrder& scriptItemsByOrder)
6104 {
6105 onHeadReadyScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6106 onHeadReadyScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
6107 if (delegate_) {
6108 UpdateJavaScriptOnHeadReadyByOrder();
6109 delegate_->JavaScriptOnHeadReadyByOrder();
6110 }
6111 }
6112
JavaScriptOnDocumentEnd(const ScriptItems & scriptItems)6113 void WebPattern::JavaScriptOnDocumentEnd(const ScriptItems& scriptItems)
6114 {
6115 onDocumentEndScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6116 onDocumentEndScriptItemsByOrder_ = std::nullopt;
6117 EventRecorder::Get().FillWebJsCode(onDocumentEndScriptItems_);
6118 if (delegate_) {
6119 UpdateJavaScriptOnDocumentEnd();
6120 delegate_->JavaScriptOnDocumentEnd();
6121 }
6122 }
6123
UpdateJavaScriptOnDocumentStart()6124 void WebPattern::UpdateJavaScriptOnDocumentStart()
6125 {
6126 if (delegate_ && onDocumentStartScriptItems_.has_value() && !onDocumentStartScriptItemsByOrder_.has_value()) {
6127 delegate_->SetJavaScriptItems(onDocumentStartScriptItems_.value(), ScriptItemType::DOCUMENT_START);
6128 onDocumentStartScriptItems_ = std::nullopt;
6129 }
6130 }
6131
UpdateJavaScriptOnDocumentStartByOrder()6132 void WebPattern::UpdateJavaScriptOnDocumentStartByOrder()
6133 {
6134 if (delegate_ && onDocumentStartScriptItems_.has_value() && onDocumentStartScriptItemsByOrder_.has_value()) {
6135 delegate_->SetJavaScriptItemsByOrder(onDocumentStartScriptItems_.value(), ScriptItemType::DOCUMENT_START,
6136 onDocumentStartScriptItemsByOrder_.value());
6137 onDocumentStartScriptItems_ = std::nullopt;
6138 onDocumentStartScriptItemsByOrder_ = std::nullopt;
6139 }
6140 }
6141
UpdateJavaScriptOnDocumentEndByOrder()6142 void WebPattern::UpdateJavaScriptOnDocumentEndByOrder()
6143 {
6144 if (delegate_ && onDocumentEndScriptItems_.has_value() && onDocumentEndScriptItemsByOrder_.has_value()) {
6145 delegate_->SetJavaScriptItemsByOrder(onDocumentEndScriptItems_.value(), ScriptItemType::DOCUMENT_END,
6146 onDocumentEndScriptItemsByOrder_.value());
6147 onDocumentEndScriptItems_ = std::nullopt;
6148 onDocumentEndScriptItemsByOrder_ = std::nullopt;
6149 }
6150 }
6151
UpdateJavaScriptOnHeadReadyByOrder()6152 void WebPattern::UpdateJavaScriptOnHeadReadyByOrder()
6153 {
6154 if (delegate_ && onHeadReadyScriptItems_.has_value() && onHeadReadyScriptItemsByOrder_.has_value()) {
6155 delegate_->SetJavaScriptItemsByOrder(onHeadReadyScriptItems_.value(), ScriptItemType::DOCUMENT_HEAD_READY,
6156 onHeadReadyScriptItemsByOrder_.value());
6157 onHeadReadyScriptItems_ = std::nullopt;
6158 onHeadReadyScriptItemsByOrder_ = std::nullopt;
6159 }
6160 }
6161
UpdateJavaScriptOnDocumentEnd()6162 void WebPattern::UpdateJavaScriptOnDocumentEnd()
6163 {
6164 if (delegate_ && onDocumentEndScriptItems_.has_value() && !onDocumentEndScriptItemsByOrder_.has_value()) {
6165 delegate_->SetJavaScriptItems(onDocumentEndScriptItems_.value(), ScriptItemType::DOCUMENT_END);
6166 onDocumentEndScriptItems_ = std::nullopt;
6167 }
6168 }
6169
GetAccessibilityNodeById(int64_t accessibilityId)6170 std::shared_ptr<NWeb::NWebAccessibilityNodeInfo> WebPattern::GetAccessibilityNodeById(int64_t accessibilityId)
6171 {
6172 if (!accessibilityState_) {
6173 return nullptr;
6174 }
6175 CHECK_NULL_RETURN(delegate_, nullptr);
6176 return delegate_->GetAccessibilityNodeInfoById(accessibilityId);
6177 }
6178
GetTransitionalNodeById(int64_t accessibilityId)6179 std::shared_ptr<NG::TransitionalNodeInfo> WebPattern::GetTransitionalNodeById(int64_t accessibilityId)
6180 {
6181 if (!accessibilityState_) {
6182 return nullptr;
6183 }
6184 CHECK_NULL_RETURN(delegate_, nullptr);
6185 auto accessNode = delegate_->GetAccessibilityNodeInfoById(accessibilityId);
6186 CHECK_NULL_RETURN(accessNode, nullptr);
6187 return std::make_shared<NG::TransitionalNodeInfo>(accessNode);
6188 }
6189
GetFocusedAccessibilityNode(int64_t accessibilityId,bool isAccessibilityFocus)6190 std::shared_ptr<NG::TransitionalNodeInfo> WebPattern::GetFocusedAccessibilityNode(
6191 int64_t accessibilityId, bool isAccessibilityFocus)
6192 {
6193 if (!accessibilityState_) {
6194 return nullptr;
6195 }
6196 CHECK_NULL_RETURN(delegate_, nullptr);
6197 auto accessNode = delegate_->GetFocusedAccessibilityNodeInfo(accessibilityId, isAccessibilityFocus);
6198 CHECK_NULL_RETURN(accessNode, nullptr);
6199 return std::make_shared<NG::TransitionalNodeInfo>(accessNode);
6200 }
6201
6202
GetAccessibilityNodeByFocusMove(int64_t accessibilityId,int32_t direction)6203 std::shared_ptr<NG::TransitionalNodeInfo> WebPattern::GetAccessibilityNodeByFocusMove(int64_t accessibilityId,
6204 int32_t direction)
6205 {
6206 if (!accessibilityState_) {
6207 return nullptr;
6208 }
6209 CHECK_NULL_RETURN(delegate_, nullptr);
6210 auto accessNode = delegate_->GetAccessibilityNodeInfoByFocusMove(accessibilityId, direction);
6211 CHECK_NULL_RETURN(accessNode, nullptr);
6212 return std::make_shared<NG::TransitionalNodeInfo>(accessNode);
6213 }
6214
ExecuteAction(int64_t accessibilityId,AceAction action,const std::map<std::string,std::string> & actionArguments) const6215 bool WebPattern::ExecuteAction(int64_t accessibilityId, AceAction action,
6216 const std::map<std::string, std::string>& actionArguments) const
6217 {
6218 CHECK_NULL_RETURN(delegate_, false);
6219 if (!accessibilityState_) {
6220 return false;
6221 }
6222 return delegate_->ExecuteAction(accessibilityId, action, actionArguments);
6223 }
6224
SetAccessibilityState(bool state,bool isDelayed)6225 void WebPattern::SetAccessibilityState(bool state, bool isDelayed)
6226 {
6227 CHECK_NULL_VOID(delegate_);
6228 focusedAccessibilityId_ = -1;
6229 if (!state) {
6230 if (!accessibilityState_ || inspectorAccessibilityEnable_ || textBlurAccessibilityEnable_) {
6231 return;
6232 }
6233 accessibilityState_ = state;
6234 delegate_->SetAccessibilityState(state, isDelayed);
6235 return;
6236 }
6237
6238 if (accessibilityState_ != state) {
6239 accessibilityState_ = state;
6240 delegate_->SetAccessibilityState(state, isDelayed);
6241 }
6242 }
6243
UpdateFocusedAccessibilityId(int64_t accessibilityId)6244 void WebPattern::UpdateFocusedAccessibilityId(int64_t accessibilityId)
6245 {
6246 if (!accessibilityState_) {
6247 return;
6248 }
6249 auto host = GetHost();
6250 CHECK_NULL_VOID(host);
6251 auto renderContext = host->GetRenderContext();
6252 CHECK_NULL_VOID(renderContext);
6253
6254 if (accessibilityId > 0) {
6255 focusedAccessibilityId_ = accessibilityId;
6256 } else if (focusedAccessibilityId_ == -1) {
6257 return;
6258 }
6259 RectT<int32_t> rect;
6260 if (focusedAccessibilityId_ <= 0) {
6261 focusedAccessibilityId_ = -1;
6262 renderContext->ResetAccessibilityFocusRect();
6263 renderContext->UpdateAccessibilityFocus(false);
6264 return;
6265 }
6266 if (GetAccessibilityFocusRect(rect, focusedAccessibilityId_)) {
6267 if (rect.Width() <= MIN_ACCESSIBILITY_FOCUS_SIZE || rect.Height() <= MIN_ACCESSIBILITY_FOCUS_SIZE) {
6268 renderContext->ResetAccessibilityFocusRect();
6269 renderContext->UpdateAccessibilityFocus(false);
6270 } else {
6271 renderContext->UpdateAccessibilityFocusRect(rect);
6272 renderContext->UpdateAccessibilityFocus(true);
6273 }
6274 } else {
6275 renderContext->ResetAccessibilityFocusRect();
6276 renderContext->UpdateAccessibilityFocus(false);
6277 }
6278 }
6279
ClearFocusedAccessibilityId()6280 void WebPattern::ClearFocusedAccessibilityId()
6281 {
6282 if (!accessibilityState_) {
6283 return;
6284 }
6285
6286 focusedAccessibilityId_ = -1;
6287 auto host = GetHost();
6288 CHECK_NULL_VOID(host);
6289 auto renderContext = host->GetRenderContext();
6290 CHECK_NULL_VOID(renderContext);
6291 renderContext->ResetAccessibilityFocusRect();
6292 renderContext->UpdateAccessibilityFocus(false);
6293 }
6294
GetSurfaceRSNode() const6295 std::shared_ptr<Rosen::RSNode> WebPattern::GetSurfaceRSNode() const
6296 {
6297 CHECK_NULL_RETURN(renderContextForSurface_, nullptr);
6298 auto rosenRenderContext = AceType::DynamicCast<NG::RosenRenderContext>(renderContextForSurface_);
6299 CHECK_NULL_RETURN(rosenRenderContext, nullptr);
6300 return rosenRenderContext->GetRSNode();
6301 }
6302
GetAccessibilityFocusRect(RectT<int32_t> & paintRect,int64_t accessibilityId) const6303 bool WebPattern::GetAccessibilityFocusRect(RectT<int32_t>& paintRect, int64_t accessibilityId) const
6304 {
6305 if (!accessibilityState_) {
6306 return false;
6307 }
6308 CHECK_NULL_RETURN(delegate_, false);
6309 int32_t rectWidth = 0;
6310 int32_t rectHeight = 0;
6311 int32_t rectX = 0;
6312 int32_t rectY = 0;
6313 bool result = delegate_->GetAccessibilityNodeRectById(accessibilityId, &rectWidth, &rectHeight, &rectX, &rectY);
6314 if (!result) {
6315 return false;
6316 }
6317
6318 paintRect.SetRect(rectX, rectY, rectWidth, rectHeight);
6319 return true;
6320 }
6321
SetTouchEventInfo(const TouchEvent & touchEvent,TouchEventInfo & touchEventInfo,const std::string & embedId)6322 void WebPattern::SetTouchEventInfo(const TouchEvent& touchEvent,
6323 TouchEventInfo& touchEventInfo, const std::string& embedId)
6324 {
6325 CHECK_NULL_VOID(delegate_);
6326 auto host = GetHost();
6327 CHECK_NULL_VOID(host);
6328 auto offset = host->GetTransformRelativeOffset();
6329
6330 TouchEventInfo tempTouchInfo = touchEventInfo_;
6331 if (touchEvent.type == TouchType::DOWN || touchEvent.type == TouchType::UP) {
6332 while (!touchEventQueue_.empty()) {
6333 if (touchEventQueue_.front().GetChangedTouches().front().GetFingerId() == touchEvent.id) {
6334 tempTouchInfo = touchEventQueue_.front();
6335 touchEventQueue_.pop();
6336 break;
6337 } else {
6338 touchEventQueue_.pop();
6339 }
6340 }
6341 }
6342 auto pos = delegate_->GetPosition(embedId);
6343 touchEventInfo.SetSourceDevice(tempTouchInfo.GetSourceDevice());
6344 touchEventInfo.SetTarget(tempTouchInfo.GetTarget());
6345 touchEventInfo.SetForce(tempTouchInfo.GetForce());
6346 touchEventInfo.SetSourceTool(tempTouchInfo.GetSourceTool());
6347 touchEventInfo.SetTargetDisplayId(tempTouchInfo.GetTargetDisplayId());
6348 touchEventInfo.SetDeviceId(tempTouchInfo.GetDeviceId());
6349
6350 TouchLocationInfo changedInfo("onTouch", touchEvent.id);
6351 changedInfo.SetLocalLocation(Offset(touchEvent.x, touchEvent.y));
6352 changedInfo.SetGlobalLocation(Offset(touchEvent.x + offset.GetX() + pos.GetX(),
6353 touchEvent.y + offset.GetY() + pos.GetY()));
6354 changedInfo.SetScreenLocation(Offset(touchEvent.x + offset.GetX() + pos.GetX(),
6355 touchEvent.y + offset.GetY() + pos.GetY()));
6356 changedInfo.SetTouchType(touchEvent.type);
6357
6358 SetTouchLocationInfo(touchEvent, changedInfo, tempTouchInfo, touchEventInfo);
6359
6360 touchEventInfo.AddChangedTouchLocationInfo(std::move(changedInfo));
6361 }
6362
SetTouchLocationInfo(const TouchEvent & touchEvent,const TouchLocationInfo & changedInfo,const TouchEventInfo & tempTouchInfo,TouchEventInfo & touchEventInfo)6363 void WebPattern::SetTouchLocationInfo(const TouchEvent& touchEvent, const TouchLocationInfo& changedInfo,
6364 const TouchEventInfo& tempTouchInfo, TouchEventInfo& touchEventInfo)
6365 {
6366 float scaleX = 0.0f;
6367 float scaleY = 0.0f;
6368 const std::list<TouchLocationInfo>& touchList = tempTouchInfo.GetTouches();
6369 for (const TouchLocationInfo& location : touchList) {
6370 if (touchEvent.id == location.GetFingerId()) {
6371 const OHOS::Ace::Offset& localLocation = location.GetLocalLocation();
6372 scaleX = localLocation.GetX() - touchEvent.x;
6373 scaleY = localLocation.GetY() - touchEvent.y;
6374 }
6375 }
6376 for (const TouchLocationInfo& location : touchList) {
6377 TouchLocationInfo info("onTouch", location.GetFingerId());
6378 if (touchEvent.id == location.GetFingerId()) {
6379 info.SetGlobalLocation(changedInfo.GetGlobalLocation());
6380 info.SetLocalLocation(changedInfo.GetLocalLocation());
6381 info.SetScreenLocation(changedInfo.GetScreenLocation());
6382 info.SetTouchType(changedInfo.GetTouchType());
6383 } else {
6384 const OHOS::Ace::Offset& localLocation = location.GetLocalLocation();
6385 const OHOS::Ace::Offset& globalLocation = location.GetGlobalLocation();
6386 const OHOS::Ace::Offset& screenLocation = location.GetScreenLocation();
6387 info.SetGlobalLocation(Offset(globalLocation.GetX() - scaleX, globalLocation.GetY() - scaleY));
6388 info.SetLocalLocation(Offset(localLocation.GetX() - scaleX, localLocation.GetY() - scaleY));
6389 info.SetScreenLocation(Offset(screenLocation.GetX() - scaleX, screenLocation.GetY() - scaleY));
6390 info.SetTouchType(location.GetTouchType());
6391 }
6392 touchEventInfo.AddTouchLocationInfo(std::move(info));
6393 }
6394 }
6395
RegisterVisibleAreaChangeCallback(const RefPtr<PipelineContext> & pipeline)6396 void WebPattern::RegisterVisibleAreaChangeCallback(const RefPtr<PipelineContext> &pipeline)
6397 {
6398 auto host = GetHost();
6399 CHECK_NULL_VOID(host);
6400 auto callback = [weak = WeakClaim(this)](bool visible, double ratio) {
6401 auto webPattern = weak.Upgrade();
6402 CHECK_NULL_VOID(webPattern);
6403 if (!visible && !NearZero(ratio)) {
6404 TAG_LOGI(AceLogTag::ACE_WEB, "Fiterate not visible when ratio=%{public}f", ratio);
6405 return;
6406 }
6407 webPattern->OnVisibleAreaChange(visible);
6408 };
6409 std::vector<double> ratioList = {0.0, 1.0};
6410 pipeline->AddVisibleAreaChangeNode(host, ratioList, callback, false, true);
6411 }
6412
GetWordSelection(const std::string & text,int8_t offset)6413 std::vector<int8_t> WebPattern::GetWordSelection(const std::string& text, int8_t offset)
6414 {
6415 // start sync task
6416 std::future<std::vector<int8_t>> future = std::async(std::launch::async, [text, offset]() {
6417 return DataDetectorMgr::GetInstance().GetWordSelection(text, offset);
6418 });
6419 // set timeout
6420 auto status = future.wait_for(std::chrono::milliseconds(AI_TIMEOUT_LIMIT));
6421 if (status == std::future_status::ready) {
6422 return future.get();
6423 } else {
6424 TAG_LOGE(AceLogTag::ACE_WEB, "WebPattern::GetWordSelection timeout! return default");
6425 return std::vector<int8_t> { -1, -1 };
6426 }
6427 }
6428
CheckSafeAreaIsExpand()6429 bool WebPattern::CheckSafeAreaIsExpand()
6430 {
6431 auto host = GetHost();
6432 CHECK_NULL_RETURN(host, false);
6433 auto layoutProperty = host->GetLayoutProperty();
6434 CHECK_NULL_RETURN(layoutProperty, false);
6435 auto &&opts = layoutProperty->GetSafeAreaExpandOpts();
6436 CHECK_NULL_RETURN(opts, false);
6437 if ((opts->type & SAFE_AREA_TYPE_SYSTEM) || (opts->type & SAFE_AREA_TYPE_KEYBOARD)) {
6438 return true;
6439 }
6440 return false;
6441 }
6442
CheckSafeAreaKeyBoard()6443 bool WebPattern::CheckSafeAreaKeyBoard()
6444 {
6445 auto host = GetHost();
6446 CHECK_NULL_RETURN(host, false);
6447 auto layoutProperty = host->GetLayoutProperty();
6448 CHECK_NULL_RETURN(layoutProperty, false);
6449 auto &&opts = layoutProperty->GetSafeAreaExpandOpts();
6450 CHECK_NULL_RETURN(opts, false);
6451 if ((opts->type & SAFE_AREA_TYPE_KEYBOARD) && (opts->edges & SAFE_AREA_EDGE_BOTTOM)) {
6452 TAG_LOGI(AceLogTag::ACE_WEB, "SafeArea type is KEYBOARD.");
6453 return true;
6454 }
6455 return false;
6456 }
6457
Backward()6458 bool WebPattern::Backward()
6459 {
6460 if (!delegate_) {
6461 TAG_LOGE(AceLogTag::ACE_WEB, "delegate is null");
6462 return false;
6463 }
6464 if (delegate_->AccessBackward()) {
6465 delegate_->Backward();
6466 return true;
6467 }
6468 return false;
6469 }
6470
SuggestionSelected(int32_t index)6471 void WebPattern::SuggestionSelected(int32_t index)
6472 {
6473 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::SuggestionSelected index:%{public}d", index);
6474 CHECK_NULL_VOID(delegate_);
6475 delegate_->SuggestionSelected(index);
6476 }
6477
OnShowAutofillPopup(const float offsetX,const float offsetY,const std::vector<std::string> & menu_items)6478 void WebPattern::OnShowAutofillPopup(
6479 const float offsetX, const float offsetY, const std::vector<std::string>& menu_items)
6480 {
6481 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnShowAutofillPopup");
6482 isShowAutofillPopup_ = true;
6483 auto host = GetHost();
6484 CHECK_NULL_VOID(host);
6485 auto id = host->GetId();
6486 std::vector<SelectParam> selectParam;
6487 for (auto& item : menu_items) {
6488 selectParam.push_back({ item, "" });
6489 }
6490 auto menu = MenuView::Create(selectParam, id, host->GetTag());
6491 auto context = PipelineContext::GetCurrentContext();
6492 CHECK_NULL_VOID(context);
6493 auto menuContainer = AceType::DynamicCast<FrameNode>(menu->GetChildAtIndex(0));
6494 CHECK_NULL_VOID(menuContainer);
6495 auto menuPattern = menuContainer->GetPattern<MenuPattern>();
6496 CHECK_NULL_VOID(menuPattern);
6497 auto options = menuPattern->GetOptions();
6498 for (auto &&option : options) {
6499 auto selectCallback = [weak = WeakClaim(this)](int32_t index) {
6500 auto webPattern = weak.Upgrade();
6501 CHECK_NULL_VOID(webPattern);
6502 webPattern->SuggestionSelected(index);
6503 };
6504 auto optionNode = AceType::DynamicCast<FrameNode>(option);
6505 if (optionNode) {
6506 auto hub = optionNode->GetEventHub<MenuItemEventHub>();
6507 auto optionPattern = optionNode->GetPattern<MenuItemPattern>();
6508 if (!hub || !optionPattern) {
6509 continue;
6510 }
6511 hub->SetOnSelect(std::move(selectCallback));
6512 optionNode->MarkModifyDone();
6513 }
6514 }
6515 auto overlayManager = context->GetOverlayManager();
6516 CHECK_NULL_VOID(overlayManager);
6517 auto offset = GetCoordinatePoint().value_or(OffsetF());
6518 offset.AddX(offsetX);
6519 offset.AddY(offsetY);
6520 menu->GetOrCreateFocusHub()->SetFocusable(false);
6521 overlayManager->DeleteMenu(id);
6522 overlayManager->ShowMenu(id, offset, menu);
6523 }
6524
OnShowAutofillPopupV2(const float offsetX,const float offsetY,const float height,const float width,const std::vector<std::string> & menu_items)6525 void WebPattern::OnShowAutofillPopupV2(
6526 const float offsetX, const float offsetY, const float height, const float width,
6527 const std::vector<std::string>& menu_items)
6528 {
6529 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnShowAutofillPopupV2");
6530 isShowAutofillPopup_ = true;
6531 auto host = GetHost();
6532 CHECK_NULL_VOID(host);
6533 std::vector<OptionParam> optionParam;
6534 for (auto& item : menu_items) {
6535 optionParam.push_back({ item, "", nullptr });
6536 }
6537 NG::MenuParam menuParam;
6538 menuParam.isShow = true;
6539 menuParam.setShow = true;
6540 menuParam.placement = Placement::BOTTOM_LEFT;
6541 menuParam.isShowInSubWindow = false;
6542 auto dataListNode = CreateDataListFrameNode(OffsetF(offsetX, offsetY), height, width);
6543 CHECK_NULL_VOID(dataListNode);
6544 auto menu = MenuView::Create(std::move(optionParam), dataListNode->GetId(), dataListNode->GetTag(),
6545 MenuType::MENU, menuParam);
6546 auto menuContainer = AceType::DynamicCast<FrameNode>(menu->GetChildAtIndex(0));
6547 CHECK_NULL_VOID(menuContainer);
6548 auto menuPattern = menuContainer->GetPattern<MenuPattern>();
6549 CHECK_NULL_VOID(menuPattern);
6550 auto options = menuPattern->GetOptions();
6551 for (auto &&option : options) {
6552 auto selectCallback = [weak = WeakClaim(this)](int32_t index) {
6553 auto webPattern = weak.Upgrade();
6554 CHECK_NULL_VOID(webPattern);
6555 webPattern->SuggestionSelected(index);
6556 };
6557 auto optionNode = AceType::DynamicCast<FrameNode>(option);
6558 if (optionNode) {
6559 auto hub = optionNode->GetEventHub<MenuItemEventHub>();
6560 auto optionPattern = optionNode->GetPattern<MenuItemPattern>();
6561 if (!hub || !optionPattern) {
6562 continue;
6563 }
6564 hub->SetOnSelect(std::move(selectCallback));
6565 optionNode->MarkModifyDone();
6566 }
6567 }
6568 auto context = dataListNode->GetContext();
6569 CHECK_NULL_VOID(context);
6570 auto overlayManager = context->GetOverlayManager();
6571 CHECK_NULL_VOID(overlayManager);
6572 menu->GetOrCreateFocusHub()->SetFocusable(false);
6573 overlayManager->ShowMenu(dataListNode->GetId(), OffsetF(), menu);
6574 }
6575
OnHideAutofillPopup()6576 void WebPattern::OnHideAutofillPopup()
6577 {
6578 if (!isShowAutofillPopup_) {
6579 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnHideAutofillPopup isShowAutofillPopup_ is null");
6580 return;
6581 }
6582 auto host = GetHost();
6583 CHECK_NULL_VOID(host);
6584 auto id = host->GetId();
6585 auto context = PipelineContext::GetCurrentContext();
6586 CHECK_NULL_VOID(context);
6587 auto overlayManager = context->GetOverlayManager();
6588 CHECK_NULL_VOID(overlayManager);
6589 overlayManager->DeleteMenu(id);
6590 RemoveDataListNode();
6591 isShowAutofillPopup_ = false;
6592 }
6593
CreateDataListFrameNode(const OffsetF & offfset,const float height,const float width)6594 RefPtr<FrameNode> WebPattern::CreateDataListFrameNode(const OffsetF& offfset, const float height, const float width)
6595 {
6596 RemoveDataListNode();
6597 auto host = GetHost();
6598 CHECK_NULL_RETURN(host, nullptr);
6599 auto pipeline = host->GetContextRefPtr();
6600 CHECK_NULL_RETURN(host, nullptr);
6601 dataListNodeId_ = ElementRegister::GetInstance()->MakeUniqueId();
6602 auto dataListNode = FrameNode::GetOrCreateFrameNode(
6603 V2::IMAGE_ETS_TAG, dataListNodeId_.value(), []() { return AceType::MakeRefPtr<ImagePattern>(); });
6604 CHECK_NULL_RETURN(dataListNode, nullptr);
6605 auto dataListRenderContext = dataListNode->GetRenderContext();
6606 CHECK_NULL_RETURN(dataListRenderContext, nullptr);
6607 auto dataListGesture = dataListNode->GetOrCreateGestureEventHub();
6608 CHECK_NULL_RETURN(dataListGesture, nullptr);
6609
6610 dataListNode->SetDraggable(false);
6611 dataListGesture->SetDragEvent(nullptr, { PanDirection::DOWN }, 0, Dimension(0));
6612
6613 if (width <= 0 || height <= 0) {
6614 TAG_LOGI(AceLogTag::ACE_WEB, "CreateDataListFrameNode get size(%{public}f, %{public}f) error",
6615 width, height);
6616 return nullptr;
6617 }
6618 dataListRenderContext->UpdatePosition(
6619 OffsetT<Dimension>(Dimension(offfset.GetX()), Dimension(offfset.GetY() - height)));
6620
6621 SizeF dataListSize;
6622 dataListSize.SetWidth(width);
6623 dataListSize.SetHeight(height / pipeline->GetDipScale());
6624 auto dataListProperty = dataListNode->GetLayoutProperty<ImageLayoutProperty>();
6625 dataListProperty->UpdateMarginSelfIdealSize(dataListSize);
6626 MeasureProperty layoutConstraint;
6627 CalcSize idealSize = { CalcLength(Dimension(dataListSize.Width(), DimensionUnit::VP).ConvertToPx()),
6628 CalcLength(Dimension(dataListSize.Height(), DimensionUnit::VP).ConvertToPx()) };
6629 layoutConstraint.selfIdealSize = idealSize;
6630 layoutConstraint.maxSize = idealSize;
6631 dataListNode->UpdateLayoutConstraint(layoutConstraint);
6632 host->AddChild(dataListNode);
6633 dataListNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
6634 dataListNode->MarkModifyDone();
6635 host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
6636 host->MarkModifyDone();
6637 return dataListNode;
6638 }
6639
RemoveDataListNode()6640 void WebPattern::RemoveDataListNode()
6641 {
6642 if (!dataListNodeId_.has_value()) {
6643 return;
6644 }
6645 TAG_LOGI(AceLogTag::ACE_WEB, "RemoveDataListNode");
6646 auto dataListNode = FrameNode::GetFrameNode(V2::IMAGE_ETS_TAG, dataListNodeId_.value());
6647 CHECK_NULL_VOID(dataListNode);
6648 auto context = dataListNode->GetContext();
6649 CHECK_NULL_VOID(context);
6650 auto overlayManager = context->GetOverlayManager();
6651 CHECK_NULL_VOID(overlayManager);
6652 overlayManager->DeleteMenu(dataListNode->GetId());
6653
6654 auto parent = dataListNode->GetParent();
6655 CHECK_NULL_VOID(parent);
6656 parent->RemoveChild(dataListNode);
6657 dataListNodeId_.reset();
6658 parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
6659 }
6660
CloseKeyboard()6661 void WebPattern::CloseKeyboard()
6662 {
6663 InputMethodManager::GetInstance()->CloseKeyboard();
6664 }
6665
GetWebInfoType()6666 WebInfoType WebPattern::GetWebInfoType()
6667 {
6668 std::string factoryLevel;
6669 if (delegate_) {
6670 factoryLevel = delegate_->GetWebInfoType();
6671 }
6672 if (factoryLevel == WEB_INFO_PHONE || factoryLevel == WEB_INFO_DEFAULT) {
6673 return WebInfoType::TYPE_MOBILE;
6674 } else if (factoryLevel == WEB_INFO_TABLET) {
6675 return WebInfoType::TYPE_TABLET;
6676 } else if (factoryLevel == WEB_INFO_PC) {
6677 return WebInfoType::TYPE_2IN1;
6678 }
6679 return WebInfoType::TYPE_UNKNOWN;
6680 }
6681
JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue> & jsonNode,WebAccessibilityType key,bool value)6682 void WebPattern::JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue>& jsonNode,
6683 WebAccessibilityType key, bool value)
6684 {
6685 if (!value) {
6686 return;
6687 }
6688 jsonNode->Put(EnumTypeToString(key).c_str(), 1);
6689 }
6690
JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue> & jsonNode,WebAccessibilityType key,std::string value)6691 void WebPattern::JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue>& jsonNode,
6692 WebAccessibilityType key, std::string value)
6693 {
6694 if (value.empty()) {
6695 return;
6696 }
6697 jsonNode->Put(EnumTypeToString(key).c_str(), value.c_str());
6698 }
6699
JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue> & jsonNode,WebAccessibilityType key,int32_t value,int32_t defaultValue)6700 void WebPattern::JsonNodePutDefaultValue(std::unique_ptr<OHOS::Ace::JsonValue>& jsonNode,
6701 WebAccessibilityType key, int32_t value, int32_t defaultValue)
6702 {
6703 if (value == defaultValue) {
6704 return;
6705 }
6706 jsonNode->Put(EnumTypeToString(key).c_str(), value);
6707 }
6708
EnumTypeToString(WebAccessibilityType type)6709 std::string WebPattern::EnumTypeToString(WebAccessibilityType type)
6710 {
6711 return std::to_string(static_cast<int>(type));
6712 }
6713
VectorIntToString(std::vector<int64_t> && vec)6714 std::string WebPattern::VectorIntToString(std::vector<int64_t>&& vec)
6715 {
6716 std::string vecStr;
6717 uint32_t vecLen = vec.size();
6718 if (vecLen < 1) {
6719 return vecStr;
6720 }
6721
6722 for (uint32_t i = 0; i < vecLen - 1; ++i) {
6723 vecStr += std::to_string(vec[i]) + " ";
6724 }
6725 return vecStr + std::to_string(vec[vecLen - 1]);
6726 }
6727
WebNodeInfoToJsonValue(std::shared_ptr<OHOS::Ace::JsonValue> & jsonNodeArray,std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> webNodeInfo,std::string & nodeTag)6728 void WebPattern::WebNodeInfoToJsonValue(std::shared_ptr<OHOS::Ace::JsonValue>& jsonNodeArray,
6729 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> webNodeInfo, std::string& nodeTag)
6730 {
6731 auto jsonNode = JsonUtil::Create(true);
6732 jsonNode->Put(WEB_NODE_URL, delegate_ ? delegate_->GetUrl().c_str() : "");
6733 jsonNode->Put(EnumTypeToString(WebAccessibilityType::ID).c_str(), webNodeInfo->GetAccessibilityId());
6734 if (webNodeInfo->GetSelectionEnd() != 0) {
6735 jsonNode->Put(EnumTypeToString(WebAccessibilityType::SEL_START).c_str(), webNodeInfo->GetSelectionStart());
6736 jsonNode->Put(EnumTypeToString(WebAccessibilityType::SEL_END).c_str(), webNodeInfo->GetSelectionEnd());
6737 }
6738 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::INPUT_TYPE, webNodeInfo->GetInputType(), -1);
6739 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::LIVE_REGION, webNodeInfo->GetLiveRegion(), -1);
6740 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::HINT, webNodeInfo->GetHint());
6741 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::CONTENT, webNodeInfo->GetContent());
6742 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::ERROR, webNodeInfo->GetError());
6743 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::CHILD_IDS, VectorIntToString(webNodeInfo->GetChildIds()));
6744 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::PARENT_ID, webNodeInfo->GetParentId(), -1);
6745 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_ROWS, webNodeInfo->GetGridRows(), -1);
6746 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_COLS, webNodeInfo->GetGridColumns(), -1);
6747 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_SEL_MODE, webNodeInfo->GetGridSelectedMode(), -1);
6748 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_ITEM_ROW, webNodeInfo->GetGridItemRow(), -1);
6749 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_ITEM_ROW_SPAN, webNodeInfo->GetGridItemRowSpan(), -1);
6750 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_ITEM_COL, webNodeInfo->GetGridItemColumn(), -1);
6751 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::GRID_ITEM_COL_SPAN,
6752 webNodeInfo->GetGridItemColumnSpan(), -1);
6753 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::PAGE_ID, webNodeInfo->GetPageId(), -1);
6754
6755 if (webNodeInfo->GetRectWidth() != 0 || webNodeInfo->GetRectHeight() != 0) {
6756 jsonNode->Put(EnumTypeToString(WebAccessibilityType::RECTX).c_str(), webNodeInfo->GetRectX());
6757 jsonNode->Put(EnumTypeToString(WebAccessibilityType::RECTY).c_str(), webNodeInfo->GetRectY());
6758 jsonNode->Put(EnumTypeToString(WebAccessibilityType::RECT_WIDTH).c_str(), webNodeInfo->GetRectWidth());
6759 jsonNode->Put(EnumTypeToString(WebAccessibilityType::RECT_HEIGHT).c_str(), webNodeInfo->GetRectHeight());
6760 }
6761
6762 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::HEADING, webNodeInfo->GetIsHeading());
6763 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::CHECKED, webNodeInfo->GetIsChecked());
6764 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::EDITABLE, webNodeInfo->GetIsEditable());
6765 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::ENABLED, webNodeInfo->GetIsEnabled());
6766 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::FOCUSED, webNodeInfo->GetIsFocused());
6767 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::SELECTED, webNodeInfo->GetIsSelected());
6768 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::CHECKABLE, webNodeInfo->GetIsCheckable());
6769 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::CLICKABLE, webNodeInfo->GetIsClickable());
6770 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::FOCUSABLE, webNodeInfo->GetIsFocusable());
6771 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::SCROLLABLE, webNodeInfo->GetIsScrollable());
6772 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::PASSWORD, webNodeInfo->GetIsPassword());
6773 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::VISIBLE, webNodeInfo->GetIsVisible());
6774 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::PLURAL_LINE, webNodeInfo->GetIsPluralLineSupported());
6775 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::POPUP, webNodeInfo->GetIsPopupSupported());
6776 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::DELETABLE, webNodeInfo->GetIsDeletable());
6777 JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::FOCUS, webNodeInfo->GetIsAccessibilityFocus());
6778 jsonNodeArray->PutRef(nodeTag.c_str(), std::move(jsonNode));
6779 }
6780
GetWebAllInfosImpl(WebNodeInfoCallback cb,int32_t webId)6781 void WebPattern::GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId)
6782 {
6783 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> rootWebNode;
6784 if (delegate_) {
6785 rootWebNode = delegate_->GetAccessibilityNodeInfoById(-1);
6786 }
6787 CHECK_NULL_VOID(rootWebNode);
6788
6789 auto jsonNodeArray = static_cast<std::shared_ptr<JsonValue> >(JsonUtil::Create(true));
6790 std::queue<uint64_t> que;
6791 for (auto id: rootWebNode->GetChildIds()) {
6792 que.push(id);
6793 }
6794
6795 int nodeCount = 0;
6796 while (!que.empty()) {
6797 uint64_t tmp = que.front();
6798 que.pop();
6799 auto webNodeInfo = delegate_->GetAccessibilityNodeInfoById(tmp);
6800 CHECK_NULL_VOID(webNodeInfo);
6801 auto componentType = webNodeInfo->GetComponentType();
6802 if (componentType.compare(ACCESSIBILITY_GENERIC_CONTAINER) != 0
6803 && componentType.compare(ACCESSIBILITY_PARAGRAPH) != 0
6804 && componentType.compare(ACCESSIBILITY_IMAGE) != 0) {
6805 WebNodeInfoToJsonValue(jsonNodeArray, webNodeInfo, componentType);
6806 }
6807 for (auto id: webNodeInfo->GetChildIds()) {
6808 que.push(id);
6809 }
6810 nodeCount++;
6811 }
6812 TAG_LOGD(AceLogTag::ACE_WEB, "Current web info node count: %{public}d", nodeCount);
6813 cb(jsonNodeArray, webId);
6814 inspectorAccessibilityEnable_ = false;
6815 SetAccessibilityState(false);
6816 }
6817
GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb,int32_t webId)6818 void WebPattern::GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t webId)
6819 {
6820 CHECK_NULL_VOID(cb);
6821 inspectorAccessibilityEnable_ = true;
6822 SetAccessibilityState(true);
6823 auto host = GetHost();
6824 CHECK_NULL_VOID(host);
6825 auto pipelineContext = host->GetContext();
6826 CHECK_NULL_VOID(pipelineContext);
6827 auto taskExecutor = pipelineContext->GetTaskExecutor();
6828 taskExecutor->PostDelayedTask([weak = WeakClaim(this), cb, webId] () {
6829 auto pattern = weak.Upgrade();
6830 auto startTime = std::chrono::high_resolution_clock::now();
6831 pattern->GetWebAllInfosImpl(cb, webId);
6832 auto nowTime = std::chrono::high_resolution_clock::now();
6833 std::chrono::duration<double, std::milli> diff =
6834 std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - startTime);
6835 TAG_LOGD(AceLogTag::ACE_WEB, "GetAllAccessibilityInfo time cost: %{public}f", diff.count());
6836 },
6837 TaskExecutor::TaskType::UI, WEB_ACCESSIBILITY_DELAY_TIME, "GetAllWebAccessibilityNodeInfos");
6838 }
6839
RegisterWebComponentClickCallback(WebComponentClickCallback && callback)6840 void WebPattern::RegisterWebComponentClickCallback(WebComponentClickCallback&& callback)
6841 {
6842 CHECK_NULL_VOID(callback);
6843 webComponentClickCallback_ = std::move(callback);
6844 textBlurAccessibilityEnable_ = true;
6845 SetAccessibilityState(true);
6846 }
6847
UnregisterWebComponentClickCallback()6848 void WebPattern::UnregisterWebComponentClickCallback()
6849 {
6850 webComponentClickCallback_ = nullptr;
6851 textBlurAccessibilityEnable_ = false;
6852 SetAccessibilityState(false);
6853 }
6854
IsCurrentFocus()6855 bool WebPattern::IsCurrentFocus()
6856 {
6857 auto host = GetHost();
6858 CHECK_NULL_RETURN(host, false);
6859 auto eventHub = host->GetEventHub<WebEventHub>();
6860 CHECK_NULL_RETURN(eventHub, false);
6861 auto focusHub = eventHub->GetOrCreateFocusHub();
6862 CHECK_NULL_RETURN(focusHub, false);
6863
6864 return focusHub->IsCurrentFocus();
6865 }
6866
OnRebuildFrame()6867 void WebPattern::OnRebuildFrame()
6868 {
6869 auto host = GetHost();
6870 CHECK_NULL_VOID(host);
6871 auto renderContext = host->GetRenderContext();
6872 CHECK_NULL_VOID(renderContext);
6873 CHECK_NULL_VOID(renderContextForSurface_);
6874 renderContext->AddChild(renderContextForSurface_, 0);
6875 CHECK_NULL_VOID(renderContextForPopupSurface_);
6876 if (SystemProperties::GetDeviceType() == DeviceType::TWO_IN_ONE) {
6877 renderContext->AddChild(renderContextForPopupSurface_, 1);
6878 }
6879 }
6880
CreateOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,int offsetX,int offsetY,int rectWidth,int rectHeight,int pointX,int pointY)6881 void WebPattern::CreateOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap, int offsetX, int offsetY, int rectWidth,
6882 int rectHeight, int pointX, int pointY)
6883 {
6884 if (!imageAnalyzerManager_) {
6885 imageAnalyzerManager_ = std::make_shared<ImageAnalyzerManager>(GetHost(), ImageAnalyzerHolder::WEB);
6886 }
6887 TAG_LOGI(AceLogTag::ACE_WEB,
6888 "CreateOverlay, offsetX=%{public}d, offsetY=%{public}d, width=%{public}d, height=%{public}d", offsetX, offsetY,
6889 rectWidth, rectHeight);
6890 auto callback = [weak = AceType::WeakClaim(this)]() {
6891 auto webPattern = weak.Upgrade();
6892 CHECK_NULL_VOID(webPattern);
6893 webPattern->OnTextSelected();
6894 };
6895 imageAnalyzerManager_->DestroyAnalyzerOverlay();
6896 awaitingOnTextSelected_ = true;
6897 auto selectedTask = [weak = AceType::WeakClaim(this)](bool isSelected) {
6898 auto webPattern = weak.Upgrade();
6899 CHECK_NULL_VOID(webPattern);
6900 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::CreateOverlay selectedTask=%{public}d", isSelected);
6901 webPattern->SetImageOverlaySelectedStatus(isSelected);
6902 if (isSelected) {
6903 webPattern->CloseSelectOverlay();
6904 webPattern->SelectCancel();
6905 webPattern->OnTextSelected();
6906 CHECK_NULL_VOID(webPattern->delegate_);
6907 webPattern->delegate_->OnContextMenuHide("");
6908 }
6909 };
6910 imageAnalyzerManager_->SetNotifySelectedCallback(std::move(selectedTask));
6911 imageAnalyzerManager_->UpdatePressOverlay(
6912 pixelMap, offsetX, offsetY, rectWidth, rectHeight, pointX, pointY, std::move(callback));
6913 imageAnalyzerManager_->CreateAnalyzerOverlay(nullptr);
6914 }
6915
OnOverlayStateChanged(int offsetX,int offsetY,int rectWidth,int rectHeight)6916 void WebPattern::OnOverlayStateChanged(int offsetX, int offsetY, int rectWidth, int rectHeight)
6917 {
6918 if (imageAnalyzerManager_) {
6919 TAG_LOGI(AceLogTag::ACE_WEB,
6920 "OnOverlayStateChanged, offsetX=%{public}d, offsetY=%{public}d, width=%{public}d, height=%{public}d",
6921 offsetX, offsetY, rectWidth, rectHeight);
6922 if (!rectWidth || !rectHeight) {
6923 TAG_LOGE(AceLogTag::ACE_WEB, "OnOverlayStateChanged failed: rect is empty, begin to destroy overlay");
6924 DestroyAnalyzerOverlay();
6925 return;
6926 }
6927 imageAnalyzerManager_->UpdateOverlayStatus(true, offsetX, offsetY, rectWidth, rectHeight);
6928 }
6929 }
6930
OnTextSelected()6931 void WebPattern::OnTextSelected()
6932 {
6933 if (!awaitingOnTextSelected_) {
6934 TAG_LOGD(AceLogTag::ACE_WEB, "OnTextSelected already called, ignored.");
6935 return;
6936 }
6937 awaitingOnTextSelected_ = false;
6938 CHECK_NULL_VOID(delegate_);
6939 delegate_->OnTextSelected();
6940 overlayCreating_ = true;
6941 }
6942
DestroyAnalyzerOverlay()6943 void WebPattern::DestroyAnalyzerOverlay()
6944 {
6945 if (imageAnalyzerManager_ && imageAnalyzerManager_->IsOverlayCreated()) {
6946 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::DestroyAnalyzerOverlay");
6947 imageAnalyzerManager_->DestroyAnalyzerOverlay();
6948 delegate_->OnDestroyImageAnalyzerOverlay();
6949 }
6950 overlayCreating_ = false;
6951 imageOverlayIsSelected_ = false;
6952 awaitingOnTextSelected_ = false;
6953 }
6954
OnAccessibilityHoverEvent(const PointF & point)6955 bool WebPattern::OnAccessibilityHoverEvent(const PointF& point)
6956 {
6957 CHECK_NULL_RETURN(delegate_, false);
6958 auto host = GetHost();
6959 CHECK_NULL_RETURN(host, false);
6960 auto pipelineContext = host->GetContextRefPtr();
6961 CHECK_NULL_RETURN(pipelineContext, false);
6962 auto viewScale = pipelineContext->GetViewScale();
6963 int32_t globalX = static_cast<int32_t>(point.GetX()) * viewScale;
6964 int32_t globalY = static_cast<int32_t>(point.GetY()) * viewScale;
6965 auto offset = GetCoordinatePoint().value_or(OffsetF());
6966 globalX = static_cast<int32_t>(globalX - offset.GetX());
6967 globalY = static_cast<int32_t>(globalY - offset.GetY());
6968 delegate_->HandleAccessibilityHoverEvent(globalX, globalY);
6969 return true;
6970 }
6971
RegisterTextBlurCallback(TextBlurCallback && callback)6972 void WebPattern::RegisterTextBlurCallback(TextBlurCallback&& callback)
6973 {
6974 CHECK_NULL_VOID(callback);
6975 textBlurCallback_ = std::move(callback);
6976 textBlurAccessibilityEnable_ = true;
6977 SetAccessibilityState(true);
6978 }
6979
UnRegisterTextBlurCallback()6980 void WebPattern::UnRegisterTextBlurCallback()
6981 {
6982 textBlurCallback_ = nullptr;
6983 textBlurAccessibilityEnable_ = false;
6984 SetAccessibilityState(false);
6985 }
6986
InitMagnifier()6987 void WebPattern::InitMagnifier()
6988 {
6989 TAG_LOGI(AceLogTag::ACE_WEB, "InitMagnifier");
6990 if (!magnifierController_) {
6991 magnifierController_ = MakeRefPtr<MagnifierController>(WeakClaim(this));
6992 }
6993 }
6994
InitializeAccessibility()6995 void WebPattern::InitializeAccessibility()
6996 {
6997 ContainerScope scope(instanceId_);
6998 if (accessibilityChildTreeCallback_.find(instanceId_) != accessibilityChildTreeCallback_.end()) {
6999 return;
7000 }
7001 auto frameNode = frameNode_.Upgrade();
7002 CHECK_NULL_VOID(frameNode);
7003 int64_t accessibilityId = frameNode->GetAccessibilityId();
7004 auto pipeline = PipelineContext::GetCurrentContext();
7005 CHECK_NULL_VOID(pipeline);
7006 auto accessibilityManager = pipeline->GetAccessibilityManager();
7007 CHECK_NULL_VOID(accessibilityManager);
7008 accessibilityChildTreeCallback_[instanceId_] = std::make_shared<WebAccessibilityChildTreeCallback>(
7009 WeakClaim(this), frameNode->GetAccessibilityId());
7010 accessibilityManager->RegisterAccessibilityChildTreeCallback(accessibilityId,
7011 accessibilityChildTreeCallback_[instanceId_]);
7012 if (accessibilityManager->IsRegister()) {
7013 accessibilityChildTreeCallback_[instanceId_]->SetIsDelayed(true);
7014 accessibilityChildTreeCallback_[instanceId_]->OnRegister(pipeline->GetWindowId(),
7015 accessibilityManager->GetTreeId());
7016 }
7017 }
7018
UninitializeAccessibility()7019 void WebPattern::UninitializeAccessibility()
7020 {
7021 ContainerScope scope(instanceId_);
7022 auto frameNode = frameNode_.Upgrade();
7023 CHECK_NULL_VOID(frameNode);
7024 int64_t accessibilityId = frameNode->GetAccessibilityId();
7025 auto pipeline = PipelineContext::GetCurrentContext();
7026 CHECK_NULL_VOID(pipeline);
7027 auto accessibilityManager = pipeline->GetAccessibilityManager();
7028 CHECK_NULL_VOID(accessibilityManager);
7029 if (accessibilityManager->IsRegister()) {
7030 if (accessibilityChildTreeCallback_.find(instanceId_) == accessibilityChildTreeCallback_.end() ||
7031 accessibilityChildTreeCallback_[instanceId_] == nullptr) {
7032 return;
7033 }
7034 accessibilityChildTreeCallback_[instanceId_]->OnDeregister();
7035 }
7036 accessibilityManager->DeregisterAccessibilityChildTreeCallback(accessibilityId);
7037 accessibilityChildTreeCallback_.erase(instanceId_);
7038 }
7039
OnSetAccessibilityChildTree(int32_t childWindowId,int32_t childTreeId)7040 void WebPattern::OnSetAccessibilityChildTree(int32_t childWindowId, int32_t childTreeId)
7041 {
7042 treeId_ = childTreeId;
7043 auto frameNode = frameNode_.Upgrade();
7044 CHECK_NULL_VOID(frameNode);
7045 auto accessibilityProperty = frameNode->GetAccessibilityProperty<AccessibilityProperty>();
7046 if (accessibilityProperty != nullptr) {
7047 accessibilityProperty->SetChildWindowId(childWindowId);
7048 accessibilityProperty->SetChildTreeId(childTreeId);
7049 }
7050 }
7051
OnAccessibilityChildTreeRegister()7052 bool WebPattern::OnAccessibilityChildTreeRegister()
7053 {
7054 ContainerScope scope(instanceId_);
7055 auto pipeline = PipelineContext::GetCurrentContext();
7056 CHECK_NULL_RETURN(pipeline, false);
7057 auto accessibilityManager = pipeline->GetAccessibilityManager();
7058 CHECK_NULL_RETURN(accessibilityManager, false);
7059 auto frameNode = frameNode_.Upgrade();
7060 CHECK_NULL_RETURN(frameNode, false);
7061 int64_t accessibilityId = frameNode->GetAccessibilityId();
7062 return accessibilityManager->RegisterWebInteractionOperationAsChildTree(accessibilityId, WeakClaim(this));
7063 }
7064
OnAccessibilityChildTreeDeregister()7065 bool WebPattern::OnAccessibilityChildTreeDeregister()
7066 {
7067 ContainerScope scope(instanceId_);
7068 auto pipeline = PipelineContext::GetCurrentContext();
7069 CHECK_NULL_RETURN(pipeline, false);
7070 auto accessibilityManager = pipeline->GetAccessibilityManager();
7071 CHECK_NULL_RETURN(accessibilityManager, false);
7072 return accessibilityManager->DeregisterWebInteractionOperationAsChildTree(treeId_);
7073 }
7074
GetActiveStatus() const7075 bool WebPattern::GetActiveStatus() const
7076 {
7077 return isActive_;
7078 }
7079
GetBufferSizeByDeviceType()7080 int32_t WebPattern::GetBufferSizeByDeviceType()
7081 {
7082 return (SystemProperties::GetDeviceType() == DeviceType::PHONE) ? ASYNC_SURFACE_QUEUE_SIZE_FOR_PHONE :
7083 ASYNC_SURFACE_QUEUE_SIZE_FOR_OTHERS;
7084 }
7085
StartVibraFeedback(const std::string & vibratorType)7086 void WebPattern::StartVibraFeedback(const std::string& vibratorType)
7087 {
7088 if (isEnabledHapticFeedback_) {
7089 NG::VibratorUtils::StartVibraFeedback(vibratorType);
7090 }
7091 }
7092
UpdateTouchpadSlidingStatus(const GestureEvent & event)7093 void WebPattern::UpdateTouchpadSlidingStatus(const GestureEvent& event)
7094 {
7095 isTouchpadSliding_ = false;
7096 if ((event.GetInputEventType() == InputEventType::AXIS) &&
7097 (event.GetSourceTool() == SourceTool::TOUCHPAD)) {
7098 isTouchpadSliding_ = true;
7099 }
7100 }
7101
CloseImageOverlaySelection()7102 bool WebPattern::CloseImageOverlaySelection()
7103 {
7104 if (imageOverlayIsSelected_) {
7105 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::CloseImageOverlaySelection");
7106 DestroyAnalyzerOverlay();
7107 return true;
7108 }
7109 return false;
7110 }
7111
SetDrawSize(double width,double height)7112 void WebPattern::SetDrawSize(double width, double height)
7113 {
7114 drawSize_.SetWidth(width);
7115 drawSize_.SetHeight(height);
7116 }
7117
OnParentScrollDragEndRecursive(RefPtr<NestableScrollContainer> parent)7118 void WebPattern::OnParentScrollDragEndRecursive(RefPtr<NestableScrollContainer> parent)
7119 {
7120 if (isDragEnd_) {
7121 return;
7122 }
7123 if (parent) {
7124 TAG_LOGI(AceLogTag::ACE_WEB, "WebPattern::OnParentScrollDragEndRecursive");
7125 parent->OnScrollDragEndRecursive();
7126 }
7127 isDragEnd_ = true;
7128 }
7129
GetAccessibilityVisible(int64_t accessibilityId)7130 bool WebPattern::GetAccessibilityVisible(int64_t accessibilityId)
7131 {
7132 if (delegate_) {
7133 return delegate_->GetAccessibilityVisible(accessibilityId);
7134 }
7135 return true;
7136 }
7137
DumpInfo()7138 void WebPattern::DumpInfo()
7139 {
7140 float totalSize = DumpGpuInfo();
7141 if (totalSize > GPU_SERIOUS_ABNORMAL_VALUE) {
7142 totalSize = totalSize / SIZE_UNIT / SIZE_UNIT; // 转换成MB
7143 } else if (totalSize > GPU_ABNORMAL_VALUE) {
7144 totalSize = totalSize / SIZE_UNIT;
7145 }
7146 totalSize = std::round(totalSize * FLOAT_UNIT) / FLOAT_UNIT; // 变为浮点数
7147 // 使用ostringstream来格式化数字为字符串
7148 std::ostringstream oss;
7149 oss << std::fixed << std::setprecision(DECIMAL_POINTS) << totalSize; // 转换成保留两位小数的字符串
7150 std::string formattedSize = oss.str(); // 获取格式化后的字符串
7151 DumpLog::GetInstance().Print("------------GpuMemoryInfo-----------");
7152 DumpLog::GetInstance().Print("Total Gpu Memory size: " + formattedSize + "(MB)");
7153 }
7154
DumpGpuInfo()7155 float WebPattern::DumpGpuInfo()
7156 {
7157 if (delegate_ != nullptr) {
7158 if (delegate_->GetNweb() != nullptr) {
7159 float totalSize = delegate_->GetNweb()->DumpGpuInfo();
7160 return totalSize;
7161 }
7162 }
7163 return 0;
7164 }
7165
GetWebEventHub()7166 RefPtr<WebEventHub> WebPattern::GetWebEventHub()
7167 {
7168 return GetEventHub<WebEventHub>();
7169 }
7170
OnOptimizeParserBudgetEnabledUpdate(bool value)7171 void WebPattern::OnOptimizeParserBudgetEnabledUpdate(bool value)
7172 {
7173 if (delegate_) {
7174 delegate_->UpdateOptimizeParserBudgetEnabled(value);
7175 }
7176 }
7177
OnWebMediaAVSessionEnabledUpdate(bool enable)7178 void WebPattern::OnWebMediaAVSessionEnabledUpdate(bool enable)
7179 {
7180 if (delegate_) {
7181 delegate_->UpdateWebMediaAVSessionEnabled(enable);
7182 }
7183 }
7184
PushOverlayInfo(float x,float y,int32_t id)7185 void WebPattern::PushOverlayInfo(float x, float y, int32_t id)
7186 {
7187 TouchInfo touchPoint;
7188 touchPoint.id = id;
7189 touchPoint.x = x;
7190 touchPoint.y = y;
7191 touchOverlayInfo_.push_back(touchPoint);
7192 }
7193
UpdateImageOverlayTouchInfo(int touchPointX,int touchPointY,TouchType touchType)7194 void WebPattern::UpdateImageOverlayTouchInfo(int touchPointX, int touchPointY, TouchType touchType)
7195 {
7196 if (overlayCreating_) {
7197 imageAnalyzerManager_->UpdateOverlayTouchInfo(touchPointX, touchPointY, TouchType::DOWN);
7198 }
7199 }
7200
WebOverlayRequestFocus()7201 void WebPattern::WebOverlayRequestFocus()
7202 {
7203 if (!GetNativeEmbedModeEnabledValue(false)) {
7204 WebRequestFocus();
7205 }
7206 }
7207
GetCurrentLanguage()7208 std::string WebPattern::GetCurrentLanguage()
7209 {
7210 std::string result = "";
7211 if (delegate_) {
7212 result = delegate_->GetCurrentLanguage();
7213 }
7214 return result;
7215 }
7216
OnEnableFollowSystemFontWeightUpdate(bool value)7217 void WebPattern::OnEnableFollowSystemFontWeightUpdate(bool value)
7218 {
7219 if (delegate_) {
7220 delegate_->UpdateEnableFollowSystemFontWeight(value);
7221 }
7222 }
7223
GetTranslateTextCallback(const std::string & result)7224 void WebPattern::GetTranslateTextCallback(const std::string& result)
7225 {
7226 TAG_LOGI(AceLogTag::ACE_WEB, "GetTranslateTextCallback WebId:%{public}d | Text.length:%{public}d",
7227 GetWebId(), static_cast<int32_t>(result.size()));
7228 #if !defined(PREVIEW) && !defined(ACE_UNITTEST) && defined(OHOS_PLATFORM)
7229 auto frameNode = frameNode_.Upgrade();
7230 CHECK_NULL_VOID(frameNode);
7231 auto id = frameNode->GetId();
7232 UiSessionManager::GetInstance()->SendWebTextToAI(id, result);
7233 #endif
7234 }
7235
RegisterTranslateTextJavaScript()7236 void WebPattern::RegisterTranslateTextJavaScript()
7237 {
7238 TAG_LOGI(AceLogTag::ACE_WEB, "RegisterTranslateTextJavaScript WebId:%{public}d", GetWebId());
7239 std::vector<std::string> methods;
7240 methods.push_back(g_translateTextData.registerFunctionName);
7241 auto lambda = [weak = AceType::WeakClaim(this)](const std::vector<std::string>& param) {
7242 auto webPattern = weak.Upgrade();
7243 if (webPattern && param.size() > 0) {
7244 webPattern->GetTranslateTextCallback(param[0]);
7245 }
7246 };
7247 std::vector<std::function<void(const std::vector<std::string>&)>> funcs;
7248 funcs.push_back(std::move(lambda));
7249 std::string permission = "";
7250 CHECK_NULL_VOID(delegate_);
7251 delegate_->RegisterNativeJavaScriptProxy(g_translateTextData.registerObjectName,
7252 methods, funcs, false, permission, true);
7253 }
7254
RunJsInit()7255 void WebPattern::RunJsInit()
7256 {
7257 if (!g_translateTextData.needTranslate) {
7258 return;
7259 }
7260 if (!isRegisterJsObject_) {
7261 isRegisterJsObject_ = true;
7262 RegisterTranslateTextJavaScript();
7263 return;
7264 }
7265 TAG_LOGI(AceLogTag::ACE_WEB, "run java TranslateScript and InitScript. WebId:%{public}d", GetWebId());
7266 CHECK_NULL_VOID(delegate_);
7267 delegate_->ExecuteTypeScript(g_translateTextData.translateScript, [](std::string result) {});
7268 delegate_->ExecuteTypeScript(g_translateTextData.initScript, [](std::string result) {});
7269 }
7270
GetTranslateText(std::string extraData,std::function<void (std::string)> callback,bool isContinued)7271 void WebPattern::GetTranslateText(std::string extraData, std::function<void(std::string)> callback, bool isContinued)
7272 {
7273 auto host = GetHost();
7274 CHECK_NULL_VOID(host);
7275 auto context = host->GetContext();
7276 CHECK_NULL_VOID(context);
7277 auto taskExecutor = context->GetTaskExecutor();
7278 CHECK_NULL_VOID(taskExecutor);
7279 taskExecutor->PostTask([weak = AceType::WeakClaim(this), jsonData = extraData]() {
7280 std::unique_ptr<JsonValue> json = JsonUtil::ParseJsonString(jsonData);
7281 g_translateTextData.registerObjectName = json->GetString("registerObjectName");
7282 g_translateTextData.registerFunctionName = json->GetString("registerFunctionName");
7283 g_translateTextData.translateScript = json->GetString("translateScript");
7284 g_translateTextData.initScript = json->GetString("initScript");
7285
7286 auto webPattern = weak.Upgrade();
7287 TAG_LOGI(AceLogTag::ACE_WEB, "GetTranslateText WebId:%{public}d", webPattern->GetWebId());
7288 TAG_LOGI(AceLogTag::ACE_WEB,
7289 "GetTranslateText 'registerObjectName':%{public}s; 'registerFunctionName':%{public}s",
7290 g_translateTextData.registerObjectName.c_str(), g_translateTextData.registerFunctionName.c_str());
7291 g_translateTextData.needTranslate = true;
7292 webPattern->RunJsInit();
7293 }, TaskExecutor::TaskType::UI, "ArkUIWebGetTranslateText");
7294 }
7295
SendTranslateResult(std::vector<std::string> results,std::vector<int32_t> ids)7296 void WebPattern::SendTranslateResult(std::vector<std::string> results, std::vector<int32_t> ids)
7297 {
7298 return;
7299 }
7300
SendTranslateResult(std::string jscode)7301 void WebPattern::SendTranslateResult(std::string jscode)
7302 {
7303 TAG_LOGI(AceLogTag::ACE_WEB, "SendTranslateResult WebId:%{public}d; Text.length:%{public}d",
7304 GetWebId(), static_cast<int32_t>(jscode.size()));
7305 CHECK_NULL_VOID(delegate_);
7306 delegate_->ExecuteTypeScript(jscode, [](std::string result) {});
7307 }
7308
EndTranslate()7309 void WebPattern::EndTranslate()
7310 {
7311 auto host = GetHost();
7312 CHECK_NULL_VOID(host);
7313 auto context = host->GetContext();
7314 CHECK_NULL_VOID(context);
7315 auto taskExecutor = context->GetTaskExecutor();
7316 CHECK_NULL_VOID(taskExecutor);
7317 taskExecutor->PostTask([weak = AceType::WeakClaim(this)]() {
7318 g_translateTextData.needTranslate = false;
7319 g_translateTextData.translateScript = "";
7320 g_translateTextData.initScript = "";
7321 auto webPattern = weak.Upgrade();
7322 if (webPattern->isRegisterJsObject_) {
7323 CHECK_NULL_VOID(webPattern->delegate_);
7324 std::string p = g_translateTextData.registerObjectName;
7325 TAG_LOGI(AceLogTag::ACE_WEB, "UnRegister TranslateText JsObject %{public}s", p.c_str());
7326 webPattern->delegate_->UnRegisterNativeArkJSFunction(std::move(p));
7327 webPattern->isRegisterJsObject_ = false;
7328 webPattern->delegate_->Reload();
7329 }
7330 TAG_LOGI(AceLogTag::ACE_WEB, "EndTranslateText WebId:%{public}d", webPattern->GetWebId());
7331 }, TaskExecutor::TaskType::UI, "ArkUIWebEndTranslate");
7332 }
7333
RegisterSurfaceDensityCallback()7334 void WebPattern::RegisterSurfaceDensityCallback()
7335 {
7336 auto pipeline = PipelineBase::GetCurrentContextSafely();
7337 if (pipeline) {
7338 density_ = pipeline->GetDensity();
7339 densityCallbackId_ = pipeline->RegisterDensityChangedCallback([weak = WeakClaim(this)](double density) {
7340 auto webPattern = weak.Upgrade();
7341 CHECK_NULL_VOID(webPattern);
7342 webPattern->SetSurfaceDensity(density);
7343 });
7344 }
7345 }
7346 } // namespace OHOS::Ace::NG
7347