<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Chromium on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/chromium/</link>
        <description>Recent content in Chromium on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Wed, 03 Sep 2025 15:27:52 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/chromium/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>comprehensive-rust</title>
        <link>https://producthunt.programnotes.cn/en/p/comprehensive-rust/</link>
        <pubDate>Wed, 03 Sep 2025 15:27:52 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/comprehensive-rust/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1542707088-7fa1c72006d8?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTY4ODQzNjh8&amp;ixlib=rb-4.1.0" alt="Featured image of post comprehensive-rust" /&gt;&lt;h1 id=&#34;googlecomprehensive-rust&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;google/comprehensive-rust&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;comprehensive-rust-&#34;&gt;Comprehensive Rust 🦀
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/actions/workflows/build.yml?query=branch%3Amain&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/actions/workflow/status/google/comprehensive-rust/build.yml?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Build workflow&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/graphs/contributors&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/contributors/google/comprehensive-rust?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub contributors&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/stargazers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/stars/google/comprehensive-rust?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub stars&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This repository has the source code for Comprehensive Rust 🦀, a multi-day Rust
course developed by the Android team. The course covers all aspects of Rust,
from basic syntax to generics and error handling. It also includes deep dives on
&lt;a class=&#34;link&#34; href=&#34;https://google.github.io/comprehensive-rust/android.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Android&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://google.github.io/comprehensive-rust/chromium.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chromium&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://google.github.io/comprehensive-rust/bare-metal.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bare-metal&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://google.github.io/comprehensive-rust/concurrency.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;concurrency&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read the course at &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://google.github.io/comprehensive-rust/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://google.github.io/comprehensive-rust/&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;course-format-and-target-audience&#34;&gt;Course Format and Target Audience
&lt;/h2&gt;&lt;p&gt;The course is used internally at Google when teaching Rust to experienced
software engineers. They typically have a background in C++ or Java.&lt;/p&gt;
&lt;p&gt;The course is taught in a classroom setting and we hope it will be useful for
others who want to teach Rust to their team. The course will be less useful for
self-study since you miss out on the discussions happening in the classroom. You
don&amp;rsquo;t see the questions and answers and you don&amp;rsquo;t see the compiler errors we
trigger when going through the code samples. We hope to improve on this via
&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/issues/53&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;speaker notes&lt;/a&gt; and by
&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/issues/52&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;publishing videos&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;press&#34;&gt;Press
&lt;/h2&gt;&lt;p&gt;Articles and blog posts from around the web which cover Comprehensive Rust:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2023-09-08:
&lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://mo8it.com/blog/teaching-rust/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Teaching Rust in 5 days&lt;/a&gt;&lt;/em&gt;.
Comprehensive Rust was used as a base for a 5-day university class on Rust.&lt;/li&gt;
&lt;li&gt;2023-09-21:
&lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://security.googleblog.com/2023/09/scaling-rust-adoption-through-training.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Scaling Rust Adoption Through Training&lt;/a&gt;&lt;/em&gt;.
We published a blog post with details on the development of the course.&lt;/li&gt;
&lt;li&gt;2023-10-02:
&lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.darkreading.com/application-security/seeking-rust-developers-in-house-training&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;In Search of Rust Developers, Companies Turn to In-House Training&lt;/a&gt;&lt;/em&gt;.
About how Microsoft, Google, and others are training people in Rust.&lt;/li&gt;
&lt;li&gt;2024-10-18:
&lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/7h5KyMqt2-Q?si=4M99HdWWxMaqN8Zr&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rust Training at Scale | Rust Global @ RustConf 2024&lt;/a&gt;&lt;/em&gt;.
What Google learnt from teaching Comprehensive Rust for more than two years.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup
&lt;/h2&gt;&lt;p&gt;The course is built using a few tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/rust-lang/mdBook&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mdbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/boozook/mdbook-svgbob&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mdbook-svgbob&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/mdbook-i18n-helpers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mdbook-i18n-helpers and i18n-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;mdbook-exerciser/&#34; &gt;mdbook-exerciser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;mdbook-course/&#34; &gt;mdbook-course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/marxin/mdbook-linkcheck2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mdbook-linkcheck2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First install Rust by following the instructions on &lt;a class=&#34;link&#34; href=&#34;https://rustup.rs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://rustup.rs/&lt;/a&gt;. Then
clone this repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/google/comprehensive-rust/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; comprehensive-rust
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then install these tools with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo xtask install-tools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; We use &lt;code&gt;xtask&lt;/code&gt; for task automation within the project (e.g.
installing required tools). Xtask is not a package that you should install.
Visit &lt;a class=&#34;link&#34; href=&#34;https://github.com/matklad/cargo-xtask&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/matklad/cargo-xtask&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;commands&#34;&gt;Commands
&lt;/h2&gt;&lt;p&gt;Here are some of the commonly used commands you can run in the project. Run
&lt;code&gt;cargo xtask&lt;/code&gt; to view all available commands.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cargo xtask install-tools&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Install all the tools the project depends on.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cargo xtask serve&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Start a web server with the course. You&amp;rsquo;ll find the content on http://localhost:3000. To serve any of the translated versions of the course, add the language flag (&amp;ndash;language or -l) followed by xx, where xx is the ISO 639 language code (e.g. cargo xtask serve -l da for the Danish translation).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cargo xtask rust-tests&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Test the included Rust snippets.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cargo xtask web-tests&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Run the web driver tests in the tests directory.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cargo xtask build&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Create a static version of the course in the &lt;code&gt;book/&lt;/code&gt; directory. Note that you have to separately build and zip exercises and add them to book/html. To build any of the translated versions of the course, add the language flag (&amp;ndash;language or -l) followed by xx, where xx is the ISO 639 language code (e.g. cargo xtask build -l da for the Danish translation). &lt;a class=&#34;link&#34; href=&#34;TRANSLATIONS.md&#34; &gt;TRANSLATIONS.md&lt;/a&gt; contains further instructions.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; On Windows, you need to enable symlinks
(&lt;code&gt;git config --global core.symlinks true&lt;/code&gt;) and Developer Mode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;p&gt;We would like to receive your contributions. Please see
&lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;CONTRIBUTING.md&lt;/a&gt; for details.&lt;/p&gt;
&lt;h2 id=&#34;contact&#34;&gt;Contact
&lt;/h2&gt;&lt;p&gt;For questions or comments, please contact
&lt;a class=&#34;link&#34; href=&#34;mailto:mgeisler@google.com&#34; &gt;Martin Geisler&lt;/a&gt; or start a
&lt;a class=&#34;link&#34; href=&#34;https://github.com/google/comprehensive-rust/discussions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;discussion on GitHub&lt;/a&gt;.
We would love to hear from you.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>uBlock</title>
        <link>https://producthunt.programnotes.cn/en/p/ublock/</link>
        <pubDate>Tue, 15 Jul 2025 15:32:27 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/ublock/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1654009730888-ac8f77fc8d4a?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTI1NjQ3MTl8&amp;ixlib=rb-4.1.0" alt="Featured image of post uBlock" /&gt;&lt;h1 id=&#34;gorhillublock&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gorhill/uBlock&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/commits/master&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/commit-activity/m/gorhill/ublock?label=Commits&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Commits&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/uBlockOrigin/uBlock-issues/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/issues/uBlockOrigin/uBlock-issues&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Issues&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://crowdin.com/project/ublock&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://d322cqt584bo4o.cloudfront.net/ublock/localized.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Localization&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;LICENSE.txt&#34; &gt;&lt;img src=&#34;https://img.shields.io/badge/License-GPLv3-blue.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge License&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/@gorhill/ubo-core&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/npm/v/@gorhill/ubo-core&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge NPM&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://addons.mozilla.org/addon/ublock-origin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/amo/rating/ublock-origin?label=Firefox&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Mozilla&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/chrome-web-store/rating/cjpalhdlnbpafiamejdnhcphjbkeiagm?label=Chrome&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Chrome&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/dynamic/json?label=Edge&amp;amp;color=brightgreen&amp;amp;query=%24.averageRating&amp;amp;suffix=%2F%35&amp;amp;url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Fodfafepnkmbhccpbejgmiehpchacaeak&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Badge Edge&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 align=&#34;center&#34;&gt;
