serversideup / webext-bridge

💬 Messaging in Web Extensions made easy. Batteries included.
https://serversideup.net/open-source/webext-bridge
MIT License
547 stars 50 forks source link

fix: Firefox cross-origin object access #94

Open pnd280 opened 1 month ago

pnd280 commented 1 month ago

PR: Resolve Firefox cross-origin object access issue in message port handling

Issue

Firefox was throwing the following error when attempting to send message from window context:

Error: Not allowed to define cross-origin object as property on [Object] or [Array] XrayWrapper

image

Solution

The fix involves modifying how we handle the message port in the getMessagePort function. Instead of directly accessing and modifying ports[0], we now store it in a local variable port. This approach avoids the cross-origin object access issue.

Changes

In src/internal/message-port.ts:

export const getMessagePort = (
  // ... existing code ...
) => {
  // ... existing code ...
  window.addEventListener('message', function acceptMessagingPort(event) {
    const { data: { cmd, scope, context }, ports } = event
    if (cmd === 'webext-port-offer' && scope === namespace && context !== thisContext) {
      window.removeEventListener('message', acceptMessagingPort)
      const port = ports[0]
      port.onmessage = onMessage
      port.postMessage('port-accepted')
      return resolve(port)
    }
  }
  // ... existing code ...
}

Impact

This change resolves the Firefox-specific error without affecting functionality on other browsers. It ensures consistent behavior across different browser environments when handling message ports in cross-origin contexts.

Testing

Please review and test this change to confirm it resolves the issue without introducing any regressions.