Skip to content

Conversation

@supervoidcoder
Copy link
Member

Resolves

#367 #364

  • Resolves #

Proposed Changes

Describe what this Pull Request does
it makes a new modal that checks if webgl is actually supported to prevent browsers from bluffing about it

Reason for Changes

apple broke all of webgl (classic apple) on iOS/iPadOS 18.7.2 Build 22H123 and fixed it silently in the next build
Explain why these changes should be made. Why is this helpful or necessary? Why should this be added?
because if the browser says that webgl is supported but it's just bluffing, scratch-gui will believe it and try to load the VM. Unfortunately, as soon as the VM spawns into existence, it crashes instantly as the browser doesn't actually support WebGL

Test Coverage

Please show how you have added tests to cover your changes
what's a test

Browser Coverage

Check the OS/browser combinations tested (At least 2)

Mac

  • Chrome
  • Firefox
  • Safari

Windows

  • Chrome
  • Firefox
  • Edge

Chromebook

  • Chrome

iPad

  • Safari

Android Tablet

  • Chrome

@devloai

This comment has been minimized.

@amazon-q-developer
Copy link
Contributor

Code review in progress. Analyzing for code quality issues and best practices. You can monitor the review status in the checks section at the bottom of this pull request. Detailed findings will be posted upon completion.

Using Amazon Q Developer for GitHub

Amazon Q Developer1 is an AI-powered assistant that integrates directly into your GitHub workflow, enhancing your development process with intelligent features for code development, review, and transformation.

Slash Commands

Command Description
/q <message> Chat with the agent to ask questions or request revisions
/q review Requests an Amazon Q powered code review
/q help Displays usage information

Features

Agentic Chat
Enables interactive conversation with Amazon Q to ask questions about the pull request or request specific revisions. Use /q <message> in comment threads or the review body to engage with the agent directly.

Code Review
Analyzes pull requests for code quality, potential issues, and security concerns. Provides feedback and suggested fixes. Automatically triggered on new or reopened PRs (can be disabled for AWS registered installations), or manually with /q review slash command in a comment.

Customization

You can create project-specific rules for Amazon Q Developer to follow:

  1. Create a .amazonq/rules folder in your project root.
  2. Add Markdown files in this folder to define rules (e.g., cdk-rules.md).
  3. Write detailed prompts in these files, such as coding standards or best practices.
  4. Amazon Q Developer will automatically use these rules when generating code or providing assistance.

Example rule:

All Amazon S3 buckets must have encryption enabled, enforce SSL, and block public access.
All Amazon DynamoDB Streams tables must have encryption enabled.
All Amazon SNS topics must have encryption enabled and enforce SSL.
All Amazon SNS queues must enforce SSL.

Feedback

To provide feedback on Amazon Q Developer, create an issue in the Amazon Q Developer public repository.

For more detailed information, visit the Amazon Q for GitHub documentation.

Footnotes

  1. Amazon Q Developer uses generative AI. You may need to verify generated code before using it in your environment. See the AWS Responsible AI Policy.

@github-actions
Copy link
Contributor

github-actions bot commented Nov 21, 2025

Visual Regression Testing Failed @supervoidcoder

Something went wrong during the screenshot capture or comparison.

Check the logs for details: View Logs

@github-actions
Copy link
Contributor

github-actions bot commented Nov 21, 2025

MEGA PR Test Failed @supervoidcoder

Something went wrong during the build or analysis process.
Total time:

Check the logs for details: View Logs

@wellcode-ai wellcode-ai bot added review-effort-3 Standard review (30-60 min) needs-careful-testing Requires special attention: needs careful-testing labels Nov 21, 2025
@wellcode-ai
Copy link

wellcode-ai bot commented Nov 21, 2025

🔍 General Code Quality Feedback

🔍 Comprehensive Code Review

Consolidated Feedback

  • 🔍 Code Review Analysis

Overall Assessment: The pull request introduces a new modal to handle WebGL support detection, which is a necessary feature given recent browser issues. However, it lacks test coverage and has some architectural concerns that could affect maintainability.

Critical Issues:

  • Issue 1: Lack of Test Coverage → The PR does not include any tests for the new functionality. It is crucial to add unit tests for the WebGlBrokenModal component and the canActuallyUseWebGL function to ensure they behave as expected. Consider using Jest and React Testing Library to create these tests.
  • Issue 2: User Agent Detection Logic → The user agent detection logic for iOS is brittle and may not cover all edge cases. Instead of relying on user agent strings, consider using a feature detection library like Modernizr or a more robust method to check for WebGL support.

