A place to cache linked articles (think custom and personal wayback machine)
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.html 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Le pillage de la communauté des logiciels libres (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Documented, feel free to shoot an email. -->
  28. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  29. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  36. <script>
  37. function toggleTheme(themeName) {
  38. document.documentElement.classList.toggle(
  39. 'forced-dark',
  40. themeName === 'dark'
  41. )
  42. document.documentElement.classList.toggle(
  43. 'forced-light',
  44. themeName === 'light'
  45. )
  46. }
  47. const selectedTheme = localStorage.getItem('theme')
  48. if (selectedTheme !== 'undefined') {
  49. toggleTheme(selectedTheme)
  50. }
  51. </script>
  52. <meta name="robots" content="noindex, nofollow">
  53. <meta content="origin-when-cross-origin" name="referrer">
  54. <!-- Canonical URL for SEO purposes -->
  55. <link rel="canonical" href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221">
  56. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  57. <article>
  58. <header>
  59. <h1>Le pillage de la communauté des logiciels libres</h1>
  60. </header>
  61. <nav>
  62. <p class="center">
  63. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  64. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  65. </svg> Accueil</a> •
  66. <a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <p><span class="mot-lettrine"><span class="lettrine">E</span>n</span> marge de l’industrie des nouvelles technologies, dans les années 1990, un autre monde numérique émerge. Des développeurs bénévoles distants géographiquement se structurent en communautés pour construire de manière collaborative des logiciels concurrents des offres dites «<small class="fine"> </small>propriétaires<small class="fine"> </small>» : le système d’exploitation Linux, le serveur Web Apache ou le lecteur multimédia VLC en sont des exemples connus. Ils abandonnent les droits exclusifs sur leur production non seulement parce qu’ils perçoivent des bénéfices non financiers (plaisir, apprentissage, réputation, offres d’emploi), mais aussi pour des raisons morales : une licence dite «<small class="fine"> </small>copyleft<small class="fine"> </small>» (comme la licence publique générale, GPL) accorde aux utilisateurs les droits d’exécution, de copie, de modification et de distribution du code informatique. Elle impose aussi le maintien de ces libertés dans toutes les versions dérivées du logiciel<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb1" class="spip_note" rel="appendix" title="Lire Philippe Rivière, « Logiciels libres : et pourtant, ils tournent », (...)" id="nh1">1</a>)</span>. Où en est aujourd’hui le mouvement du logiciel libre<small class="fine"> </small>?</p>
  71. <p>La réponse n’incite guère à l’optimisme : il a été coopté, intégré et récupéré par les colosses de la Silicon Valley, Google, Apple, Facebook, Amazon et Microsoft (Gafam). Au point que les logiciels open source (pour «<small class="fine"> </small>code source ouvert<small class="fine"> </small>», un terme adopté dans le milieu industriel pour parler du logiciel libre sans parler de… libertés<small class="fine"> </small>! <span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb2" class="spip_note" rel="appendix" title="Evgeni Morozov, « The meme hustler », The Baffler, n° 22, Cambridge (...)" id="nh2">2</a>)</span>) se trouvent désormais au cœur de l’économie numérique. Selon un sondage réalisé en 2018 auprès de 1 200 professionnels de l’informatique, plus de neuf applications sur dix contiennent des fragments de programmes issus du monde «<small class="fine"> </small>libre<small class="fine"> </small>»<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb3" class="spip_note" rel="appendix" title="Keenan Szulik, « Open source is everywhere », Tidelift, 12 avril  (...)" id="nh3">3</a>)</span>. L’intégration débute au début des années 2000 chez IBM et s’achève en 2018 avec le rachat par Microsoft de la plate-forme de développement collaborative GitHub pour 7,5 milliards de dollars. Les entreprises paient certains développeurs, profitent du travail gratuit des bénévoles, et les intellectuels critiques qui voyaient dans le «<small class="fine"> </small>libre<small class="fine"> </small>» un outil d’émancipation en sont pour leurs frais<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb4" class="spip_note" rel="appendix" title="Lire Sébastien Broca, « L’étrange destin du logiciel libre », Le Monde (...)" id="nh4">4</a>)</span>.</p>
  72. <p>Dans ce processus d’appropriation, deux acteurs ont joué un rôle essentiel de passerelle entre le monde des entreprises et celui des projets<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb5" class="spip_note" rel="appendix" title="Cf. Benjamin Birkinbine, Incorporating the Digital Commons : Corporate (...)" id="nh5">5</a>)</span>. En premier lieu, GitHub, la plate-forme de stockage de lignes de code libre, créée en 2005 et devenue un nœud central fort de quelque 40 millions d’utilisateurs et de 190 millions de dépôts. Cette centralité même a découragé les activistes «<small class="fine"> </small>libristes<small class="fine"> </small>» de la quitter après son rachat par Microsoft. Le succès de GitHub découle de son modèle collaboratif et du fait que les contributions bénévoles, recensées sur les profils individuels des développeurs, constituent de fait leur curriculum vitae.</p>
  73. <p>L’autre acteur-clé est la Fondation Linux. Lancée en 2000 pour garantir un emploi indépendant au créateur américano-finlandais du système d’exploitation libre Linux, M. Linus Torvalds, elle devait prémunir le projet de toute dépendance à une entreprise. Son activité consiste à faciliter l’usage de Linux en produisant des spécifications techniques, du code et des certifications professionnelles. Sur le plan juridique, il s’agit d’un consortium à but non lucratif qui défend les intérêts des entreprises membres, parmi lesquelles on retrouve… la plupart des Gafam. Le développement de son activité donne le vertige : alors qu’elle menait, en 2013, 10 projets, générait 23 millions de dollars de revenus et comptait 39 employés, la Fondation Linux enregistrait cinq ans plus tard 156 projets, 81 millions de dollars de revenus et 178 employés<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb6" class="spip_note" rel="appendix" title="Bradford Biddle, « Linux Foundation is eating the world », Journal of Open Law, (...)" id="nh6">6</a>)</span>.</p>
  74. <p>Dans son abondante communication, la fondation insiste sur l’importance de la documentation et de la sécurité afin de <i>«<small class="fine"> </small>professionnaliser<small class="fine"> </small>»</i> le développement et de rassurer les entreprises non technologiques qui utilisent des logiciels libres. Elle veille à donner une image rassembleuse : lors de ses conférences à gros budget, des intervenants d’Intel ou de GitHub prennent la défense des pauvres «<small class="fine"> </small>devs<small class="fine"> </small>» (développeurs) chinois empêchés de contribuer aux biens communs par les autorités. Surtout, la Fondation Linux martèle l’idée qu’entreprises et projets collaboratifs forment une «<small class="fine"> </small>communauté<small class="fine"> </small>». Ce même terme de <i>community</i> se retrouve systématiquement dans les présentations d’intervenants des sociétés marchandes pour souligner la convergence d’intérêts entre bénévoles et salariés contribuant au même projet<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb7" class="spip_note" rel="appendix" title="Mathieu O’Neil, Xiaolan Cai, Laure Muselli, Fred Pailler et Stefano (...)" id="nh7">7</a>)</span>. Les entreprises qui publient du code sur GitHub insistent également sur la «<small class="fine"> </small>gouvernance communautaire<small class="fine"> </small>» de leurs projets, car n’importe qui peut soumettre une modification à l’approbation de l’auteur originel — ce qui permet à des sociétés commerciales de conserver le dernier mot tout en singeant l’horizontalité… On retrouve enfin la même vision d’une «<small class="fine"> </small>communauté unie<small class="fine"> </small>» dans les articles de médias spécialisés traitant de la coproduction entre sociétés commerciales et projets bénévoles.</p>
  75. <p>Une telle concordance ne doit rien au hasard. Cette inversion orwellienne du sens associé à des termes positifs comme «<small class="fine"> </small>communauté<small class="fine"> </small>», «<small class="fine"> </small>collaboration<small class="fine"> </small>» et «<small class="fine"> </small>ouverture<small class="fine"> </small>» constitue une caractéristique du capitalisme de surveillance<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb8" class="spip_note" rel="appendix" title="Lire Soshana Zuboff, « Un capitalisme de surveillance », Le Monde diplomatique, (...)" id="nh8">8</a>)</span>. En réalité, les intérêts des communautés bénévoles et des entreprises prédatrices ne se rejoignent que dans la mesure où les premières subissent une prédation numérique croissante de la part des secondes. Les Gafam captent, par exemple, les recherches produites avec le monde universitaire : entre 2014 et 2019, 78,3<small class="fine"> </small>% des 17 405 publications d’employés de Microsoft furent coécrites avec des chercheurs<small class="fine"> </small>; au cours de la même période, l’entreprise obtint 76 109 brevets, dont seulement 0,2<small class="fine"> </small>% furent partagés<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb9" class="spip_note" rel="appendix" title="Cf. Cecilia Rikap et Bengt-Ake Lundvall, « Big tech, knowledge predation and (...)" id="nh9">9</a>)</span>. Une autre technique consiste pour les entreprises à multiplier les offres de recherche et développement (R&amp;D) auprès des jeunes développeurs<small class="fine"> </small>; une fois les innovations dévoilées par leurs auteurs, l’entreprise coupe les ponts et crée sa propre version. Les divisions d’Alphabet (maison mère de Google), les laboratoires Google ATAP et Google X, en ont fait leur spécialité, mais Facebook n’est pas en reste<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb10" class="spip_note" rel="appendix" title="The Wall Street Journal, New York, 9 août 2017 ; Fortune, New York, 15 juin  (...)" id="nh10">10</a>)</span>.</p>
  76. <p>Pourquoi les licences copyleft comme la GPL n’ont-elles pas protégé le monde «<small class="fine"> </small>libre<small class="fine"> </small>» des attaques des Gafam<small class="fine"> </small>? D’abord parce que Google les a récupérées — avant de les torpiller. L’entreprise californienne a en effet construit sa domination en faisant de Linux le socle des téléphones Android. Or la licence publique obligeait Google à publier le code source des modifications qu’il apportait à ce logiciel libre. Du moins jusqu’à ce que la société fondée par Larry Page et Sergey Brin développe son propre système d’exploitation, Fuchsia, et lui associe une licence non copyleft.</p>
  77. <p>La GPL a également pâti du développement de l’informatique en nuage <i>(cloud),</i> c’est-à-dire du stockage et du traitement des données sur des serveurs centralisés plutôt que sur les ordinateurs des utilisateurs. En effet, la plupart des licences copyleft, y compris la licence publique générale, ne garantissent l’accès, la modification et la redistribution du code source des logiciels que s’ils sont distribués aux utilisateurs, autrement dit s’ils sont transférés et installés sur leurs ordinateurs. Mais elles n’opèrent pas quand le logiciel tourne sur les serveurs des Gafam : le copyleft ne s’active pas, car le logiciel n’est pas distribué mais utilisé à distance. Le monde «<small class="fine"> </small>libre<small class="fine"> </small>» a bien tenté de créer des licences copyleft efficaces contre la «<small class="fine"> </small>cloudification<small class="fine"> </small>», avec, par exemple, la licence publique générale Affero, mais Google a combattu celle-ci bec et ongles. Si elle avait été adoptée par de nombreux acteurs, cette licence aurait forcé Google et consorts à partager le code source des logiciels qui tournent sur leurs serveurs, même pour les utilisateurs qui interagissent avec ces logiciels à distance. Le mastodonte de la Silicon Valley a donc purement et simplement interdit son utilisation dans ses produits<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb11" class="spip_note" rel="appendix" title="« AGPL policy », Google Open Source." id="nh11">11</a>)</span>.</p>
  78. <p>En matière de logiciel libre, les entreprises technologiques ne présentent pas une attitude monolithique. L’examen des propos tenus par leurs employés lors de trois grandes conférences open source révèle une division claire entre, d’un côté, les grands groupes de type Gafam et, de l’autre, les sociétés de taille plus réduite. Face au modèle économique et aux prétentions communautaires des premières, les secondes affichent une vision critique et plus axée sur la soutenabilité des projets. Leurs représentants insistent sur l’importance des licences et du respect des principes «<small class="fine"> </small>libristes<small class="fine"> </small>», quand les employés des Gafam répètent que la question ne présente aujourd’hui plus guère d’intérêt pour une majorité de contributeurs.</p>
  79. <p>Le partage et la transparence constituent deux valeurs fondatrices du logiciel libre. Si les Gafam consacrent tant de temps et de ressources à nourrir l’illusion de leur appartenance à l’univers collaboratif bénévole, c’est qu’elles savent leur position moralement intenable. Pour les combattre il faut donc répéter cette vérité : les principes fondateurs du logiciel libre sont systématiquement et cyniquement bafoués par ces entreprises. Mais vers quelle cible faut-il diriger cette critique<small class="fine"> </small>? Le grand public<small class="fine"> </small>? Les développeurs<small class="fine"> </small>?</p>
  80. <p>Le grand public se soucie peu des principes du logiciel libre<small class="fine"> </small>; il se montre en revanche sensible aux questions de vie privée et de surveillance. À la faveur des scandales qui entachent la réputation des Gafam, il pourrait graduellement adopter les plates-formes et services décentralisés issus du monde «<small class="fine"> </small>libre<small class="fine"> </small>», à l’instar de l’«<small class="fine"> </small>archipélisation<small class="fine"> </small>» que propose l’association Framasoft pour nouer des partenariats entre structures de natures différentes, du standard ouvert Matrix pour la communication en temps réel sécurisée et décentralisée, ou encore de Nextcloud, solution d’hébergement de fichiers et de collaboration à l’architecture ouverte<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb12" class="spip_note" rel="appendix" title="Cf. https://framasoft.org ; https://matrix.org ; https://nextcloud.com" id="nh12">12</a>)</span>. Le réalisme commande toutefois de reconnaître que ces solutions, malgré leur succès ponctuel, ne peuvent rivaliser avec l’offre de services quasi infinie proposée par les Gafam.</p>
  81. <p>Si le combat n’a jamais été équilibré, le statut d’employé de certains développeurs open source dans les grandes entreprises et le discours dominant qui définit l’innovation uniquement en termes d’investissements privés et de start-up paralysent la résistance. Les communautés des «<small class="fine"> </small>libristes<small class="fine"> </small>» se sont traditionnellement constituées comme des entités collectives pour répondre à des tentatives d’appropriation de programmes. La situation appelle un large débat en leur sein. Quand Oracle acquiert Sun Microsystems en 2010, l’opération menace certains projets open source soutenus par Sun, et des membres de la communauté décident de constituer une version libre alternative du système de gestion de base de données MySQL, qu’ils rebaptisent alors MariaDB. Mais soustraire ainsi à l’appropriation toute l’infrastructure numérique d’Internet bâtie sur des logiciels libres (tels que Linux, Kubernetes, et plus généralement toute la pile logicielle sur laquelle reposent les <i>clouds</i> commerciaux), et par là même les moteurs de recherche, réseaux sociaux et autres plates-formes de service destinés aux entreprises ou au grand public, n’est guère envisageable sans soutien public.</p>
  82. <p>À rebours de la culture des deux acteurs, il s’agit à présent de connecter le libre et l’État. Dans un contexte d’automatisation et de chômage croissants se posent la question de la reconnaissance des contributions volontaires et celle de l’articulation entre les secteurs coopératifs, étatiques et privés. Les Économistes atterrés et Bernard Stiegler ont par exemple proposé des variantes de «<small class="fine"> </small>droits communs du travail<small class="fine"> </small>», qui permettraient à celles et ceux qui contribuent aux communs d’accumuler des droits d’accès à des services sociaux<span class="spip_note_ref"> (<a href="https://www.monde-diplomatique.fr/2022/01/O_NEIL/64221#nb13" class="spip_note" rel="appendix" title="Cf. Calimaq (Lionel Maurel), « Droits communs du travail et droit au travail (...)" id="nh13">13</a>)</span>. La communauté du logiciel libre peut-elle se constituer en entité politique qui réfléchit, au-delà du logiciel, sur la société dans son ensemble<small class="fine"> </small>? Peut-elle se confronter aux orthodoxies productivistes, au développement infini de la puissance de calcul<small class="fine"> </small>? Tout le passé indique le contraire. Son succès, pourtant, en dépend.</p>
  83. </article>
  84. <hr>
  85. <footer>
  86. <p>
  87. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  88. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  89. </svg> Accueil</a> •
  90. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  91. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  92. </svg> Suivre</a> •
  93. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  94. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  95. </svg> Pro</a> •
  96. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  97. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  98. </svg> Email</a> •
  99. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  100. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  101. </svg> Légal</abbr>
  102. </p>
  103. <template id="theme-selector">
  104. <form>
  105. <fieldset>
  106. <legend><svg class="icon icon-brightness-contrast">
  107. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  108. </svg> Thème</legend>
  109. <label>
  110. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  111. </label>
  112. <label>
  113. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  114. </label>
  115. <label>
  116. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  117. </label>
  118. </fieldset>
  119. </form>
  120. </template>
  121. </footer>
  122. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  123. <script>
  124. function loadThemeForm(templateName) {
  125. const themeSelectorTemplate = document.querySelector(templateName)
  126. const form = themeSelectorTemplate.content.firstElementChild
  127. themeSelectorTemplate.replaceWith(form)
  128. form.addEventListener('change', (e) => {
  129. const chosenColorScheme = e.target.value
  130. localStorage.setItem('theme', chosenColorScheme)
  131. toggleTheme(chosenColorScheme)
  132. })
  133. const selectedTheme = localStorage.getItem('theme')
  134. if (selectedTheme && selectedTheme !== 'undefined') {
  135. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  136. }
  137. }
  138. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  139. window.addEventListener('load', () => {
  140. let hasDarkRules = false
  141. for (const styleSheet of Array.from(document.styleSheets)) {
  142. let mediaRules = []
  143. for (const cssRule of styleSheet.cssRules) {
  144. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  145. continue
  146. }
  147. // WARNING: Safari does not have/supports `conditionText`.
  148. if (cssRule.conditionText) {
  149. if (cssRule.conditionText !== prefersColorSchemeDark) {
  150. continue
  151. }
  152. } else {
  153. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  154. continue
  155. }
  156. }
  157. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  158. }
  159. // WARNING: do not try to insert a Rule to a styleSheet you are
  160. // currently iterating on, otherwise the browser will be stuck
  161. // in a infinite loop…
  162. for (const mediaRule of mediaRules) {
  163. styleSheet.insertRule(mediaRule.cssText)
  164. hasDarkRules = true
  165. }
  166. }
  167. if (hasDarkRules) {
  168. loadThemeForm('#theme-selector')
  169. }
  170. })
  171. </script>
  172. </body>
  173. </html>