No description
Find a file
Benedikt Willi 283dae295c Implement HTTP redirect following
- Support for 301, 302, 303, 307, 308 redirects
- Automatic Location header following
- Relative URL resolution for redirects
- Max redirect limit (default 10) to prevent infinite loops
- 303 (See Other) automatically changes method to GET
- 4 new unit tests for redirect functionality
- All 73 tests passing
2026-01-09 14:11:46 +01:00
.github/prompts Initial bowser project scaffold 2026-01-09 12:20:46 +01:00
assets Initial commit: Setup Bowser educational web browser 2026-01-09 13:31:48 +01:00
src Implement HTTP redirect following 2026-01-09 14:11:46 +01:00
tests Implement HTTP redirect following 2026-01-09 14:11:46 +01:00
.gitignore Add comprehensive test suite with pytest 2026-01-09 13:37:21 +01:00
main.py Initial commit: Setup Bowser educational web browser 2026-01-09 13:31:48 +01:00
pyproject.toml Add comprehensive test suite with pytest 2026-01-09 13:37:21 +01:00
README.md Add comprehensive test suite with pytest 2026-01-09 13:37:21 +01:00
uv.lock Initial commit: Setup Bowser educational web browser 2026-01-09 13:31:48 +01:00

Bowser — Educational Web Browser

A custom web browser built from scratch following the browser.engineering curriculum.

Status: Early scaffolding phase (M0)

Building

Prerequisites

  • Python 3.11+
  • GTK 4 development libraries (Debian: libgtk-4-dev libgtk-4-1)
  • Skia-Python (skia-python): pip install skia-python
  • PyGObject (PyGObject): pip install PyGObject

Setup

uv sync
uv run bowser

Testing

Run the test suite:

# Install dev dependencies
uv sync --extra dev

# Run all tests
uv run pytest

# Run with verbose output
uv run pytest -v

# Run with coverage report
uv run pytest --cov=src --cov-report=html

# Run specific test file
uv run pytest tests/test_browser.py

Development

# Format code
uv run black src tests

# Lint code
uv run ruff check src tests

# Type check
uv run mypy src

Project Structure

bowser/
├── src/
│   ├── network/          # URL parsing, HTTP, cookies
│   ├── parser/           # HTML & CSS parsers
│   ├── layout/           # Block/inline/embedded layout
│   ├── render/           # Paint commands, fonts, compositing
│   ├── script/           # JavaScript integration
│   ├── browser/          # Tab/frame/chrome orchestration
│   └── accessibility/    # A11y tree and screen reader
├── assets/               # Stylesheets, images
├── tests/                # Unit tests
├── pyproject.toml        # Dependencies & build config
└── main.py               # Entry point

Development Milestones

  • M0: Project scaffold
  • M1: Display "Hello World" in GTK window with manual URL fetch & paint
  • M2: Render plain HTML with text wrapping
  • M3: Parse and apply basic CSS
  • M4: Clickable links and navigation
  • M5: Form input and submission
  • M6: JavaScript execution (embed QuickJS)
  • M7: Event handling
  • M8: Images and iframes
  • M9: Animations and visual effects
  • M10: Accessibility and keyboard navigation

References