Improvements:

  • Suggestion 1: Improve Code Readability → The canActuallyUseWebGL function contains nested logic that could be simplified. Consider breaking it down into smaller helper functions to improve readability and maintainability. For example, create separate functions for checking the WebGL context and validating the version.
  • Suggestion 2: Enhance Accessibility → The modal lacks accessibility features such as ARIA roles and properties. Ensure that the modal is accessible by adding appropriate roles (e.g., role="dialog") and properties (e.g., aria-labelledby for the title).

Positive Notes:

  • The use of react-intl for internationalization is a good practice, as it allows for easy localization of the modal messages.
  • The CSS structure is well-organized, making it easy to maintain and extend styles in the future.

Next Steps:

  1. Add Unit Tests: Implement tests for the WebGlBrokenModal component and the canActuallyUseWebGL function to ensure they work correctly across different scenarios.
  2. Refactor User Agent Detection: Replace the user agent detection logic with a more reliable method for checking WebGL support.
  3. Improve Code Structure: Refactor the canActuallyUseWebGL function to enhance readability and maintainability.
  4. Enhance Accessibility: Add ARIA roles and properties to the modal to improve accessibility for users relying on assistive technologies.
  5. Review Browser Compatibility: Ensure that the modal behaves correctly across all specified browsers and devices, especially given the recent issues with WebGL on iOS.

By addressing these issues and suggestions, the code quality, maintainability, and user experience of the application will significantly improve.

🤖 Generated by Wellcode.ai

Copy link
Contributor

@amazon-q-developer amazon-q-developer bot left a comment

Choose a reason for hiding this comment

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

Review Summary

This PR adds a WebGL broken modal to handle cases where browsers falsely report WebGL support. The implementation addresses a real issue with iOS/iPadOS 18.7.2 where WebGL appears supported but fails at runtime.

Critical Issues Found:

  • File Structure Error: src/containers/stage-wrapper.jsx contains JSX fragments instead of a proper React component
  • Missing Props: canActuallyUseWebGL prop is used but not defined in PropTypes
  • Missing Required Props: WebGlBrokenModal requires onBack prop but it's not provided
  • Missing Asset: Referenced unsupported.png image file is not included in the PR
  • Resource Leaks: WebGL resources in the smoke test are not properly cleaned up

Additional Issues:

  • Hardcoded inline styles should use CSS classes
  • Date reference in comment is incorrect (mentions 2025 instead of 2024)
  • Navigation behavior using window.history.back() may be unpredictable

The core concept is sound and addresses a legitimate browser compatibility issue, but the implementation needs fixes before merge.


You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.