&lt;sub&gt;
&lt;img src=&#34;https://github.com/gorhill/uBlock/blob/master/src/img/ublock.svg&#34; height=&#34;38&#34; width=&#34;38&#34;&gt;
&lt;/sub&gt;
uBlock Origin (uBO)
&lt;/h1&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Browser&lt;/th&gt;
          &lt;th&gt;Install from &amp;hellip;&lt;/th&gt;
          &lt;th&gt;Status&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/b0136512-56a5-4856-8c50-4971c957a24f&#34; alt=&#34;Get uBlock Origin for Firefox&#34;&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://addons.mozilla.org/addon/ublock-origin/&#34;&gt;Firefox Add-ons&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uBO works best on Firefox&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/3a7569f8-688b-4eb1-a643-8d0fe173aefe&#34; alt=&#34;Get uBlock Origin for Microsoft Edge&#34;&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak&#34;&gt;Edge Add-ons&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/938f080c-fe64-4e48-8b89-4bfceabb56e6&#34; alt=&#34;Get uBlock Origin for Opera&#34;&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://addons.opera.com/extensions/details/ublock/&#34;&gt;Opera Add-ons&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/5463ef88-873b-4516-8514-5277664cfde7&#34; alt=&#34;Get uBlock Origin for Chromium&#34;&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh&#34;&gt;Chrome Web Store&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/uBlockOrigin/uBlock-issues/wiki/About-Google-Chrome&#39;s-%22This-extension-may-soon-no-longer-be-supported%22&#34;&gt;About Google Chrome&amp;rsquo;s &amp;ldquo;This extension may soon no longer be supported&amp;rdquo;&lt;/a&gt;&lt;br&gt;End of support on Chrome 139&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/2e9037c4-836d-44c1-a716-ba96e89daaff&#34; alt=&#34;Get uBlock Origin for Thunderbird&#34;&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://addons.thunderbird.net/en-Us/thunderbird/addon/ublock-origin/&#34;&gt;Thunderbird Add-ons&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/uBlockOrigin/uBlock-issues/issues/2928&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;No longer updated and stuck at 1.49.2&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;uBlock Origin (uBO) is a CPU and memory-efficient &lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/Blocking-mode&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;wide-spectrum content blocker&lt;/a&gt; for Chromium and Firefox. It blocks ads, trackers, coin miners, popups, annoying anti-blockers, malware sites, etc., by default using &lt;a class=&#34;link&#34; href=&#34;https://easylist.to/#easylist&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EasyList&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://easylist.to/#easyprivacy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EasyPrivacy&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://pgl.yoyo.org/adservers/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Peter Lowe&amp;rsquo;s Blocklist&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/malware-filter/urlhaus-filter#malicious-url-blocklist&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Online Malicious URL Blocklist&lt;/a&gt;, and uBO &lt;a class=&#34;link&#34; href=&#34;https://github.com/uBlockOrigin/uAssets/tree/master/filters&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;filter lists&lt;/a&gt;. There are many other lists available to block even more. Hosts files are also supported. uBO uses the EasyList filter syntax and &lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#extended-syntax&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;extends&lt;/a&gt; the syntax to work with custom rules and filters.&lt;/p&gt;
