Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/brave-ants-report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@lynx-js/offscreen-document": patch
---

feat: support touch events
15 changes: 15 additions & 0 deletions .changeset/empty-worms-buy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@lynx-js/web-mainthread-apis": patch
"@lynx-js/web-worker-runtime": patch
"@lynx-js/web-constants": patch
"@lynx-js/web-core": patch
---

feat: support touch events for MTS

now we support

- main-thread:bindtouchstart
- main-thread:bindtouchend
- main-thread:bindtouchmove
- main-thread:bindtouchcancel
5 changes: 5 additions & 0 deletions .changeset/loud-mangos-enjoy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@lynx-js/web-core": patch
---

feat: add SystemInfo.screenWidth and SystemInfo.screenHeight
3 changes: 3 additions & 0 deletions .cspell/lynx.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ bindinput
bindload
bindtap
bindtapuser
bindtouchstart
bindtouchend
bindtouchcancel
bindtouchmove
catchlongpress
catchtap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import {
function emptyHandler() {
// no-op
}

const otherPropertyNames = [
'detail',
'keyCode',
Expand All @@ -19,7 +18,41 @@ const otherPropertyNames = [
'propertyName',
'pseudoElement',
'animationName',
'touches',
'targetTouches',
'changedTouches',
];
const blockList = new Set([
'isTrusted',
'target',
'currentTarget',
'type',
'bubbles',
'window',
'self',
'view',
'srcElement',
'eventPhase',
]);

function transferToCloneable(value: any): any {
if (
typeof value === 'string' || typeof value === 'number'
|| typeof value === 'boolean' || value === null || value === undefined
) {
return value;
} else if (value[Symbol.iterator]) {
return [...value].map(transferToCloneable);
} else if (typeof value === 'object' && !(value instanceof EventTarget)) {
const obj: Record<string, any> = {};
for (const key in value) {
if (!blockList.has(key)) {
obj[key] = transferToCloneable(value[key]);
}
}
return obj;
}
}

export function initOffscreenDocument(options: {
shadowRoot: ShadowRoot;
Expand Down Expand Up @@ -64,7 +97,8 @@ export function initOffscreenDocument(options: {
const otherProperties: Record<string, unknown> = {};
for (const propertyName of otherPropertyNames) {
if (propertyName in ev) {
otherProperties[propertyName] = (ev as any)[propertyName];
// @ts-expect-error
otherProperties[propertyName] = transferToCloneable(ev[propertyName]);
}
}
onEvent(eventType, targetUniqueId, ev.bubbles, otherProperties);
Expand Down
11 changes: 6 additions & 5 deletions packages/web-platform/web-constants/src/types/Cloneable.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
// Copyright 2023 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
export type Cloneable<T = string | number | null | undefined> =
export type Cloneable<T = string | number | null | boolean | undefined> =
| T
| Record<string, T>
| T[];

export type CloneableObject<T = string | number | null | undefined> = Record<
string,
T
>;
export type CloneableObject<T = string | number | null | boolean | undefined> =
Record<
string,
T | T[]
>;
2 changes: 2 additions & 0 deletions packages/web-platform/web-constants/src/types/PageConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ export interface PageConfig {

export interface BrowserConfig {
pixelRatio: number;
pixelWidth: number;
pixelHeight: number;
}
5 changes: 5 additions & 0 deletions packages/web-platform/web-core/src/apis/createLynxView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ import {
type StartUIThreadCallbacks,
} from '../uiThread/startUIThread.js';
import type { RpcCallType } from '@lynx-js/web-worker-rpc';
const pixelRatio = window.devicePixelRatio;
const screenWidth = window.screen.availWidth * pixelRatio;
const screenHeight = window.screen.availHeight * pixelRatio;

export interface LynxViewConfigs {
templateUrl: string;
Expand Down Expand Up @@ -61,6 +64,8 @@ export function createLynxView(configs: LynxViewConfigs): LynxView {
napiModulesMap,
browserConfig: {
pixelRatio: window.devicePixelRatio,
pixelWidth: screenWidth,
pixelHeight: screenHeight,
},
},
shadowRoot,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export class MainThreadRuntime {
this.__OnLifecycleEvent = this.config.callbacks.__OnLifecycleEvent;
this.SystemInfo = {
...systemInfo,
pixelRatio: config.browserConfig.pixelRatio,
...config.browserConfig,
};
/**
* Start the exposure service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
// Copyright 2023 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
import type { Cloneable, LynxCrossThreadEvent } from '@lynx-js/web-constants';
import type {
Cloneable,
CloneableObject,
LynxCrossThreadEvent,
} from '@lynx-js/web-constants';
import {
elementToRuntimeInfoMap,
type MainThreadRuntime,
} from '../MainThreadRuntime.js';

function toCloneableObject(obj: any): CloneableObject {
const cloneableObj: CloneableObject = {};
for (const key in obj) {
const value = obj[key];
if (
typeof value === 'boolean' || typeof value === 'number'
|| typeof value === 'string' || value === null
) {
cloneableObj[key] = value;
}
}
return cloneableObj;
}

export function createCrossThreadEvent(
runtime: MainThreadRuntime,
domEvent: Event,
Expand All @@ -17,6 +35,8 @@ export function createCrossThreadEvent(
.currentTarget! as HTMLElement;
const type = domEvent.type;
const params: Cloneable = {};
const isTrusted = domEvent.isTrusted;
const otherProperties: CloneableObject = {};
if (type.match(/^transition/)) {
Object.assign(params, {
'animation_type': 'keyframe-animation',
Expand All @@ -29,6 +49,24 @@ export function createCrossThreadEvent(
'animation_name': (domEvent as AnimationEvent).animationName,
new_animator: true, // we support the new_animator only
});
} else if (type.startsWith('touch')) {
const touchEvent = domEvent as TouchEvent;
const touch = [...touchEvent.touches as unknown as Touch[]];
const targetTouches = [...touchEvent.targetTouches as unknown as Touch[]];
const changedTouches = [...touchEvent.changedTouches as unknown as Touch[]];
Object.assign(otherProperties, {
touches: isTrusted ? touch.map(toCloneableObject) : touch,
targetTouches: isTrusted
? targetTouches.map(
toCloneableObject,
)
: targetTouches,
changedTouches: isTrusted
? changedTouches.map(
toCloneableObject,
)
: changedTouches,
});
}
const targetElementRuntimeInfo = runtime[elementToRuntimeInfoMap].get(
targetElement,
Expand All @@ -54,5 +92,6 @@ export function createCrossThreadEvent(
// @ts-expect-error
detail: domEvent.detail ?? {},
params,
...otherProperties,
};
}
39 changes: 39 additions & 0 deletions packages/web-platform/web-tests/tests/react.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,35 @@
await wait(100);
expect(eventHandlerTriggered).toBe(true);
});

test(
'basic-mts-bindtouchstart',
async ({ page, browserName, context }, { title }) => {
test.skip(browserName !== 'chromium', 'not support CDPsession');
await goto(page, title);
await wait(300);
const cdpSession = await context.newCDPSession(page);
await swipe(cdpSession, {
x: 20,
y: 20,
xDistance: 10,
yDistance: 0,
});
expect(page.locator('#target1'), 'has touches').toHaveCSS(
'background-color',
'rgb(0, 128, 0)',
); // green
expect(page.locator('#target2'), 'has target touches').toHaveCSS(
'background-color',
'rgb(0, 128, 0)',
); // green
expect(page.locator('#target3'), 'has changed touches').toHaveCSS(
'background-color',
'rgb(0, 128, 0)',
); // green
},
);

test(
'basic-mts-bindtap-change-element-background',
async ({ page }, { title }) => {
Expand Down Expand Up @@ -458,6 +487,16 @@
},
);

test(
'api-SystemInfo-height-width',
async ({ page }, { title }) => {
await goto(page, title);
await wait(200);
const target = page.locator('#target');
await expect(target).toHaveCSS('background-color', 'rgb(0, 128, 0)'); // green
},
);

test('api-initdata', async ({ page }, { title }) => {
await goto(page, title);
await wait(100);
Expand Down Expand Up @@ -894,7 +933,7 @@
globalThis.lynxView.sendGlobalEvent('event-test', ['change']);
});
await wait(100);
await expect(target).toHaveCSS(

Check failure on line 936 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[chromium] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent

7) [chromium] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent ──────── Error: Timed out 5000ms waiting for expect(locator).toHaveCSS(expected) Locator: locator('#target') Expected string: "rgb(0, 128, 0)" Received string: "rgb(255, 192, 203)" Call log: - expect.toHaveCSS with timeout 5000ms - waiting for locator('#target') 9 × locator resolved to <x-view id="target" lynx-tag="view" lynx-unique-id="2"></x-view> - unexpected value "rgb(255, 192, 203)" 934 | }); 935 | await wait(100); > 936 | await expect(target).toHaveCSS( | ^ 937 | 'background-color', 938 | 'rgb(0, 128, 0)', 939 | ); // green; at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:936:28

Check failure on line 936 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux-all-on-ui / check

[webkit] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent

2) [webkit] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent ────────── Error: Timed out 5000ms waiting for expect(locator).toHaveCSS(expected) Locator: locator('#target') Expected string: "rgb(0, 128, 0)" Received string: "rgb(255, 192, 203)" Call log: - expect.toHaveCSS with timeout 5000ms - waiting for locator('#target') 9 × locator resolved to <x-view id="target" lynx-tag="view" lynx-unique-id="2"></x-view> - unexpected value "rgb(255, 192, 203)" 934 | }); 935 | await wait(100); > 936 | await expect(target).toHaveCSS( | ^ 937 | 'background-color', 938 | 'rgb(0, 128, 0)', 939 | ); // green; at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:936:28

Check failure on line 936 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux-all-on-ui / check

[chromium] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent

6) [chromium] › tests/react.spec.ts:927:5 › reactlynx3 tests › apis › api-sendGlobalEvent ──────── Error: Timed out 5000ms waiting for expect(locator).toHaveCSS(expected) Locator: locator('#target') Expected string: "rgb(0, 128, 0)" Received string: "rgb(255, 192, 203)" Call log: - expect.toHaveCSS with timeout 5000ms - waiting for locator('#target') 9 × locator resolved to <x-view id="target" lynx-tag="view" lynx-unique-id="2"></x-view> - unexpected value "rgb(255, 192, 203)" 934 | }); 935 | await wait(100); > 936 | await expect(target).toHaveCSS( | ^ 937 | 'background-color', 938 | 'rgb(0, 128, 0)', 939 | ); // green; at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:936:28
'background-color',
'rgb(0, 128, 0)',
); // green;
Expand Down Expand Up @@ -1098,7 +1137,7 @@
await wait(100);
const target = page.locator('#target');
await target.click();
await expect(await target.getAttribute('style')).toContain('green');

Check failure on line 1140 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:1135:5 › reactlynx3 tests › configs › config-mode-dev-with-all-in-one

2) [webkit] › tests/react.spec.ts:1135:5 › reactlynx3 tests › configs › config-mode-dev-with-all-in-one Error: expect(received).toContain(expected) // indexOf Expected substring: "green" Received string: "height: 100px; width: 100px; background: pink;" 1138 | const target = page.locator('#target'); 1139 | await target.click(); > 1140 | await expect(await target.getAttribute('style')).toContain('green'); | ^ 1141 | await target.click(); 1142 | await expect(await target.getAttribute('style')).toContain('pink'); 1143 | }); at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:1140:56

Check failure on line 1140 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux-all-on-ui / check

[webkit] › tests/react.spec.ts:1135:5 › reactlynx3 tests › configs › config-mode-dev-with-all-in-one

3) [webkit] › tests/react.spec.ts:1135:5 › reactlynx3 tests › configs › config-mode-dev-with-all-in-one Error: expect(received).toContain(expected) // indexOf Expected substring: "green" Received string: "height: 100px; width: 100px; background: pink;" 1138 | const target = page.locator('#target'); 1139 | await target.click(); > 1140 | await expect(await target.getAttribute('style')).toContain('green'); | ^ 1141 | await target.click(); 1142 | await expect(await target.getAttribute('style')).toContain('pink'); 1143 | }); at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:1140:56
await target.click();
await expect(await target.getAttribute('style')).toContain('pink');
});
Expand Down Expand Up @@ -1347,7 +1386,7 @@
await wait(500);
const count = (await page.getByText('the count is:1').count())
+ (await await page.getByText('the count is:2').count());
expect(count).toBe(1);

Check failure on line 1389 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux-all-on-ui / check

[webkit] › tests/react.spec.ts:1382:7 › reactlynx3 tests › elements › text › basic-element-text-set-native-props-text

4) [webkit] › tests/react.spec.ts:1382:7 › reactlynx3 tests › elements › text › basic-element-text-set-native-props-text Error: expect(received).toBe(expected) // Object.is equality Expected: 1 Received: 0 1387 | const count = (await page.getByText('the count is:1').count()) 1388 | + (await await page.getByText('the count is:2').count()); > 1389 | expect(count).toBe(1); | ^ 1390 | }, 1391 | ); 1392 | at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:1389:25
},
);

Expand Down Expand Up @@ -2038,7 +2077,7 @@
await page.locator('.focus').click({ force: true });
await wait(100);
const result = await page.locator('.result').first().innerText();
expect(result).toBe('bindfocus');

Check failure on line 2080 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus

3) [webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus Error: expect(received).toBe(expected) // Object.is equality Expected: "bindfocus" Received: "" 2078 | await wait(100); 2079 | const result = await page.locator('.result').first().innerText(); > 2080 | expect(result).toBe('bindfocus'); | ^ 2081 | }, 2082 | ); 2083 | // input/focus test-case end at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2080:26

Check failure on line 2080 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus

3) [webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBe(expected) // Object.is equality Expected: "bindfocus" Received: "" 2078 | await wait(100); 2079 | const result = await page.locator('.result').first().innerText(); > 2080 | expect(result).toBe('bindfocus'); | ^ 2081 | }, 2082 | ); 2083 | // input/focus test-case end at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2080:26

Check failure on line 2080 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus

3) [webkit] › tests/react.spec.ts:2072:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-focus Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBe(expected) // Object.is equality Expected: "bindfocus" Received: "" 2078 | await wait(100); 2079 | const result = await page.locator('.result').first().innerText(); > 2080 | expect(result).toBe('bindfocus'); | ^ 2081 | }, 2082 | ); 2083 | // input/focus test-case end at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2080:26
},
);
// input/focus test-case end
Expand All @@ -2049,7 +2088,7 @@
await page.locator('input').click({ force: true });
await wait(100);
const result = await page.locator('.result').first().innerText();
expect(result).toBe('bindfocus');

Check failure on line 2091 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:2086:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindfocus

4) [webkit] › tests/react.spec.ts:2086:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindfocus Error: expect(received).toBe(expected) // Object.is equality Expected: "bindfocus" Received: "" 2089 | await wait(100); 2090 | const result = await page.locator('.result').first().innerText(); > 2091 | expect(result).toBe('bindfocus'); | ^ 2092 | }); 2093 | // input/bindfocus test-case end 2094 | at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2091:24

Check failure on line 2091 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux-all-on-ui / check

[webkit] › tests/react.spec.ts:2086:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindfocus

5) [webkit] › tests/react.spec.ts:2086:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindfocus Error: expect(received).toBe(expected) // Object.is equality Expected: "bindfocus" Received: "" 2089 | await wait(100); 2090 | const result = await page.locator('.result').first().innerText(); > 2091 | expect(result).toBe('bindfocus'); | ^ 2092 | }); 2093 | // input/bindfocus test-case end 2094 | at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2091:24
});
// input/bindfocus test-case end

Expand All @@ -2059,7 +2098,7 @@
await page.locator('input').press('Enter');
await wait(100);
const result = await page.locator('.result').first().innerText();
expect(result).toBe('bindconfirm');

Check failure on line 2101 in packages/web-platform/web-tests/tests/react.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-linux / check

[webkit] › tests/react.spec.ts:2096:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindconfirm

5) [webkit] › tests/react.spec.ts:2096:7 › reactlynx3 tests › elements › x-input › basic-element-x-input-bindconfirm Error: expect(received).toBe(expected) // Object.is equality Expected: "bindconfirm" Received: "" 2099 | await wait(100); 2100 | const result = await page.locator('.result').first().innerText(); > 2101 | expect(result).toBe('bindconfirm'); | ^ 2102 | }); 2103 | // input/bindconfirm test-case end 2104 | at /home/runner/_work/lynx-stack/lynx-stack/packages/web-platform/web-tests/tests/react.spec.ts:2101:24
});
// input/bindconfirm test-case end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2023 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
import { root, useEffect, useState } from '@lynx-js/react';

function App() {
const [color, setColor] = useState('pink');
useEffect(() => {
if (
typeof SystemInfo.pixelHeight === 'number'
&& typeof SystemInfo.pixelWidth === 'number'
) {
setColor('green');
}
}, []);
return (
<view
id='target'
style={{
height: '100px',
width: '100px',
background: color,
}}
/>
);
}

root.render(<App></App>);
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright 2023 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
import { useState, root, runOnBackground } from '@lynx-js/react';
function App() {
const [hasTouch, setHasTouch] = useState(false);
const [hasTargetTouches, setHasTargetTouches] = useState(false);
const [hasChangedTouches, setHasChangedTouches] = useState(false);
return (
<view
id='target'
main-thread:bindtouchstart={(ev) => {
'main thread';
if (ev.touches[0]) {
runOnBackground(setHasTouch)(true);
}
if (ev.targetTouches[0]) {
runOnBackground(setHasTargetTouches)(true);
}
if (ev.changedTouches[0]) {
runOnBackground(setHasChangedTouches)(true);
}
}}
>
<view
id='target1'
style={{
height: '100px',
width: '100px',
background: hasTouch ? 'green' : 'pink',
}}
/>
<view
id='target2'
style={{
height: '100px',
width: '100px',
background: hasTargetTouches ? 'green' : 'pink',
}}
/>
<view
id='target3'
style={{
height: '100px',
width: '100px',
background: hasChangedTouches ? 'green' : 'pink',
}}
/>
</view>
);
}
root.render(<App />);
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export async function createNativeApp(config: {
lynxCoreInject.tt.lynxCoreInject = lynxCoreInject;
lynxCoreInject.tt.globalThis ??= lynxCoreInject;
Object.assign(lynxCoreInject.tt, {
SystemInfo: { ...systemInfo, pixelRatio: browserConfig.pixelRatio },
SystemInfo: { ...systemInfo, ...browserConfig },
});
const ret = entry?.(lynxCoreInject.tt);
return ret;
Expand Down
Loading