No description
Find a file
Benedikt Willi cb6103ce04 Reimplement tab bar from scratch with simplified, working design
Simplified tab bar implementation:
- Remove complex CSS provider logic that was causing issues
- Simple box-based layout with tab label + close button per tab
- Direct button click handlers with tab reference stored on widget
- Much simpler and more reliable event handling

Tab bar features:
- Each tab shown as: [tab label button] [close button ✕]
- Active tab highlighted with suggested-action style
- Inactive tabs use flat style for cleaner look
- Close button is small and flat (36px width)
- New tab button with + symbol (48px width)

Event handling:
- _on_tab_clicked: Activates the clicked tab
- _on_close_clicked: Closes the clicked tab
- _on_new_tab_clicked: Opens new tab to about:startpage
- Tab reference stored directly on button widget for easy access

Benefits:
- Much simpler codebase
- No complex CSS provider per widget
- Reliable event handling
- Easy to debug and maintain
- No style context issues

All tests passing (15/15)
2026-01-09 14:36:49 +01:00
.github/prompts Initial bowser project scaffold 2026-01-09 12:20:46 +01:00
assets Implement Jinja2 templates for startpage and error pages 2026-01-09 14:24:01 +01:00
src Reimplement tab bar from scratch with simplified, working design 2026-01-09 14:36:49 +01:00
tests Implement Jinja2 templates for startpage and error pages 2026-01-09 14:24:01 +01:00
.gitignore Add comprehensive test suite with pytest 2026-01-09 13:37:21 +01:00
main.py Implement Jinja2 templates for startpage and error pages 2026-01-09 14:24:01 +01:00
pyproject.toml Refactor browser chrome to use libadwaita for modern GNOME UI 2026-01-09 14:31:55 +01:00
README.md Add comprehensive test suite with pytest 2026-01-09 13:37:21 +01:00
uv.lock Implement Jinja2 templates for startpage and error pages 2026-01-09 14:24:01 +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