diff --git a/spec/components/evented-iframe-spec.cjsx b/spec/components/evented-iframe-spec.cjsx index cb98af510..3689abfaa 100644 --- a/spec/components/evented-iframe-spec.cjsx +++ b/spec/components/evented-iframe-spec.cjsx @@ -40,7 +40,9 @@ describe 'EventedIFrame', -> expect(@setAttributeSpy).not.toHaveBeenCalled() expect(@openLinkSpy).toHaveBeenCalled() target = @openLinkSpy.calls[i].args[0].target - expect(target.getAttribute('href')).toBe href + targetHref = @openLinkSpy.calls[i].args[0].href + expect(target).not.toBeDefined() + expect(targetHref).toBe href it 'corrects relative uris', -> hrefs = [ diff --git a/src/components/evented-iframe.cjsx b/src/components/evented-iframe.cjsx index 0c8995429..1a4aaf786 100644 --- a/src/components/evented-iframe.cjsx +++ b/src/components/evented-iframe.cjsx @@ -150,8 +150,18 @@ class EventedIFrame extends React.Component else target.setAttribute('href', "http://#{rawHref}") + rawHref = target.getAttribute('href') + e.preventDefault() - NylasEnv.windowEventHandler.openLink(target: target, metaKey: e.metaKey) + + # It's important to send the raw `href` here instead of the target. + # The `target` comes from the document context of the iframe, which + # as of Electron 0.36.9, has different constructor function objects + # in memory than the main execution context. This means that code + # like `e.target instanceof Element` will erroneously return false + # since the `e.target.constructor` and the `Element` function are + # created in different contexts. + NylasEnv.windowEventHandler.openLink(href: rawHref, metaKey: e.metaKey) _isBlacklistedHref: (href) -> return (new RegExp(/^file:/i)).test(href)