Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
58488f2
Add Playwright CDN support for arm64 Linux chrome-headless-shell
cderv Apr 7, 2026
3376692
Wire arm64 Playwright CDN into chrome-headless-shell install flow
cderv Apr 7, 2026
a6e8e84
Deprecate 'quarto install chromium', redirect to chrome-headless-shell
cderv Apr 7, 2026
270ee2d
Switch binder post-build script from chromium to chrome-headless-shell
cderv Apr 7, 2026
47dff24
Bump @playwright/test to 1.59.1
cderv Apr 7, 2026
3b6cf84
Add Playwright CDN link to chrome-for-testing.ts file header
cderv Apr 7, 2026
1666c2f
Rename Cft-prefixed identifiers to Chrome-prefixed
cderv Apr 7, 2026
4e04e25
Minor cleanup from code review
cderv Apr 7, 2026
d0aba1c
Cache platform detection in latestRelease()
cderv Apr 7, 2026
e439d21
Extract chromeHeadlessShellBinaryName() helper
cderv Apr 7, 2026
7a926fa
Handle unsupported platform gracefully in chromeHeadlessShellBinaryName
cderv Apr 7, 2026
feb967e
Clarify why Playwright CDN tests are skipped on CI
cderv Apr 7, 2026
2649e71
Add changelog entries for chromium deprecation and arm64 support
cderv Apr 8, 2026
e514a5f
Add #9710 reference to changelog entry
cderv Apr 8, 2026
964e487
Mark Chromium as deprecated in tool registry
cderv Apr 8, 2026
ed1047f
Remove chromium examples from install/update/uninstall help text
cderv Apr 8, 2026
1775c1e
Auto-remove legacy chromium when chrome-headless-shell is installed
cderv Apr 8, 2026
a7befa6
Revert "Auto-remove legacy chromium when chrome-headless-shell is ins…
cderv Apr 8, 2026
62cdc0c
Extract chrome-headless-shell path utilities to break circular depend…
cderv Apr 8, 2026
d9d799e
Add CI workflow for tool install and chromium deprecation tests
cderv Apr 8, 2026
e113ceb
Tighten CI workflow assertions and fix unit tests for arm64
cderv Apr 8, 2026
7c8cdb8
Make CI assert steps always run instead of skip-on-success
cderv Apr 8, 2026
ffafa54
Merge branch 'main' into fix/chromium-deprecation-arm64
cderv Apr 8, 2026
8bb5a46
Tighten CI assertions: check update exit code, verify legacy chromium…
cderv Apr 8, 2026
10c3800
Fix legacy Chromium assertion to match installed-only warning text
cderv Apr 8, 2026
91ae92b
Remove duplicate deprecation warning from Chrome Headless check section
cderv Apr 8, 2026
eb5b313
Remove unnecessary re-exports from chrome-headless-shell.ts
cderv Apr 8, 2026
dc4d907
Update changelog for afterInstall cleanup and quarto check warning
cderv Apr 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 100 additions & 2 deletions .github/workflows/test-install.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,109 @@ jobs:
quarto install tinytex

- name: Install Chrome Headless Shell
# arm64 Linux support requires #14334. Remove this condition once merged.
if: runner.arch != 'ARM64'
run: |
quarto install chrome-headless-shell --no-prompt

- name: Verify tools with quarto check
run: |
quarto check install