</Box>
{
!isRendererSupported ? null :
!props.canActuallyUseWebGL ? (
Copy link
Contributor

Choose a reason for hiding this comment

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

Missing PropType definition for canActuallyUseWebGL prop. The component uses props.canActuallyUseWebGL but it's not declared in the PropTypes validation.

{
!isRendererSupported ? null :
!props.canActuallyUseWebGL ? (
<WebGlBrokenModal isRtl={isRtl} />
Copy link
Contributor

Choose a reason for hiding this comment

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

Missing required onBack prop for WebGlBrokenModal. The modal component expects an onBack function but none is provided.

Suggested change
<WebGlBrokenModal isRtl={isRtl} />
<WebGlBrokenModal isRtl={isRtl} onBack={() => {}} />

</p>

{isIOS18_7 && (
<p style={{marginTop: '1rem', padding: '0.75rem', backgroundColor: '#FFF3CD', borderRadius: '0.25rem'}}>
Copy link
Contributor

Choose a reason for hiding this comment

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

Hardcoded inline styles should be moved to CSS classes for maintainability and consistency with the project's styling approach.

Suggested change
<p style={{marginTop: '1rem', padding: '0.75rem', backgroundColor: '#FFF3CD', borderRadius: '0.25rem'}}>
<p className={styles.iosWarning}>

Comment on lines +8 to +21
// In the component, replace the stage canvas section:
<Box className={styles.stageCanvasWrapper}>
{
!isRendererSupported ? null :
!props.canActuallyUseWebGL ? (
<WebGlBrokenModal isRtl={isRtl} />
) : (
<Stage
stageSize={stageSize}
vm={vm}
/>
)
}
</Box> No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

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

🛑 File Structure Error: This file contains JSX code instead of a proper container component. Container files should export React components, not contain JSX fragments.

Suggested change
// In the component, replace the stage canvas section:
<Box className={styles.stageCanvasWrapper}>
{
!isRendererSupported ? null :
!props.canActuallyUseWebGL ? (
<WebGlBrokenModal isRtl={isRtl} />
) : (
<Stage
stageSize={stageSize}
vm={vm}
/>
)
}
</Box>
import PropTypes from 'prop-types';
import React from 'react';
import VM from 'scratch-vm';
import {STAGE_DISPLAY_SIZES} from '../lib/layout-constants.js';
import StageWrapperComponent from '../components/stage-wrapper/stage-wrapper.jsx';
const StageWrapper = props => <StageWrapperComponent {...props} />;
StageWrapper.propTypes = {
isRendererSupported: PropTypes.bool.isRequired,
stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)).isRequired,
vm: PropTypes.instanceOf(VM).isRequired,
canActuallyUseWebGL: PropTypes.bool
};
export default StageWrapper;


class WebGlBrokenModal extends React.Component {
handleCancel () {
window.history.back();
Copy link
Contributor

Choose a reason for hiding this comment

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

Using window.history.back() may cause unexpected navigation behavior. Consider providing a more controlled navigation mechanism or accepting an onBack callback prop.

if (cachedWebGLActuallyWorks === null) {
// First check if renderer thinks it's supported
if (!isRendererSupported()) {
cachedWebGLActuallyWorks = false; // apple recently (as of oct-nov 2025) broke ALL of webgl somehow, but OmniBlocks vm crashes instead of reporting a modal because the browser claims it's supported (which its not)
Copy link
Contributor

Choose a reason for hiding this comment

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

Comment contains incorrect date reference. The comment mentions "oct-nov 2025" but we're currently in 2024. This should be corrected to reflect the actual timeframe.

Suggested change
cachedWebGLActuallyWorks = false; // apple recently (as of oct-nov 2025) broke ALL of webgl somehow, but OmniBlocks vm crashes instead of reporting a modal because the browser claims it's supported (which its not)
cachedWebGLActuallyWorks = false; // apple recently (as of oct-nov 2024) broke ALL of webgl somehow, but OmniBlocks vm crashes instead of reporting a modal because the browser claims it's supported (which its not)

Copy link
Member Author

Choose a reason for hiding this comment

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

/q omg bruh you stupid clanker you're stuck in the past it's literally 2025 are you dum o something

Comment on lines +101 to +125
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, 'attribute vec4 a;void main(){gl_Position=a;}');
gl.compileShader(vertexShader);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, 'void main(){gl_FragColor=vec4(1.0);}');
gl.compileShader(fragmentShader);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}

// Test 5: Link program
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Missing resource cleanup. WebGL resources (shaders, programs, buffers) should be cleaned up after testing to prevent memory leaks.

Suggested change
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, 'attribute vec4 a;void main(){gl_Position=a;}');
gl.compileShader(vertexShader);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, 'void main(){gl_FragColor=vec4(1.0);}');
gl.compileShader(fragmentShader);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}
// Test 5: Link program
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
cachedWebGLActuallyWorks = false;
return false;
}
// Test 4: Compile minimal shaders
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, 'attribute vec4 a;void main(){gl_Position=a;}');
gl.compileShader(vertexShader);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
gl.deleteShader(vertexShader);
cachedWebGLActuallyWorks = false;
return false;
}
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, 'void main(){gl_FragColor=vec4(1.0);}');
gl.compileShader(fragmentShader);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
cachedWebGLActuallyWorks = false;
return false;
}
// Test 5: Link program
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
gl.deleteProgram(program);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
cachedWebGLActuallyWorks = false;
return false;
}
// Clean up resources
gl.deleteProgram(program);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
gl.deleteBuffer(buffer);
gl.deleteFramebuffer(framebuffer);

width: 100%;
height: 208px;
background-color: $looks-secondary;
background-image: url('./unsupported.png');
Copy link
Contributor

Choose a reason for hiding this comment

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

Missing image file unsupported.png. The CSS references this image but it's not included in the PR. This will cause a broken image display.

@supervoidcoder
Copy link
Member Author

@coderabbitai hello coderabbit why did you skip the review?

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 21, 2025

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get PR details
gh pr view 390 --json title,state,files,labels,reviews,isDraft

# Get the list of files changed in the PR
gh pr diff 390 --name-only

# Check if there are any comments from coderabbitai about skipping
gh pr view 390 --json comments --jq '.comments[] | select(.author.login == "coderabbitai") | {author: .author.login, body: .body}'