&lt;p&gt;You may easily unselect any preselected filter lists if you think uBO blocks too much. For reference, Adblock Plus installs with only EasyList, ABP filters, and Acceptable Ads enabled by default.&lt;/p&gt;
&lt;p&gt;It is important to note that using a blocker is &lt;strong&gt;NOT&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://x.com/LeaVerou/status/518154828166725632&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;theft&lt;/a&gt;. Do not fall for this creepy idea. The &lt;em&gt;ultimate&lt;/em&gt; logical consequence of &lt;code&gt;blocking = theft&lt;/code&gt; is the criminalization of the inalienable right to privacy.&lt;/p&gt;
&lt;p&gt;Ads, &amp;ldquo;unintrusive&amp;rdquo; or not, are just the visible portion of the privacy-invading means entering your browser when you visit most sites. &lt;strong&gt;uBO&amp;rsquo;s primary goal is to help users neutralize these privacy-invading methods&lt;/strong&gt; in a way that welcomes those users who do not wish to use more technical means.&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#documentation&#34; &gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#installation&#34; &gt;Installation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#firefox&#34; &gt;Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#thunderbird&#34; &gt;Thunderbird&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#chromium&#34; &gt;Chromium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#all-programs&#34; &gt;All Programs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#enterprise-deployment&#34; &gt;Enterprise Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#release-history&#34; &gt;Release History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#translations&#34; &gt;Translations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#about&#34; &gt;About&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;documentation&#34;&gt;Documentation
&lt;/h2&gt;&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Basic Mode&lt;/th&gt;
            &lt;th&gt;Advanced Mode&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;The &lt;a href=&#34;https://github.com/gorhill/uBlock/wiki/Quick-guide:-popup-user-interface&#34;&gt;simple popup user interface&lt;/a&gt; for an install-it-and-forget-it type of installation that is configured optimally by default.&lt;/td&gt;
            &lt;td&gt;The &lt;a href=&#34;https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-quick-guide&#34;&gt;advanced popup user interface&lt;/a&gt; includes a point-and-click firewall that is configurable on a per-site basis.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&#34;center&#34; valign=&#34;top&#34;&gt;&lt;a href=&#34;https://github.com/gorhill/uBlock/wiki/Quick-guide:-popup-user-interface&#34;&gt;&lt;img src=&#34;https://user-images.githubusercontent.com/585534/232531044-c4ac4dd5-0b60-4c1e-aabb-914be04b846c.png&#34;/&gt;&lt;/a&gt;&lt;/td&gt;
            &lt;td align=&#34;center&#34; valign=&#34;top&#34;&gt;&lt;a href=&#34;https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-quick-guide&#34;&gt;&lt;img src=&#34;https://user-images.githubusercontent.com/585534/232531439-a8f81cc3-6622-45c4-8b32-7348cecf6e98.png&#34;/&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Visit the &lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wiki&lt;/a&gt; for documentation.&lt;/p&gt;
