I found this while looking for refactoring opportunities in ThemeRegistry.
A Drupal\Core\Utility\ThemeRegistry object is created for a specific theme.
This theme determines the cache id ($cid) that ThemeRegistry will use to read from and write to the cache.
ThemeRegistry::resolveCacheMiss() gets a "complete registry" from \Drupal::service('theme.registry')->get().
This provides the theme registry array for whichever is the current theme at the time this is called.
Depending on things happening between ThemeRegistry object construction and the first ThemeRegistry::get() with a cache miss, a different theme might have become active then.
This would cause ThemeRegistry to write entries from theme B into the registry cache of theme A.
I don't know if this bug manifests anywhere. I suspect it would manifest as a miraculous heisenbug.
It would require that something changes the active theme mid-request, or that something requests a theme registry for a different theme than the active theme.
Comments
Comment #2
donquixote commentedThe underlying problem here is that
Drupal\Core\Theme\Registrycannot decide whether it manages and represents the registry of a specific theme, or that of all themes. E.g. Registry->registry contains entries for multiple themes, but there is Registry->theme which is the current theme, and Registry->get() returns the registry for the current theme.Comment #3
donquixote commentedI think I found the reason why this might never happen in practice:
Theme\Registry->themeName or Theme\Registry->theme are not changed mid request.
They can only be initialized on first use, but never modified afterwards.
What could happen, in theory, is that someone creates a Theme\Registry instance that is distinct from the "theme.registry" service, with a theme name different from the current theme, and calls ->getRuntime() on that.
So the entire thing is still weird and fragile, but in practice it might not be a problem.
Comment #14
smustgrave commentedCame up in the bugsmash daily triage target.
Wonder if this should be closed out?
@lendude brought the logic is being refactored over on #2957440: Refactor ThemeRegistry and Theme\Registry
Comment #15
donquixote commentedWe could create a test case, to demonstrate that this was a problem in the past, and is now fixed.
So, a test with an artificial scenario that would replicate the problem described here.
We create one branch from an earlier version of Drupal where this still happens.
And another branch with the same test, but in a later version where it is fixed.
I don't have time atm to write this test, but I still think it can be a good exercise.
Comment #16
donquixote commentedAlso I don't see any code yet in the refactoring issue (you can blame me for it).
I think the Hux POC MR has some interesting patterns that could be useful for refactoring other parts like the theme registry.
Comment #17
smustgrave commentedAlways think adding more test coverage is good.