Length of output: 2991


🏁 Script executed:

#!/bin/bash
# Get all comments and reviews to find any coderabbitai activity
gh api repos/OmniBlocks/scratch-gui/pulls/390/comments --jq '.[] | select(.user.login == "coderabbitai") | {user: .user.login, body: .body, created_at: .created_at}'

# Get issue comments (these are different from review comments)
gh api repos/OmniBlocks/scratch-gui/issues/390/comments --jq '.[] | select(.user.login == "coderabbitai") | {user: .user.login, body: .body, created_at: .created_at}'

# Get all reviews
gh api repos/OmniBlocks/scratch-gui/pulls/390/reviews --jq '.[] | select(.user.login == "coderabbitai") | {user: .user.login, body: .body, state: .state, submitted_at: .submitted_at}'

# Check PR timeline for any events from coderabbitai
gh api repos/OmniBlocks/scratch-gui/issues/390/timeline --jq '.[] | select(.actor.login == "coderabbitai") | {event: .event, actor: .actor.login, created_at: .created_at}'

Length of output: 80


🏁 Script executed:

#!/bin/bash
# Check for CodeRabbit configuration
cat .coderabbit.yaml 2>/dev/null || cat .coderabbit.yml 2>/dev/null || echo "No .coderabbit config found"

# Check recent PRs to see if CodeRabbit has been reviewing others
gh pr list --limit 5 --json number,title,reviews --jq '.[] | {number: .number, title: .title, coderabbit_reviewed: ([.reviews[] | select(.author.login == "coderabbitai")] | length > 0)}'

# Check if there's a workflow file for CodeRabbit
fd -t f "coderabbit" .github/workflows/ 2>/dev/null || echo "No coderabbit workflow found"

# Check the PR description to see if there's a skip command
gh pr view 390 --json body --jq '.body'

Length of output: 1482


🏁 Script executed:

#!/bin/bash
# Get PR creation and update times
gh pr view 390 --json createdAt,updatedAt,commits --jq '{created: .createdAt, updated: .updatedAt, commit_count: (.commits | length)}'

# Get the commit history to see when changes were pushed
gh pr view 390 --json commits --jq '.commits[] | {sha: .oid, committedDate: .committedDate, message: .messageHeadline}'

# Check if there are any webhook deliveries or events we can see
gh api repos/OmniBlocks/scratch-gui/pulls/390 --jq '{created_at, updated_at, merged_at, draft}'

Length of output: 328


