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