Skip to content

Cross Domain Recording #16323

Description

@nwgroup

What happened?

Hi, when we use the API that creates an iframe. We got the error "Logger.js:155 2025-08-08T13:30:15.371Z [features/recording] Capture failed SecurityError: Failed to execute 'showSaveFilePicker' on 'Window': Cross origin sub frames aren't allowed to show a file picker. at Object.startLocalRecording LocalRecordingManager.web.ts:112:40)" and did a lot of changes in the origin server and de the destiny server, but it's the same. Finally, we thing that a change like this could work:

`async startLocalRecording(store, onlySelf) {
const { dispatch, getState } = store;
this.roomName = getRoomName(getState()) ?? '';

// Función para solicitar al padre la selección del archivo                                                                                                                               
const requestFileHandleFromParent = () => {                                                                                                                                               
    return new Promise((resolve, reject) => {                                                                                                                                             
        const messageHandler = event => {                                                                                                                                                 
            if (event.source === window.parent && event.data && event.data.type === 'fileHandleResponse') {                                                                               
                window.removeEventListener('message', messageHandler);                                                                                                                    
                if (event.data.fileHandle) {                                                                                                                                              
                    resolve(event.data.fileHandle);                                                                                                                                       
                } else {                                                                                                                                                                  
                    reject(new Error('No file handle received from parent'));                                                                                                             
                }                                                                                                                                                                         
            }                                                                                                                                                                             
        };                                                                                                                                                                                
        window.addEventListener('message', messageHandler);                                                                                                                               
        window.parent.postMessage({ type: 'requestFileHandle' }, '*');                                                                                                                    
    });                                                                                                                                                                                   
};                                                                                                                                                                                        
                                                                                                                                                                                          
// Obtener un handle al archivo donde escribir                                                                                                                                            
let options = {                                                                                                                                                                           
    startIn: 'downloads',                                                                                                                                                                 
    suggestedName: `${this.getFilename()}.webm`,                                                                                                                                          
};                                                                                                                                                                                        
                                                                                                                                                                                          
try {                                                                                                                                                                                     
    if (window.self !== window.top) {                                                                                                                                                     
        // Estamos en un iframe, solicitar al padre el fileHandle                                                                                                                         
        this.fileHandle = await requestFileHandleFromParent();                                                                                                                            
    } else {                                                                                                                                                                              
        // No estamos en iframe, usar showSaveFilePicker normalmente                                                                                                                      
        this.fileHandle = await window.showSaveFilePicker(options);                                                                                                                       
    }                                                                                                                                                                                     
                                                                                                                                                                                          
    this.writableStream = await this.fileHandle?.createWritable();                                                                                                                        
} catch (e) {                                                                                                                                                                             
    nwUtils.print('No se pudo obtener el handle del archivo:', e);                                                                                                                        
    throw e;                                                                                                                                                                              
}                                                                                                                                                                                         

` continue the function whitout changes. Thanks to start an open discussion about that.

https://github.com/jitsi/jitsi-meet/blob/master/react/features/recording/components/Recording/LocalRecordingManager.web.ts

Platform

  • Chrome (or Chromium based)
  • Firefox
  • Safari
  • Other desktop browser
  • Android browser
  • iOS browser
  • Electron app
  • Android mobile app
  • iOS mobile app
  • Custom app using a mobile SDK

Browser / app / sdk version

Google Chome Version 137.0.7151.119 (Official Build) (64-bit)

Relevant log output

Logger.js:155 2025-08-08T13:30:15.371Z [features/recording] Capture failed SecurityError: Failed to execute 'showSaveFilePicker' on 'Window': Cross origin sub frames aren't allowed to show a file picker.
    at Object.startLocalRecording (LocalRecordingManager.web.ts:112:40)
    at middleware.ts:79:35
    at middleware.ts:28:12
    at middleware.ts:155:12
    at middleware.ts:7:20
    at middleware.ts:55:20
    at middleware.ts:22:12
    at middleware.ts:66:12
    at middleware.ts:50:20
    at middleware.web.ts:35:12
    at middleware.web.ts:19:12
    at middleware.any.ts:52:20
    at middleware.ts:60:12
    at middleware.web.ts:273:22
    at middleware.ts:48:12
    at middleware.ts:21:12
    at middleware.ts:11:20
    at middleware.ts:18:12
    at middleware.web.ts:31:12
    at middleware.any.ts:39:20

Reproducibility

  • The problem is reproducible on meet.jit.si

More details?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions