3.5.0
lynx-family/lynx3.5.0Nov 17, 2025by Kingatnuaa0528
AI Summary
Feature release introducing TemplateBundle async decoding for Harmony, LynxModuleAndroid Authentication, LynxViewGroup support for iOS, and extensive embedded mode improvements.
Key Highlights
- TemplateBundle async decoding for Harmony to avoid blocking main thread
- LynxModuleAndroid Authentication using LynxMethod verification
- LynxViewGroup support for iOS to reuse runtime environments
- ServiceAPI integration for LynxBase on Android and iOS
- DevTool getBoxModel and getNodeForLocation support for iOS clay
- Embedded mode auto-size feature and timing fixes
- DefaultLogicExecutor implementation for iOS embedded mode
New Features
- TemplateBundle.fromTemplateAsync for Harmony platform
- LynxModuleAndroid Authentication with verification interface
- LynxViewGroup with isTemplateBundleReady/getLynxViewById APIs
- ServiceAPI management for LynxBase component
- DevTool getBoxModel and getNodeForLocation for iOS
- DefaultLogicExecutor for iOS embedded mode
- Auto-size feature in embeddedMode
- Image auto-size optimization using LynxViewGroup cache
- Multi-ABI builds support for Harmony (arm64-v8a and x86_64)
Full Release Notes
# Changelog ## 3.5.0 ### ✨ Features - [Feature][Harmony] TemplateBundle support async decoding ([28ed738](https://github.com/lynx-family/lynx/commit/28ed7382197102f8ae16eb200869f8ae202a2f3d)) @pilipala195 On the Harmony platform, ets code runs on the main thread by default. `TemplateBundle.fromTemplate` can block the main thread and causing app_freeze. This MR introduces the `TemplateBundle.fromTemplateAsync` interface, which allows callers to wait asynchronously using a `Promise`, thus avoiding blocking other operations on the main thread. - [Feature][Android] LynxModuleAndroid Authentication ([2e32ba6](https://github.com/lynx-family/lynx/commit/2e32ba69df758e2df96c0f4ef48648ec0498647e)) @OverWatch-Winder Use LynxMethod verification interface to verify whether the LynxMethod is allowed to be called. - [Feature][DevTool] Support getBoxModel and getNodeForLocation for ios clay ([c4cd7c1](https://github.com/lynx-family/lynx/commit/c4cd7c155e5fcd6f65ef7c1243bbbba6e8eb01f5)) @yuweizheng Support getBoxModel and getNodeForLocation for ios clay ### 🐛 Bug Fixes - [BugFix] add `auto-size` feature in embeddedMode. ([b5c2832](https://github.com/lynx-family/lynx/commit/b5c2832d876462dfd6f25e29b3772a003fe1c3ba)) @nhsprite add `auto-size` feature in embeddedMode. 1. create shadowNode for imageElement in case auto-size is true; 2. triggering requestLayout in justShadowNodeSize method, and mark element layoutNode as dirty; 3. invoke LynxUILayoutTick with closure, and take the closure as the trigger layout method in EmbeddedMode. (cherry picked from commit 1abce1e0c5847f77a56494d6cefa80400c7c75e9) - [BugFix][Event] Fix the problem of catch interception failure. ([da53e66](https://github.com/lynx-family/lynx/commit/da53e6693229b3a4883fd608090be04dd4201e7b)) @rAY-ooo description: When a catch-type event listener is set on the target node, the return result should be checked to prevent subsequent event propagation. - [BugFix] Report error when evaluateJavaScriptBytecode fails ([5f0306b](https://github.com/lynx-family/lynx/commit/5f0306b6b18d409c1f866229dc208a47c6509a2d)) @lybvinci Currently, we only log it, but it should be reported. (cherry picked from commit 04c4d4558340817eae6b6a54429e9a8d3bf8714e) - [BugFix] Add preload event reporting for iOS ([6139638](https://github.com/lynx-family/lynx/commit/61396382bdcd7dfaa051d4b75596c63a6ff03d9d)) @lybvinci Used to assist in locating iOS JSC crash issues. - [BugFix][Event] Provides a client interface for tapSlop on Android. ([cbc3c95](https://github.com/lynx-family/lynx/commit/cbc3c95cdd673ea9013246ecc2114994ac116a74)) @rAY-ooo description: tapSlop is a front-end switch with a default value of 50px. A client-side interface is provided to set the value of tapSlop, but when both the client and front-end are set, the front-end setting takes precedence. - [BugFix][Android][EmbeddedMode] Fix inline view not take effect. ([f6145c6](https://github.com/lynx-family/lynx/commit/f6145c6c8a183f39598cf60090fa8317ed132a7b)) @Randycn Support inline view on Android when enable embedded mode. - Propagate inline view sign and impl_id via text props - Measure inline children recursively and pass metrics to Java - Align inline views by mapping Java results back to children - [BugFix][Harmony] Fix the crash caused by multi-threaded reading and writing of font face. ([be6916b](https://github.com/lynx-family/lynx/commit/be6916be856ed8b03c1ce3e8272da70a61fe7b48)) @Randycn Add read-write locks to `font_faces_`. - [BugFix][iOS][image] LynxUIImage preview hash supports default metaData ([55061b8](https://github.com/lynx-family/lynx/commit/55061b82e3932f3a3258a19d7a4a5915c03e9951)) @liubb0516 LynxUIImage `placeholder-hash-config` preview type hash supports default `metaData` m-6788453885 - [BugFix] Fix compile error in i18nService ([57d4cb5](https://github.com/lynx-family/lynx/commit/57d4cb57f75d35eefc73fee4ba3491043582dfff)) @ykai55 Add the LynxServiceProtocol.h to the Lynx component, which just includes LynxServiceProtocol.h in the LynxServiceAPI component. This change avoids the breaking change of service implementation. (cherry picked from commit 70007c52ad916d0f37842f2d90589974756eb575) - [BugFix] Fix related issues when embeddedMode with jsruntime on ([c998236](https://github.com/lynx-family/lynx/commit/c9982364ccd3b21aff6258b5278c26c69d4fda22)) @nhsprite 1. considering the globalProps passed in LynxViewGroup for the embeddedmode rendering 2. AirMode is `AIR_MODE_FIBER` in embeddedMode, but it's still needed to send onJSPrepared event if logic executor is not set. 3. introducing LynxViewGroup into EmbedderTestVC, and adapts to the issue that lynxConfig is changed while LynxTemplateRender initialize process. 4. fix the crash issues that embeddedmode set but jsruntime is not init. 5. merge moduleWarpper with lynxViewGroup & lynxViewBuilder (cherry picked from commit 6626fc02910f8066f6e471846908c9cbc185bd1f) - [BugFix][iOS][EmbeddedMode] Fix line-height not take effect. ([57f9df8](https://github.com/lynx-family/lynx/commit/57f9df8c32eb5c1dd65d638bc7b755c6c3193e39)) @Randycn 1.Fix line-height not take effect. 2.Fix vertical-align not take effect. - [BugFix][LynxRecorder]Fix crash issues during recording and replay ([d0d0c7c](https://github.com/lynx-family/lynx/commit/d0d0c7ca0b866d664e66d42a706b3f37a9ad5b63)) @RovicnowYoyi 1. baseInspectorOwner maybe not ready yet. 2. add null check for piper_val in ParsePiperValueToJsonValue to prevent crash when parsing JavaScript object properties that may be null, undefined, or when getProperty() returns nullptr. (cherry picked from commit 00e53c54560d0dbbde8524673b1702d895f4d5da) - [BugFix] add trailKey for quickjs thread checker ([f79538c](https://github.com/lynx-family/lynx/commit/f79538c813717227c57dd2b1652bfc6a1bb8f0b5)) @nhsprite add TrailKey for quickjs thread checker. - [BugFix][Harmony] Use postTask instead of postSyncTask to avoid stuck. ([e549be7](https://github.com/lynx-family/lynx/commit/e549be70e56e5110e901f591ea9268823be9cc75)) @Tamerlx This MR is to use postTask instead of postSyncTask to avoid stuck. issue:m-6787511750 (cherry picked from commit e34df2679054d408a5bb2be207a319a1ff107db7) - [BugFix][LayoutInElement] fix the text decoration style issue ([5a48b48](https://github.com/lynx-family/lynx/commit/5a48b4848c3177ad8ab2858cc557eb41915c51e7)) @linxs0211 support text decoration for LayoutInElement mode - [BugFix] merge moduleWarpper with lynxViewGroup & lynxViewBuilder ([1567104](https://github.com/lynx-family/lynx/commit/15671044cf4d17302e0d7b920d1cbd0ed0d59b11)) @nhsprite 1. merge moduleWarpper with lynxViewGroup & lynxViewBuilder 2. add EmbedderModule for setData & getData from client. 3. DLynxBridge should not be registered in EmbeddedMode. - [BugFix] Guard removal of layout node by checking parent and using actual parent ([2ea58bb](https://github.com/lynx-family/lynx/commit/2ea58bb161a7d719c7d1dc1f3bfde47876c25808)) @zhongyr In element-mode layout, removing a child's layout node assumed this element was its parent, which could be false and cause incorrect removals or crashes. Now we verify the child has a layout node and a parent, then remove it from its actual parent instead of unconditionally using this->sl_node_. This prevents invalid parent-child operations and stabilizes node removal paths. - Add null and parent checks before removal - Remove child via child->slnode()->parent()->RemoveChild(child->slnode()) - Leave a FIXME to investigate mismatched parent relationships - [BugFix] prefers lynxGroup in LynxViewBuilder ([e86ca68](https://github.com/lynx-family/lynx/commit/e86ca68a5fec585f92a5d9a367725ead71c0f71b)) @nhsprite prefers lynxGroup in LynxViewBuilder so that lynxView in the same LynxViewGroup may still has seperate globalThis in js environment. - [BugFix][Event] Fix a gesture conflict issue when Lynx cards overlapped. ([936ece6](https://github.com/lynx-family/lynx/commit/936ece65f65c60978ac01aafec763fbf4b9f91c4)) @rAY-ooo description: Previously, because `OH_ArkUI_GestureEvent_GetNode` was not supported, setting a `HitTestBehavior` of type `Transparent` would reset the `event_dispatcher` to that of the bottom-level Lynx card when multiple Lynx cards overlapped. This caused gesture comparison to fail, resulting in upper-level Lynx cards failing to respond to clicks. Therefore, we set the `EventDispatcher` to `user_data` on the gesture-bound node, and then retrieved the `EventDispatcher` from the node in the custom gesture determination interface to ensure consistency. - [BugFix][Memory] Unify MemoryReportTimer to use LynxEventReporter thread. ([6803306](https://github.com/lynx-family/lynx/commit/6803306c305ea2308b0870af7d131f6541e61701)) @Tamerlx Refactors `LynxMemoryReportTimer` on both iOS and Android to use the shared `LynxEventReporter.delayRunOnReportThread`. This change replaces platform-specific timers (`NSTimer`, `ScheduledExecutorService`) with a single, centralized scheduling mechanism. This simplifies the code, unifies threading for all reporting tasks, and improves resource management by eliminating redundant timers and threads. - [BugFix] Making sure that TemplateData is released properly ([f626001](https://github.com/lynx-family/lynx/commit/f626001463d06591eb3bcd6388fb88577edadec5)) @nhsprite It's needed to make sure the templateData is released with the engine thread. In this patch an asscociated lynxContext is bind to templateData we will post the recycle runnable to engine thread if lynxContext is valid. thus that we have no need to keep the updateDataList at templateRender as it may cause memory issues when lynxView is kept alive the whole app lifecycle, the updateDataList will be larger and larger. anding a trail key "enable_data_list_fix" to control the fix with TrailService NoLanding: release/3.4 - [BugFix] Fixed the issue where lynxviewclient could not receive InitLynxviewEntry ([dbdc080](https://github.com/lynx-family/lynx/commit/dbdc080dd67f4ac244934f06d3b1c316229ba07a)) @Tamerlx This MR is to fixed the issue where lynxviewclient could not receive InitLynxviewEntry. Delay the sending of the init event to solve the problem of lynxviewclient registration being later than the event sending. The fix is to delay the init event until after main thread engine and background thread engine are ready. - [BugFix][Harmony] Fix shadow node UAF in FontFaceManager ([fc0e84b](https://github.com/lynx-family/lynx/commit/fc0e84bb413ca0f8fb78108aae24ee0467024238)) @zhongyr - Replace CheckNodeValid() with FindShadowNodeBySign() to properly validate node existence - Change loading_shadow_nodes_ from storing ShadowNode* to just storing sign - Use base::InlineLinearFlatSet<int, 4> instead of unordered_map for better memory efficiency - Fix potential use-after-free by ensuring node validity before marking dirty This prevents crashes when shadow nodes are deleted while font loading is in progress. - [BugFix][Image] revert enableImageRequestOptimize settings as false ([6f17691](https://github.com/lynx-family/lynx/commit/6f17691197dab3e5766cb9c09a3338bdbac1c488)) @linxs0211 set enableImageRequestOptimize as false by default - [BugFix] protect for NPE in getModuleWrapper ([94dafab](https://github.com/lynx-family/lynx/commit/94dafab6383c3a9e7d2dfe69c4d79fc268b45137)) @nhsprite protect for NPE in getModuleWrapper, in case that config or moduleFactoryPtr is nil. - [BugFix][iOS][EmbeddedMode] Apply NSParagraphStyle to entire attributed string to fix line-height. ([9d8ff86](https://github.com/lynx-family/lynx/commit/9d8ff86dbe751ba4ebe784bbc1f10af119bdf9e5)) @Randycn When there is inline text, the line-height on the root text may be overridden by child node properties, causing the line-height to become ineffective. Apply NSParagraphStyle to entire attributed string to prevent line-height from not working. - [BugFix][Event] Fix the issue where exposure was still triggered even when the Lynx card was in a hidden state. ([995ed36](https://github.com/lynx-family/lynx/commit/995ed36073b512693171a35b655ddf1a7bebe2cb)) @rAY-ooo description: In some scenarios, a Lynx card may be in the view tree but in a hidden state. In this case, Lynx's exposure detection should not be performed, otherwise it will produce unexpected exposure. - [BugFix][Event] Fix the issue where exposure was still triggered even when the Lynx card was in a hidden state. ([5b3cbc9](https://github.com/lynx-family/lynx/commit/5b3cbc93b2d97f77dc4b1be8b77a65a33b2eeec0)) @rAY-ooo description: In some scenarios, a Lynx card may be in the view tree but in a hidden state. In this case, Lynx's exposure detection should not be performed, otherwise it will produce unexpected exposure. - [BugFix] Fix Lynx image getUrl crash ([8e56eba](https://github.com/lynx-family/lynx/commit/8e56eba733a48297a9e96b1c45e1e8864ed7deae)) @liubb0516 Added null checks for `mCurPlaceholderRequest` to prevent `getUrl` crashes. m-6791533583 - [BugFix] Route font-face definitions to platform layout mode and fix map initialization ([e80d417](https://github.com/lynx-family/lynx/commit/e80d4172af3ef50202421be0b428db64c68ebc5f)) @jianliang00 When layout-in-element mode is enabled, font-face rules were not being propagated to the platform layout context, causing missing custom fonts. This change directs SetFontFaces to platform_layout_context_ when the mode is on, and returns early to avoid duplicate routing. Additionally, fix font-face map initialization in binary readers by binding to the returned container by reference. Using a value copy could lead to writing into a temporary and losing decoded entries. Changes: - ElementManager::SetFontFaces now forwards to platform_layout_context_ under element-mode and falls back to delegate otherwise. - LynxBinaryReader and TemplateBinaryReader initialize font_faces with a reference (auto&) to ensure decoded data is stored in the bundle. - [BugFix][LynxRecorder]Fix that the result of findViewById maybe null ([06cb253](https://github.com/lynx-family/lynx/commit/06cb253fbd096c8121a8546e1f63feddfa240859)) @RovicnowYoyi Add judgement to prevent NullPointerException crash. - [BugFix]Fix NSInvalidArgumentException cause by missing parameter ([99b48b4](https://github.com/lynx-family/lynx/commit/99b48b4db5cffa04d22006dcd96199c44c02919b)) @RovicnowYoyi Add back the missing parameter to fix the crash. - [BugFix] Make Tasm Check with bytebuffer as template input ([bf09e03](https://github.com/lynx-family/lynx/commit/bf09e03b27b3674b3f3c971480152966f2c661de)) @nhsprite ByteBuffer is a new type that lynx supported to optimze the load & parse period. Supporting Security Check with bytebuffer in this commit, we have no need to copy byte[] into `std::vector` instead we can initialize a `LynxServiceSignBlockBinaryReader` with the pointer & capacity in bytebuffer now. - [BugFix][Crash] fix the unthreadsafe init issue ([9c56ff9](https://github.com/lynx-family/lynx/commit/9c56ff978cfc5279bb0a2814a47c625a720d89a3)) @linxs0211 fix crash when getLynxTrailExtensionService - [BugFix][RadonFiber] when page classes change under Fiber-based Radon diff, mark children dirty before diffing to ensure styles resolve correctly. ([f21f7d3](https://github.com/lynx-family/lynx/commit/f21f7d374f7cc8a989f71e83e20a0419cd8602ee)) @DragonDragonDDD Refactor MarkChildStyleDirtyRecursively to use a clearer mark_whole_tree flag and adjust propagation semantics: - Stop marking at RadonComponent boundaries unless mark_whole_tree is true. - Pass mark_whole_tree to FiberElement::MarkStyleDirty for accurate propagation. - Update callers to propagate option.ShouldForceUpdate instead of using a root sentinel. - Add unit test to ensure component boundaries block non-global marking. - [BugFix] Initialize LayoutProxy in JSRuntime Standalone ([95ff21a](https://github.com/lynx-family/lynx/commit/95ff21a9f0ff12510c6b0b9b3a297f4523435b72)) @ChrisChan0668 Currently, LayoutProxy is only initialized in initPiper, which won't be tiggered in RuntimeStandalone. So we need to initialize LayoutProxy in attachPiper too. - [BugFix][Harmony] Propagate detailed error messages for lazy bundle fetch/verify failures ([3f5158c](https://github.com/lynx-family/lynx/commit/3f5158c770807ba4a30b97288f70325eba4ee82e)) @pilipala195 Improve error handling across Harmony lazy bundle fetching and verification: - Read error code from callback unconditionally and handle non-success paths by propagating the provider’s error message via response.err_msg. - Replace hardcoded "verify template bundle failed" with the actual error string returned from the fetch/verify layer. - Update LynxTemplateResourceFetcher to return a typed BusinessError including both code and data (message). Populate specific errors for invalid signature and missing binary. - Refine LynxSecurityService message for empty template to a clearer verification failure string. Previously, callers received generic messages and sometimes missed context on verification or fetch failures. Now they get accurate error codes and detailed messages to aid debugging and user feedback. - [BugFix][iOS] Avoid mutating collection during enumeration in ForeachArray ([ad18d07](https://github.com/lynx-family/lynx/commit/ad18d078f67421fe150dcd9271263f4690cf18d7)) @FrendyChen ForeachArray now iterates over a copied NSArray instance instead of the original backend_value_. The previous loop used backend_value_ for the count while enumerating a copy, which risked inconsistencies if the original array changed during iteration. Using [array count] ensures we iterate safely over the snapshot. - [BugFix] Do not create DefaultLogicExecutor by default. ([d7b6711](https://github.com/lynx-family/lynx/commit/d7b671145a0e43e08119cef54d7f66289aa63316)) @nhsprite 1. Making logicExecutor must be set in LynxViewGroup, if logicExecutor not set, init LynxRuntime instead. 2. Making DefaultLogicExecutor as no-param constructor, and it can be init when lynxViewGroup created. NoLanding: release/3.5 - [BugFix][Harmony][Font] Fix null pointer crash when calling GetTextInfo. ([1d0daac](https://github.com/lynx-family/lynx/commit/1d0daac0c9c7eb23db0ad8597c1a8c6b1b8d9759)) @Randycn Null check is required before accessing `font_face_manager`. - [BugFix][Android] Make sure LayoutProxy is initialized in all branches. ([41b27e8](https://github.com/lynx-family/lynx/commit/41b27e82d049276ea0001dd1c433a18fa790e435)) @ChrisChan0668 Currently, LayoutProxy might be null in the certain branch, which will cause NPE. This commit make sure LayoutProxy is initialized in all branches. - [BugFix][Android] Fixed the issue that text layout was not cached. ([9a8ba56](https://github.com/lynx-family/lynx/commit/9a8ba565567aa6a7752cd2b504db61ca95f4d4d7)) @Randycn When an inline view is included in an inline-truncation node, if updateMeasure of the inline view is not triggered, it will cause the cached result of the parent text node not to be correctly triggered in the next layout cycle. The `updateMeasure` method of all inline views needs to be triggered. ### 🚀 Optimization - [Optimize][iOS][EmbeddedMode] refine LynxViewGroup ([3f22ffc](https://github.com/lynx-family/lynx/commit/3f22ffce631951b7f0fb626ed82714a14b2e7bef)) @linxs0211 1.add onLynxEvent 2.refine LynxViewGroup - [Optimize][Android] Embed keyframe manager in ViewInfo for better animation handling ([c1673fd](https://github.com/lynx-family/lynx/commit/c1673fdec39f7975b1ecd8b4c24d37c0b7250c1a)) @zhongyr - Move KeyframeManager ownership from LynxUI to ViewInfo - Update animation handling in updateView() method - Clean up keyframe manager reference during detach (cherry picked from commit eae6f76f4262c44e6e69d33eedbae9229fa39a85) - [Optimize][iOS][EmbeddedMode][Part2] add ParseTemplateData for value_impl_darwin ([ee66bcb](https://github.com/lynx-family/lynx/commit/ee66bcb050e0fa38f3633769b0393801aa6dda53)) @linxs0211 1.add ParseTemplateData for value_impl_darwin 2.fix UT issue - [Optimize][Harmony] Support multi-ABI builds for Harmony ([9549144](https://github.com/lynx-family/lynx/commit/9549144e17f17165eee749ad1872f28129f0a35b)) @rel-q Updates the Harmony build script to generate binaries for both arm64-v8a and x86_64 architectures. - [Optimize] open js strip mode for eval ([7904db4](https://github.com/lynx-family/lynx/commit/7904db49a4f96b770b0d7d7531f789ae539201f0)) @zys777 - [Optimize][iOS][EmbeddedMode][Part3] introduce DefaultLogicExecutor ([d3422db](https://github.com/lynx-family/lynx/commit/d3422dbb3293b8e417c76effb72e5d0ce6429922)) @linxs0211 add DefaultLogicExecutor - [Optimize][iOS][Image] LynxUIImage supports fetch UIImage from container ([1e70585](https://github.com/lynx-family/lynx/commit/1e70585cf2d496c2d3c65082769dd851ddb3178d)) @liubb0516 Implement `fetchUIImage` to support the migration of scenarios such as iOS mini app to LynxImageService. m-6782584583 - [Optimize][Element]Export image, list, list-item and scroll-view typings ([fc63270](https://github.com/lynx-family/lynx/commit/fc63270c7a0d790a484eff1f20507820352784a9)) @MoonfaceX Add typings exports for common elements to improve type support in consuming projects - [Optimize][Harmony] Optimize image load failure logging ([3fc61e5](https://github.com/lynx-family/lynx/commit/3fc61e523b1e636b3dbe87d1f12e3b096cd4333f)) @rel-q Adds the node's src attribute to the error log for failed image loads to provide more debugging information. (cherry picked from commit faaedad2274b201b8bbe6faa1b4f981e67e6a36d) - [Optimize][Harmony]Clear keyboardHeightChangeCallback when unmounting ([6311377](https://github.com/lynx-family/lynx/commit/6311377cbd27a86b265bb0ae31665853765a2f4e)) @MoonfaceX Prevent potential memory leaks by explicitly setting the callback to undefined when the component unmounts - [Optimize] using LynxViewGroup to optimize Image AutoSize ([b6d5437](https://github.com/lynx-family/lynx/commit/b6d5437c4099423f8c9a48ea1a66bca56e58c42f)) @nhsprite image with autosize should trigger layout reflow when loadsuccess, which is performance cost. Using lynxViewGroup to cache bitmapSize, so that image may accquires the bitmapSize before loadSuccess in cache cases, making the measure in `AutoSizeImage` return the proper size immediately. - [Optimize] Link async React lifecycle events using flowId ([1c1a2ee](https://github.com/lynx-family/lynx/commit/1c1a2ee9f2a2867fcbb33fcd51acc343e38fc099)) @KingAlen Asynchronous component lifecycle events like `OnReactComponentCreated` and `OnReactComponentRender` were previously disconnected from their triggering sources in traces. This change introduces a `flowId` to connect these background events to their upstream calls, enabling a complete execution flow trace across threads. - [Optimize][Harmony] Add windowStage storage link and update window handling ([58cd821](https://github.com/lynx-family/lynx/commit/58cd821c4b2b58a9bee2bc3cbd31e855643f7e17)) @MoonfaceX Add StorageLink for windowStage and modify window retrieval logic to use windowStage if available (cherry picked from commit 28042d0723e26e10bf5a1ed24114d785991e8920) ### 🛠️ Infra - [Infra] Cache pnpm dependencies ([03f498e](https://github.com/lynx-family/lynx/commit/03f498e5f5ee91453f4ff8bcfdf72b96976ae37d)) @coolkiid Fix occasionally occurring network issue when installing pnpm dependencies. other fix: set debugrouter deps attribute enable_lfs to false. - [Infra] Import some third party libraries and relative patch files. ([80815e7](https://github.com/lynx-family/lynx/commit/80815e78c3163c0b8a5d7dc8aa7632307d0ac21f)) @zsy-jason 1. Update the source of expat to flutter source, and add relative patch file; 2. Import harfbuzz and gyp libraries, add relative patch files. - [Infra] Change the usage of the pip command ([0d123bf](https://github.com/lynx-family/lynx/commit/0d123bf1527500b2efb290de9401a8dfb1642039)) @deanjingshui Change the usage of the pip command ## [3.5.0-rc.0] - 2025-10-31 ### ✨ Features - [Feature][iOS] Decoupling LynxService framework and Trail/Log service interface from Lynx framework ([dfb1235](https://github.com/lynx-family/lynx/commit/dfb1235c2f25ba1ad2e92bd4cea0310eed1e9c26)) @ykai55 The frameworks like Lynx can now also use services without relying on the Lynx component after this refactoring. (cherry picked from commit 81c91b151169609aee98f303c8ebb2afbf90c3d2) - [Feature] The LynxBase component uses ServiceAPI to manage Service implementations on the Android side. ([f3ca22e](https://github.com/lynx-family/lynx/commit/f3ca22e2ddfe68d5ef93aebac06c0fc52b40f86f)) @yongjieTang After the Service API was moved to a lower layer with independent dependency capabilities, in order to reduce maintenance costs and code redundancy, LynxBase now uses the Service API to manage Service injection and access. (cherry picked from commit 5681e6fae467d95aba66d2e0e2894d418ecf9e42) - [Feature] LynxBase component uses ServiceAPI to manage Service implementations on the darwin side. ([ab77a2c](https://github.com/lynx-family/lynx/commit/ab77a2c66c532e206c11dcbb6939ee95ca36f3af)) @yongjieTang After the Service API was moved to a lower layer with independent dependency capabilities, in order to reduce maintenance costs and code redundancy, LynxBase now uses the Service API to manage Service injection and access. (cherry picked from commit ce7c94c5c996bbd747b2b0f8d72cf928a2835e55) ### 🐛 Bug Fixes - [BugFix][Event] Fix runWorklet not differ event and eventClosureListener ([206fda5](https://github.com/lynx-family/lynx/commit/206fda5ebe166c6c2b58a31a024a40da89bf84d7)) @f0rdream Currently, there're EventHandler and ClosureEventHandler to handle events, when they call `runWorklet`, framework need to distingish these two, to wrap different object in it. (cherry picked from commit 45072d294f9d9bdd9ab7d3e249dab7df8f483d51) - [BugFix][Harmony] Refactor overflow clipping implementation in UIBase for Harmony platform ([77ff43e](https://github.com/lynx-family/lynx/commit/77ff43ecf6adc726ca5b20b089a4391a0afa1dea)) @rel-q Updated `ApplyOverflowClipPath` and `ApplyOverflowClipRectangle` methods to improve clip handling and overflow behavior (cherry picked from commit a1aa8a3e76ca3ede3cdb51a1328de2e6b0aef6c2) - [BugFix][Event] Modify the native-interaction-enabled validation logic. ([2a9ee52](https://github.com/lynx-family/lynx/commit/2a9ee5211367a628199e66f96b55516286b82806)) @rAY-ooo description: Since HitTestMode.None only affects the node itself and cannot affect its child nodes, it is necessary to traverse the UI tree before touching so that native-interaction-enabled can affect its child nodes. (cherry picked from commit 948823949dd849813e137e5b9c8cf04c63adf4e2) - [BugFix] fix embedded mode issues ([1ab2c57](https://github.com/lynx-family/lynx/commit/1ab2c57038e64d40972f81f6a49d685fd090a932)) @nhsprite Fix some embedded mode issues: - in engine reuse cases, if data is not changed we need to make sure rebuildViewTree for each LynxView. - in case lynxView is created without init, we need to protect the case that mKeyboardEvent is null. (cherry picked from commit 6445c07635be0d037ca39f6c183e7142e80b65a5) - [BugFix][Harmony] Fix vertical position error of inline view when setting vertical-align as middle. ([f1e9a93](https://github.com/lynx-family/lynx/commit/f1e9a93ca69a14f2d4af29c06c9be4e306c493c0)) @Randycn When calculating the offset of the middle property value, the vertical offset of the line was omitted. (cherry picked from commit 92106461ef9eb4d96d60bc6359e1085e71bdb7b6) - [BugFix][Android] Add pixelCopy support and optimize screenshot generation ([a32039d](https://github.com/lynx-family/lynx/commit/a32039d2cdff623bbaca69cd6c08024085a4807f)) @rel-q Moves bitmap processing to a background thread and adds a pixelCopy option for better screenshot generation (cherry picked from commit 3c5e5fcc6bfc3f7aa8fbf9d9c2df16b858476671) - [BugFix][List] Fix sticky item not render when list scroll in the next vsync. ([23b5942](https://github.com/lynx-family/lynx/commit/23b5942063179dddf7ea05db0156e3fb9d6aa98f)) @DwwWxx If list's scroll offset is updated in the next vsync callback, we should set sticky item's translate after updating scroll offset. (cherry picked from commit b305e1698f1f4021c7746b68403c75a542525819) - [BugFix][InlineStyle] fix the issue when splitting inline style string ([55aadc2](https://github.com/lynx-family/lynx/commit/55aadc215982c8eed1e72d4a32b698b65295bfc5)) @linxs0211 When there are single quotes, the style string splits incorrectly, failing to skip the closing single quote. (cherry picked from commit 76b849e5009b92b1ce1d9a61aa3dfcc597839eae) - [BugFix][iOS] Fix compilation errors when using LynxServiceRegister in LynxBase ([d2f57ac](https://github.com/lynx-family/lynx/commit/d2f57acc2f9815c7ad6728c0b6fc513fa2f73ef4)) @ykai55 Using the same guard condition in ServiceLazyLoad.h and LynxLazyLoad.h to avoid redefination of macros. This change fixes compilation errors when using LynxServiceRegister in LynxBase. (cherry picked from commit 81a557fac596d82059a891c4bcaf3daed4338041) - [BugFix] using correct resourcetype when fetchTemplate ([d0300cf](https://github.com/lynx-family/lynx/commit/d0300cfe9ef629cf5dacfbe9ca528ee0f0b65cbd)) @nhsprite - Update resource type handling in resource loader - Fix template resource callback parameter usage - Ensure consistent resource type across platforms (cherry picked from commit 0754ba9a3ecb91d01215413edcf338819b04cadd) - [BugFix][Event] The new event logic adapts to triggerEvent. ([b021472](https://github.com/lynx-family/lynx/commit/b021472d3cca31a1963f3d4a2918b8c5fccbafb3)) @rAY-ooo description: 1. Added the enableEventHandleRefactor switch to control the new event handling logic. 2. Adapted the triggerEvent interface to trigger CustomEvent. 3. Fixed an issue where catch interception failed. 4. Adjusted the event triggering order. - [BugFix] Fix the bytecode generation task handling error that causes task loss ([5114025](https://github.com/lynx-family/lynx/commit/5114025382d1dfd736d34e7816fe5d76818d4a1e)) @lybvinci Because active and passive generation may execute sequentially, and passive executiondoes not include all tasks while active generation includes all tasks, judging only by template key can cause tasks to be overwritten and some tasks to be lost. (cherry picked from commit 3eb805b5e19992606c9a6c988e81964aaa6e8730) - [BugFix][List] Fix list item-snap not work on Harmony platform. ([2245672](https://github.com/lynx-family/lynx/commit/2245672f714711420a120dafe8768948fd87caa0)) @DwwWxx (cherry picked from commit a83703292af36c4547391edc41a24baf08435e17) - [BugFix] Fix the issue with incorrect reading of the codecache toggle. ([4991868](https://github.com/lynx-family/lynx/commit/4991868eaf0a205c268ff78d45767538d66e1038)) @lybvinci Use the remote switch as primary and the local switch as secondary to resolve the issue of remote switch failure. (cherry picked from commit 187f01b3dfd3431d1f31b320b57d1be71e734c1f) - [BugFix][Harmony] Self-Adaptation text height when line-height is the default value. ([5568240](https://github.com/lynx-family/lynx/commit/556824039ec2815ff3cdc525286433a5252ac513)) @Randycn When the developer does not set the line-height, no specific line height will be set, and the text height will be expanded using font Self-Adaptation. (cherry picked from commit d38fa2000c821be1c7883d57630b3085cffec187) - [BugFix] There lacks a `debuggable` value in InitRuntimeStandalone ([02560d9](https://github.com/lynx-family/lynx/commit/02560d95d1066c1e0fcfd001176fe51bb28d864f)) @talisk summary: When use `debuggable` to enable instance-level debugging, we should pass `debuggable` via InitRuntimeStandalone. (cherry picked from commit 52ce5bd266702b47ea13a85fdcb72199f0777a41) - [BugFix][List] Fix invoking EnqueueComponent() multiple times in the rendering pipeline of a single list item. ([7017e1c](https://github.com/lynx-family/lynx/commit/7017e1cc1495ac3ed72063856fc7d0beff032d8f)) @DwwWxx As the layout is triggered twice in the layout process, and the second layout will use the same PipelineOption, the HandleListOrComponentUpdated may also trigger twice. Therefore we will clear all list-related variables in PipelineOption after the first layout. (cherry picked from commit a896084c7cfd7ad9ea76c540e9bde02d79e7b82d) - [BugFix][iOS] Fix text overlapping in the scenario where text is reused in a list. ([c582605](https://github.com/lynx-family/lynx/commit/c582605cf4495d892e678e884358ede262e1c062)) @Randycn 1.When text is reused, the previously drawn text may not be cleared, and the contents of both the view and layer need to be reset. 2.When there are line breaks in the text, `boundingRectForGlyphRange` returns the typography width instead of the actual text width. Change it to the maximum value between the maximum font size and the text typography width. (cherry picked from commit b398b8c165a3f4a0d28ee3bf7240c6140c17acf3) - [BugFix][Gesture][Harmony] Fix gesture stop fling will trigger bindtap in harmony ([0c879a2](https://github.com/lynx-family/lynx/commit/0c879a2e450067357e0e6c25e46b98128acb0397)) @AdrianLCA Fix gesture stop fling will trigger bindtap in harmony, merge single touch and multi touch gesture processing logic. (cherry picked from commit b27965e08ced4f54f7f512241c39eab1bfb49919) - [BugFix][Clay][Headless] Pick historical fixes in headless mode. ([beea3cf](https://github.com/lynx-family/lynx/commit/beea3cf337dd6a4ecda30bf110a816d54620e56a)) @ChrisChan0668 Details: Add ENABLE_HEADLESS flag and update platform checks to include headless mode Integrate harmony platform support for resource loading and task runner Refactor resource loader service to use common LynxResourceLoader interface Update text input and mouse handling for headless compatibility (cherry picked from commit cf3f596c91b124224fba909022e1e741015503b8) - [BugFix][Devtool]Initialize devtool env before lynx shell reset. ([e67d9ea](https://github.com/lynx-family/lynx/commit/e67d9ea492cb2190829fa042ecc64f1e06b84c7d)) @benb365 - Initialize the devtool env sufficiently early to make sure all debug switches are prepared before the lynx shell resets - Enable devtool in lynx example - [BugFix][Android]: add ByteBuffer support for TemplateProviderResult initialization ([95eff53](https://github.com/lynx-family/lynx/commit/95eff534e08547cbcb0a39f460b0d682ef3f67fc)) @nhsprite - Add constructor to initialize TemplateProviderResult with ByteBuffer - Update LynxTemplateRender to handle ByteBuffer-based templates - Enhance TemplateLoaderHelper and TemplateResourceCallback for ByteBuffer support - Add comprehensive unit tests for ByteBuffer functionality - Update native resource loader to support ByteBuffer operations (cherry picked from commit 4cf1ec83f7b302340fe293103741f5e5028c7766) - [BugFix][List] Fix return value with list getVisibileCells ([503f08f](https://github.com/lynx-family/lynx/commit/503f08f92a0943466965c2824394242297514643)) @DwwWxx 1. The value of 'id' should be the IdSeclector of list-item. 2. The order of visible cells should be ascending. (cherry picked from commit 736f26fb5e00578754a73610cf95fb515b124811) - [BugFix][DevTool] Fix the function name’s initial capitalization error in HarmonySessionHandler ([2080099](https://github.com/lynx-family/lynx/commit/2080099bcdae019ebcbcea9ffcf584998bd771d3)) @yuweizheng Fix the function name’s initial capitalization error in HarmonySessionHandler, resolving the callback failure issue. (cherry picked from commit 139fbddb959059fa86e43660054ea47809cf8625) - [BugFix][Harmony] Use weak_ptr for Delegate in NativeModuleHarmony ([f2f5d3b](https://github.com/lynx-family/lynx/commit/f2f5d3b8ec114b1595ba8a82425cb990e50c8834)) @rel-q Change the Delegate from a shared_ptr to a weak_ptr to prevent potential reference cycles. (cherry picked from commit 28c6f22a11caa95275d900759ba127e7a1c7ffa6) - [BugFix][DevTool] Fix HarmonyOS logbox failing to display error in some scenarios ([6a84de6](https://github.com/lynx-family/lynx/commit/6a84de63812c2aeb8aa9ff180c752261e540650a)) @yuweizheng If a logbox error's JS file has an unreachable source map URL, HarmonyOS misses the error catch, so no default response returns. The front end awaits indefinitely, leaving the logbox stuck on "error data is loading". To solve this, a try-catch block was added around the download logic to ensure that any exceptions are caught, allowing fallback logic to execute and return an empty response to the frontend. (cherry picked from commit b119533fe808032286aa67006c9a825789063db3) - [BugFix][Event] Fix the issue where custom events could not be monitored or intercepted. ([ee85038](https://github.com/lynx-family/lynx/commit/ee850385abd6e824b0daced4d20e79eb8b639251)) @rAY-ooo description: For custom events, you need to find the corresponding event target through uiowner so that subsequent client event monitoring or interception can proceed normally. (cherry picked from commit 650600457423b7b90ec6a7837c18abc9a4955304) - [BugFix] Make LynxRuntime Initialization If LogicExecutor is not Provided ([c8a5427](https://github.com/lynx-family/lynx/commit/c8a54272c8e5a8c07e012de52ea6bef4dff24f0c)) @nhsprite LogicExecutor is a replacement of LynxRuntime in embeddedMode, It's needed to make LynxRuntime Initiazation if Users has not provide the implementation of LogicExecutor. while, if the EnginePool is enabled, we will provided a DefaultLogicExecutor as default Implementation, but not in Base EmbeddedMode. (cherry picked from commit e49f911fd7f0f2dfc8df7995495471e990baa527) - [BugFix] Handle null nodes and out-of-bounds operations in ShadowNode. ([4d16013](https://github.com/lynx-family/lynx/commit/4d160136f96b65915e1a3c31182d140351a181ba)) @ChrisChan0668 - Add null checks for parent and child nodes in shadow node operations - Replace assertions with error logging for better error handling (cherry picked from commit 7b95468a465795ff33c3e22b3b3ca95bd786acfd) - [BugFix][Event] Fix exposure accuracy logic and sub-thread operation issues ([1a49001](https://github.com/lynx-family/lynx/commit/1a490018cf2baea66be28c6ba2c2c80d645e3e83)) @rAY-ooo description: 1. Consider 100% scenarios when comparing cross-proportions. 2. Avoid using strict equality when determining transparency. 3. Avoid manipulating UI and exposure data in child threads. 4. Avoid adding listeners repeatedly or omitting listeners. 5. Add event-related logs. - [BugFix][List] list item should have defualt size in main axis. ([c991018](https://github.com/lynx-family/lynx/commit/c9910187894020c3b18b3d8beda6938bf160d618)) @DwwWxx In c++ list, if list item has no estimated size in main axis, we use 200px as the default size in main axis to avoid rendering all list items. (cherry picked from commit 42d1dd2a73ac977c90e80fbe78f28932e6a36ee7) - [BugFix][List] Fix list trace info ([a8a1076](https://github.com/lynx-family/lynx/commit/a8a1076444e1703426aaf424449e0fef1b141573)) @DwwWxx (cherry picked from commit 08f4d43d661887701cee56d8bf7e75e1da2d39c1) - [BugFix] typo for `scroll-width` and `list-width` ([a7fb24d](https://github.com/lynx-family/lynx/commit/a7fb24d1e9800bb9be3ec1b77a302d20c114ada0)) @ci_lynx Oops, let's look up the dictionary first next time. We didn't delete the wrong name for not to introduce breaking changes. (cherry picked from commit 4d9bfdde60a8815c45e9754d339a69b3554014f0) - [BugFix][Frame] The LynxView mounted on LynxContext is null ([86266ac](https://github.com/lynx-family/lynx/commit/86266ac4e06df2600ff711c899159ac9f04badc0)) @pilipala195 In previous scenarios, the UIBodyView mounted on LynxContext was defaulted to LynxView, so LynxView would never be null when retrieved. The introduction of LynxFrameView has led to the fact that the UIBodyView mounted on LynxContext is not necessarily of type LynxView. 1. On Android, when we initialize lynxframeview, we save the uibodyview of lynxcontext in mrootview of lynxframeview, and return this mrootview when lynxcontext.getlynxview is called. 2. On iOS, `LynxFrameView` store the `rootView` which in `LynxView` type, so we just return `rootView` when `LynxContext.GetLynxView` in frame. (cherry picked from commit e9d3d7af21149fb331d035029093c54182e99367) - [BugFix][Android] Fixed the issue of registering LynxMethod with the same name in Devtool ([f9e563d](https://github.com/lynx-family/lynx/commit/f9e563d2f7d907693ae569eedecaa26ae24b225e)) @OverWatch-Winder Fixed the issue of registering LynxMethod with the same name in Devtool.LynxModule currently does not allow registering a LynxMethod with the same name, but will be supported in the future. (cherry picked from commit bedd4c194aebd6a5528fceb395f3e8c31b72a1a5) - [BugFix][Part2] suppot lynxViewGroup in Darwin ([156cfff](https://github.com/lynx-family/lynx/commit/156cfff3aaf0c820579c5a0bed9cb54f53c0618d)) @nhsprite - Add substantial implementation to LynxViewBuilder.mm, providing custom getters that consider lynxViewGroup first. - Remove legacy props in LynxBaseConfigurator to LynxViewBuilder, lynxViewGroup should not considering it any more. - optimize loadTemplate with meta, if bundle is provided with metaData or lynxViewGroup, it should be considered to optimize the performance. (cherry picked from commit ffd67ca07d31a5e17c44a1688c5daedb7322a8e5) - [BugFix][List] Fix list typings. ([afa546f](https://github.com/lynx-family/lynx/commit/afa546f63ddfc2df85014237717205bfb8e554b0)) @DwwWxx Re-define list-type to avoid incompatible error. - [BugFix] Fix the issue where the static variable g_looper_class is null. ([23fa7f1](https://github.com/lynx-family/lynx/commit/23fa7f105c90759da6030d2c7ad189afc5baf728)) @yongjieTang Sometimes downstream projects call LynxEnv.loadNativeLynxLibrary to load Lynx-related dynamic libraries, but that path does not load the base library. As a result, the message-loop-related variables remain uninitialized and eventually cause a crash. This change fixes the issue by explicitly initializing LynxBase during the LynxEnv.init flow. (cherry picked from commit 71f15058c212bc66ddf16e8f7bc853251c6f55a4) - [BugFix] ChoreographerLayoutTick needs to post layout-related to Layout thread rather than executing it on current thread. ([b4febbb](https://github.com/lynx-family/lynx/commit/b4febbb1fae3d815723fa1f339f987cc41df94b6)) @ChrisChan0668 ChoreographerLayoutTick should never be used in ALL_ON_UI mode, however, we might switch thread mode to ALL_ON_UI and layoutTick cannot be reset to ViewLayoutTick. Using ChoreographerLayoutTick in ALL_ON_UI mode will trigger Layout-related task in a wrong thread. This commit provides a temporary solution to fix it, posting task to Layout thread with LynxContext. Key changes: 1. Add LynxContext member variable to ChoreographerLayoutTick for accessing layout thread 2. Modify ChoreographerLayoutTick constructor to accept LynxContext parameter 3. In doFrame callback, if layout thread change is detected, post task to layout thread via LynxContext.runOnLayoutThread() 4. Add runOnLayoutThread() public method to LynxContext with @RestrictTo annotation to limit access scope 5. Add hasLayoutThreadChanged() and setLayoutThreadChanged() methods to LynxContext for tracking layout thread change state 6. Pass mLynxContext parameter when creating ChoreographerLayoutTick in LynxTemplateRender 7. In LynxTemplateRender.onThreadStrategyUpdated(), mark layout thread as changed when thread strategy is MOST_ON_TASM or ALL_ON_UI 8. Add thread safety protection in LynxLayoutProxy using ReadWriteLock to ensure thread safety of native pointer access 9. Add corresponding method declarations in API definition files This fix ensures that layout-related tasks are executed correctly in the layout thread after layout thread has changed, avoiding thread safety issues. - [BugFix][Event] HitTest adapts the sticky logic of the list. ([941bc2a](https://github.com/lynx-family/lynx/commit/941bc2a161f05be5a69b35bd431d345dcbff8878)) @rAY-ooo description: The sticky logic of the list is different from that of the scroll-view, so they need to be adapted separately. (cherry picked from commit 1342f4994c91bf22b08523ec8c55de835315c6cd) - [BugFix][iOS] Fix image element layout behavior on iOS platform ([4c84827](https://github.com/lynx-family/lynx/commit/4c848270f7072bc2e06a27fd1a2b6a6b9d300785)) @zhongyr - Add platform_traits.h to detect OS type at compile time - Create platform-specific GetImageNodeInfo() method for iOS - Make iOS always use kCommonBuiltInNodeInfo for image elements - This fixes layout issues with inline images on iOS platform - [BugFix][Event] Fix the multi-threaded operation issue of sendEvent in LynxUIExposure. ([08f423c](https://github.com/lynx-family/lynx/commit/08f423cd7533c261b9a3685deff088388967869c)) @rAY-ooo description: When different threads call sendEvent, it may trigger the problem of multiple threads operating uiSet. Therefore, a copy is needed for traversal. AudoLand: release/3.5, release/3.4 - [BugFix][Timing] attach NativeFacadeActor to TimingActor for full functionality. ([71621c1](https://github.com/lynx-family/lynx/commit/71621c189326e7f0530834f2aa24feb6257ec874)) @Tamerlx Ensure TimingHandler is fully functional by connecting NativeFacadeActor to TimingActor when perf_controller_actor is available. issue:m-6787554633 (cherry picked from commit ecefa47e4619ecea8250fb56ce2e2b58843676f3) - [BugFix][Embedded]fix lineHeight error ([970c3f8](https://github.com/lynx-family/lynx/commit/970c3f83092d39c3e2aa98dc07d99b33e0de30c2)) @linxs0211 use the wrong lineHeight type for LayoutInElement (cherry picked from commit c10b99e666d7e9d707226312a5df823e424abfa4) - [BugFix][Harmony] Remove spread limit for outset shadow to enable complete display ([009a11a](https://github.com/lynx-family/lynx/commit/009a11ada2d4678b585fa9e195cd59c5d799d705)) @zhongyr We should not give a limit with spread to enable outset shadow can be completely displayed. The previous code limited the spread radius to min(width, height) / 2 for both inset and outset shadows, but outset shadows should not have this limitation as they extend outward and need to be fully visible. (cherry picked from commit b687ebb68db335cf37406791aa4b1b06edcfbee3) - [BugFix][Android] Fixed ExtensionModule not being initialized in Context Free mode ([e832343](https://github.com/lynx-family/lynx/commit/e832343d75a95762dfbfcf22c2d7dddac471a447)) @FrendyChen When the user precreates LynxTemplateRender but does not create LynxView, the initial ExtensionModule will return early because LynxView is nil, causing initialization to fail. - [BugFix] fix crash in layout node manager ([a36616f](https://github.com/lynx-family/lynx/commit/a36616f8d68c5fde2c1123273193a0b9da02e3fd)) @ci_lynx fix crash in layout node manager - [BugFix][EmbeddedMode] fix keyframes not working issue ([e81aac5](https://github.com/lynx-family/lynx/commit/e81aac530f9fa1d69c22c507ce8d215c6712e4bc)) @linxs0211 fix the Keyframes not working when enable SimpleStyling (cherry picked from commit 850bafee2c2060a567e15ddaace338d02a78cfa4) ### 🚀 Optimization - [Optimize][typings] Optimize list and list-item typings. ([feb1704](https://github.com/lynx-family/lynx/commit/feb170427106012e15500dcfb2420b7b6eb074a0)) @DwwWxx - [Optimize] Refactor gn for clay release ([9faa5ff](https://github.com/lynx-family/lynx/commit/9faa5ffc3466e677d33e46cebb7ab2c8c8bbf358)) @rel-q Initialize clay build environment (cherry picked from commit b493056c4d19db1ce1f6e9d7f45011b811f4a8e1) - [Optimize][Event] Add enableExposureWhenReload to support exposure during reload. ([a84492f](https://github.com/lynx-family/lynx/commit/a84492f4b6ab9320a36b8425c4630e0ed4e6192d)) @rAY-ooo description: In the reload scenario, lynxview is reused, the element tree is updated after diff, and if the exposure node does not change, the exposure event will not be triggered. However, for the business, exposure may be required in this case, so we add the enableExposureWhenReload switch to control whether exposure is triggered in this scenario. - [Optimize][Clay] devtool use real dpi ([3d0f4a5](https://github.com/lynx-family/lynx/commit/3d0f4a5d0dcc235b4a77f1735862f1776e6a1c53)) @ci_lynx 1.devtool use real dpi - [Optimize][Android][Input]Ensure text inputs are focusable in touch mode ([7484159](https://github.com/lynx-family/lynx/commit/7484159849d1bdc5b60906ed0d8552241fed9a26)) @MoonfaceX Set isFocusableInTouchMode to true for both LynxUITextArea and LynxUIInput to handle cases where the default style may set it to false in application context (cherry picked from commit 5da2f9261d920218548c43a970201472f1a5dbd3) - [Optimize][iOS] Add pre-creation high-priority option to prevent thread deadlocks. ([149629e](https://github.com/lynx-family/lynx/commit/149629e3b8884006620f5b19346e0549305d8b4b)) @Yellow5A5 This commit addresses a potential deadlock issue during thread creation. When a high-priority parent thread creates and waits for a low-priority child thread to initialize, the child may not get scheduled in a busy system, causing the parent thread to block indefinitely. To resolve this, a "create-with-boost" mechanism is introduced, along with adjusted logic for restoring thread priority after startup: - Adds an enable_preset_thread_priority option to ThreadConfig . - When enabled, the new thread is temporarily boosted to the highest priority before creation. This ensures it can run its initialization code immediately and unblock the parent. - After startup, PlatformThreadPriority::Setter restores the thread to its final target priority. - The HIGH priority level is always restored, while other levels are only restored if the temporary boost was enabled. (cherry picked from commit d5b678cd3c5113e8f577f499e4cb7a199978bf87) - [Optimize] Add detailed logging for lynx extnsion module setup ([58240b8](https://github.com/lynx-family/lynx/commit/58240b8785ef3bded17561cca9de5807ce6fb6d2)) @ci_lynx Adds more detailed logging to the Lynx extensions module to help diagnose and address setup failures. (cherry picked from commit c107d0ec6d09c82e004a147112817bb1f204e004) - [Optimize] Unify Trace logging across asynchronous tasks ([1064455](https://github.com/lynx-family/lynx/commit/1064455a68ed66c653c196d1af0d1af1e971fad2)) @KingAlen During the execution of asynchronous tasks in Trace, there can be two flow lines connecting different async tasks. This update merges and unifies trace points to ensure more comprehensive information is available when viewing the Trace. - [Optimize] Add cache for loadScript's result ([d35510b](https://github.com/lynx-family/lynx/commit/d35510bf4e6472c9468393b754f81c1c52ea3f52)) @lybvinci Files do not need to be read and executed multiple times; increasing caching improves performance. app-service.js includes logic to check for initialization, so we need to modify the packaging script simultaneously to officially use this feature. - [Optimize] Fix RadonFiber :active invalidation ([7106d99](https://github.com/lynx-family/lynx/commit/7106d99c02ca33bf86b32e0aabe1d6441fd8b8a4)) @YellowFishWyfCPP RadonElement checks for touch pseudo tags on the fragment when `GetStyleSheet` to update the touch pseudo state, but FiberElement does not have a similar process, so add this check and update step to the GetRelatedCSSFragment. (cherry picked from commit 20f554880febd98a787cf583d795d8274a2c8356) - [Optimize][iOS] Support LynxViewGroup to reuse lynx runtime environment ([127db95](https://github.com/lynx-family/lynx/commit/127db954956fb769f3417ed1329595d71ccc0926)) @nhsprite Refactor LynxViewBuilder by extracting shared configuration logic into LynxBaseConfigurator to enable LynxViewGroup to reuse lynx runtime environments, improving performance and memory efficiency. Changes: - Extract LynxBaseConfigurator from LynxViewBuilder (~193 lines) - Move shared configuration logic to base class - Update LynxViewGroup to leverage runtime environment reuse - Refactor internal header structure for better modularity - Update BUILD.gn to include new configurator files LynxViewGroup supports the same properties as LynxViewBuilder before and has custom properties as follows: - `url` - `templateBundle` - `globalProps` (cherry picked from commit 0e39c0070b96acf863536e3901de15a1115dfa66) - [Optimize][iOS][Input]Implement customized keyboard hold strategy ([a4250e6](https://github.com/lynx-family/lynx/commit/a4250e6f6d0dac39b2e5ac364a7174adf7d2bca2)) @MoonfaceX Add support for holding keyboard focus when `hold-keyboard` is enabled by introducing a new property `enableHoldKeyboard` and modifying the end editing logic. This aligns with Android's behavior and provides better control over keyboard dismissal. (cherry picked from commit 04b9a8ca53457ffc48350becb76c66689f240af2) - [Optimize][iOS] Support isTemplateBundleReady/getLynxViewById API in LynxViewGroup ([4c426e6](https://github.com/lynx-family/lynx/commit/4c426e649cfa15a650c27a06bcad28c19a6e8cb3)) @ykai55 Support the isTemplateBundleReady/getLynxViewById API in LynxViewGroup. - Support create LynxViewGroup with a URL and a template request will start automatically. - Support create LynxViewGroup with an existing LynxTemplateBundle. - Add lynxViewId property to LynxView. Assigns an id for LynxView when created with a LynxViewGroup. - [Optimize][iOS] add evaulateTemplateBundle&CallFunction for standalone BackgroundRuntime ([5d8d1a4](https://github.com/lynx-family/lynx/commit/5d8d1a4a47436c5c439e401c0e02a072cdc3606a)) @linxs0211 1.add evaluateTemplateBundle api 2.add callFunction (cherry picked from commit f888c9ce728f9467f4ea04356dff320f989517ab) ### 🛠️ Infra - [Infra] Export lynx base symbols on the Windows side. ([fbcb7c0](https://github.com/lynx-family/lynx/commit/fbcb7c0a61a1f8bd716e72025326b1fa2e3be8b1)) @yongjieTang When building Windows artifacts, it is also necessary to export the relevant public APIs to solve the issue of symbol not found during compilation. (cherry picked from commit 3d0eb8b5663360711d2e846f31e0af558215aeac) - [Infra] Upgrade habitat version to 0.3.143 ([5e24f17](https://github.com/lynx-family/lynx/commit/5e24f172b08d7e6573f66ccf529b2b626ceb7874)) @coolkiid Improve habitat's Windows compatibility, and fix some known issues. - [Infra] Update habitat version to avoid network error when fetch external repositories ([b4be5f7](https://github.com/lynx-family/lynx/commit/b4be5f715d76c772b09cf93ff4c315951c0bab9c)) @jianliang00 - [Infra] Disable ios e2e task in ci pipeline ([bbcfd85](https://github.com/lynx-family/lynx/commit/bbcfd85ed29a79fa2a639c89b057bec155c6c192)) @Kingatnuaa0528 Disable ios e2e task because the network success rate for Python dependency installation is too low.