&lt;p&gt;For support, questions, or help, visit &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/uBlockOrigin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;/r/uBlockOrigin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/Permissions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Required Permissions&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;firefox&#34;&gt;Firefox
&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://addons.mozilla.org/addon/ublock-origin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Firefox Add-ons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/blob/master/dist/README.md#for-beta-version&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Development Builds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;uBO &lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;works best&lt;/a&gt; on Firefox and is available for desktop and Android versions.&lt;/p&gt;
&lt;h4 id=&#34;thunderbird&#34;&gt;Thunderbird
&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://addons.thunderbird.net/thunderbird/addon/ublock-origin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thunderbird Add-ons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In Thunderbird, uBlock Origin does not affect emails, just feeds.&lt;/p&gt;
&lt;h4 id=&#34;chromium&#34;&gt;Chromium
&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chrome Web Store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Edge Add-ons&lt;/a&gt; (Published by &lt;a class=&#34;link&#34; href=&#34;https://github.com/nicole-ashley&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nicole Rolls&lt;/a&gt; until version 1.62. Ownership transfer at version 1.64.)&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://addons.opera.com/extensions/details/ublock/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Opera Add-ons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Development Builds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;uBO should be compatible with any Chromium-based browser.&lt;/p&gt;
&lt;h4 id=&#34;all-programs&#34;&gt;All Programs
&lt;/h4&gt;&lt;p&gt;Do &lt;strong&gt;NOT&lt;/strong&gt; use uBO with any other content blocker. uBO &lt;a class=&#34;link&#34; href=&#34;https://www.debugbear.com/blog/chrome-extensions-website-performance#the-impact-of-ad-blocking-on-website-performance&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;performs&lt;/a&gt; as well as or better than most popular blockers. Other blockers can prevent uBO&amp;rsquo;s privacy or anti-blocker-defusing features from working correctly.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/tree/master/dist#install&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Manual Installation&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;enterprise-deployment&#34;&gt;Enterprise Deployment
&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/Deploying-uBlock-Origin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Deploying uBO&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;release-history&#34;&gt;Release History
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Releases Page&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;translations&#34;&gt;Translations
&lt;/h2&gt;&lt;p&gt;Help translate uBO via &lt;a class=&#34;link&#34; href=&#34;https://crowdin.com/project/ublock&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Crowdin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;about&#34;&gt;About
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;MANIFESTO.md&#34; &gt;Manifesto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gorhill/uBlock/wiki/Privacy-policy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Privacy Policy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;LICENSE.txt&#34; &gt;GPLv3 License&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Free. Open-source. For users by users. No donations sought.&lt;/p&gt;
&lt;p&gt;If you ever want to contribute something, think about the people working hard to maintain the filter lists you are using, which are available to use by all for free.&lt;/p&gt;
&lt;!-----------------------------------------------------------------------------&gt;
&lt;!---------------------------------[ Internal ]--------------------------------&gt;
&lt;!----------------------------------[ Badges ]---------------------------------&gt;
</description>
        </item>
        <item>
        <title>thorium</title>
        <link>https://producthunt.programnotes.cn/en/p/thorium/</link>
        <pubDate>Mon, 07 Jul 2025 15:31:22 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/thorium/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1616506349772-77c088465018?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTE4NzM0MjZ8&amp;ixlib=rb-4.1.0" alt="Featured image of post thorium" /&gt;&lt;h1 id=&#34;alex313031thorium&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Alex313031/thorium&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://img.shields.io/github/v/tag/alex313031/thorium?label=Version%3A&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub tag (latest SemVer)&#34;
	
	
&gt;  &lt;img src=&#34;https://img.shields.io/github/license/alex313031/thorium?color=green&amp;amp;label=License%3A&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub&#34;
	
	
&gt;  &lt;img src=&#34;https://img.shields.io/github/commit-activity/w/alex313031/thorium?color=blueviolet&amp;amp;label=Commit%20Activity%3A&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub commit activity&#34;
	
	
&gt;  &lt;img src=&#34;https://img.shields.io/reddit/subreddit-subscribers/ChromiumBrowser?style=social&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Subreddit subscribers&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;thorium&#34;&gt;Thorium
&lt;/h1&gt;&lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/NEW/thorium_ver_2048_grey_old.png&#34;&gt;
&lt;h2 id=&#34;chromium-fork-for-linux-named-after-radioactive-element-no-90-windowsmacosraspiandroidother-builds-see-below&#34;&gt;Chromium fork for linux named after &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Thorium&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;radioactive element No. 90&lt;/a&gt;. Windows/MacOS/RasPi/Android/Other builds see below.
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Always built with the latest stable version of &lt;a class=&#34;link&#34; href=&#34;https://www.chromium.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chromium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Intended to behave like and have the featureset of Google Chrome, with differences/patches/enhancements listed below.&lt;/li&gt;
&lt;li&gt;Includes &lt;a class=&#34;link&#34; href=&#34;https://www.widevine.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Widevine&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://tools.woolyss.com/html5-audio-video-tester/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;All Codecs&lt;/a&gt;, Chrome Plugins, as well as thinLTO, CFlag, LDFlag, LLVM Loop, and PGO compiler optimizations. It is built with &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/SSE4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SSE4&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Advanced_Vector_Extensions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AVX&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/AES_instruction_set&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AES&lt;/a&gt;, so it won&amp;rsquo;t launch on CPU&amp;rsquo;s below 2nd gen Core or AMD FX, but benefits from Advanced Vector EXtensions. If your CPU lacks AVX, you can use builds from the &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-SSE3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium SSE3&lt;/a&gt; repo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-builds&#34;&gt;Other Builds  &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/winflag_animated.gif&#34; width=&#34;34&#34;&gt;  &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/AVX2.png&#34; width=&#34;48&#34;&gt;  &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/apple.png&#34; width=&#34;30&#34;&gt;  &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/Android_Robot.svg&#34; width=&#34;26&#34;&gt;  &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/Raspberry_Pi_Logo.svg&#34; width=&#34;24&#34;&gt;  &lt;img src=&#34;https://raw.githubusercontent.com/Alex313031/thorium-win7/main/logos/STAGING/win7/compatible-with-windows-7.png&#34; width=&#34;28&#34;&gt;
&lt;/h3&gt;&lt;p&gt; – Windows builds are here &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-Win&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Win&lt;/a&gt; &lt;br&gt;
 – AVX2 Builds for Windows and Linux &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-AVX2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium AVX2&lt;/a&gt; &lt;br&gt;
 – MacOS (M1 and X64) builds are located at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-Mac&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Mac&lt;/a&gt; &lt;br&gt;
 – Android (arm32 &amp;amp; arm64) builds are located at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-Android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Android&lt;/a&gt; I might also occasionally post x86 builds. &lt;br&gt;
 – Raspberry Pi builds are located at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-Raspi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Raspi&lt;/a&gt; For the Pi 3B/3B+ and Pi 4/400. &lt;br&gt;
 – Special builds are located at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/Thorium-SSE3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Special&lt;/a&gt; You can find SSE3 builds for CPUs without AVX here. &lt;br&gt;
 – Thorium Website with deb repo for auto-updating on Linux &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://thorium.rocks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://thorium.rocks/&lt;/a&gt; &lt;br&gt;
 – &lt;strong&gt;NEW&lt;/strong&gt;: Windows 7 / 8 / 8.1 / Server 2012 builds in &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium-win7&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thorium Win7&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;features--differences-between-chromium-and-thorium&#34;&gt;FEATURES &amp;amp; DIFFERENCES BETWEEN CHROMIUM AND THORIUM &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/NEW/bulb_light.svg#gh-dark-mode-only&#34;&gt; &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/NEW/bulb_dark.svg#gh-light-mode-only&#34;&gt;
&lt;/h3&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Various compiler flags that improve performance and target &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Advanced_Vector_Extensions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AVX&lt;/a&gt; CPU&amp;rsquo;s (read &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/docs/PATCHES.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PATCHES.md&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Experimental &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MPEG-DASH&lt;/a&gt; support.&lt;/li&gt;
&lt;li&gt;HEVC/H.265 support on Linux and Windows.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jpeg.org/jpegxl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JPEG XL&lt;/a&gt; Image File Format support restored and turned on by default.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/File_Transfer_Protocol&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FTP&lt;/a&gt; URL support restored and enabled by default.&lt;/li&gt;
&lt;li&gt;Enable &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/chrome/answer/10538231?hl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Live Caption&lt;/a&gt; (SODA) on all builds.&lt;/li&gt;
&lt;li&gt;Experimental PDF annotation support (called &amp;ldquo;Ink&amp;rdquo; on ChromiumOS). # DISABLED FOR NOW BECAUSE OF CRASHES.&lt;/li&gt;
&lt;li&gt;Patches from Debian including font rendering patch, VAAPI Patch, Intel HD support patch, native notifications patch, title bar patch, and&amp;hellip; the VDPAU Patch!! (Rejoice Nvidia users)&lt;/li&gt;
&lt;li&gt;Linux audio sandbox patch.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/DNS_over_HTTPS&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DoH&lt;/a&gt; (DNS over HTTPS) patches from Bromite.&lt;/li&gt;
&lt;li&gt;Enable &lt;a class=&#34;link&#34; href=&#34;https://allaboutdnt.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Do Not Track&lt;/a&gt; by default patch from Vanadium.&lt;/li&gt;
&lt;li&gt;Show full URLs including trailing slashes in address bar by default.&lt;/li&gt;
&lt;li&gt;Disable &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Federated_Learning_of_Cohorts&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FLOC&lt;/a&gt; patch.&lt;/li&gt;
&lt;li&gt;Disable annoying Google API Key Infobar warning (you can still use API Keys to enable sync) from Ungoogled Chromium.&lt;/li&gt;
&lt;li&gt;Disable annoying Default Browser Infobar warning.&lt;/li&gt;
&lt;li&gt;Disable annoying IPH (In Product Help) promos.&lt;/li&gt;
&lt;li&gt;Adds &lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DuckDuckGo&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://search.brave.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Brave Search&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.ecosia.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ecosia&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.ask.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ask.com&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://yandex.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Yandex.com&lt;/a&gt; in US and other locales, along with the normal search engines.&lt;/li&gt;
&lt;li&gt;Always use the local NTP (New Tab Page) regardless of search engine.&lt;/li&gt;
&lt;li&gt;Fix icons when distilling page content in &lt;a class=&#34;link&#34; href=&#34;https://www.howtogeek.com/423643/how-to-use-google-chromes-hidden-reader-mode/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Reader Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Enable new Menu UI when right clicking the Reload button. (Adds &amp;lsquo;Normal Reload&amp;rsquo;, &amp;lsquo;Hard Reload&amp;rsquo;, and &amp;lsquo;Clear Cache and Hard Reload&amp;rsquo;)&lt;/li&gt;
&lt;li&gt;Home button, Chrome Labs button, and Bookmarks bar shown by default.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.chromium.org/developers/design-documents/dns-prefetching/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prefetch&lt;/a&gt; settings updated to respect privacy.&lt;/li&gt;
&lt;li&gt;Patches for &lt;a class=&#34;link&#34; href=&#34;https://chromium.googlesource.com/chromium/src/tools/gn/&amp;#43;/48062805e19b4697c5fbd926dc649c78b6aaa138/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GN&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://chromium.googlesource.com/chromium/src/&amp;#43;/HEAD/docs/design/sandbox.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;chrome_sandbox&lt;/a&gt; when building.&lt;/li&gt;
&lt;li&gt;Remove the addition of the Chrome APT sources.list during installation.&lt;/li&gt;
&lt;li&gt;Widevine CDM Patch for Linux.&lt;/li&gt;
&lt;li&gt;GTK auto dark mode patch&lt;/li&gt;
&lt;li&gt;Various new flags either developed from scratch, or added from Ungoogled Chromium. See &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/docs/PATCHES.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PATCHES.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enable Parallel Downloading by Default.&lt;/li&gt;
&lt;li&gt;Inclusion of &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/pak.png&#34; width=&#34;16&#34;&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/tree/main/pak_src#readme&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pak&lt;/a&gt; a utility for packing and unpacking the &lt;a class=&#34;link&#34; href=&#34;https://textslashplain.com/2022/05/03/chromium-internals-pak-files/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;*.pak&lt;/a&gt; files in Thorium or any other Chromium based browser.&lt;/li&gt;
&lt;li&gt;Logo and Branding/Naming changed to the Thorium logo, Thorium name, and &amp;ldquo;Alex313031&amp;rdquo; being appended to &amp;ldquo;The Chromium Authors&amp;rdquo; in credits, etc.&lt;/li&gt;
&lt;li&gt;.desktop file includes useful cmdline flags that enable experimental or useful features. (See &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/docs/PATCHES.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PATCHES.md&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Includes installer patches and files to include &lt;a class=&#34;link&#34; href=&#34;https://chromedriver.chromium.org/home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChromeDriver&lt;/a&gt; and &lt;em&gt;thorium_shell&lt;/em&gt; &lt;a class=&#34;link&#34; href=&#34;https://chromium.googlesource.com/chromium/src/&amp;#43;/HEAD/docs/testing/web_tests_in_content_shell.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;(content_shell)&lt;/a&gt;, with a .desktop file being provided for thorium_shell (named thorium-shell.desktop and shows in desktop environments as Thorium Content Shell). These are also included in the Windows releases, but it doesn&amp;rsquo;t make a shorcut, although a .png and .ico is in the install directory for you to make your own shortcut with an icon. You can also run content_shell with the command thorium-shell (custom wrapper for it, located in /usr/bin/). You can run ChromeDriver at /usr/bin/chromedriver or chromedriver.exe on Windows. Also, patches for abseil library and mini_installer when building with AVX on Windows.&lt;/li&gt;
&lt;li&gt;Right clicking the launcher after install gives three additional desktop actions, one to open thorium-shell, another to open in Safe Mode which disables any flags one has set in chrome://flags until the next launch, and lastly to open in Dark Mode which appends the &amp;ndash;force-dark-mode flag.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;For more info, read the &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/docs/PATCHES.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PATCHES.md&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;Known bugs are in the &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/infra/BUGS.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BUGS.md&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;A list of Chromium command line flags can be found at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://peter.sh/experiments/chromium-command-line-switches&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://peter.sh/experiments/chromium-command-line-switches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;building&#34;&gt;Building &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/NEW/build_light.svg#gh-dark-mode-only&#34;&gt; &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/NEW/build_dark.svg#gh-light-mode-only&#34;&gt;
&lt;/h2&gt;&lt;p&gt;See &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/docs/BUILDING.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Alex313031/thorium/blob/main/docs/BUILDING.md&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Debugging &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/bug.svg&#34; width=&#34;28&#34;&gt;
&lt;/h2&gt;&lt;p&gt;See &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/tree/main/infra/DEBUG#readme&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Alex313031/thorium/tree/main/infra/DEBUG#readme&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt; − &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ChromiumBrowser/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.reddit.com/r/ChromiumBrowser/&lt;/a&gt; is a subreddit I made for Thorium and general Thorium/Chromium discussion, &lt;a class=&#34;link&#34; href=&#34;https://thorium.rocks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://thorium.rocks/&lt;/a&gt; is the website I made for it, and &lt;a class=&#34;link&#34; href=&#34;https://alex313031.blogspot.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://alex313031.blogspot.com/&lt;/a&gt; is a blog I made relating to Thorium/ThoriumOS. &lt;br&gt;
 − I also build ChromiumOS (now called ThoriumOS) with Thorium, Codecs, Widevine, linux-firmware/modules, and extra packages at &amp;gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/ChromiumOS/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Alex313031/ChromiumOS/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; − Thanks to &lt;a class=&#34;link&#34; href=&#34;https://github.com/robrich999/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/robrich999/&lt;/a&gt; for some info and fixes that went into this project.&lt;br&gt;
 − Thanks to &lt;a class=&#34;link&#34; href=&#34;https://github.com/midzer/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/midzer/&lt;/a&gt; for support and helping with builds. &lt;br&gt;
 − Also thanks to &lt;a class=&#34;link&#34; href=&#34;https://github.com/bromite/bromite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/bromite/bromite&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/saiarcot895/chromium-ubuntu-build&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/saiarcot895/chromium-ubuntu-build&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/Eloston/ungoogled-chromium&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Eloston/ungoogled-chromium&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/GrapheneOS/Vanadium&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/GrapheneOS/Vanadium&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://github.com/iridium-browser/iridium-browser&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/iridium-browser/iridium-browser&lt;/a&gt; for patch code. &lt;br&gt;
 − The pak_src dir, and the binaries in &lt;em&gt;pack_src/bin&lt;/em&gt; are credited to @freeer &lt;a class=&#34;link&#34; href=&#34;https://github.com/myfreeer/chrome-pak-customizer/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/myfreeer/chrome-pak-customizer/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;   &lt;strong&gt;NOTE:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/Alex313031/thorium/blob/main/infra/libpepflashplayer.so&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;em&gt;libpepflashplayer.so&lt;/em&gt;&lt;/a&gt; is included for posterity and can be used to enable Adobe Flash on older Chromium releases. ʘ‿ʘ&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks for using Thorium!&lt;/em&gt;&lt;/p&gt;
&lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/Thorium90_504.jpg&#34; width=&#34;200&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/GitHub/GitHub-Mark-Light-32px.png#gh-dark-mode-only&#34;&gt; &lt;img src=&#34;https://github.com/Alex313031/thorium/blob/main/logos/STAGING/GitHub/GitHub-Mark-32px.png#gh-light-mode-only&#34;&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>playwright</title>
        <link>https://producthunt.programnotes.cn/en/p/playwright/</link>
        <pubDate>Wed, 25 Jun 2025 15:31:05 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/playwright/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1644945428609-0e7f21cd2a3d?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTA4MzY1ODN8&amp;ixlib=rb-4.1.0" alt="Featured image of post playwright" /&gt;&lt;h1 id=&#34;microsoftplaywright&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/playwright&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;microsoft/playwright&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;-playwright&#34;&gt;🎭 Playwright
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/playwright&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/npm/v/playwright.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;npm version&#34;
	
	
&gt;&lt;/a&gt; &lt;!-- GEN:chromium-version-badge --&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.chromium.org/Home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/chromium-138.0.7204.35-blue.svg?logo=google-chrome&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Chromium version&#34;
	
	
&gt;&lt;/a&gt;&lt;!-- GEN:stop --&gt; &lt;!-- GEN:firefox-version-badge --&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.mozilla.org/en-US/firefox/new/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/firefox-139.0-blue.svg?logo=firefoxbrowser&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Firefox version&#34;
	
	
&gt;&lt;/a&gt;&lt;!-- GEN:stop --&gt; &lt;!-- GEN:webkit-version-badge --&gt;&lt;a class=&#34;link&#34; href=&#34;https://webkit.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/webkit-18.5-blue.svg?logo=safari&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;WebKit version&#34;
	
	
&gt;&lt;/a&gt;&lt;!-- GEN:stop --&gt; &lt;a class=&#34;link&#34; href=&#34;https://aka.ms/playwright/discord&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/join-discord-informational&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Join Discord&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;documentation--api-reference&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Documentation&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/api/class-playwright&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API reference&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Playwright is a framework for Web Testing and Automation. It allows testing &lt;a class=&#34;link&#34; href=&#34;https://www.chromium.org/Home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chromium&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.mozilla.org/en-US/firefox/new/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Firefox&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://webkit.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WebKit&lt;/a&gt; with a single API. Playwright is built to enable cross-browser web automation that is &lt;strong&gt;ever-green&lt;/strong&gt;, &lt;strong&gt;capable&lt;/strong&gt;, &lt;strong&gt;reliable&lt;/strong&gt; and &lt;strong&gt;fast&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Linux&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;macOS&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Windows&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Chromium &lt;!-- GEN:chromium-version --&gt;138.0.7204.35&lt;!-- GEN:stop --&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;WebKit &lt;!-- GEN:webkit-version --&gt;18.5&lt;!-- GEN:stop --&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Firefox &lt;!-- GEN:firefox-version --&gt;139.0&lt;!-- GEN:stop --&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;:white_check_mark:&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Headless execution is supported for all browsers on all platforms. Check out &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/intro#system-requirements&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;system requirements&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Looking for Playwright for &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/python/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Python&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/dotnet/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/java/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Java&lt;/a&gt;?&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;Playwright has its own test runner for end-to-end tests, we call it Playwright Test.&lt;/p&gt;
&lt;h3 id=&#34;using-init-command&#34;&gt;Using init command
&lt;/h3&gt;&lt;p&gt;The easiest way to get started with Playwright Test is to run the init command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Run from your project&amp;#39;s root directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm init playwright@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Or create a new project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm init playwright@latest new-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This will create a configuration file, optionally add examples, a GitHub Action workflow and a first test example.spec.ts. You can now jump directly to writing assertions section.&lt;/p&gt;
&lt;h3 id=&#34;manually&#34;&gt;Manually
&lt;/h3&gt;&lt;p&gt;Add dependency and install browsers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm i -D @playwright/test
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# install supported browsers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx playwright install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can optionally install only selected browsers, see &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/cli#install-browsers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;install browsers&lt;/a&gt; for more details. Or you can install no browsers at all and use existing &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/browsers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;browser channels&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/api/class-playwright&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;capabilities&#34;&gt;Capabilities
&lt;/h2&gt;&lt;h3 id=&#34;resilient--no-flaky-tests&#34;&gt;Resilient • No flaky tests
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Auto-wait&lt;/strong&gt;. Playwright waits for elements to be actionable prior to performing actions. It also has a rich set of introspection events. The combination of the two eliminates the need for artificial timeouts - a primary cause of flaky tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web-first assertions&lt;/strong&gt;. Playwright assertions are created specifically for the dynamic web. Checks are automatically retried until the necessary conditions are met.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tracing&lt;/strong&gt;. Configure test retry strategy, capture execution trace, videos and screenshots to eliminate flakes.&lt;/p&gt;
&lt;h3 id=&#34;no-trade-offs--no-limits&#34;&gt;No trade-offs • No limits
&lt;/h3&gt;&lt;p&gt;Browsers run web content belonging to different origins in different processes. Playwright is aligned with the architecture of the modern browsers and runs tests out-of-process. This makes Playwright free of the typical in-process test runner limitations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multiple everything&lt;/strong&gt;. Test scenarios that span multiple tabs, multiple origins and multiple users. Create scenarios with different contexts for different users and run them against your server, all in one test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trusted events&lt;/strong&gt;. Hover elements, interact with dynamic controls and produce trusted events. Playwright uses real browser input pipeline indistinguishable from the real user.&lt;/p&gt;
&lt;p&gt;Test frames, pierce Shadow DOM. Playwright selectors pierce shadow DOM and allow entering frames seamlessly.&lt;/p&gt;
&lt;h3 id=&#34;full-isolation--fast-execution&#34;&gt;Full isolation • Fast execution
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Browser contexts&lt;/strong&gt;. Playwright creates a browser context for each test. Browser context is equivalent to a brand new browser profile. This delivers full test isolation with zero overhead. Creating a new browser context only takes a handful of milliseconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Log in once&lt;/strong&gt;. Save the authentication state of the context and reuse it in all the tests. This bypasses repetitive log-in operations in each test, yet delivers full isolation of independent tests.&lt;/p&gt;
&lt;h3 id=&#34;powerful-tooling&#34;&gt;Powerful Tooling
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/codegen&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Codegen&lt;/a&gt;&lt;/strong&gt;. Generate tests by recording your actions. Save them into any language.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/inspector&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Playwright inspector&lt;/a&gt;&lt;/strong&gt;. Inspect page, generate selectors, step through the test execution, see click points and explore execution logs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/trace-viewer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Trace Viewer&lt;/a&gt;&lt;/strong&gt;. Capture all the information to investigate the test failure. Playwright trace contains test execution screencast, live DOM snapshots, action explorer, test source and many more.&lt;/p&gt;
&lt;p&gt;Looking for Playwright for &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TypeScript&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JavaScript&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/python/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Python&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/dotnet/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/java/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Java&lt;/a&gt;?&lt;/p&gt;
&lt;h2 id=&#34;examples&#34;&gt;Examples
&lt;/h2&gt;&lt;p&gt;To learn how to run these Playwright Test examples, check out our &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;getting started docs&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;page-screenshot&#34;&gt;Page screenshot
&lt;/h4&gt;&lt;p&gt;This code snippet navigates to Playwright homepage and saves a screenshot.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-TypeScript&#34; data-lang=&#34;TypeScript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@playwright/test&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Page Screenshot&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://playwright.dev/&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;screenshot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`example.png`&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;mobile-and-geolocation&#34;&gt;Mobile and geolocation
&lt;/h4&gt;&lt;p&gt;This snippet emulates Mobile Safari on a device at given geolocation, navigates to maps.google.com, performs the action and takes a screenshot.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-TypeScript&#34; data-lang=&#34;TypeScript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;devices&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@playwright/test&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;iPhone 13 Pro&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;locale&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;en-US&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;geolocation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;longitude&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;12.492507&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latitude&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;41.889938&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;permissions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;geolocation&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Mobile and geolocation&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://maps.google.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getByText&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Your location&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitForRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/.*preview\/pwa/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;screenshot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;colosseum-iphone.png&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;evaluate-in-browser-context&#34;&gt;Evaluate in browser context
&lt;/h4&gt;&lt;p&gt;This code snippet navigates to example.com, and executes a script in the page context.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-TypeScript&#34; data-lang=&#34;TypeScript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@playwright/test&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Evaluate in browser context&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://www.example.com/&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dimensions&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;evaluate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;width&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;document.documentElement.clientWidth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;height&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;document.documentElement.clientHeight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;deviceScaleFactor&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;window.devicePixelRatio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dimensions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;intercept-network-requests&#34;&gt;Intercept network requests
&lt;/h4&gt;&lt;p&gt;This code snippet sets up request routing for a page to log all network requests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-TypeScript&#34; data-lang=&#34;TypeScript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@playwright/test&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Intercept network requests&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Log and continue all network requests
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;route&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;**&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;route&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;route&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://todomvc.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/docs/api/class-playwright/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;Contribution guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/playwright/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
