feat: allow lynx code to get JS engine provided properties on globalThis#786
Conversation
``` globalThis.Reflect; // this will be the Reflect Object ``` Note that `assigning to the globalThis` is still not allowed.
🦋 Changeset detectedLatest commit: 9fbaa91 The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
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 |
There was a problem hiding this comment.
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)');
Bundle ReportChanges will increase total bundle size by 3.58kB (0.56%) ⬆️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: @lynx-js/example-react-lynx-cjsAssets Changed:
view changes for bundle: @lynx-js/web-explorer-web-array-pushAssets Changed:
|
CodSpeed Performance ReportMerging #786 will not alter performanceComparing Summary
|
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>
Note that
assigning to the globalThisis still not allowed.fix #716