test-chromium-deprecation:
name: Chromium deprecation redirect (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Repo
uses: actions/checkout@v6

- uses: ./.github/workflows/actions/quarto-dev

- name: Make quarto available in bash (Windows)
if: runner.os == 'Windows'
shell: bash
run: |
quarto_cmd=$(command -v quarto.cmd)
dir=$(dirname "$quarto_cmd")
printf '#!/bin/bash\nexec "%s" "$@"\n' "$quarto_cmd" > "$dir/quarto"
chmod +x "$dir/quarto"

- name: Install chromium (should redirect to chrome-headless-shell)
id: install-chromium
shell: bash
run: |
set +e
output=$(quarto install chromium --no-prompt 2>&1)
exit_code=$?
set -e
echo "$output"
if echo "$output" | grep -Fq "is deprecated"; then
echo "deprecation-warning=true" >> "$GITHUB_OUTPUT"
fi
if [ "$exit_code" -eq 0 ]; then
echo "install-successful=true" >> "$GITHUB_OUTPUT"
fi

- name: Assert deprecation warning was shown
shell: bash
run: |
if [ "${{ steps.install-chromium.outputs.deprecation-warning }}" != "true" ]; then
echo "::error::Deprecation warning missing from 'quarto install chromium' output"
exit 1
fi
echo "Install deprecation warning found"

- name: Assert installation succeeded (via redirect)
shell: bash
run: |
if [ "${{ steps.install-chromium.outputs.install-successful }}" != "true" ]; then
echo "::error::Installation did not succeed — redirect to chrome-headless-shell may have failed"
exit 1
fi
echo "Installation succeeded via redirect"

- name: Verify quarto check shows Chrome Headless Shell
shell: bash
run: |
output=$(quarto check install 2>&1)
echo "$output"
if ! echo "$output" | grep -Fq "Chrome Headless Shell"; then
echo "::error::Chrome Headless Shell not detected by quarto check after redirect install"
exit 1
fi
if echo "$output" | grep -Fq 'chrome-headless-shell" to replace'; then
echo "::error::Legacy Chromium still installed — afterInstall should have removed it"
exit 1
fi

- name: Update chromium (should redirect) and capture result
id: update-chromium
shell: bash
run: |
set +e
output=$(quarto update tool chromium --no-prompt 2>&1)
exit_code=$?
set -e
echo "$output"
if echo "$output" | grep -Fq "is deprecated"; then
echo "deprecation-warning=true" >> "$GITHUB_OUTPUT"
fi
if [ "$exit_code" -eq 0 ]; then
echo "update-successful=true" >> "$GITHUB_OUTPUT"
fi

- name: Assert update deprecation warning was shown and succeeded
shell: bash
run: |
if [ "${{ steps.update-chromium.outputs.deprecation-warning }}" != "true" ]; then
echo "::error::Deprecation warning missing from 'quarto update tool chromium' output"
exit 1
fi
echo "Update deprecation warning found"
if [ "${{ steps.update-chromium.outputs.update-successful }}" != "true" ]; then
echo "::error::Update command failed — redirect to chrome-headless-shell may have failed"
exit 1
fi
echo "Update succeeded via redirect"
9 changes: 9 additions & 0 deletions news/changelog-1.10.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ All changes included in 1.10:

- ([#14281](https://github.com/quarto-dev/quarto-cli/issues/14281)): Avoid creating a duplicate `.quarto_ipynb` file on preview startup for single-file Jupyter documents.

### `install`

- ([#11877](https://github.com/quarto-dev/quarto-cli/issues/11877), [#9710](https://github.com/quarto-dev/quarto-cli/issues/9710)): Add arm64 Linux support for `quarto install chrome-headless-shell` using Playwright CDN as download source, since Chrome for Testing has no arm64 Linux builds.
- ([#11877](https://github.com/quarto-dev/quarto-cli/issues/11877)): Deprecate `quarto install chromium` — the command now transparently redirects to `chrome-headless-shell`. Installing `chrome-headless-shell` automatically removes any legacy Chromium installation. Use `chrome-headless-shell` instead, which always installs the latest stable Chrome (the legacy `chromium` installer pins an outdated Puppeteer revision that cannot receive security updates).

### `check`

- ([#11877](https://github.com/quarto-dev/quarto-cli/issues/11877)): `quarto check install` now shows a deprecation warning when legacy Chromium (installed via `quarto install chromium`) is detected, directing users to install `chrome-headless-shell` as a replacement.

### `quarto create`

- ([#14250](https://github.com/quarto-dev/quarto-cli/issues/14250)): Fix `quarto create` producing read-only files when Quarto is installed via system packages (e.g., `.deb`). Files copied from installed resources now have user-write permission ensured.
Expand Down
5 changes: 5 additions & 0 deletions src/command/check/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,11 @@ async function checkInstall(conf: CheckConfiguration) {
toolsJson[tool.name] = {
version,
};
if (tool.name === "Chromium (deprecated)") {
toolsOutput.push(
`${kIndent} (Run "quarto install chrome-headless-shell" to replace)`,
);
}
}
for (const tool of tools.notInstalled) {
toolsOutput.push(`${kIndent}${tool.name}: (not installed)`);
Expand Down
4 changes: 0 additions & 4 deletions src/command/install/cmd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,6 @@ export const installCommand = new Command()
"Install Chrome Headless Shell",
"quarto install chrome-headless-shell",
)
.example(
"Install Chromium (legacy)",
"quarto install chromium",
)
.example(
"Choose tool to install",
"quarto install",
Expand Down
4 changes: 0 additions & 4 deletions src/command/uninstall/cmd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ export const uninstallCommand = new Command()
"Uninstall Chrome Headless Shell",
"quarto uninstall chrome-headless-shell",
)
.example(
"Uninstall Chromium (legacy)",
"quarto uninstall chromium",
)
.action(
async (
options: { prompt?: boolean; updatePath?: boolean },
Expand Down
4 changes: 0 additions & 4 deletions src/command/update/cmd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,6 @@ export const updateCommand = new Command()
"Update Chrome Headless Shell",
"quarto update tool chrome-headless-shell",
)
.example(
"Update Chromium (legacy)",
"quarto update tool chromium",
)
.example(
"Choose tool to update",
"quarto update tool",
Expand Down
12 changes: 7 additions & 5 deletions src/command/use/commands/binder/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,12 +223,14 @@ const createPostBuild = (
postBuildScript.push(msg("Installed TinyTex"));
}

// Maybe install Chromium
// Maybe install Chrome Headless Shell for mermaid/graphviz rendering.
// Note: quartoConfig.chromium comes from QuartoTool type which uses "chromium"
// as a generic signal meaning "needs a headless browser", not the install command.
if (quartoConfig.chromium) {
postBuildScript.push(msg("Installing Chromium"));
postBuildScript.push("# install chromium");
postBuildScript.push("quarto install chromium --no-prompt");
postBuildScript.push(msg("Installed Chromium"));
postBuildScript.push(msg("Installing Chrome Headless Shell"));
postBuildScript.push("# install chrome-headless-shell");
postBuildScript.push("quarto install chrome-headless-shell --no-prompt");
postBuildScript.push(msg("Installed Chrome Headless Shell"));
}

if (vscodeConfig.version) {
Expand Down
2 changes: 1 addition & 1 deletion src/core/puppeteer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
chromeHeadlessShellExecutablePath,
chromeHeadlessShellInstallDir,
readInstalledVersion,
} from "../tools/impl/chrome-headless-shell.ts";
} from "../tools/impl/chrome-headless-shell-paths.ts";

// deno-lint-ignore no-explicit-any
// let puppeteerImport: any = undefined;
Expand Down
Loading
Loading