diff --git a/src/sizeMapping.js b/src/sizeMapping.js index b8278df69c0..04c9773a1af 100644 --- a/src/sizeMapping.js +++ b/src/sizeMapping.js @@ -1,5 +1,5 @@ import { config } from './config'; -import {logWarn, isPlainObject, deepAccess, deepClone} from './utils'; +import {logWarn, isPlainObject, deepAccess, deepClone, getWindowTop} from './utils'; import includes from 'core-js/library/fn/array/includes'; let sizeConfig = []; @@ -123,7 +123,17 @@ function evaluateSizeConfig(configs) { typeof config === 'object' && typeof config.mediaQuery === 'string' ) { - if (matchMedia(config.mediaQuery).matches) { + let ruleMatch = false; + + try { + ruleMatch = getWindowTop().matchMedia(config.mediaQuery).matches; + } catch (e) { + logWarn('Unfriendly iFrame blocks sizeConfig from being correctly evaluated'); + + ruleMatch = matchMedia(config.mediaQuery).matches; + } + + if (ruleMatch) { if (Array.isArray(config.sizesSupported)) { results.shouldFilter = true; } diff --git a/test/spec/sizeMapping_spec.js b/test/spec/sizeMapping_spec.js index aca4ccf8f54..f85da4cba0b 100644 --- a/test/spec/sizeMapping_spec.js +++ b/test/spec/sizeMapping_spec.js @@ -60,6 +60,13 @@ describe('sizeMapping', function () { matchMediaOverride = {matches: false}; + sandbox.stub(utils.getWindowTop(), 'matchMedia').callsFake((...args) => { + if (typeof matchMediaOverride === 'function') { + return matchMediaOverride.apply(utils.getWindowTop(), args); + } + return matchMediaOverride; + }); + sandbox.stub(window, 'matchMedia').callsFake((...args) => { if (typeof matchMediaOverride === 'function') { return matchMediaOverride.apply(window, args);