From e42f50178073852a824862f33bc995b5815095bb Mon Sep 17 00:00:00 2001 From: Evan Morikawa Date: Mon, 25 Apr 2016 17:28:07 -0700 Subject: [PATCH] fix(frame): fix link clicking in iframes --- spec/components/evented-iframe-spec.cjsx | 4 +++- src/components/evented-iframe.cjsx | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) 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)