+ $this->addModuleStyles( [
+ 'site.styles',
+ 'noscript',
+ 'user.styles',
+ 'user.cssprefs',
+ ] );
+
+ // Prepare exempt modules for buildExemptModules()
+ $exemptGroups = [ 'site' => [], 'noscript' => [], 'private' => [], 'user' => [] ];
+ $exemptStates = [];
+ $moduleStyles = array_filter( $this->getModuleStyles( /*filter*/ true ),
+ function ( $name ) use ( $rl, $context, &$exemptGroups, &$exemptStates ) {
+ $module = $rl->getModule( $name );
+ if ( $module ) {
+ $group = $module->getGroup();
+ if ( $name === 'user.styles' && $this->isUserCssPreview() ) {
+ $exemptStates[$name] = 'ready';
+ // Special case in buildExemptModules()
+ return false;
+ }
+ if ( $name === 'site.styles' ) {
+ // HACK: Technically, 'site.styles' isn't in a separate request group.
+ // But, in order to ensure its styles are in the right position,
+ // pretend it's in a group called 'site'.
+ $group = 'site';
+ }
+ if ( isset( $exemptGroups[$group] ) ) {
+ $exemptStates[$name] = 'ready';
+ if ( !$module->isKnownEmpty( $context ) ) {
+ // E.g. Don't output empty <styles>
+ $exemptGroups[$group][] = $name;
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+ );
+ $this->rlExemptStyleModules = $exemptGroups;
+
+ // Manually handled by getBottomScripts()
+ $userModule = $rl->getModule( 'user' );
+ $userState = $userModule->isKnownEmpty( $context ) && !$this->isUserJsPreview()
+ ? 'ready'
+ : 'loading';
+ $this->rlUserModuleState = $exemptStates['user'] = $userState;
+