From 842e526d60b4544cc8813774d2b696eeeb822830 Mon Sep 17 00:00:00 2001 From: chenrui_wza Date: Sat, 25 Apr 2026 17:47:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B1=8F=E5=B9=95?= =?UTF-8?q?=E6=9C=97=E8=AF=BB=E6=B3=A8=E5=85=A5=E7=82=B9=E5=87=BB=E3=80=81?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E3=80=81=E9=95=BF=E6=8C=89=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenrui_wza --- .../accessible_ability_channel_proxy.h | 11 +- .../include/iaccessible_ability_channel.h | 3 +- .../src/accessible_ability_channel_proxy.cpp | 43 ++++-- .../src/accessible_ability_channel_stub.cpp | 10 +- .../abilit_channel_impl_fuzz_test.h | 2 +- .../accessible_ability_channel_client.h | 2 +- .../src/accessible_ability_channel_client.cpp | 6 +- .../src/accessible_ability_client_impl.cpp | 3 +- .../mock_accessible_ability_channel_proxy.h | 4 +- .../mock_accessible_ability_channel_stub.h | 4 +- .../mock_accessible_ability_channel_proxy.cpp | 3 +- ...accessible_ability_channel_client_test.cpp | 12 +- .../common/src/accessibility_constants.cpp | 1 + .../common/include/accessibility_constants.h | 1 + .../common/include/accessibility_def.h | 14 +- .../AccessibilityExtensionContext.ets | 5 +- .../src/ani_accessibility_element.cpp | 4 +- .../kits/ani/ets/@ohos.accessibility.ets | 11 +- interfaces/kits/ani/src/ani_utils.cpp | 16 +- .../napi/src/napi_accessibility_utils.cpp | 26 +++- interfaces/kits/napi/src/native_module.cpp | 15 ++ .../aams/include/accessible_ability_channel.h | 7 +- .../aams/src/accessible_ability_channel.cpp | 139 +++++++++++++++++- .../mock_accessible_ability_connection.h | 4 +- .../mock_accessible_ability_channel_proxy.cpp | 3 +- .../mock_accessible_ability_connection.cpp | 3 +- .../accessible_ability_channel_test.cpp | 2 +- .../aams_accessible_ability_channel_test.cpp | 6 +- 28 files changed, 305 insertions(+), 55 deletions(-) diff --git a/common/interface/include/accessible_ability_channel_proxy.h b/common/interface/include/accessible_ability_channel_proxy.h index 1fc28033d..5d14612e7 100644 --- a/common/interface/include/accessible_ability_channel_proxy.h +++ b/common/interface/include/accessible_ability_channel_proxy.h @@ -116,11 +116,12 @@ public: * @param actionArguments The parameter for action type. * @param requestId Matched the request and response. It needn't cared by ACE, transfer it by callback only. * @param callback To transfer the node info to ASAC and it defined by ASAC. + * @param rect The element's boundary rectangle info. * @return Return RET_OK if perform action successfully, otherwise refer to the RetError for the failure. */ virtual RetError ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) override; + const sptr &callback, const Rect &rect) override; /** * @brief Get the result of Cursor Position through the proxy object. @@ -252,6 +253,14 @@ private: */ bool SendTransactCmd(AccessibilityInterfaceCode code, MessageParcel &data, MessageParcel &reply, MessageOption &option); + /** + * @brief Write action arguments to message parcel. + * @param data The message parcel to write to. + * @param actionArguments The action arguments to write. + * @return true: Write successfully; otherwise is not. + */ + bool WriteActionArguments(MessageParcel &data, + const std::map &actionArguments); static inline BrokerDelegator delegator; }; } // namespace Accessibility diff --git a/common/interface/include/iaccessible_ability_channel.h b/common/interface/include/iaccessible_ability_channel.h index dd212bd26..76888ff03 100644 --- a/common/interface/include/iaccessible_ability_channel.h +++ b/common/interface/include/iaccessible_ability_channel.h @@ -111,11 +111,12 @@ public: * @param actionArguments The parameter for action type. * @param requestId Matched the request and response. It needn't cared by ACE, transfer it by callback only. * @param callback To transfer the node info to ASAC and it defined by ASAC. + * @param rect The element's boundary rectangle info. * @return Return RET_OK if perform action successfully, otherwise refer to the RetError for the failure. */ virtual RetError ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) = 0; + const sptr &callback, const Rect &rect) = 0; /** * @brief Get the result of Cursor Position through the proxy object. diff --git a/common/interface/src/accessible_ability_channel_proxy.cpp b/common/interface/src/accessible_ability_channel_proxy.cpp index 05211eefe..5239bd69d 100644 --- a/common/interface/src/accessible_ability_channel_proxy.cpp +++ b/common/interface/src/accessible_ability_channel_proxy.cpp @@ -59,6 +59,26 @@ bool AccessibleAbilityChannelProxy::SendTransactCmd(AccessibilityInterfaceCode c return true; } +bool AccessibleAbilityChannelProxy::WriteActionArguments(MessageParcel &data, + const std::map &actionArguments) +{ + std::vector actionArgumentsKey {}; + std::vector actionArgumentsValue {}; + for (auto iter = actionArguments.begin(); iter != actionArguments.end(); iter++) { + actionArgumentsKey.push_back(iter->first); + actionArgumentsValue.push_back(iter->second); + } + if (!data.WriteStringVector(actionArgumentsKey)) { + HILOG_ERROR("actionArgumentsKey write error"); + return false; + } + if (!data.WriteStringVector(actionArgumentsValue)) { + HILOG_ERROR("actionArgumentsValue write error"); + return false; + } + return true; +} + RetError AccessibleAbilityChannelProxy::SearchElementInfoByAccessibilityId(const ElementBasicInfo elementBasicInfo, const int32_t requestId, const sptr &callback, const int32_t mode, bool isFilter, bool systemApi) @@ -384,7 +404,7 @@ RetError AccessibleAbilityChannelProxy::UnholdRunningLock() RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) + const sptr &callback, const Rect &rect) { HILOG_DEBUG(); @@ -407,22 +427,9 @@ RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilit HILOG_ERROR("action write error: %{public}d, ", action); return RET_ERR_IPC_FAILED; } - - std::vector actionArgumentsKey {}; - std::vector actionArgumentsValue {}; - for (auto iter = actionArguments.begin(); iter != actionArguments.end(); iter++) { - actionArgumentsKey.push_back(iter->first); - actionArgumentsValue.push_back(iter->second); - } - if (!data.WriteStringVector(actionArgumentsKey)) { - HILOG_ERROR("actionArgumentsKey write error"); + if (!WriteActionArguments(data, actionArguments)) { return RET_ERR_IPC_FAILED; } - if (!data.WriteStringVector(actionArgumentsValue)) { - HILOG_ERROR("actionArgumentsValue write error"); - return RET_ERR_IPC_FAILED; - } - if (!data.WriteInt32(requestId)) { HILOG_ERROR("requestId write error: %{public}d, ", requestId); return RET_ERR_IPC_FAILED; @@ -431,7 +438,11 @@ RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilit HILOG_ERROR("callback write error"); return RET_ERR_IPC_FAILED; } - + RectParcel rectParcel(rect); + if (!data.WriteParcelable(&rectParcel)) { + HILOG_ERROR("rect write error"); + return RET_ERR_IPC_FAILED; + } if (!SendTransactCmd(AccessibilityInterfaceCode::PERFORM_ACTION, data, reply, option)) { HILOG_ERROR("fail to perform accessibility action"); diff --git a/common/interface/src/accessible_ability_channel_stub.cpp b/common/interface/src/accessible_ability_channel_stub.cpp index 26499863b..843db1465 100644 --- a/common/interface/src/accessible_ability_channel_stub.cpp +++ b/common/interface/src/accessible_ability_channel_stub.cpp @@ -321,7 +321,15 @@ ErrCode AccessibleAbilityChannelStub::HandleExecuteAction(MessageParcel &data, M return ERR_INVALID_VALUE; } - RetError result = ExecuteAction(accessibilityWindowId, elementId, action, actionArguments, requestId, callback); + sptr rectParcel = data.ReadStrongParcelable(); + if (rectParcel == nullptr) { + HILOG_ERROR("Read RectParcel failed"); + return ERR_INVALID_VALUE; + } + Rect rect = *rectParcel; + + RetError result = ExecuteAction(accessibilityWindowId, elementId, action, + actionArguments, requestId, callback, rect); HILOG_DEBUG("ExecuteAction ret = %{public}d", result); reply.WriteInt32(result); return NO_ERROR; diff --git a/common/interface/test/fuzztest/accessibleabilitychannelstub/abilit_channel_impl_fuzz_test.h b/common/interface/test/fuzztest/accessibleabilitychannelstub/abilit_channel_impl_fuzz_test.h index dcb30dcc4..ddf4e4eb8 100644 --- a/common/interface/test/fuzztest/accessibleabilitychannelstub/abilit_channel_impl_fuzz_test.h +++ b/common/interface/test/fuzztest/accessibleabilitychannelstub/abilit_channel_impl_fuzz_test.h @@ -66,7 +66,7 @@ public: } RetError ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) override + const sptr &callback, const Rect &rect) override { return RET_OK; } diff --git a/frameworks/aafwk/include/accessible_ability_channel_client.h b/frameworks/aafwk/include/accessible_ability_channel_client.h index 48c86b543..7fa37f03d 100644 --- a/frameworks/aafwk/include/accessible_ability_channel_client.h +++ b/frameworks/aafwk/include/accessible_ability_channel_client.h @@ -92,7 +92,7 @@ public: * @return RET_OK: execute action successfully; otherwise refer to the RetError for the failure. */ RetError ExecuteAction(int32_t accessibilityWindowId, - int64_t elementId, int32_t action, const std::map &actionArguments); + int64_t elementId, int32_t action, const std::map &actionArguments, const Rect &rect); /** * @brief Package status to send server data. diff --git a/frameworks/aafwk/src/accessible_ability_channel_client.cpp b/frameworks/aafwk/src/accessible_ability_channel_client.cpp index 129cc2978..444008df6 100644 --- a/frameworks/aafwk/src/accessible_ability_channel_client.cpp +++ b/frameworks/aafwk/src/accessible_ability_channel_client.cpp @@ -160,7 +160,7 @@ RetError AccessibleAbilityChannelClient::GetCursorPosition( } RetError AccessibleAbilityChannelClient::ExecuteAction(int32_t accessibilityWindowId, - int64_t elementId, int32_t action, const std::map &actionArguments) + int64_t elementId, int32_t action, const std::map &actionArguments, const Rect &rect) { #ifdef OHOS_BUILD_ENABLE_HITRACE HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "ExecuteAction"); @@ -172,7 +172,7 @@ RetError AccessibleAbilityChannelClient::ExecuteAction(int32_t accessibilityWind if (action == ActionType::ACCESSIBILITY_ACTION_ACCESSIBILITY_FOCUS && accessibilityFocusedElementId_ != INVALID_WINDOW_ID && accessibilityFocusedWindowId_ != INVALID_WINDOW_ID) { ExecuteAction(accessibilityFocusedWindowId_, accessibilityFocusedElementId_, - ActionType::ACCESSIBILITY_ACTION_CLEAR_ACCESSIBILITY_FOCUS, actionArguments); + ActionType::ACCESSIBILITY_ACTION_CLEAR_ACCESSIBILITY_FOCUS, actionArguments, rect); } int32_t requestId = GenerateRequestId(); @@ -185,7 +185,7 @@ RetError AccessibleAbilityChannelClient::ExecuteAction(int32_t accessibilityWind ffrt::future promiseFuture = elementOperator->promise_.get_future(); RetError ret = proxy_->ExecuteAction(accessibilityWindowId, - elementId, action, actionArguments, requestId, elementOperator); + elementId, action, actionArguments, requestId, elementOperator, rect); if (ret != RET_OK) { HILOG_ERROR("ExecuteAction failed. action[%{public}d], ret[%{public}d]", action, ret); return ret; diff --git a/frameworks/aafwk/src/accessible_ability_client_impl.cpp b/frameworks/aafwk/src/accessible_ability_client_impl.cpp index 0cd5f5c11..e0e956067 100644 --- a/frameworks/aafwk/src/accessible_ability_client_impl.cpp +++ b/frameworks/aafwk/src/accessible_ability_client_impl.cpp @@ -1157,9 +1157,10 @@ RetError AccessibleAbilityClientImpl::ExecuteAction(const AccessibilityElementIn windowId = elementInfo.GetWindowId(); } int64_t elementId = elementInfo.GetAccessibilityId(); + const Rect rect = elementInfo.GetRectInScreen(); HILOG_DEBUG("windowId[%{public}d], elementId[%{public}" PRId64 "], action[%{public}d", windowId, elementId, action); Accessibility::RetError ret = channelClient_->ExecuteAction(windowId, elementId, action, - const_cast &>(actionArguments)); + const_cast &>(actionArguments), rect); #ifdef ACCESSIBILITY_EMULATOR_DEFINED reporter.setResult(ret); #endif // ACCESSIBILITY_EMULATOR_DEFINED diff --git a/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_proxy.h b/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_proxy.h index 4b627bbd4..2d516a52a 100644 --- a/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_proxy.h +++ b/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_proxy.h @@ -42,9 +42,9 @@ public: MOCK_METHOD6(FocusMoveSearch, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t direction, const int32_t requestId, const sptr& callback, bool systemApi)); - MOCK_METHOD6(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, + MOCK_METHOD7(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map& actionArguments, const int32_t requestId, - const sptr& callback)); + const sptr& callback, const Rect& rect)); MOCK_METHOD1(EnableScreenCurtain, RetError(bool isEnable)); MOCK_METHOD0(HoldRunningLock, RetError()); MOCK_METHOD0(UnholdRunningLock, RetError()); diff --git a/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_stub.h b/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_stub.h index de7f44094..669a2771e 100644 --- a/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_stub.h +++ b/frameworks/aafwk/test/mock/include/mock_accessible_ability_channel_stub.h @@ -44,9 +44,9 @@ public: MOCK_METHOD6(FocusMoveSearch, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t direction, const int32_t requestId, const sptr& callback, bool systemApi)); - MOCK_METHOD6(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, + MOCK_METHOD7(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map& actionArguments, const int32_t requestId, - const sptr& callback)); + const sptr& callback, const Rect& rect)); MOCK_METHOD1(EnableScreenCurtain, RetError(bool isEnable)); MOCK_METHOD0(HoldRunningLock, RetError()); MOCK_METHOD0(UnholdRunningLock, RetError()); diff --git a/frameworks/aafwk/test/mock/src/mock_accessible_ability_channel_proxy.cpp b/frameworks/aafwk/test/mock/src/mock_accessible_ability_channel_proxy.cpp index 4ca6bbba8..df22de449 100644 --- a/frameworks/aafwk/test/mock/src/mock_accessible_ability_channel_proxy.cpp +++ b/frameworks/aafwk/test/mock/src/mock_accessible_ability_channel_proxy.cpp @@ -115,7 +115,7 @@ RetError AccessibleAbilityChannelProxy::UnholdRunningLock() RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map& actionArguments, const int32_t requestId, - const sptr& callback) + const sptr& callback, const Rect &rect) { GTEST_LOG_(INFO) << "MOCK AccessibleAbilityChannelProxy ExecuteAction"; (void)accessibilityWindowId; @@ -124,6 +124,7 @@ RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilit (void)actionArguments; (void)requestId; (void)callback; + (void)rect; return RET_OK; } diff --git a/frameworks/aafwk/test/unittest/accessible_ability_channel_client_test.cpp b/frameworks/aafwk/test/unittest/accessible_ability_channel_client_test.cpp index 0cf3c2464..91e2176ac 100644 --- a/frameworks/aafwk/test/unittest/accessible_ability_channel_client_test.cpp +++ b/frameworks/aafwk/test/unittest/accessible_ability_channel_client_test.cpp @@ -185,10 +185,11 @@ HWTEST_F(AccessibleAbilityChannelClientTest, SendSimulateGesture_002, TestSize.L HWTEST_F(AccessibleAbilityChannelClientTest, ExecuteAction_001, TestSize.Level1) { GTEST_LOG_(INFO) << "ExecuteAction_001 start"; - EXPECT_CALL(*stub_, ExecuteAction(_, _, _, _, _, _)).Times(1).WillOnce(Return(RET_ERR_FAILED)); + EXPECT_CALL(*stub_, ExecuteAction(_, _, _, _, _, _, _)).Times(1).WillOnce(Return(RET_ERR_FAILED)); std::map actionArguments; + Rect rect; EXPECT_EQ(instance_->ExecuteAction(ACCESSIBILITY_WINDOW_ID, - ELEMENT_ID, ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments), RET_ERR_FAILED); + ELEMENT_ID, ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments, rect), RET_ERR_FAILED); GTEST_LOG_(INFO) << "ExecuteAction_001 end"; } @@ -205,7 +206,7 @@ HWTEST_F(AccessibleAbilityChannelClientTest, ExecuteAction_002, TestSize.Level1) ASSERT_TRUE(client); std::map actionArguments; EXPECT_EQ(client->ExecuteAction(ACCESSIBILITY_WINDOW_ID, - ELEMENT_ID, ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments), RET_ERR_SAMGR); + ELEMENT_ID, ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments, Rect()), RET_ERR_SAMGR); GTEST_LOG_(INFO) << "ExecuteAction_002 end"; } @@ -217,10 +218,11 @@ HWTEST_F(AccessibleAbilityChannelClientTest, ExecuteAction_002, TestSize.Level1) HWTEST_F(AccessibleAbilityChannelClientTest, ExecuteAction_003, TestSize.Level1) { GTEST_LOG_(INFO) << "ExecuteAction_003 start"; - EXPECT_CALL(*stub_, ExecuteAction(_, _, _, _, _, _)).Times(1).WillOnce(Return(RET_OK)); + EXPECT_CALL(*stub_, ExecuteAction(_, _, _, _, _, _, _)).Times(1).WillOnce(Return(RET_OK)); std::map actionArguments; + Rect rect; EXPECT_EQ(instance_->ExecuteAction(ACCESSIBILITY_WINDOW_ID, ELEMENT_ID, - ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments), RET_ERR_TIME_OUT); + ActionType::ACCESSIBILITY_ACTION_SELECT, actionArguments, rect), RET_ERR_TIME_OUT); GTEST_LOG_(INFO) << "ExecuteAction_003 end"; } diff --git a/frameworks/common/src/accessibility_constants.cpp b/frameworks/common/src/accessibility_constants.cpp index a63c1d595..527d9e061 100644 --- a/frameworks/common/src/accessibility_constants.cpp +++ b/frameworks/common/src/accessibility_constants.cpp @@ -36,6 +36,7 @@ const std::string ACTION_ARGU_MOVE_UNIT = "textMoveUnit"; const std::string ACTION_ARGU_SPAN_ID = "spanId"; const std::string ACTION_ARGU_CLICK_ENHANCE_DATA = "enhanceData"; const std::string ACTION_ARGU_CLICK_TIMESTAMP = "timeStamp"; +const std::string ACTION_ARGU_INJECT_ACTION_TYPE = "injectActionType"; const std::string ACTION_ARGU_CUSTOM_ACTION = "customActions"; // HtmlItemType diff --git a/interfaces/innerkits/common/include/accessibility_constants.h b/interfaces/innerkits/common/include/accessibility_constants.h index 7f0ad1fb4..4a9c202a5 100644 --- a/interfaces/innerkits/common/include/accessibility_constants.h +++ b/interfaces/innerkits/common/include/accessibility_constants.h @@ -40,6 +40,7 @@ extern const std::string ACTION_ARGU_MOVE_UNIT; extern const std::string ACTION_ARGU_SPAN_ID; extern const std::string ACTION_ARGU_CLICK_ENHANCE_DATA; extern const std::string ACTION_ARGU_CLICK_TIMESTAMP; +extern const std::string ACTION_ARGU_INJECT_ACTION_TYPE; extern const std::string ACTION_ARGU_CUSTOM_ACTION; // HtmlItemType diff --git a/interfaces/innerkits/common/include/accessibility_def.h b/interfaces/innerkits/common/include/accessibility_def.h index 8f8b12690..93ce7e791 100644 --- a/interfaces/innerkits/common/include/accessibility_def.h +++ b/interfaces/innerkits/common/include/accessibility_def.h @@ -191,6 +191,7 @@ enum ActionType : int32_t { ACCESSIBILITY_ACTION_NOTIFICATIONCENTER = 0x00080000, ACCESSIBILITY_ACTION_CONTROLCENTER = 0x00008000, ACCESSIBILITY_ACTION_CUSTOM = 0x20000000, + ACCESSIBILITY_ACTION_INJECT_ACTION = 0x40000000, ACCESSIBILITY_ACTION_TYPE_MASK = 0x1FFFFFFF, }; @@ -604,6 +605,13 @@ enum AccessibilityEventType : int32_t { TYPE_FOCUS_INVISIBLE = 71 }; +enum InjectActionType : int32_t { + INJECT_ACTION_TYPE_INVALID = -1, + INJECT_ACTION_TYPE_CLICK = 1, + INJECT_ACTION_TYPE_DOUBLE_CLICK = 2, + INJECT_ACTION_TYPE_LONG_CLICK = 3, +}; + enum AccessibilityAction : int32_t { ERROR = -1, ACCESSIBILITY_FOCUS = 0, @@ -627,7 +635,8 @@ enum AccessibilityAction : int32_t { NOTIFICATION_CENTER = 18, CONTROL_CENTER = 19, SPAN_CLICK = 20, - CUSTOM_ACTION = 21 + INJECT_ACTION = 21, + CUSTOM_ACTION = 22 }; const std::vector ACTION_NAMES = { @@ -652,7 +661,8 @@ const std::vector ACTION_NAMES = { "notificationCenter", //AccessibilityAction.NOTIFICATION_CENTER=18 "controlCenter", //AccessibilityAction.CONTROL_CENTER=19 "spanClick", //AccessibilityAction.SPAN_CLICK=20 - "customActions" //AccessibilityAction.CUSTOM_ACTION=21 + "injectAction", //AccessibilityAction.INJECT_ACTION=21 + "customActions" //AccessibilityAction.CUSTOM_ACTION=22 }; enum class AnnounceType : uint32_t { diff --git a/interfaces/kits/ani/accessibility_extension/ets/application/AccessibilityExtensionContext.ets b/interfaces/kits/ani/accessibility_extension/ets/application/AccessibilityExtensionContext.ets index 2133d41c9..879333eb2 100644 --- a/interfaces/kits/ani/accessibility_extension/ets/application/AccessibilityExtensionContext.ets +++ b/interfaces/kits/ani/accessibility_extension/ets/application/AccessibilityExtensionContext.ets @@ -17,7 +17,7 @@ import ExtensionContext from 'application.ExtensionContext'; import Want from '@ohos.app.ability.Want'; import { AsyncCallback, BusinessError, Callback } from '@ohos.base'; import accessibility from '@ohos.accessibility'; -import { AccessibilityAction, FocusMoveResultCode } from '@ohos.accessibility'; +import { AccessibilityAction, FocusMoveResultCode, InjectActionType } from '@ohos.accessibility'; export interface FocusMoveResult { target: Array; @@ -536,7 +536,8 @@ export class Parameter { selectTextInForWard?: boolean = false; offset?: string = ''; spanId?: string = ''; - scrollType?: string = ''; + scrollType?: string = ''; + injectActionType?: InjectActionType; } export type FocusDirection = 'up' | 'down' | 'left' | 'right' | 'forward' | 'backward'; diff --git a/interfaces/kits/ani/accessibility_extension_module/src/ani_accessibility_element.cpp b/interfaces/kits/ani/accessibility_extension_module/src/ani_accessibility_element.cpp index 9ac70cac4..f23135a82 100644 --- a/interfaces/kits/ani/accessibility_extension_module/src/ani_accessibility_element.cpp +++ b/interfaces/kits/ani/accessibility_extension_module/src/ani_accessibility_element.cpp @@ -471,7 +471,8 @@ std::string ConvertActionTypeToString(ActionType type) {ActionType::ACCESSIBILITY_ACTION_SPAN_CLICK, "spanClick"}, {ActionType::ACCESSIBILITY_ACTION_CUSTOM, "customActions"}, {ActionType::ACCESSIBILITY_ACTION_NEXT_HTML_ITEM, "nextHtmlItem"}, - {ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM, "previousHtmlItem"} + {ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM, "previousHtmlItem"}, + {ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION, "injectAction"} }; if (triggerActionTable.find(type) == triggerActionTable.end()) { @@ -532,6 +533,7 @@ int32_t ConvertOperationTypeToTarget(ActionType type) {ActionType::ACCESSIBILITY_ACTION_SET_CURSOR_POSITION, AccessibilityAction::SET_CURSOR_POSITION}, {ActionType::ACCESSIBILITY_ACTION_SET_TEXT, AccessibilityAction::SET_TEXT}, {ActionType::ACCESSIBILITY_ACTION_SPAN_CLICK, AccessibilityAction::SPAN_CLICK}, + {ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION, AccessibilityAction::INJECT_ACTION}, {ActionType::ACCESSIBILITY_ACTION_CUSTOM, AccessibilityAction::CUSTOM_ACTION} }; diff --git a/interfaces/kits/ani/ets/@ohos.accessibility.ets b/interfaces/kits/ani/ets/@ohos.accessibility.ets index 9fab717e7..9d6bbf6a1 100644 --- a/interfaces/kits/ani/ets/@ohos.accessibility.ets +++ b/interfaces/kits/ani/ets/@ohos.accessibility.ets @@ -40,7 +40,8 @@ export enum AccessibilityAction { NOTIFICATION_CENTER = 18, CONTROL_CENTER = 19, SPAN_CLICK = 20, - CUSTOM_ACTION = 21 + INJECT_ACTION = 21, + CUSTOM_ACTION = 22 } export enum AccessibilityEventType { @@ -130,7 +131,7 @@ namespace accessibility { export type Action = 'accessibilityFocus' | 'clearAccessibilityFocus' | 'focus' | 'clearFocus' | 'clearSelection' | 'click' | 'longClick' | 'cut' | 'copy' | 'paste' | 'select' | 'setText' | 'delete' | 'scrollForward' | 'scrollBackward' | 'setSelection' | 'setCursorPosition' | 'home' | - 'back' | 'recentTask' | 'notificationCenter' | 'controlCenter' | 'common' | 'customActions'; + 'back' | 'recentTask' | 'notificationCenter' | 'controlCenter' | 'common' | 'injectAction' | 'customActions'; export type WindowUpdateType = 'add' | 'remove' | 'bounds' | 'active' | 'focus'; @@ -546,3 +547,9 @@ export enum FocusMoveResultCode { DOUBLE_CHECK_CHILD_PROPERTY_AND_GET_LAST = 7, SEARCH_FAILURE_IN_SCROLL = 8 } + +export enum InjectActionType { + CLICK = 1, + DOUBLE_CLICK = 2, + LONG_CLICK = 3 +} diff --git a/interfaces/kits/ani/src/ani_utils.cpp b/interfaces/kits/ani/src/ani_utils.cpp index b5760fb10..abc8327f2 100644 --- a/interfaces/kits/ani/src/ani_utils.cpp +++ b/interfaces/kits/ani/src/ani_utils.cpp @@ -325,7 +325,9 @@ ActionType ANIUtils::ConvertStringToAccessibleOperationType(const std::string &t {"recentTask", ActionType::ACCESSIBILITY_ACTION_RECENTTASK}, {"notificationCenter", ActionType::ACCESSIBILITY_ACTION_NOTIFICATIONCENTER}, {"controlCenter", ActionType::ACCESSIBILITY_ACTION_CONTROLCENTER}, - {"customActions", ActionType::ACCESSIBILITY_ACTION_CUSTOM}}; + {"injectAction", ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION}, + {"customActions", ActionType::ACCESSIBILITY_ACTION_CUSTOM} + }; if (accessibleOperationTypeTable.find(type) == accessibleOperationTypeTable.end()) { HILOG_WARN("invalid key[%{public}s]", type.c_str()); @@ -1339,6 +1341,18 @@ void ANIUtils::ConvertActionArgsJSToANI(ani_env *env, ani_object obj, args.insert(std::pair("customActions", str.c_str())); } break; + case ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION: { + if (env->Object_GetFieldByName_Ref(obj, "injectActionType", &fiedNameValue) == ANI_OK) { + int32_t injectActionType = 0; + if (env->EnumItem_GetValue_Int(static_cast(fiedNameValue), + &injectActionType) != ANI_OK) { + HILOG_ERROR("Failed to get injectActionType enum value"); + break; + } + args.insert(std::pair("injectActionType", std::to_string(injectActionType))); + } + break; + } case ActionType::ACCESSIBILITY_ACTION_SCROLL_FORWARD: case ActionType::ACCESSIBILITY_ACTION_SCROLL_BACKWARD: SetScrollTypeParam(env, obj, args); diff --git a/interfaces/kits/napi/src/napi_accessibility_utils.cpp b/interfaces/kits/napi/src/napi_accessibility_utils.cpp index a3154749c..703d4108d 100644 --- a/interfaces/kits/napi/src/napi_accessibility_utils.cpp +++ b/interfaces/kits/napi/src/napi_accessibility_utils.cpp @@ -819,7 +819,8 @@ std::string ConvertOperationTypeToString(ActionType type) {ActionType::ACCESSIBILITY_ACTION_SPAN_CLICK, "spanClick"}, {ActionType::ACCESSIBILITY_ACTION_CUSTOM, "customActions"}, {ActionType::ACCESSIBILITY_ACTION_NEXT_HTML_ITEM, "nextHtmlItem"}, - {ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM, "previousHtmlItem"} + {ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM, "previousHtmlItem"}, + {ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION, "injectAction"} }; if (triggerActionTable.find(type) == triggerActionTable.end()) { @@ -1034,6 +1035,13 @@ bool ConvertActionArgsJSToNAPI( args.insert(std::pair("customActions", str.c_str())); } break; + case ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION: + napi_create_string_utf8(env, "injectActionType", NAPI_AUTO_LENGTH, &propertyNameValue); + str = ConvertStringJSToNAPI(env, object, propertyNameValue, hasProperty); + if (hasProperty) { + args.insert(std::pair("injectActionType", str.c_str())); + } + break; case ActionType::ACCESSIBILITY_ACTION_SCROLL_FORWARD: ret = SetScrollTypeParam(env, object, args); break; @@ -1165,7 +1173,21 @@ std::string ConvertStringJSToNAPI(napi_env env, napi_value object, napi_value pr if (hasProperty) { napi_value itemValue = nullptr; napi_get_property(env, object, propertyNameValue, &itemValue); - str = GetStringFromNAPI(env, itemValue); + + napi_status status; + napi_valuetype valuetype = napi_null; + status = napi_typeof(env, itemValue, &valuetype); + if (status != napi_ok) { + HILOG_ERROR("ConvertStringJSToNAPI napi_typeof error and status is %{public}d", status); + return str; + } + if (valuetype == napi_string) { + str = GetStringFromNAPI(env, itemValue); + } else if (valuetype == napi_number) { + int32_t num; + napi_get_value_int32(env, itemValue, &num); + str = std::to_string(num); + } } return str; } diff --git a/interfaces/kits/napi/src/native_module.cpp b/interfaces/kits/napi/src/native_module.cpp index 1f9cc20cf..5efacf943 100644 --- a/interfaces/kits/napi/src/native_module.cpp +++ b/interfaces/kits/napi/src/native_module.cpp @@ -194,6 +194,19 @@ static napi_value CreateAccessibilityEventType(napi_env env) return objValue; } +static napi_value CreateInjectActionType(napi_env env) +{ + napi_value objValue = nullptr; + napi_create_object(env, &objValue); + napi_set_named_property(env, objValue, "CLICK", + CreateIntObject(env, InjectActionType::INJECT_ACTION_TYPE_CLICK)); + napi_set_named_property(env, objValue, "DOUBLE_CLICK", + CreateIntObject(env, InjectActionType::INJECT_ACTION_TYPE_DOUBLE_CLICK)); + napi_set_named_property(env, objValue, "LONG_CLICK", + CreateIntObject(env, InjectActionType::INJECT_ACTION_TYPE_LONG_CLICK)); + return objValue; +} + static napi_value CreateAccessibilityAction(napi_env env) { napi_value objValue = nullptr; @@ -226,6 +239,7 @@ static napi_value CreateAccessibilityAction(napi_env env) napi_set_named_property(env, objValue, "CONTROL_CENTER", CreateIntObject(env, AccessibilityAction::CONTROL_CENTER)); napi_set_named_property(env, objValue, "SPAN_CLICK", CreateIntObject(env, AccessibilityAction::SPAN_CLICK)); + napi_set_named_property(env, objValue, "INJECT_ACTION", CreateIntObject(env, AccessibilityAction::INJECT_ACTION)); return objValue; } @@ -271,6 +285,7 @@ static napi_value Init(napi_env env, napi_value exports) napi_set_named_property(env, exports, "AccessibilityEventType", CreateAccessibilityEventType(env)); napi_set_named_property(env, exports, "AccessibilityAction", CreateAccessibilityAction(env)); + napi_set_named_property(env, exports, "InjectActionType", CreateInjectActionType(env)); auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance(); (void)instance.InitializeContext(); diff --git a/services/aams/include/accessible_ability_channel.h b/services/aams/include/accessible_ability_channel.h index d23a31fe5..58468cdfb 100644 --- a/services/aams/include/accessible_ability_channel.h +++ b/services/aams/include/accessible_ability_channel.h @@ -59,7 +59,7 @@ public: RetError ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) override; + const sptr &callback, const Rect &rect) override; RetError GetWindow(const int32_t windowId, AccessibilityWindowInfo &windowInfo) override; @@ -107,6 +107,11 @@ private: RetError ExecuteActionAsync(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, const sptr &callback); + RetError HandleInjectAction(const std::map &actionArguments, const Rect &rect); + void InjectEventToInput(int32_t xPos, int32_t yPos, InjectActionType injectActionType, + int32_t displayWidth, int32_t displayHeight); + void CalculateCenterPosition(const Rect &rect, int32_t &xPos, int32_t &yPos, + int32_t displayWidth, int32_t displayHeight); std::string clientName_ = ""; int32_t accountId_ = -1; std::shared_ptr eventHandler_ = nullptr; diff --git a/services/aams/src/accessible_ability_channel.cpp b/services/aams/src/accessible_ability_channel.cpp index bda4ec8d9..d742250c2 100644 --- a/services/aams/src/accessible_ability_channel.cpp +++ b/services/aams/src/accessible_ability_channel.cpp @@ -18,8 +18,10 @@ #include "accessibility_window_connection.h" #include "accessibility_window_manager.h" #include "accessible_ability_connection.h" +#include "display_manager.h" #include "hilog_wrapper.h" #include +#include #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER #include "accessibility_power_manager.h" #endif @@ -30,6 +32,7 @@ namespace Accessibility { namespace { constexpr int32_t WINDOW_ID_INVALID = -1; constexpr int64_t ELEMENT_ID_INVALID = -1; + const int32_t LONG_PRESS_EVENT_INTERVAL = 500; MMI::InputManager* inputManager_ = MMI::InputManager::GetInstance(); std::map>> accessibleKeyCodeTable = { {ActionType::ACCESSIBILITY_ACTION_HOME, @@ -42,6 +45,24 @@ namespace { {true, {MMI::KeyEvent::KEYCODE_CALL_NOTIFICATION_CENTER, MMI::KeyEvent::KEYCODE_CALL_NOTIFICATION_CENTER}}}, {ActionType::ACCESSIBILITY_ACTION_CONTROLCENTER, {true, {MMI::KeyEvent::KEYCODE_CALL_CONTROL_CENTER, MMI::KeyEvent::KEYCODE_CALL_CONTROL_CENTER}}}}; + + InjectActionType StringToInjectAction(const std::string& injectActionType) + { + static const std::unordered_map actionMap = { + {"click", INJECT_ACTION_TYPE_CLICK}, + {"doubleClick", INJECT_ACTION_TYPE_DOUBLE_CLICK}, + {"longClick", INJECT_ACTION_TYPE_LONG_CLICK}, + {"1", INJECT_ACTION_TYPE_CLICK}, + {"2", INJECT_ACTION_TYPE_DOUBLE_CLICK}, + {"3", INJECT_ACTION_TYPE_LONG_CLICK} + }; + + auto it = actionMap.find(injectActionType); + if (it != actionMap.end()) { + return it->second; + } + return INJECT_ACTION_TYPE_INVALID; + } } // namespace AccessibleAbilityChannel::AccessibleAbilityChannel( @@ -464,7 +485,7 @@ RetError AccessibleAbilityChannel::UnholdRunningLock() RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr &callback) + const sptr &callback, const Rect &rect) { HILOG_DEBUG("ExecuteAction elementId:%{public}" PRId64 " winId:%{public}d, action:%{public}d, requestId:%{public}d", elementId, accessibilityWindowId, action, requestId); @@ -493,9 +514,125 @@ RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWind callback->SetExecuteActionResult(true, requestId); return RET_OK; } + + if (action == ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION) { + RetError ret = HandleInjectAction(actionArguments, rect); + if (ret != RET_OK) { + HILOG_ERROR("Handle Inject Click failed!"); + callback->SetExecuteActionResult(false, requestId); + return RET_ERR_FAILED; + } + callback->SetExecuteActionResult(true, requestId); + return RET_OK; + } return ExecuteActionAsync(accessibilityWindowId, elementId, action, actionArguments, requestId, callback); } +RetError AccessibleAbilityChannel::HandleInjectAction(const std::map &actionArguments, + const Rect &rect) +{ + HILOG_DEBUG(); + auto it = actionArguments.find("injectActionType"); + if (it == actionArguments.end()) { + HILOG_ERROR("HandleInjectAction injectActionType not found in actionArguments"); + return RET_ERR_INVALID_PARAM; + } + std::string clickTypeStr = it->second; + HILOG_INFO("HandleInjectAction clickType: %{public}s", clickTypeStr.c_str()); + + InjectActionType injectActionType = StringToInjectAction(clickTypeStr); + if (injectActionType == INJECT_ACTION_TYPE_INVALID) { + HILOG_ERROR("HandleInjectAction invalid clickType: %{public}s", clickTypeStr.c_str()); + return RET_ERR_INVALID_PARAM; + } + + int32_t xPos = 0; + int32_t yPos = 0; + uint64_t displayId = Rosen::DisplayManager::GetInstance().GetDefaultDisplayId(); + sptr display = Rosen::DisplayManager::GetInstance().GetDisplayById(displayId); + if (!display) { + HILOG_ERROR("Get display failed"); + return RET_ERR_FAILED; + } + int32_t displayWidth = display->GetWidth(); + int32_t displayHeight = display->GetHeight(); + HILOG_INFO("HandleInjectAction displayWidth: %{public}d, displayHeight: %{public}d", displayWidth, displayHeight); + CalculateCenterPosition(rect, xPos, yPos, displayWidth, displayHeight); + + InjectEventToInput(xPos, yPos, injectActionType, displayWidth, displayHeight); + return RET_OK; +} + +void AccessibleAbilityChannel::CalculateCenterPosition(const Rect &rect, int32_t &xPos, int32_t &yPos, + int32_t displayWidth, int32_t displayHeight) +{ + int32_t leftTopXPos = rect.GetLeftTopXScreenPostion(); + int32_t rightBottomXPos = rect.GetRightBottomXScreenPostion(); + int32_t leftTopYPos = rect.GetLeftTopYScreenPostion(); + int32_t rightBottomYPos = rect.GetRightBottomYScreenPostion(); + + HILOG_DEBUG("CalculateCenterPosition leftTopXPos: %{public}d, rightBottomXPos: %{public}d, " + "leftTopYPos: %{public}d, rightBottomYPos: %{public}d", + leftTopXPos, rightBottomXPos, leftTopYPos, rightBottomYPos); + + leftTopXPos = leftTopXPos > 0 ? leftTopXPos : 0; + leftTopYPos = leftTopYPos > 0 ? leftTopYPos : 0; + + rightBottomXPos = (displayWidth > 0 && displayWidth < rightBottomXPos) ? + displayWidth : rightBottomXPos; + rightBottomYPos = (displayHeight > 0 && displayHeight < rightBottomYPos) ? + displayHeight : rightBottomYPos; + + xPos = leftTopXPos + (rightBottomXPos - leftTopXPos) / 2; + yPos = leftTopYPos + (rightBottomYPos - leftTopYPos) / 2; + HILOG_DEBUG("CalculateCenterPosition xPos: %{public}d, yPos: %{public}d", xPos, yPos); +} + +void AccessibleAbilityChannel::InjectEventToInput(int32_t xPos, int32_t yPos, InjectActionType injectActionType, + int32_t displayWidth, int32_t displayHeight) +{ + HILOG_INFO("InjectEventToInput injectActionType: %{public}d, position: [%{public}d, %{public}d]", + injectActionType, xPos, yPos); + + if (xPos < 0 || yPos < 0 || (displayWidth > 0 && xPos >= displayWidth) || + (displayHeight > 0 && yPos >= displayHeight)) { + HILOG_ERROR("InjectEventToInput invalid position: [%{public}d, %{public}d], " + "displaySize: [%{public}d, %{public}d]", xPos, yPos, displayWidth, displayHeight); + return; + } + + auto injectTouchEvent = [](int32_t x, int32_t y, int32_t action) { + std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); + pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); + pointerEvent->SetPointerAction(action); + pointerEvent->AddFlag(MMI::InputEvent::EVENT_FLAG_ACCESSIBILITY); + pointerEvent->AddFlag(MMI::InputEvent::EVENT_FLAG_NO_INTERCEPT); + MMI::PointerEvent::PointerItem item; + item.SetDisplayX(x); + item.SetDisplayY(y); + item.SetRawDisplayX(x); + item.SetRawDisplayY(y); + item.SetPointerId(1); + pointerEvent->AddPointerItem(item); + pointerEvent->SetPointerId(1); + MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent); + }; + + if (injectActionType == INJECT_ACTION_TYPE_CLICK) { + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_DOWN); + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_UP); + } else if (injectActionType == INJECT_ACTION_TYPE_DOUBLE_CLICK) { + for (int i = 0; i < 2; i++) { + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_DOWN); + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_UP); + } + } else if (injectActionType == INJECT_ACTION_TYPE_LONG_CLICK) { + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_DOWN); + std::this_thread::sleep_for(std::chrono::milliseconds(LONG_PRESS_EVENT_INTERVAL)); + injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_UP); + } +} + RetError AccessibleAbilityChannel::ExecuteActionAsync(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, const sptr &callback) diff --git a/services/aams/test/mock/include/mock_accessible_ability_connection.h b/services/aams/test/mock/include/mock_accessible_ability_connection.h index c8160ee08..12cc0a8ef 100644 --- a/services/aams/test/mock/include/mock_accessible_ability_connection.h +++ b/services/aams/test/mock/include/mock_accessible_ability_connection.h @@ -45,9 +45,9 @@ public: MOCK_METHOD6( FocusMoveSearch, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t direction, const int32_t requestId, const sptr& callback, bool systemApi)); - MOCK_METHOD6(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, + MOCK_METHOD7(ExecuteAction, RetError(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr& callback)); + const sptr& callback, const Rect& rect)); MOCK_METHOD2(GetWindows, RetError(std::vector &windows, bool systemApi)); MOCK_METHOD3(GetWindowsByDisplayId, RetError(const uint64_t displayId, std::vector &windows, bool systemApi)); diff --git a/services/aams/test/mock/src/mock_accessible_ability_channel_proxy.cpp b/services/aams/test/mock/src/mock_accessible_ability_channel_proxy.cpp index 4fe50b13c..922329fe7 100644 --- a/services/aams/test/mock/src/mock_accessible_ability_channel_proxy.cpp +++ b/services/aams/test/mock/src/mock_accessible_ability_channel_proxy.cpp @@ -121,13 +121,14 @@ RetError AccessibleAbilityChannelProxy::UnholdRunningLock() RetError AccessibleAbilityChannelProxy::ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr& callback) + const sptr& callback, const Rect &rect) { (void)accessibilityWindowId; (void)elementId; (void)requestId; (void)callback; (void)actionArguments; + (void)rect; return RET_OK; } diff --git a/services/aams/test/mock/src/mock_accessible_ability_connection.cpp b/services/aams/test/mock/src/mock_accessible_ability_connection.cpp index ba8877eba..a30a31c93 100644 --- a/services/aams/test/mock/src/mock_accessible_ability_connection.cpp +++ b/services/aams/test/mock/src/mock_accessible_ability_connection.cpp @@ -115,7 +115,7 @@ RetError AccessibleAbilityChannel::FocusMoveSearch(const int32_t accessibilityWi RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWindowId, const int64_t elementId, const int32_t action, const std::map &actionArguments, const int32_t requestId, - const sptr& callback) + const sptr& callback, const Rect &rect) { GTEST_LOG_(INFO) << "MOCK AccessibleAbilityChannel ExecuteAction"; (void)accessibilityWindowId; @@ -124,6 +124,7 @@ RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWind (void)actionArguments; (void)requestId; (void)callback; + (void)rect; return RET_OK; } diff --git a/services/aams/test/unittest/accessible_ability_channel_test.cpp b/services/aams/test/unittest/accessible_ability_channel_test.cpp index 65afb0b9e..0b22d08a6 100644 --- a/services/aams/test/unittest/accessible_ability_channel_test.cpp +++ b/services/aams/test/unittest/accessible_ability_channel_test.cpp @@ -192,7 +192,7 @@ HWTEST_F(AccessibleAbilityChannelUnitTest, { GTEST_LOG_(INFO) << "AccessibleAbilityChannel_Unittest_ExecuteAction_001 start"; std::map actionArguments; - EXPECT_EQ(channel_->ExecuteAction(WINDOW_ID, ELEMENT_ID, 1, actionArguments, 0, nullptr), RET_ERR_NULLPTR); + EXPECT_EQ(channel_->ExecuteAction(WINDOW_ID, ELEMENT_ID, 1, actionArguments, 0, nullptr, Rect()), RET_ERR_NULLPTR); GTEST_LOG_(INFO) << "AccessibleAbilityChannel_Unittest_ExecuteAction_001 end"; } diff --git a/services/test/moduletest/aamstest/aams_accessible_ability_channel_test/aams_accessible_ability_channel_test.cpp b/services/test/moduletest/aamstest/aams_accessible_ability_channel_test/aams_accessible_ability_channel_test.cpp index e62ecd85f..0f63290bd 100644 --- a/services/test/moduletest/aamstest/aams_accessible_ability_channel_test/aams_accessible_ability_channel_test.cpp +++ b/services/test/moduletest/aamstest/aams_accessible_ability_channel_test/aams_accessible_ability_channel_test.cpp @@ -418,7 +418,7 @@ HWTEST_F(AamsAccessibleAbilityChannelTest, AccessibleAbilityChannel_ModuleTest_E ASSERT_TRUE(AccessibilityHelper::GetInstance().GetTestStub()); RetError result = - AccessibilityHelper::GetInstance().GetTestStub()->ExecuteAction(0, 4, 3, actionArguments, 0, nullptr); + AccessibilityHelper::GetInstance().GetTestStub()->ExecuteAction(0, 4, 3, actionArguments, 0, nullptr, Rect()); sleep(2); GTEST_LOG_(INFO) << "Test result"; EXPECT_EQ(-1, proxy_->testChannelElementId_); @@ -446,7 +446,7 @@ HWTEST_F(AamsAccessibleAbilityChannelTest, AccessibleAbilityChannel_ModuleTest_E ASSERT_TRUE(AccessibilityHelper::GetInstance().GetTestStub()); RetError result = AccessibilityHelper::GetInstance().GetTestStub()->ExecuteAction( - ACTIVE_WINDOW_ID, 4, 3, actionArguments, 0, nullptr); + ACTIVE_WINDOW_ID, 4, 3, actionArguments, 0, nullptr, Rect()); sleep(2); GTEST_LOG_(INFO) << "Test result"; EXPECT_EQ(-1, proxy_->testChannelElementId_); @@ -624,7 +624,7 @@ HWTEST_F(AamsAccessibleAbilityChannelTest, AccessibleAbilityChannel_ModuleTest_E ASSERT_TRUE(AccessibilityHelper::GetInstance().GetTestStub()); RetError result = - AccessibilityHelper::GetInstance().GetTestStub()->ExecuteAction(0, 4, 3, actionArguments, 0, nullptr); + AccessibilityHelper::GetInstance().GetTestStub()->ExecuteAction(0, 4, 3, actionArguments, 0, nullptr, Rect()); sleep(2); GTEST_LOG_(INFO) << "Test result"; EXPECT_EQ(-1, proxy_->testChannelElementId_); From 55fd043c90b02616c7011071e94b14b52fcdc8a9 Mon Sep 17 00:00:00 2001 From: chenrui_wza Date: Sat, 25 Apr 2026 17:54:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B1=8F=E5=B9=95?= =?UTF-8?q?=E6=9C=97=E8=AF=BB=E6=B3=A8=E5=85=A5=E7=82=B9=E5=87=BB=E3=80=81?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E3=80=81=E9=95=BF=E6=8C=89=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenrui_wza --- interfaces/kits/napi/src/napi_accessibility_utils.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interfaces/kits/napi/src/napi_accessibility_utils.cpp b/interfaces/kits/napi/src/napi_accessibility_utils.cpp index 703d4108d..97494da28 100644 --- a/interfaces/kits/napi/src/napi_accessibility_utils.cpp +++ b/interfaces/kits/napi/src/napi_accessibility_utils.cpp @@ -933,7 +933,9 @@ ActionType ConvertStringToAccessibleOperationType(const std::string &type) {"spanClick", ActionType::ACCESSIBILITY_ACTION_SPAN_CLICK}, {"customActions", ActionType::ACCESSIBILITY_ACTION_CUSTOM}, {"nextHtmlItem", ActionType::ACCESSIBILITY_ACTION_NEXT_HTML_ITEM}, - {"previousHtmlItem", ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM}}; + {"previousHtmlItem", ActionType::ACCESSIBILITY_ACTION_PREVIOUS_HTML_ITEM}, + {"injectAction", ActionType::ACCESSIBILITY_ACTION_INJECT_ACTION} + }; if (accessibleOperationTypeTable.find(type) == accessibleOperationTypeTable.end()) { HILOG_WARN("invalid key[%{public}s]", type.c_str()); From 76ea1c0dfdf475bf65e31c00ad5afaf48c3be70b Mon Sep 17 00:00:00 2001 From: chenrui_wza Date: Sat, 25 Apr 2026 18:36:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B1=8F=E5=B9=95?= =?UTF-8?q?=E6=9C=97=E8=AF=BB=E6=B3=A8=E5=85=A5=E7=82=B9=E5=87=BB=E3=80=81?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E3=80=81=E9=95=BF=E6=8C=89=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenrui_wza --- interfaces/kits/napi/src/native_module.cpp | 2 +- services/aams/src/accessible_ability_channel.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interfaces/kits/napi/src/native_module.cpp b/interfaces/kits/napi/src/native_module.cpp index 5efacf943..b8b2998e8 100644 --- a/interfaces/kits/napi/src/native_module.cpp +++ b/interfaces/kits/napi/src/native_module.cpp @@ -195,7 +195,7 @@ static napi_value CreateAccessibilityEventType(napi_env env) } static napi_value CreateInjectActionType(napi_env env) -{ +{ napi_value objValue = nullptr; napi_create_object(env, &objValue); napi_set_named_property(env, objValue, "CLICK", diff --git a/services/aams/src/accessible_ability_channel.cpp b/services/aams/src/accessible_ability_channel.cpp index d742250c2..2b847da9b 100644 --- a/services/aams/src/accessible_ability_channel.cpp +++ b/services/aams/src/accessible_ability_channel.cpp @@ -583,8 +583,8 @@ void AccessibleAbilityChannel::CalculateCenterPosition(const Rect &rect, int32_t rightBottomYPos = (displayHeight > 0 && displayHeight < rightBottomYPos) ? displayHeight : rightBottomYPos; - xPos = leftTopXPos + (rightBottomXPos - leftTopXPos) / 2; - yPos = leftTopYPos + (rightBottomYPos - leftTopYPos) / 2; + xPos = leftTopXPos + (rightBottomXPos - leftTopXPos) / DIVISOR_TWO; + yPos = leftTopYPos + (rightBottomYPos - leftTopYPos) / DIVISOR_TWO; HILOG_DEBUG("CalculateCenterPosition xPos: %{public}d, yPos: %{public}d", xPos, yPos); } @@ -622,7 +622,7 @@ void AccessibleAbilityChannel::InjectEventToInput(int32_t xPos, int32_t yPos, In injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_DOWN); injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_UP); } else if (injectActionType == INJECT_ACTION_TYPE_DOUBLE_CLICK) { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < DIVISOR_TWO; i++) { injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_DOWN); injectTouchEvent(xPos, yPos, MMI::PointerEvent::POINTER_ACTION_UP); }