@@ -212,13 +212,15 @@ type ParsedMediaInParens = ParsedMediaFeature;
212
212
class ParsedMediaCondition {
213
213
constructor (
214
214
public readonly first : ParsedMediaFeature ,
215
- public readonly conditions ?: ParsedMediaAnds
215
+ public readonly conditions ?: ParsedMediaAnds | ParsedMediaOrs
216
216
) { }
217
217
218
218
matches ( context : MatchMediaContext ) {
219
219
const base = this . first . matches ( context ) ;
220
- if ( this . conditions ) {
220
+ if ( this . conditions instanceof ParsedMediaAnds ) {
221
221
return base && this . conditions . matches ( context ) ;
222
+ } else if ( this . conditions instanceof ParsedMediaOrs ) {
223
+ return base || this . conditions . matches ( context ) ;
222
224
} else {
223
225
return base ;
224
226
}
@@ -227,7 +229,11 @@ class ParsedMediaCondition {
227
229
static * Parser ( ) {
228
230
yield optionalWhitespace ;
229
231
const first : ParsedMediaInParens = yield parsedMediaInParens ;
230
- const conditions : ParsedMediaAnds | '' = yield [ ParsedMediaAnds . Parser , '' ] ;
232
+ const conditions : ParsedMediaAnds | ParsedMediaOrs | '' = yield [
233
+ ParsedMediaAnds . Parser ,
234
+ ParsedMediaOrs . Parser ,
235
+ '' ,
236
+ ] ;
231
237
if ( conditions === '' ) {
232
238
return first ;
233
239
} else {
@@ -257,6 +263,27 @@ class ParsedMediaAnds {
257
263
}
258
264
}
259
265
266
+ class ParsedMediaOrs {
267
+ constructor ( public readonly list : ReadonlyArray < ParsedMediaInParens > ) { }
268
+
269
+ matches ( context : MatchMediaContext ) {
270
+ return this . list . some ( ( m ) => m . matches ( context ) ) ;
271
+ }
272
+
273
+ static * Parser ( ) {
274
+ const list : Array < ParsedMediaInParens > = [ ] ;
275
+
276
+ do {
277
+ yield requiredWhitespace ;
278
+ yield 'or' ;
279
+ yield requiredWhitespace ;
280
+ list . push ( yield parsedMediaInParens ) ;
281
+ } while ( yield hasMore ) ;
282
+
283
+ return new ParsedMediaOrs ( list ) ;
284
+ }
285
+ }
286
+
260
287
class ParsedMediaTypeThenConditionWithoutOr {
261
288
constructor (
262
289
public readonly mediaType : ParsedMediaType | ParsedNotMediaType ,
@@ -624,4 +651,11 @@ test('matchMedia()', () => {
624
651
'not print and (min-width: 480px) and (orientation: landscape) and (any-hover: hover)'
625
652
) . matches
626
653
) . toBe ( true ) ;
654
+
655
+ expect (
656
+ matchMedia (
657
+ screenSized ( 480 , 100 ) ,
658
+ '(orientation: landscape) or (orientation: portrait)'
659
+ ) . matches
660
+ ) . toBe ( true ) ;
627
661
} ) ;
0 commit comments