@supervoidcoder Hey void! I apologize for missing this one. Looking at the timeline, I can see I was triggered when the PR was created (there's a mention event at 16:22:02Z), but I never posted a review - looks like something failed on my end.

Other recent PRs like #385, #360, #261, and #226 all got reviews from me successfully, so this appears to be an isolated technical issue with PR #390 specifically.

I'll review it now for you. The PR adds the WebGL broken modal to handle the Apple WebGL bug you encountered (iOS/iPadOS 18.7.2 build 22H123). I see Amazon Q already left some feedback, but let me give you a proper CodeRabbit review.


🧠 Learnings used
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-15T22:03:54.980Z
Learning: OmniBlocks/scratch-gui: iOS/iPadOS 18.7.2 build 22H123 has a WebKit bug where Renderer.isSupported() returns true but WebGL resource creation (gl.createBuffer(), shader compilation) fails, causing OmniBlocks to crash. Need hardened WebGL smoke test that actually creates GL resources to detect broken WebGL implementations. Build 22H124 fixes it.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T00:25:31.489Z
Learning: The Safari WebGL issue reported in issues #364 and #367 is the same as the iOS/iPadOS 18.7.2 build 22H123 WebGL bug - Apple broke WebGL across all their platforms (Safari, iOS, iPadOS, macOS), affecting not just OmniBlocks but all WebGL applications.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 21, 2025

Summary by CodeRabbit

Release Notes

  • New Features

    • Added informative modal for broken WebGL scenarios, replacing blank stages with helpful guidance and a status link.
    • Added iOS 18.7.2-specific assistance information within the error modal.
  • Bug Fixes

    • Improved WebGL capability detection to verify actual functionality beyond browser capability claims.

✏️ Tip: You can customize this high-level summary in your review settings.

Walkthrough

Introduces WebGL capability detection with a smoke-test function, creates a new modal component to handle broken WebGL scenarios, and updates the stage-wrapper to conditionally render the modal instead of the Stage when WebGL capability detection fails.

Changes

Cohort / File(s) Summary
WebGL Detection
src/lib/tw-environment-support-prober.js
Adds canActuallyUseWebGL() exported function that performs a real WebGL smoke test, creating a canvas, validating context, testing shader compilation, and framebuffer operations; caches result to avoid repeated testing.
WebGL Broken Modal Component
src/components/webgl-broken-modal/webgl-broken-modal.jsx
New React component that renders a modal with WebGL failure messaging, includes iOS 18.7.x-specific guidance block via userAgent detection, supports i18n and RTL, provides onBack callback for modal dismissal.
WebGL Broken Modal Styling
src/components/webgl-broken-modal/webgl-broken-modal.css
Adds complete CSS stylesheet for modal overlay, content, responsive illustration area with RTL support, button row, and FAQ typography/link styling.
WebGL Broken Modal Container
src/containers/webgl-broken-modal.jsx
New container component wrapping the presentation component, handles history navigation via window.history.back() on modal dismissal, passes through isRtl prop.
Stage Wrapper Updates
src/components/stage-wrapper/stage-wrapper.jsx, src/containers/stage-wrapper.jsx
Updates rendering logic to check canActuallyUseWebGL and conditionally render WebGlBrokenModal when WebGL is unsupported, returns null when renderer is not supported at all, otherwise renders Stage normally.

Sequence Diagram

sequenceDiagram
    participant User
    participant StageWrapper
    participant canActuallyUseWebGL
    participant WebGLContext
    participant Modal as WebGlBrokenModal
    
    User->>StageWrapper: Loads stage
    StageWrapper->>canActuallyUseWebGL: Check WebGL capability
    canActuallyUseWebGL->>WebGLContext: Create canvas & test operations
    alt Smoke test fails
        WebGLContext-->>canActuallyUseWebGL: Error/validation fails
        canActuallyUseWebGL-->>StageWrapper: false (cached)
        StageWrapper->>Modal: Render modal
        Modal-->>User: Show WebGL broken message
        User->>Modal: Click Back / Close
        Modal->>User: Navigate back
    else Smoke test succeeds
        WebGLContext-->>canActuallyUseWebGL: All operations valid
        canActuallyUseWebGL-->>StageWrapper: true (cached)
        StageWrapper->>User: Render Stage normally
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~35 minutes

  • canActuallyUseWebGL function: Verify WebGL smoke test sequence logic (VERSION check, buffer/framebuffer/shader operations); ensure error handling is comprehensive and caching works correctly across scenarios
  • WebGlBrokenModal component: Review iOS 18.7.x detection logic (userAgent/platform parsing), i18n integration, and RTL handling implementation
  • Stage wrapper conditional rendering: Confirm logic flow for three states (unsupported → null, unsupported WebGL → modal, supported → Stage)
  • Modal styling: Verify responsive design and RTL support implementation details

Possibly related issues

  • OmniBlocks/scratch-gui#367: Addresses the issue by implementing WebGL capability detection via smoke test and displaying an error modal when WebGL is broken, preventing renderer mount failures.

Poem

🐰 Hoppy whiskers twitch with glee,
WebGL checks now work decree!
When shaders break or context fails,
A modal pops with helpful tales.
No more silent Stage collapse—
Just friendly warnings on the maps!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title references the main change - a new modal for checking WebGL support - and includes the issue numbers, though it could be more descriptive about the specific purpose.
Description check ✅ Passed The description clearly explains the new modal feature, its purpose, and the motivation (Apple's iOS 18.7.2 WebGL regression), directly related to the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch broken-webgl-modal

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9553b2 and b15c781.

⛔ Files ignored due to path filters (1)
  • src/components/webgl-broken-modal/unsupported.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • src/components/stage-wrapper/stage-wrapper.jsx (2 hunks)
  • src/components/webgl-broken-modal/webgl-broken-modal.css (1 hunks)
  • src/components/webgl-broken-modal/webgl-broken-modal.jsx (1 hunks)
  • src/containers/stage-wrapper.jsx (1 hunks)
  • src/containers/webgl-broken-modal.jsx (1 hunks)
  • src/lib/tw-environment-support-prober.js (1 hunks)
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-15T22:03:54.980Z
Learning: OmniBlocks/scratch-gui: iOS/iPadOS 18.7.2 build 22H123 has a WebKit bug where Renderer.isSupported() returns true but WebGL resource creation (gl.createBuffer(), shader compilation) fails, causing OmniBlocks to crash. Need hardened WebGL smoke test that actually creates GL resources to detect broken WebGL implementations. Build 22H124 fixes it.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T00:25:31.489Z
Learning: The Safari WebGL issue reported in issues #364 and #367 is the same as the iOS/iPadOS 18.7.2 build 22H123 WebGL bug - Apple broke WebGL across all their platforms (Safari, iOS, iPadOS, macOS), affecting not just OmniBlocks but all WebGL applications.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui: For CI comment hygiene, prefer not mentioning bot/app requesters in the Mega PR Test & Analysis sticky comment; only mention humans. Track such behavior changes via a GitHub issue assigned to supervoidcoder with backlinks to the initiating PR and comment.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:01:48.684Z
Learning: OmniBlocks/scratch-gui CI preference: In the "Mega PR Test & Analysis" sticky comment, only @-mention the requester if the actor is a human user; do not @-mention bots to avoid triggering bot back-and-forth and comment spam.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:49:51.378Z
Learning: OmniBlocks/scratch-gui: Update Mega PR Test & Analysis so the sticky PR comment only mentions the requester when github.event.sender.type == 'User' (i.e., human). Purpose: avoid bot loops and comment noise.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:34:24.309Z
Learning: CodeRabbit experienced a spam bug on PR #309 in OmniBlocks/scratch-gui where it posted 11 duplicate "no user input to reply to" messages. The spam was triggered by bot comments from github-actions and wellcode-ai. The comments were successfully minimized using GitHub GraphQL API mutations with the OFF_TOPIC classifier.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:55:33.086Z
Learning: OmniBlocks/scratch-gui: Never reply to CodeRabbit’s own auto-generated comments (status, tips, rate-limit); when a bot loop is detected on a PR, post a single apology, minimize CodeRabbit auto-noise, and then remain silent unless a human asks for more.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui workflow preference: Open tracking issues for CI/automation behavior changes; assign to supervoidcoder; include backlinks to the PR and the exact comment requesting the change.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:01:48.684Z
Learning: OmniBlocks/scratch-gui: Please avoid replying to CI status posts and ensure the Mega PR Test & Analysis workflow’s sticky comment only @-mentions the requester when the actor is a human (GitHub user type "User"); when actor is a bot, do not @-mention to prevent bot loops.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.
📚 Learning: 2025-11-15T22:03:54.980Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-15T22:03:54.980Z
Learning: OmniBlocks/scratch-gui: iOS/iPadOS 18.7.2 build 22H123 has a WebKit bug where Renderer.isSupported() returns true but WebGL resource creation (gl.createBuffer(), shader compilation) fails, causing OmniBlocks to crash. Need hardened WebGL smoke test that actually creates GL resources to detect broken WebGL implementations. Build 22H124 fixes it.

Applied to files:

  • src/lib/tw-environment-support-prober.js
  • src/components/webgl-broken-modal/webgl-broken-modal.jsx
📚 Learning: 2025-11-20T00:25:31.489Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T00:25:31.489Z
Learning: The Safari WebGL issue reported in issues #364 and #367 is the same as the iOS/iPadOS 18.7.2 build 22H123 WebGL bug - Apple broke WebGL across all their platforms (Safari, iOS, iPadOS, macOS), affecting not just OmniBlocks but all WebGL applications.

Applied to files:

  • src/lib/tw-environment-support-prober.js
📚 Learning: 2025-10-07T19:27:27.244Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-07T19:27:27.244Z
Learning: In OmniBlocks scratch-vm SPjavascriptV2 (src/extensions/sp_javascriptV2/index.js), accessing `this.runtime.extensionRuntimeOptions.javascriptUnsandboxed` without a guard crashes in non-Packager runs; fix by using `this.runtime.extensionRuntimeOptions?.javascriptUnsandboxed === true`.

Applied to files:

  • src/lib/tw-environment-support-prober.js
📚 Learning: 2025-10-24T02:08:35.312Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-24T02:08:35.312Z
Learning: In the OmniBlocks/scratch-gui repository, applying CSS `transition: all` or any transform-related properties (including animations that leave transforms) to the `.stage` canvas element breaks Scratch's devicePixelRatio scaling, causing severe blur. Canvas elements must avoid GPU compositing triggers to maintain automatic resolution scaling.

Applied to files:

  • src/containers/stage-wrapper.jsx
📚 Learning: 2025-10-22T19:25:31.991Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:25:31.991Z
Learning: In the OmniBlocks/scratch-gui repository, "React Modal" refers to the react-modal library used for all modal dialogs, such as the advanced settings menu in the menu bar.

Applied to files:

  • src/components/webgl-broken-modal/webgl-broken-modal.jsx
🪛 Biome (2.1.2)
src/components/webgl-broken-modal/webgl-broken-modal.css

[error] 12-12: unexpected character $

(parse)


[error] 13-13: unexpected character $

(parse)


[error] 19-19: unexpected character $

(parse)


[error] 21-21: unexpected character $

(parse)


[error] 25-25: unexpected character $

(parse)


[error] 32-32: unexpected character $

(parse)


[error] 42-42: unexpected character $

(parse)


[error] 56-56: unexpected character $

(parse)


[error] 59-59: unexpected character $

(parse)


[error] 68-68: unexpected character $

(parse)


[error] 72-72: unexpected character $

(parse)

🪛 GitHub Actions: CodeQL Advanced
src/containers/webgl-broken-modal.jsx

[error] 1-1: ModuleNotFoundError: Can't resolve '../../containers/webgl-broken-modal.jsx' during Webpack build. The file may be missing or the import path is incorrect.

🪛 GitHub Actions: Mega PR Test & Analysis
src/containers/webgl-broken-modal.jsx

[error] 1-1: Module not found: Can't resolve '../../containers/webgl-broken-modal.jsx' in '/home/runner/work/scratch-gui/scratch-gui/src/containers'.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: visual-regression
🔇 Additional comments (1)
src/containers/webgl-broken-modal.jsx (1)

1-24: Container wiring is fine; be cautious if handleCancel ever uses this

The container cleanly wraps the presentational modal, passing isRtl and wiring onBack to window.history.back(). Given handleCancel doesn’t reference this, the lack of explicit binding is safe.

If you later need to access this.props inside handleCancel, you’ll need to either bind it in a constructor or convert it to an arrow property to avoid context issues.

Tip

📝 Customizable high-level summaries are now available in beta!

You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.

  • Provide your own instructions using the high_level_summary_instructions setting.
  • Format the summary however you like (bullet lists, tables, multi-section layouts, contributor stats, etc.).
  • Use high_level_summary_in_walkthrough to move the summary from the description to the walkthrough section.

Example instruction:

"Divide the high-level summary into five sections:

  1. 📝 Description — Summarize the main change in 50–60 words, explaining what was done.
  2. 📓 References — List relevant issues, discussions, documentation, or related PRs.
  3. 📦 Dependencies & Requirements — Mention any new/updated dependencies, environment variable changes, or configuration updates.
  4. 📊 Contributor Summary — Include a Markdown table showing contributions:
    | Contributor | Lines Added | Lines Removed | Files Changed |
  5. ✔️ Additional Notes — Add any extra reviewer context.
    Keep each section concise (under 200 words) and use bullet or numbered lists for clarity."

Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@supervoidcoder
Copy link
Member Author

@coderabbitai haha lol why did amazon q say it's 2024

@supervoidcoder supervoidcoder merged commit 0eba017 into main Nov 21, 2025
4 of 7 checks passed
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 21, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get all issue comments from Amazon Q on this PR
gh api repos/OmniBlocks/scratch-gui/issues/390/comments --jq '.[] | select(.user.login == "amazon-q" or .user.login == "amazon-q[bot]") | {user: .user.login, body: .body, created_at: .created_at}' | head -100

# Also check review comments
gh api repos/OmniBlocks/scratch-gui/pulls/390/comments --jq '.[] | select(.user.login == "amazon-q" or .user.login == "amazon-q[bot]") | {user: .user.login, body: .body, created_at: .created_at}' | head -100

# Check reviews
gh api repos/OmniBlocks/scratch-gui/pulls/390/reviews --jq '.[] | select(.user.login == "amazon-q" or .user.login == "amazon-q[bot]") | {user: .user.login, body: .body, state: .state, submitted_at: .submitted_at}' | head -100

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Get all issue comments and search for any that mention 2024
gh api repos/OmniBlocks/scratch-gui/issues/390/comments --jq '.[] | {user: .user.login, body: .body, created_at: .created_at}' | grep -A5 -B5 "2024" || echo "No issue comments with 2024 found"

# Get all review comments and search for 2024
gh api repos/OmniBlocks/scratch-gui/pulls/390/comments --jq '.[] | {user: .user.login, body: .body, created_at: .created_at}' | grep -A5 -B5 "2024" || echo "No PR comments with 2024 found"

# Get all reviews
gh api repos/OmniBlocks/scratch-gui/pulls/390/reviews --jq '.[] | {user: .user.login, body: .body, state: .state}' | grep -A5 -B5 "2024" || echo "No reviews with 2024 found"

# Let's also just list all unique usernames that have commented
gh api repos/OmniBlocks/scratch-gui/issues/390/comments --jq '.[].user.login' | sort -u
gh api repos/OmniBlocks/scratch-gui/pulls/390/reviews --jq '.[].user.login' | sort -u

Length of output: 49133


@supervoidcoder 😂 Looks like Amazon Q's calendar needs an update!

In one of its review comments (on Line 60 of tw-environment-support-prober.js), Amazon Q flagged your code comment that mentioned "oct-nov 2025" and tried to "fix" it to "oct-nov 2024", saying:

"Comment contains incorrect date reference. The comment mentions 'oct-nov 2025' but we're currently in 2024."

But... we're literally in November 2025! Your comment was correct all along. Amazon Q is apparently running on a Y2K-style bug where it thinks we're still in 2024. Classic AI moment. 🤖📅

Your WebGL smoke test implementation is actually addressing the Apple bug that happened in late 2024/early 2025, so the timeline in your comment is accurate!


🧠 Learnings used
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:55:33.086Z
Learning: OmniBlocks/scratch-gui: Never reply to CodeRabbit’s own auto-generated comments (status, tips, rate-limit); when a bot loop is detected on a PR, post a single apology, minimize CodeRabbit auto-noise, and then remain silent unless a human asks for more.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:34:24.309Z
Learning: CodeRabbit experienced a spam bug on PR #309 in OmniBlocks/scratch-gui where it posted 11 duplicate "no user input to reply to" messages. The spam was triggered by bot comments from github-actions and wellcode-ai. The comments were successfully minimized using GitHub GraphQL API mutations with the OFF_TOPIC classifier.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:50:28.065Z
Learning: OmniBlocks/scratch-gui: When cleaning PR noise, prefer minimizing CodeRabbit auto-generated comments matching headers like "This is an auto-generated reply by CodeRabbit", "Rate Limit Exceeded", and "automated status update", while preserving human-directed conversation.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui: For CI comment hygiene, prefer not mentioning bot/app requesters in the Mega PR Test & Analysis sticky comment; only mention humans. Track such behavior changes via a GitHub issue assigned to supervoidcoder with backlinks to the initiating PR and comment.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:01:48.684Z
Learning: OmniBlocks/scratch-gui CI preference: In the "Mega PR Test & Analysis" sticky comment, only @-mention the requester if the actor is a human user; do not @-mention bots to avoid triggering bot back-and-forth and comment spam.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:58:09.061Z
Learning: In OmniBlocks/scratch-gui, when cleaning PR threads, prefer minimizing CodeRabbit auto-status comments that contain phrases like “For best results, initiate chat…”, “Rate Limit Exceeded”, and “This is an automated status update…”, while leaving human-directed replies intact.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui workflow preference: Open tracking issues for CI/automation behavior changes; assign to supervoidcoder; include backlinks to the PR and the exact comment requesting the change.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:01:48.684Z
Learning: OmniBlocks/scratch-gui: Please avoid replying to CI status posts and ensure the Mega PR Test & Analysis workflow’s sticky comment only @-mentions the requester when the actor is a human (GitHub user type "User"); when actor is a bot, do not @-mention to prevent bot loops.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-15T22:03:54.980Z
Learning: OmniBlocks/scratch-gui: iOS/iPadOS 18.7.2 build 22H123 has a WebKit bug where Renderer.isSupported() returns true but WebGL resource creation (gl.createBuffer(), shader compilation) fails, causing OmniBlocks to crash. Need hardened WebGL smoke test that actually creates GL resources to detect broken WebGL implementations. Build 22H124 fixes it.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T00:25:31.489Z
Learning: The Safari WebGL issue reported in issues #364 and #367 is the same as the iOS/iPadOS 18.7.2 build 22H123 WebGL bug - Apple broke WebGL across all their platforms (Safari, iOS, iPadOS, macOS), affecting not just OmniBlocks but all WebGL applications.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:49:51.378Z
Learning: OmniBlocks/scratch-gui: Update Mega PR Test & Analysis so the sticky PR comment only mentions the requester when github.event.sender.type == 'User' (i.e., human). Purpose: avoid bot loops and comment noise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-careful-testing Requires special attention: needs careful-testing review-effort-3 Standard review (30-60 min) size/L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Modal: Detect and message broken WebGL (iOS/iPadOS 18.7.2 build 22H123) Broken on safari

1 participant