3.3.1

lynx-family/lynx3.3.1Jul 25, 2025by Kingatnuaa0528

AI Summary

Bug fix release with a minor feature addition for local image resource handling. Addresses numerous issues including DevTool errors, OOM problems, nested query component crashes, CSS variable inheritance, and various event handling fixes.

Key Highlights

  • Added skip-redirection and MediaResourceFetcher support for local images
  • Fixed OOM caused by too many CallbackImpl instances
  • Fixed nested query component crash
  • Fixed CSS variable changes not affecting child nodes
  • Fixed list sticky info not responding to diff changes

New Features

  • skip-redirection and MediaResourceFetcher for local image resource

Full Release Notes

Some bugfixes have been made for version 3.3.0.

### 💡 Features


- [Feature] Support `skip-redirection` and `MediaResourceFetcher` for local image resource ([59c6436](https://github.com/lynx-family/lynx/commit/59c64360c6ec40419717fab925d8b717a5113b37))  @liubb0516

	
	support `skip-redirection` and `MediaResourceFetcher` for local image resource
	
	
	(cherry picked from commit 87e5cc2f677e874bb34ec65bdc21ca5d26960912)


### 🐛 Bug Fixes




- [BugFix][DevTool] add safeguard checks in RunDevToolFunction to prevent false error logs ([36c7039](https://github.com/lynx-family/lynx/commit/36c7039f3022c78ea6b1bd046cc0960164e63eb7))  @yuweizheng

	
	add safeguard checks in RunDevToolFunction to prevent false error logs
	
	
	(cherry picked from commit 3ff8064f87f39b20832d45bc14cf45e1f5299dfb)




- [BugFix] make reloadTemplate with safety globalProps ([59bafd7](https://github.com/lynx-family/lynx/commit/59bafd7a1714af28d0ed77e4ef76ebeb9c504133))  @nhsprite

	
	reloadTemplate with globalProps now passing raw globalProps, it's unsafe to pass globalProps to tasm thread, we need to make a deepClone to lepusValue to make thread safe.
	
	
	(cherry picked from commit 35d69990d39c2d9e7fa65bb5673613cebc538931)




- [BugFix] Fix OOM caused by too many CallbackImpl instances ([00300da](https://github.com/lynx-family/lynx/commit/00300daaebba0a2b6e1bf7b7f75528e45d434e1c))  @OverWatch-Winder

	
	When calling JSB with callback frequently, if the callback is not called back, the Java CallbackImpl instance cached in the Native layer will not be destroyed, resulting in OOM
	
	
	
	(cherry picked from commit 32b327cbe06c9d0adaa56c55b0910496bc4cb171)




- [BugFix] fix nested query component. ([a0036d4](https://github.com/lynx-family/lynx/commit/a0036d413e3d62b8af8d0daec63999da8abf5729))  @nhsprite

	
	Nested calling query component may cause crash now, it's caused by modifing `url_to_lifecycle_option_map_` while looping `url_to_lifecycle_option_map_`, eg: calling `queryComponent` in callback of `queryComponent`.
	It's reasonable to use `extract` to accquire lifecycleOption list from `url_to_lifecycle_option_map_` first, and then call `OnLazyBundleLifecycleEnd` for each option. `QueryComponent` called in `OnLazyBundleLifecycleEnd` will just return because templateEntry is cached now.
	
	TODO: adding test cases for nested query component cases.
	
	
	
	
	(cherry picked from commit 87e82d787a788314025c98835944662e4f58055f)




- [BugFix] enable FIX_FIBER_REMOVE_TWICE_BUG only in RadonArch. ([0f08a2c](https://github.com/lynx-family/lynx/commit/0f08a2c60146005ac4416df6b45bcfbde94c3b00))  @DragonDragonDDD

	
	As title described.
	
	
	
	
	(cherry picked from commit f331e642f704a003bff529f4d48c0bc282878ba6)




- [BugFix][Fiber] Fix the issue that CSSVariable changes on parent nodes did not affect child nodes in RadonToFiber ([a5ab4d8](https://github.com/lynx-family/lynx/commit/a5ab4d8bd6fb07d6ae0a665cf316e90494dd478b))  @ci_lynx

	
	When RadonDiff, RadonNode only copies the `css_variable_` part of the CSSVariableBundle and does not copy the `css_variable_related_` part, So when css-var parent node changed, related css in child node won't be affected.
	
	




- [BugFix][Android][Event] Fixed the issue that the keyboard cannot be retracted when touching other areas when input becomes the first focusedUI through uimethod. ([be15d06](https://github.com/lynx-family/lynx/commit/be15d06759a525e3af4b5e0255283e3d7c208000))  @rAY-ooo

	
	description: In the lazy loading scenario of TouchEventDispatcher, the input will setFocusedUI when the focus changes, but the TouchEventDispatcher may not have been created at this time, which makes the setting invalid, and then the input focus cannot be transferred and the keyboard cannot be retracted.
	
	
	
	(cherry picked from commit abbff3d3390266d78cee8131a63c4254cb56b58b)




- [BugFix][Element] Fix page element not record when AttachToElementManager causing white screen ([e2cf9a7](https://github.com/lynx-family/lynx/commit/e2cf9a7e19c3374a7958772df8970e9dc320ad41))  @usczz

	
	In the current implementation, the reused element bundle is deeply cloned and attached to the target ElementManager by TreeResolver. TreeResolver first sets the root element as its current page, which removes the old page from the internal NodeManager. Then, FiberElement's AttachToElementManager is called recursively for each element in the tree. PageElement overrides this behavior by first calling the base class's AttachToElementManager, which records its element ID in the NodeManager. After that, it calls SetFiberPageElement to set itself as the root and removes its element ID from the internal NodeManager, causing the PageElement entry to be deleted. This removal can lead to incorrect layout results when using UNSPECIFIED or AT_MOST measure specs, as these require looking up the corresponding element in the NodeManager during layout propagation.
	
	In this merge request, SetFiberPageElement will be called only in PageElement’s overridden AttachToElementManager method and will be invoked before the base class’s AttachToElementManager to ensure that the page element's entry remains in the NodeManager. Additionally, a DCHECK is added in layout_mediator's OnLayoutUpdate to verify that no element entries are missing from the NodeManager during layout result propagation.
	
	
	
	
	(cherry picked from commit 02c0b7163958e412a7d1481e392b702a17eb2129)




- [BugFix][DevTool] Eliminate unnecessary inspector initialization in Non-LepusNG context. ([d59de54](https://github.com/lynx-family/lynx/commit/d59de54ed495554f6a4811a9a9c061ae582ae0c6))  @Dango-2021

	
	
	(cherry picked from commit a64614521d567f30557e6b036127d7ee4456502d)




- [BugFix] Remove JSVM deps for openssl symbol error ([64d4066](https://github.com/lynx-family/lynx/commit/64d406647647e663d905fa7cf922a596051b08dd))  @ci_lynx

	
	Remove JSVM deps for openssl symbol error.




- [BugFix] Add NPE protection for DisplayMetricsHolder ([daa29fb](https://github.com/lynx-family/lynx/commit/daa29fb927d1da940fda4e68682c1d1e9b44a9a8))  @ChrisChan0668

	
	In some special ROMs, WindowManager.getDefaultDisplay() may return a null object, so we need to check before use.
	
	
	(cherry picked from commit 2c429e81e3dd74e655957df9b181b4da3db126e4)




- [BugFix] Fix the JS error when Callback is undefine in JSB ([90c62f5](https://github.com/lynx-family/lynx/commit/90c62f565d31eea1784e2889c3cae73c9aaf3bc0))  @OverWatch-Winder

	
	Callback in JSB can be undefined, and JS errors should not be reported
	
	
	
	(cherry picked from commit 5fa9bde167f4fa61d1a95c08fc941434dd9f3e01)




- [BugFix][ZIndex] fix the negative zIndex insertion issue ([d44db20](https://github.com/lynx-family/lynx/commit/d44db20514491407601080e6aaf01b2489d61b98))  @linxs0211

	
	The element container has a should_skip_index_calculation logic that skips index calculation if there are no zIndex children and insertion is at the end (ref=null). However, it doesn't account for negative_z_children_, causing incorrect index calculation. It's updated so that if any zIndex exists, index calculation is forced.
	
	
	
	




- [BugFix][Element] Fix shorthand CSS Property with CSS Variable value is reset in threaded element resolution ([83a599b](https://github.com/lynx-family/lynx/commit/83a599b9f75c15e658c1aa85fa363c9a63538117))  @usczz

	
	In the current implementation, during threaded element resolution, CSS Variable resolution is postponed as an engine thread task. However, when handling shorthand CSS properties, the actual values are not resolved, leaving only their keys in the parsed_style_map. Later, in the engine thread task that refreshes the CSS styles, the shorthand properties are expanded into longhand properties. During the diffing process between the previous and current style maps, shorthand properties are mistakenly included in the list of properties that require resetting.
	
	In this merge request, shorthand properties are excluded from the construction of reset_style_ids when comparing the previous parsed style with the new parsed style, preventing them from being reset unintentionally.
	
	
	
	(cherry picked from commit 3802d45420e6a90d13b4cbd62947d5247552c2ee)




- [BugFix][DevTool][iOS] Fix the issue where DevToolViewControllerLifeListener was added to the incorrect VC when destroying LynxView. ([520ea43](https://github.com/lynx-family/lynx/commit/520ea43af59029f2879ac10d463b335937c3ffe0))  @Dango-2021

	
	Add DevToolViewControllerLifeListener to the top VC while skipping UITabBarController and UINavigationController.
	
	
	(cherry picked from commit 443003ed738a8a3c87a23a79578aa94812bb6dd4)




- [BugFix][Trace] Fix crashes that occurred during element tree dumping in multithreaded environments. ([c127272](https://github.com/lynx-family/lynx/commit/c127272714134a1c8da23d3c11c3932939b41296))  @ci_lynx

	
	1.Deep clone `lepus::Value` objects when transferring data between threads to prevent JavaScript garbage collection issues.
	2. Pass `instance_id` instead of `this` to avoid crashes when the catalyzer instance is destroyed.
	
	




- [BugFix][List] Fix list-item rtl layout error on Android platform. ([bfc2247](https://github.com/lynx-family/lynx/commit/bfc2247fb29a6869f8cafdf6a9ebcb301b2b2f62))  @DwwWxx

	
	Because on the Android platform, we has one LinearLayout between ListContainerView and ListItemView and the layout position of ListItemView is relative to ListContainerView but ListItemView is added to LinearLayout, so in this commit, we ensure that the height of the LinearLayout is at least the size of the ListContainerView itself.
	
	
	
	(cherry picked from commit aa226d9aaf27642576b386f793e407b8ac26cba6)




- [BugFix][iOS] Fix Image's reportTime error ([3429b89](https://github.com/lynx-family/lynx/commit/3429b896657ba890708d41659217ee6348387040))  @linxs0211

	
	finishRequestTime is not assgined..
	
	
	
	
	(cherry picked from commit 82c03abb8065ac3e14df80b6b34dc8bb5dcf85b1)
	
	(cherry picked from commit 7ce610aa451979c060340f4aadc515d1556dc471)




- [BugFix] call InitStyleRootWithElement when exectue GetMatchedStylesForNode to avoid style_root_ is nullptr. ([e117535](https://github.com/lynx-family/lynx/commit/e117535c0c955473ec446c3456c2ba2ff3c1726e))  @ShouruiSong

	
	When element is fiber element, the style_root_ maybe nullptr when execture GetMatchedStylesForNode(). To fix this issue, call InitStyleRootWithElement to init style_root_.
	
	




- [BugFix] Fix Crash When PiperData object in JavaOnlyMap ([cc27a14](https://github.com/lynx-family/lynx/commit/cc27a14b25ca42b3be63e005dbcc628302d644b2))  @OverWatch-Winder

	
	Fix Crash When PiperData object in JavaOnlyMap
	
	
	(cherry picked from commit ba593cec9294fb8efca5ebf052964ecc8b356b44)




- [BugFix][Gesture] Fix gesture relationship not work due to EventDispatcher lazy load ([1bf1c41](https://github.com/lynx-family/lynx/commit/1bf1c41bfef9bdda0cfa21cdac676477f6d292c0))  @AdrianLCA

	
	1. Since EventDispatcher is created only when touching, but lynxUI needs to join the gesture arena when createView, so the gesture arena logic is moved to pageConfigDecoded
	2. Optimize existing logic and move duplicate code to lynxBaseUI
	3. Add getScrollInfo in listContainer and align the platform list
	
	
	
	
	(cherry picked from commit 287e2c94e57bd4ea6b3e487c0063adaa8247f4c1)




- [BugFix] Fix mixed scan not work as expected ([a96bfdb](https://github.com/lynx-family/lynx/commit/a96bfdb80ddd40648103d404848ff3cd2ec3651a))  @coolkiid

	
	If setDecoderFactory() is called before initializeFromIntent(), the
	configured decoder will be overridden.




- [BugFix] fix wrongly fetch lazyBundle sync ([bc1c0a1](https://github.com/lynx-family/lynx/commit/bc1c0a1c18624f312a184728d33b16d76f83380a))  @nhsprite

	
	fix wrongly fetch lazyBundle sync.
	
	
	
	
	(cherry picked from commit 27ac0700c3a3bb0763263c0376f68b9edd1f9700)




- [BugFix] Remove default value for pre-painting flag ([e999ceb](https://github.com/lynx-family/lynx/commit/e999ceb4600d58edf865bfaab0c7b5221436f69c))  @rel-q

	
	Removes the default value for the `enable_pre_painting` parameter in `LynxShell::LoadTemplate` and `LynxShell::LoadTemplateBundle`.
	
	




- [BugFix][List] Fix list sticky info not responds to diff change. ([cc1b0f8](https://github.com/lynx-family/lynx/commit/cc1b0f8909d717af69c6220bcb6c6d3070a5a301))  @DwwWxx

	
	Currently, we use map<Index,ListItem> to save all sticky top or bottom item info, but if list receives diff info to change the index's of sticky item, we missing update the map which may lead to item not sticky.
	
	In this commit, we introduce map<ItemKey,ListItem> to save sticky item info and update the map in related platform ui operations, which can make sure that the sticky item info is corrent before we invoke transform animation.
	
	Here we use experimental-update-sticky-for-diff property as the swtich with default value is true.
	
	
	NoLanding:develop




- [BugFix][Element] Fix render with reused element bundle not trigger animation as expected ([eea6856](https://github.com/lynx-family/lynx/commit/eea6856899d2167b96665ec89b2a210c2f33633f))  @usczz

	
	In the current implementation, when an element tree is cloned, the parsed_style_map is also copied to the new element. During style resolution for the cloned element tree, no style changes are detected, so keyframe and transition animations are not triggered because there is no difference between the previous and current states. This results in abnormal animation behavior.
	
	In this merge request, a new dirty flag called kDirtyCloned is added to cloned elements. When resolving styles for these cloned elements, the presence of the kDirtyCloned flag is checked to force the reapplication of animation-related CSS properties, ensuring animations are triggered correctly.
	
	
	
	




- [BugFix][DevTool] fix NullPointerException when call LynxDevToolDelegate functions ([e5c4a67](https://github.com/lynx-family/lynx/commit/e5c4a67491e96e597ef634ad9cdc35feda92c2b9))  @yuweizheng

	
	fix NullPointerException when call LynxDevToolDelegate functions
	
	




- [BugFix][Element] Fix reset incorrect property in fiber element with RTL direction ([f82e289](https://github.com/lynx-family/lynx/commit/f82e28970ebcecc7d858e0d2832fc6e2504c6cc3))  @usczz

	
	In the current implementation, when resetting a CSS property due to a style change, the direction is not taken into account, leading to incorrect CSS property resets in RTL mode.
	
	In this merge request, before resetting a CSS property, the property ID is adjusted based on the current direction value to ensure the correct CSS property is reset.
	
	
	
	(cherry picked from commit 43bc387a8b75b49d4b6ceadb7cdd7b88a1e6e461)




- [BugFix][List] Fix list scrolltolower event not sent. ([e00f723](https://github.com/lynx-family/lynx/commit/e00f723d7a2925039a6e07cc8ed010bed26d1163))  @DwwWxx

	
	Currently, we use base::FloatsLargerOrEqual with float epsilon 0.01 to check whether list is scrolled to lower, but in iOS, content offset is round by platform, but content size in c++ is not round, which may lead to precision issue and FloatsLargerOrEqual() check fail.
	
	So in this commit, we use physical_pixels_per_layout_unit to round content_size.
	
	




- [BugFix][Starlight] The allocated size of the layout result is incorrect ([f378e9a](https://github.com/lynx-family/lynx/commit/f378e9ab5ca4d37b9a119282fdeaa2c71c9210a2))  @givemefive9

	
	The allocated size of the layout result is incorrect.
	
	
	(cherry picked from commit 73d159f4b2d111e661453ff1bc8d29f0d6593f16)




- [BugFix][RadonFiber] Should mark children's style dirty when parent's class has changed. ([d1f517a](https://github.com/lynx-family/lynx/commit/d1f517a717cbceaea0f5774f053cc0c3e89c6aa1))  @DragonDragonDDD

	
	As title described, we should mark children's style dirty when parent's class has changed for Radon Arch.
	
	
	
	
	(cherry picked from commit c37b6de54da2e3d21a24405f15721dabed18c0a5)




- [BugFix] disable SPI in lite scenarios ([27a479e](https://github.com/lynx-family/lynx/commit/27a479e45b7b4b1613870925b847715d2d1e49a4))  @Awuiil

	
	As describe.
	
	AutoSumbit: true
	
	(cherry picked from commit 18f57a1b584a259f6853e5b33b084bce0ca2157c)




- [BugFix][RadonFiber] Align style validation blocking behavior between Radon and Radon-Fiber worklets ([fc69208](https://github.com/lynx-family/lynx/commit/fc6920882013e418dd60b440f0fde450faf7f0da))  @DragonDragonDDD

	
	In the Radon architecture's worklet, when invalid styles are passed to setStyle, it should block and prevent updates. This behavior needs to be aligned in the Radon-Fiber architecture.
	
	
	
	
	(cherry picked from commit 775377741e93bd73dd98e84d984deca29b68e699)




- [BugFix][Android][Gesture] Fix NPE in dispatchGetDisplayList when using flingGesture api ([73ac41b](https://github.com/lynx-family/lynx/commit/73ac41b414fd1ccf9895803282c6752aa4edcf1d))  @AdrianLCA

	
	Fix NPE in dispatchGetDisplayList when using flingGesture api. The current processing flow is to call `onUpdate` during drawing. If the current operation node is deleted, it may cause NPE exception, so it is moved to the next frame.
	
	
	
	
	(cherry picked from commit 128096ee979d178fdaf40f15049a61381d435e94)
	
	(cherry picked from commit a0460dab55a788c9de2435556d544582b33113ea)




- [BugFix] Fix the crash in JSB when the return value type is String but the actual return value is Null ([6b81de5](https://github.com/lynx-family/lynx/commit/6b81de540a834dc0647d1f4a218e914fd0dcb1f6))  @OverWatch-Winder

	
	Add null protection for the String() method in JavaValue of String type
	
	
	(cherry picked from commit 50adc7e21d3c75e75e2572f719f56435891bdae5)


### 🚀 Optimize




- [Optimize][Animation] Fix enable-new-animator default value consume logic in render backend. ([7afc82f](https://github.com/lynx-family/lynx/commit/7afc82f51bf7f4864a3d2ad938f04a70949aa658))  @YellowFishWyfCPP

	
	When enable-new-animator is true, just don't pass keyframe and transition data to platform or render backend, like android and iOS.
	
	




- [Optimize] Adaption to Xcode 16.4. ([6219d55](https://github.com/lynx-family/lynx/commit/6219d55126c7ffbefbdec345beede2fc136e6fc8))  @zsy-jason

	
	Xcode 16.4 has enabled error protection for certain warnings by default, and it exposes some building problems.
	This change will fix the building problem with Xcode 16.4:
	1. Use invoke_result_t because result_of_t is deprecated;
	2. Add -Wno-documentation to avoid documentation warnings;
	3. Add -Wno-macro-redefined to fix zlib's redefinition problem;
	4. Fix other building errors.
	
	(cherry picked from commit a657dccfdf2e1c3d6b468d073d5843b01811345f)




- [Optimize][NewAnimator] CSS Transition support CSSVariable ([b62b1b2](https://github.com/lynx-family/lynx/commit/b62b1b294f844ce57221769f5be022664b77ad2b))  @YellowFishWyfCPP

	
	As described in the commit title.
	




- [Optimize][Animation] Fix same target value trigger transition recursively ([6a099a1](https://github.com/lynx-family/lynx/commit/6a099a1332d57d269db4e7ee15d268934f15094d))  @YellowFishWyfCPP

	
	The same target value should not trigger transition, Align web presentation.
	
	
	(cherry picked from commit 25dae83e559aabf12fb6ee879209c3fab62ce979)




- [Optimize] List supports recycle sticky item outside visible area. ([801d39d](https://github.com/lynx-family/lynx/commit/801d39db39a4a4d7bd1cca0239e577ad08b02d73))  @DwwWxx

	
	Currently, the list cannot recycle sticky items that have already been rendered, which will lead to significant memory pressure in scenarios with many sticky items.
	
	In this commit, we introduce sticky top/bottom set to cache sticky items and allow developers to set the capacity of the cache. If the sticky item not in cache, it will be recycled. Here we use sticky-item-buffer-count to set the capacity of sticky item cache and experimental-recycle-sticky-item to control whether recycle sticky item. By default, the capacity of sticky item cache is 1 in sync thread mode and 2 in async thread mode.
	
	
	NoLanding:develop




- [Optimize][Android][Input] prevent null pointer exception in text change handler ([debe764](https://github.com/lynx-family/lynx/commit/debe7647afd4cbc2886090f72d58b5365d8193fd))  @MoonfaceX

	
	Check for mView nullability before processing text changes to avoid potential crashes when the view is detached
	
	




- [Optimize][Animation] Fix same target value trigger transition recursively ([a7d380a](https://github.com/lynx-family/lynx/commit/a7d380a00e2a4a688d479120217832054c72e1b7))  @YellowFishWyfCPP

	
	The same target value should not trigger transition, Align web presentation.
	At the beginning of the transition, record its endvalue. If the endvalues are the same, the animation will not be triggered repeatedly. When the transition ends or is destroyed, clear the recorded endvalue
	
	
	(cherry picked from commit a99ccf2f86e15570b3e1216bf9912cdaa5ccd209)




- [Optimize] LynxBackgroundRuntime supports callback on evaluateJavaScriptEnd ([a5797a3](https://github.com/lynx-family/lynx/commit/a5797a325d81e4a207aeba52c25e61b29ac63d31))  @ci_lynx

	
	LynxView has a callback named onRuntimeReady which informs the client that
	the user script has been evaluated. This callback is missed and
	also important to client in the situation under LynxBackgroundRuntime.
	
	Thus add evaluateJavaScriptEnd callback for LynxBackgroundRuntime
	when each evaluateJavaScript is done.
	
	
	(cherry picked from commit d8696c823f51443a00a6aae4589a2264f2f708a0)