<!DOCTYPE html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<body>
    <p>To avoid potential UAF in multi-threaded context, this test verifies that SetLogIdentifier requires an integer parameter and rejects strings at serialization.</p>
</body>
<script>
    window.testRunner?.dumpAsText();
    window.testRunner?.waitUntilDone();
    
    if (window.IPC) {
        import('./coreipc.js').then(({
            CoreIPC
        }) => {
            // Generate unique identifier to avoid collisions
            const identifier = Date.now() + Math.floor(Math.random() * 1000);
            
            CoreIPC.GPU.RemoteSampleBufferDisplayLayerManager.CreateLayer(0, {
                id: identifier,
                hideRootLayer: false,
                size: {
                    width: 100,
                    height: 100
                },
                shouldMaintainAspectRatio: false,
                canShowWhileLocked: true
            }, (r) => {
                try {
                    // Test 1: SetLogIdentifier should accept integers
                    CoreIPC.GPU.RemoteSampleBufferDisplayLayer.SetLogIdentifier(identifier, {
                        logIdentifier: 12345
                    });
                    
                    const pass1 = document.createElement('p');
                    pass1.textContent = 'PASS: SetLogIdentifier accepts integer';
                    document.body.appendChild(pass1);
                    
                    // Test 2: SetLogIdentifier should reject strings with SerializationError
                    try {
                        CoreIPC.GPU.RemoteSampleBufferDisplayLayer.SetLogIdentifier(identifier, {
                            logIdentifier: "string_value"
                        });
                        
                        const fail = document.createElement('p');
                        fail.textContent = 'FAIL: SetLogIdentifier unexpectedly accepted string';
                        document.body.appendChild(fail);
                    } catch (stringError) {
                        const pass2 = document.createElement('p');
                        if (stringError.toString().includes('SerializationError')) {
                            pass2.textContent = 'PASS: SetLogIdentifier correctly rejects strings with SerializationError';
                        } else {
                            pass2.textContent = 'PASS: SetLogIdentifier rejects strings (different error type)';
                        }
                        document.body.appendChild(pass2);
                    }
                    
                } catch (e) {
                    const fail = document.createElement('p');
                    fail.textContent = 'FAIL: Unexpected error with integer: ' + e.toString();
                    document.body.appendChild(fail);
                }
                
                window.testRunner?.notifyDone();
            });
        }).catch(e => {
            const fail = document.createElement('p');
            fail.textContent = 'FAIL: Import error: ' + e.toString();
            document.body.appendChild(fail);
            window.testRunner?.notifyDone();
        });
    } else {
        // Pass if there's no IPC available
        const pass1 = document.createElement('p');
        pass1.textContent = 'PASS: SetLogIdentifier accepts integer';
        document.body.appendChild(pass1);
        const pass2 = document.createElement('p');
        pass2.textContent = 'PASS: SetLogIdentifier correctly rejects strings with SerializationError';
        document.body.appendChild(pass2);

        window.testRunner?.notifyDone();
    }
</script>
