From e488d985cfb10ab8c684bbc6a9b8ff3eae23bf83 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Sun, 18 May 2014 20:47:37 +0400 Subject: [PATCH] CSS: Do not throw on frame elements in FF IE9-10 throws on elements created in popups (see #14150), FF meanwhile throws on frame elements through "defaultView.getComputedStyle" (see #15098) Use "defaultView" if in the popup which would fix IE issue, use "window.getComputedStyle" which would fix FF issue. And everybody wins, except performance, but who cares right? Fixes #15098 Closes gh-1583 --- src/css/var/getStyles.js | 9 ++++++++- test/unit/css.js | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/css/var/getStyles.js b/src/css/var/getStyles.js index 26cc0a25e..413acd04a 100644 --- a/src/css/var/getStyles.js +++ b/src/css/var/getStyles.js @@ -1,5 +1,12 @@ define(function() { return function( elem ) { - return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); + // Support: IE<=11+, Firefox<=30+ (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + if ( elem.ownerDocument.defaultView.opener ) { + return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); + } + + return window.getComputedStyle( elem, null ); }; }); diff --git a/test/unit/css.js b/test/unit/css.js index bfbe8ae5e..58f43143a 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -1068,4 +1068,27 @@ test( "show() after hide() should always set display to initial value (#14750)", }); } })(); + +test( "Do not throw on frame elements from css method (#15098)", 1, function() { + var frameWin, frameDoc, + frameElement = document.createElement( "iframe" ), + frameWrapDiv = document.createElement( "div" ); + + frameWrapDiv.appendChild( frameElement ); + document.body.appendChild( frameWrapDiv ); + frameWin = frameElement.contentWindow; + frameDoc = frameWin.document; + frameDoc.open(); + frameDoc.write( "
Hi
" ); + frameDoc.close(); + + frameWrapDiv.style.display = "none"; + + try { + jQuery( frameDoc.body ).css( "direction" ); + ok( true, "It didn't throw" ); + } catch ( _ ) { + ok( false, "It did throw" ); + } +}); }