The [`@import`](https://www.w3.org/TR/css-cascade-5/#at-import) rule is 
extended to support conditional stylesheet imports:


@import [ <url> | <string> ] <media-query-list>? ;


Conceptually, a conditional import takes all rules of the referenced 
stylesheet, literally includes them at the location of the `@import` rule, and 
surrounds them with a `@media` rule with the specified `<media-query-list>`.

The implementation of this feature extends media queries with a context-free 
evaluation function:

interface MediaQuery {
    TriState evaluate(); // returns TRUE / FALSE / UNKNOWN
}


This mode of evaluation uses Kleene's strong trivalent logic to determine 
whether the media query will always match (it's a tautology), will never match 
(it's a contradiction), or whether it depends on the context or we simply don't 
know.

Using this mechanism, a conditional stylesheet import that can never match will 
be skipped at runtime. Similarly, a conditional stylesheet import that will 
always match doesn't need the `<media-query-list>` at all; its rules will be 
pasted verbatim into the main stylesheet.

Note that this mechanism is _not_ meant to be a full-blown theorem solver. It 
won't detect that, for example, the following import conditions will always 
match:

@import url("stylesheet.css") (width > 1000) or (width <= 1000);


Its purpose is an optimization for "obvious" cases. For example, at the moment 
the built-in themes use hard-coded conditions to include user-agent stylesheets 
at runtime:

    // in PlatformImpl.java:
    if (isSupported(ConditionalFeature.INPUT_TOUCH)) {
        uaStylesheets.add("com/sun/javafx/scene/control/skin/modena/touch.css");
    }

In the future, we might have a way to test for `ConditionalFeature` flags that 
achieves the same thing, but with a public API available to all theme authors:

@import url("com/sun/javafx/scene/control/skin/modena/touch.css")
        (-fx-supports-conditional-feature: input-touch);

-------------

Commit messages:
 - Conditional stylesheet imports

Changes: https://git.openjdk.org/jfx/pull/2031/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2031&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8364149
  Stats: 934 lines in 21 files changed: 821 ins; 45 del; 68 mod
  Patch: https://git.openjdk.org/jfx/pull/2031.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2031/head:pull/2031

PR: https://git.openjdk.org/jfx/pull/2031

Reply via email to