Skip to content

feat: allow lynx code to get JS engine provided properties on globalThis#786

Merged
PupilTong merged 2 commits intolynx-family:mainfrom
PupilTong:p/hw/allow-read-properties-globalThis
May 14, 2025
Merged

feat: allow lynx code to get JS engine provided properties on globalThis#786
PupilTong merged 2 commits intolynx-family:mainfrom
PupilTong:p/hw/allow-read-properties-globalThis

Conversation

@PupilTong
Copy link
Collaborator

globalThis.Reflect; // this will be the Reflect Object

Note that assigning to the globalThis is still not allowed.

fix #716

```
globalThis.Reflect; // this will be the Reflect Object
```

Note that `assigning to the globalThis` is still not allowed.
@PupilTong PupilTong requested a review from Copilot May 13, 2025 07:46
@PupilTong PupilTong self-assigned this May 13, 2025
@changeset-bot
Copy link

changeset-bot bot commented May 13, 2025

🦋 Changeset detected

Latest commit: 9fbaa91

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 5 packages
Name Type
@lynx-js/web-mainthread-apis Patch
@lynx-js/web-worker-runtime Patch
@lynx-js/web-core Patch
@lynx-js/web-constants Patch
@lynx-js/web-worker-rpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a feature that allows Lynx code to access JS engine–provided properties on globalThis without allowing assignments to globalThis. The changes include wrapping global objects in Proxy instances in both the background thread and main thread APIs and adding tests to ensure the new behavior.

Reviewed Changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createNativeApp.ts Wraps lynxCoreInject with a Proxy to allow dynamic property access on globalThis
packages/web-platform/web-tests/tests/react/basic-globalThis-property-mts/index.jsx Adds a test component that verifies globalThis properties using a state change
packages/web-platform/web-tests/tests/react/basic-globalThis-property-bts/index.jsx Adds a test component that conditionally sets a style based on globalThis properties
packages/web-platform/web-tests/tests/react.spec.ts Introduces CSS assertions for the new tests
packages/web-platform/web-mainthread-apis/src/loadMainThread.ts Removes chaining to a globalThis getter in favor of explicit proxy handling
packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts Replaces the globalThis getter with a proxied field for enhanced property access
.changeset/busy-hounds-take.md Documents the changes with a changelog note
Comments suppressed due to low confidence (1)

packages/web-platform/web-tests/tests/react.spec.ts:393

  • The test asserts the 'color' CSS property, but the corresponding components in the basic-globalThis-property tests set the 'background' property. Please verify that the assertion targets the correct CSS property.
await expect(page.locator('#target')).toHaveCSS('color', 'rgb(0, 0, 0)');

@codecov
Copy link

codecov bot commented May 13, 2025

Bundle Report

