chromiumembedded / java-cef

Java Chromium Embedded Framework (JCEF). A simple framework for embedding Chromium-based browsers in other applications using the Java programming language.
https://bitbucket.org/chromiumembedded/java-cef
Other
605 stars 135 forks source link

MacOS 13 - Class WebSwapCGLLayer is implemented in both WebKit.Framework and CEF #431

Open magreenblatt opened 1 year ago

magreenblatt commented 1 year ago

Original report by Joe Lauer (Bitbucket: jlauer, GitHub: jlauer).


On MacOS 13, jcef is unable to create a window handle for offscreen rendering, it asserts with a windowhandle value of zero. Right above that exception, is a warning printed by MacOS, which may be the culprit.

objc[30064]: Class WebSwapCGLLayer is implemented in both /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/Frameworks/libANGLE-shared.dylib (0x7ffa5c3b23b0) and /private/tmp/jcef-bundle/Chromium Embedded Framework.framework/Libraries/libGLESv2.dylib (0x10b0dc568). One of the two will be used. Which one is undefined.

This appears to have also been an issue discovered in the electron project: https://github.com/electron/electron/issues/33685

After that log line, the browser component is never created, and this exception occurs:

Exception in thread "AWT-EventQueue-0" java.lang.AssertionError
at org.cef.browser.CefBrowserOsr.getWindowHandle(CefBrowserOsr.java:130)
at org.cef.browser.CefBrowserOsr.createBrowserIfRequired(CefBrowserOsr.java:435)
at org.cef.browser.CefBrowserOsr.access$000(CefBrowserOsr.java:75)
at org.cef.browser.CefBrowserOsr$1.paint(CefBrowserOsr.java:146)
at java.desktop/sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
at java.desktop/sun.lwawt.LWRepaintArea.paintComponent(LWRepaintArea.java:59)
at java.desktop/sun.awt.RepaintArea.paint(RepaintArea.java:240)
at java.desktop/sun.lwawt.LWComponentPeer.handleJavaPaintEvent(LWComponentPeer.java:1331)
at java.desktop/sun.lwawt.LWComponentPeer.handleEvent(LWComponentPeer.java:1212)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5068)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4839)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

magreenblatt commented 1 year ago

What Java and CEF versions? How do the JCEF sample apps behave? Have you tried running without off-screen rendering?

goldenduo commented 11 months ago

I think it is related to this issue This error may occurred with the code blew

private fun getWindowHandleForMac(comp: Component?): Long {
        var comp = comp
        val result = LongArray(1)
        while (comp != null) {
            if (comp.isLightweight) {
                comp = comp.parent
                continue
            }
            val peer = AWTAccessor.getComponentAccessor().getPeer<ComponentPeer>(comp)
            if (peer is LWComponentPeer<*, *>) {
                val pWindow = peer.platformWindow
                if (pWindow is CPlatformWindow) {
                    pWindow.execute { l -> result[0] = l }
                    break
                }
            }
            comp = comp.parent
        }
        return result[0]
    }