mirror of
https://github.com/Hopiu/bowser.git
synced 2026-03-16 19:10:24 +00:00
No description
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) |
||
|---|---|---|
| .github/prompts | ||
| assets | ||
| src | ||
| tests | ||
| .gitignore | ||
| main.py | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
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
- Web Browser Engineering — O'Reilly book
- Let's Build a Browser Engine — Matt Brubeck's Rust tutorial