Changes will increase total bundle size by 3.58kB (0.56%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
@lynx-js/web-explorer-web-array-push 320.85kB 230 bytes (0.07%) ⬆️
@lynx-js/example-react-lynx-cjs 321.14kB 3.35kB (1.05%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: @lynx-js/example-react-lynx-cjs

Assets Changed:

Asset Name Size Change Total Size Change (%)
main.lynx.bundle 1.74kB 89.87kB 1.97%
.rspeedy/main/main-thread.js 744 bytes 40.8kB 1.86%
.rspeedy/main/background.*.js 864 bytes 39.91kB 2.21%
view changes for bundle: @lynx-js/web-explorer-web-array-push

Assets Changed:

Asset Name Size Change Total Size Change (%)
static/js/async/45.js 127 bytes 58.56kB 0.22%
static/js/async/579.js 103 bytes 29.35kB 0.35%

@codspeed-hq
Copy link

codspeed-hq bot commented May 13, 2025

CodSpeed Performance Report

Merging #786 will not alter performance

Comparing PupilTong:p/hw/allow-read-properties-globalThis (9fbaa91) with main (ee03212)

Summary

✅ 2 untouched benchmarks

@Sherry-hue Sherry-hue added this pull request to the merge queue May 13, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks May 13, 2025
@PupilTong PupilTong added this pull request to the merge queue May 13, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks May 13, 2025
@Sherry-hue Sherry-hue added this pull request to the merge queue May 14, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks May 14, 2025
@PupilTong PupilTong added this pull request to the merge queue May 14, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks May 14, 2025
@PupilTong PupilTong added this pull request to the merge queue May 14, 2025
Merged via the queue into lynx-family:main with commit 03a5f64 May 14, 2025
37 checks passed
@PupilTong PupilTong deleted the p/hw/allow-read-properties-globalThis branch May 14, 2025 09:15
colinaaa pushed a commit that referenced this pull request May 16, 2025
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @lynx-js/runtime-wrapper-webpack-plugin@0.1.0

### Minor Changes

- Add parameter forwarding for Browser Object Model (BOM) APIs.
([#787](#787))

This allows direct access to APIs like `fetch`, `requestAnimationFrame`.

## @lynx-js/react@0.108.1

### Patch Changes

- Bump swc_core v23.2.0.
([#827](#827))

## @lynx-js/rspeedy@0.9.5

### Patch Changes

- Support `source.preEntry`.
([#750](#750))

Add a script before the entry file of each page. This script will be
executed before the page code.
It can be used to execute global logics, such as injecting polyfills,
setting global styles, etc.

    example:

    ```js
    import { defineConfig } from "@lynx-js/rspeedy";
    export default defineConfig({
      source: {
        preEntry: "./src/polyfill.ts",
      },
    });
    ```

- Bump Rsbuild v1.3.20 with Rspack v1.3.10.
([#799](#799))

- Add `callerName` option to `createRspeedy`.
([#757](#757))

It can be accessed by Rsbuild plugins through
[`api.context.callerName`](https://rsbuild.dev/api/javascript-api/instance#contextcallername),
and execute different logic based on this identifier.

    ```js
    export const myPlugin = {
      name: "my-plugin",
      setup(api) {
        const { callerName } = api.context;

        if (callerName === "rslib") {
          // ...
        } else if (callerName === "rspeedy") {
          // ...
        }
      },
    };
    ```

- Support `performance.buildCache`.
([#766](#766))

- Updated dependencies
\[[`fbc4fbb`](fbc4fbb)]:
    -   @lynx-js/webpack-dev-transport@0.1.3

## @lynx-js/react-rsbuild-plugin@0.9.10

### Patch Changes

- Updated dependencies
\[[`e599635`](e599635),
[`c38c737`](c38c737),
[`d16522e`](d16522e)]:
    -   @lynx-js/template-webpack-plugin@0.6.11
    -   @lynx-js/web-webpack-plugin@0.6.7
    -   @lynx-js/runtime-wrapper-webpack-plugin@0.1.0
    -   @lynx-js/react-alias-rsbuild-plugin@0.9.10
    -   @lynx-js/react-refresh-webpack-plugin@0.3.2
    -   @lynx-js/react-webpack-plugin@0.6.13
    -   @lynx-js/css-extract-webpack-plugin@0.5.3

## @lynx-js/offscreen-document@0.0.3

### Patch Changes

- feat: support OffscreenDocument.innerHTML
([#772](#772))

## @lynx-js/web-constants@0.13.2

### Patch Changes

- fix: corrupt mainthread module cache
([#806](#806))

-   Updated dependencies \[]:
    -   @lynx-js/web-worker-rpc@0.13.2

## @lynx-js/web-core@0.13.2

### Patch Changes

- feat: allow lynx code to get JS engine provided properties on
globalThis ([#786](#786))

        globalThis.Reflect; // this will be the Reflect Object

    Note that `assigning to the globalThis` is still not allowed.

- perf: use v8 hint for generated javascript file
([#807](#807))

    <https://v8.dev/blog/explicit-compile-hints>

- feat: add new property `inject-style-rules` for LynxView
([#785](#785))

This property allows developer to inject some style rules into the
shadowroot.

It's a wrapper of
<https://developer.mozilla.org/docs/Web/API/CSSStyleSheet/insertRule>

- fix: corrupt mainthread module cache
([#806](#806))

- Updated dependencies
\[[`03a5f64`](03a5f64),
[`6d3d852`](6d3d852),
[`8cdd288`](8cdd288),
[`6d3d852`](6d3d852)]:
    -   @lynx-js/web-mainthread-apis@0.13.2
    -   @lynx-js/web-worker-runtime@0.13.2
    -   @lynx-js/web-constants@0.13.2
    -   @lynx-js/offscreen-document@0.0.3
    -   @lynx-js/web-worker-rpc@0.13.2

## @lynx-js/web-core-server@0.13.2

### Patch Changes

- perf: use v8 hint for generated javascript file
([#807](#807))

    <https://v8.dev/blog/explicit-compile-hints>

- fix: corrupt mainthread module cache
([#806](#806))

- feat: improve template js loading
([#807](#807))

now we will create temp js file based on the new `templateName`
argument.

## @lynx-js/web-elements@0.7.2

### Patch Changes

- refactor: split shadowroot templates into a package
([#811](#811))

We're going to implement Lynx Web Platform's SSR based on the
`shadowrootmode`.


`https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement/shadowRootMode`

    (chrome 111, firefox 123, safari 16.4)

This means those modern browsers are able to show the correct layout
before the web components are defined.

To make this work, we have to split the shadowroot template string into
a new package `@lynx-js/web-elements-template`.

    No features affected.

- Updated dependencies
\[[`ae9652a`](ae9652a),
[`ae9652a`](ae9652a)]:
    -   @lynx-js/web-elements-template@0.7.2
    -   @lynx-js/web-elements-reactive@0.2.2

## @lynx-js/web-elements-reactive@0.2.2

### Patch Changes

- feat: do not create shadowroot if there already have one
([#811](#811))

    the shadowroot may already be created by


<https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement/shadowRootMode>

## @lynx-js/web-elements-template@0.7.2

### Patch Changes

- refactor: split shadowroot templates into a package
([#811](#811))

We're going to implement Lynx Web Platform's SSR based on the
`shadowrootmode`.


`https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement/shadowRootMode`

    (chrome 111, firefox 123, safari 16.4)

This means those modern browsers are able to show the correct layout
before the web components are defined.

To make this work, we have to split the shadowroot template string into
a new package `@lynx-js/web-elements-template`.

    No features affected.

## @lynx-js/web-explorer@0.0.8

### Patch Changes

- chore: import qr-scanner from unpkg
([#815](#815))

## @lynx-js/web-mainthread-apis@0.13.2

### Patch Changes

- feat: allow lynx code to get JS engine provided properties on
globalThis ([#786](#786))

        globalThis.Reflect; // this will be the Reflect Object

    Note that `assigning to the globalThis` is still not allowed.

- fix: corrupt mainthread module cache
([#806](#806))

- Updated dependencies
\[[`8cdd288`](8cdd288)]:
    -   @lynx-js/web-constants@0.13.2

## @lynx-js/web-worker-runtime@0.13.2

### Patch Changes

- feat: allow lynx code to get JS engine provided properties on
globalThis ([#786](#786))

        globalThis.Reflect; // this will be the Reflect Object

    Note that `assigning to the globalThis` is still not allowed.

- feat: return the offscreenDocument instance for startMainThread()
([#772](#772))

- Updated dependencies
\[[`03a5f64`](03a5f64),
[`8cdd288`](8cdd288),
[`6d3d852`](6d3d852)]:
    -   @lynx-js/web-mainthread-apis@0.13.2
    -   @lynx-js/web-constants@0.13.2
    -   @lynx-js/offscreen-document@0.0.3
    -   @lynx-js/web-worker-rpc@0.13.2

## @lynx-js/template-webpack-plugin@0.6.11

### Patch Changes

- Be compatible with rspack-manifest-plugin.
([#812](#812))

Now only the `[name].lynx.bundle` and `[name].web.bundle` would exist in
`manifest.json`.

See
[#763](#763)
for details.

- Avoid CSS encode crash on Web platform.
([#814](#814))

## @lynx-js/web-webpack-plugin@0.6.7

### Patch Changes

- Be compatible with rspack-manifest-plugin.
([#812](#812))

Now only the `[name].lynx.bundle` and `[name].web.bundle` would exist in
`manifest.json`.

See
[#763](#763)
for details.

## @lynx-js/webpack-dev-transport@0.1.3

### Patch Changes

- Fix live-reload not working on Lynx 3.3
([#795](#795))

## create-rspeedy@0.9.5



## @lynx-js/react-alias-rsbuild-plugin@0.9.10



## upgrade-rspeedy@0.9.5



## @lynx-js/web-worker-rpc@0.13.2

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[Bug] cannot get Engine ingrated object via globalThis

3 participants