postcss / autoprefixer

Parse CSS and add vendor prefixes to rules by Can I Use
https://twitter.com/autoprefixer
MIT License
21.65k stars 1.26k forks source link

Ignored `-webkit-`, `-ms-` prefix on `@-moz-document` rules for userstyles #1271

Open denis-g opened 4 years ago

denis-g commented 4 years ago

NodeJs v10.15.2 NPM v6.13.1

I'm testing postcss with autoprefixer, and also gulp-autoprefixer. browserslist setting is default.

Source scss:

body {
    appearance: none;
    user-select: none;
}

@-moz-document domain('example.com') {
    body {
        appearance: none;
        user-select: none;
    }
}

Output css:

body {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
}

@-moz-document domain('example.com') {
    body {
        -moz-appearance: none;
             appearance: none;
        -moz-user-select: none;
             user-select: none;
    }
}

Same result on http://autoprefixer.github.io/

ai commented 4 years ago

Good idea. Do you want to send PR?

ai commented 4 years ago

@denis-g seems like you need to fix this method https://github.com/postcss/autoprefixer/blob/master/lib/prefixer.js#L79-L107

ai commented 4 years ago

@denis-g what is a problem here?

Current output seems like OK to me:

body {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
}

@-moz-document domain('example.com') {
    body {
        -moz-appearance: none;
             appearance: none;
        -moz-user-select: none;
             user-select: none;
    }
}
silverwind commented 4 years ago

This is actually a bad idea, at least with stylus which parsers those @-moz-document into site-specific blocks and applies the contained styles on all browsers, not just Firefox.

ai commented 4 years ago

@silverwind so stylus uses @-moz-document at-rule, but then require -webkit- prefixes inside? Why they do it? Do we need to report them an issue?

silverwind commented 4 years ago

@-moz-document is stripped entirely from the resulting style. What remains can and should be prefixed for all browsers.

ai commented 4 years ago

Did stylus strip the inner content of @-moz-document too or just unwrap the content?

silverwind commented 4 years ago

Just unwrap to my understanding. Every body of a @-moz-document is put into its own "section" which finally results in a <style> tag being added to the document for each "section" if the @-moz-document conditions match the current URL.

The old and now defunct Stylish extension for Firefox did it differently, it did not unwrap as the browser supported @-moz-document natively. But to my knowledge this mechanism is no longer in use anywhere.

silverwind commented 4 years ago

Anyways, my point is autoprefixer should not do any special processing for @-moz-document as cutting out non-moz prefixes would be detrimental to other browsers.

ai commented 4 years ago

Just unwrap to my understanding

I think we should report an issue to Stylish. It should not be just unwrapped because of the problem like this.

If Stylish developers will say that there is not any other way I can change Autoprefixer behavior for this specific case.

Anyways, my point is autoprefixer should not do any special processing for @-moz-document as cutting out non-moz prefixes would be detrimental to other browsers.

Right now Autoprefixer does not put -moz- prefixes to @-webkit-keyframes and any cases like this. To have different behavior in this case we need a good reason.