- Trong tháng 4, Ladybird đã hợp nhất 333 PR từ 35 người đóng góp, đồng thời nhận thêm tài trợ mới trị giá 50.000 USD từ Human Rights Foundation và 1.000 USD từ Jakub Stęplowski
- Đã bổ sung trình xem PDF nội tuyến, tự động hoàn thành thanh địa chỉ dựa trên lịch sử truy cập, frontend Linux GTK4/libadwaita và giao diện quản lý
about:bookmarks, mở rộng cả tính năng duyệt web lẫn UI desktop
- Trình phân tích HTML nay phân tích dần dần phần thân phản hồi và trình phân tích suy đoán tải trước tài nguyên, còn quá trình biên dịch cấp cao nhất của JavaScript được chuyển sang luồng nền, giúp giảm khoảng 200ms thời gian trên luồng chính khi tải YouTube
- Engine JavaScript được cải thiện hiệu năng Speedometer và tốc độ tải trên các trang thực tế nhờ for-in cache, bộ cấp phát thanh ghi O(1), chia sẻ định danh zero-copy,
JS::Substring lazy và cải tiến typed-array view cache
- Đã bổ sung
Cache/CacheStorage, image-set(), CSS anchor positioning, DNS bất đồng bộ, GPU painting dựa trên dmabuf, dùng mặc định mimalloc và bắt buộc Rust; điểm WPT tăng từ 2.003.537 lên 2.067.263
Quy mô phát triển và tài trợ
- Trong tháng 4, Ladybird đã hợp nhất 333 PR từ 35 người đóng góp, trong đó 7 người lần đầu tiên commit cho Ladybird
- Nhà tài trợ mới Human Rights Foundation đã tài trợ 50.000 USD thông qua chương trình “AI for Individual Rights”, và Jakub Stęplowski tài trợ 1.000 USD
- Ladybird được vận hành hoàn toàn nhờ tài trợ từ các công ty và cá nhân ủng hộ web mở
Tính năng duyệt web và frontend
-
Trình xem PDF nội tuyến
- PDF được render nội tuyến thông qua trình xem pdf.js được đóng gói sẵn (#9132)
- pdf.js là trình xem PDF được viết chỉ bằng JavaScript, HTML và CSS, cung cấp điều hướng trang, chọn văn bản, phóng to/thu nhỏ và tìm kiếm trong tài liệu
- Trong quá trình tải Intel ISA Manual bằng pdf.js, các điểm cần cải thiện ở typed-array view cache và vô hiệu hóa
:has() đã được bộc lộ
-
Lịch sử truy cập và tự động hoàn thành thanh địa chỉ
- Khi nhập vào thanh địa chỉ, các gợi ý phong phú dựa trên lịch sử truy cập sẽ được hiển thị, bao gồm favicon và tiêu đề của các trang đã truy cập trước đó, lối tắt đến công cụ tìm kiếm và hoàn thành URL thông thường (#8933)
HistoryStore dựa trên SQLite lưu tiêu đề, favicon, số lần truy cập và thời điểm truy cập gần nhất của mọi lần điều hướng
- Mục “Clear browsing history” đã được liên kết trong trang cài đặt quyền riêng tư, và cả UI Qt lẫn AppKit đều render hàng phong phú mới
-
Frontend GTK4 / libadwaita
- Ladybird đã bổ sung frontend Linux mới dựa trên GTK4 và libadwaita, được cung cấp song song với frontend Qt hiện có (#8691)
- Nó lấy cảm hứng từ GNOME Web (Epiphany) và theo hướng dẫn thiết kế GNOME, dùng menu hamburger và tab
AdwTabView thay cho thanh menu
- Cung cấp tự động hoàn thành thanh URL và biểu tượng bảo mật, tìm trong trang, toàn màn hình, menu ngữ cảnh, hộp thoại alert/confirm/prompt/color/file, clipboard, nhiều cửa sổ, giao diện sáng/tối và scaling DPR
- Vì vẫn còn ở giai đoạn đầu nên chưa đạt mức tương đương tính năng với frontend Qt và AppKit
-
Dấu trang
- Tính năng dấu trang được thêm từ tháng trước nay đã có thêm giao diện quản lý
- Có thể quản lý dấu trang và thư mục tại trang
about:bookmarks (#8825)
- Trang mới hỗ trợ nhập và xuất dấu trang (#8938)
- Đã bổ sung menu ngữ cảnh để chỉnh sửa dấu trang và thư mục (#8715)
- Đã thêm dấu thời gian
date_added cho mọi dấu trang và thư mục (#8867)
- Thanh dấu trang hỗ trợ mở trong tab mới, sao chép URL, mở tab mới bằng nhấp chuột giữa và Ctrl/Cmd+nhấp (#8758)
- API kéo thả HTML5 đã được kết nối;
about:bookmarks dùng nó để sắp xếp lại và nó cũng hoạt động trên các trang web thông thường (#8783)
Phân tích cú pháp HTML, thực thi script, pipeline kết xuất
-
Phân tích cú pháp HTML suy đoán và tăng dần
- Trình phân tích cú pháp HTML đã được thay đổi để tiêu thụ phần thân phản hồi theo cách tăng dần(#9151)
- Các byte đi qua bộ giải mã văn bản dạng streaming rồi được đưa vào tokenizer theo từng chunk; khi thiếu đầu vào thì tokenizer tạm dừng và sẽ tiếp tục khi có thêm dữ liệu đến
- Thay thế mô hình cũ vốn đợi nhận toàn bộ phần thân rồi mới bắt đầu phân tích cú pháp
- Trình phân tích cú pháp HTML suy đoán cũng đã được triển khai(#9114)
- Khi trình phân tích cú pháp chính bị chặn bởi script ngoài đồng bộ, một tokenizer riêng sẽ quét trước phần đầu vào chưa được phân tích cú pháp và phát hành các yêu cầu nạp suy đoán cho tài nguyên
<script src>, <link rel=stylesheet|preload>, <img src>
- Theo dõi
<base href> và bỏ qua chính xác bên trong template cùng foreign content
- Trình phân tích cú pháp suy đoán được nối với preload map của tài liệu để các tài nguyên được phát hiện bằng suy đoán được khử trùng lặp với các lần nạp sau đó của trình phân tích cú pháp thông thường(#9164)
-
Biên dịch JavaScript ngoài luồng
- Việc tạo bytecode cho mã cấp cao nhất của các script đã tải về được chạy trong thread pool nền(#9118)
- Các worker thread tạo bytecode và dữ liệu cần thiết để tạo
Executable, còn các tác vụ đụng tới VM hoặc GC heap vẫn được giữ lại trên luồng chính
- Xử lý classic script, module và IIFE cấp cao nhất; chỉ riêng việc tải YouTube cũng đã chuyển khoảng 200ms thời gian của luồng chính sang các luồng nền
-
Raster hóa theo từng Navigable
- Mỗi Navigable được raster hóa độc lập trên thread riêng của nó(#8793)
- Trước đây, iframe được paint đồng bộ dưới dạng display list lồng nhau bên trong display list của phần tử cha, nên chỉ có thread kết xuất của traversable cấp cao nhất được kích hoạt
- Display list của phần tử cha giờ đây tham chiếu đầu ra raster hóa của từng iframe thông qua
ExternalContentSource, vì vậy việc vô hiệu hóa iframe không còn yêu cầu ghi lại phần tử cha
- Ngoài tính song song, đây cũng là bước chuẩn bị để chuyển iframe sang các tiến trình sandbox riêng biệt
-
Vẽ GPU dựa trên dmabuf trên Linux
- Trong các bản build Linux Vulkan, WebContent từng paint lên Skia surface được hậu thuẫn bởi GPU, nhưng bộ đệm dùng để chia sẻ với tiến trình UI là bitmap CPU nên mỗi lần flush đều phát sinh GPU-to-CPU readback
SharedImage giờ có thể chứa handle Linux dmabuf, nhờ đó front/back buffer vẫn cư trú trên GPU cho tới tiến trình UI(#8917, #8920)
Hiệu năng và khả năng tương thích của engine JavaScript
-
Tối ưu hóa lời gọi JS-to-JS
- Một số PR đã được áp dụng để các lệnh
Call, Return, End trong trường hợp thông thường vẫn nằm bên trong trình thông dịch assembly AsmInt (#8891, #8909, #8912)
- Việc lưu/khôi phục thanh ghi sử dụng ARM64 paired load/store (
ldp/stp) được tinh chỉnh thủ công
- Lời gọi native function cũng được dispatch trực tiếp từ AsmInt thông qua variant
RawNativeFunction mới chứa con trỏ hàm thông thường thay vì AK::Function (#8922)
-
Bộ cấp phát thanh ghi bytecode O(1)
Generator::allocate_register trước đây quét qua pool khả dụng để tìm thanh ghi có số nhỏ nhất, và riêng hàm này đã tiêu tốn khoảng 800ms khi tải x.com
- Sau khi giai đoạn tương đương giữa pipeline C++/Rust kết thúc, bộ cấp phát được đổi sang ngăn xếp LIFO đơn giản (#9007)
-
Lặp for-in được cache
- Vị trí
for (key in obj) cache snapshot enumerable key đã được làm phẳng và tái sử dụng miễn là shape, indexed storage và prototype chain của receiver vẫn được giữ nguyên (#8856)
- Speedometer 2 tăng từ 67.7 → 73.6, còn Speedometer 3 tăng từ 4.11 → 4.22
-
Các cải tiến engine khác
- Parser chia sẻ tên định danh theo cơ chế zero-copy xuyên suốt lexer, parser và scope collector, giúp việc parse trên corpus JS của các website nhanh hơn 1.14 lần và giảm 282MB RSS (#8801)
- Nối chuỗi ngắn bỏ qua biểu diễn rope khi kết quả dù sao cũng sẽ được quan sát như flat string, nhanh hơn 2.13 lần trong các vòng lặp
a + b dày đặc (#9184)
- Arrow function lexical-this không còn cấp phát function environment cho mỗi lần gọi, cải thiện 2.13 lần trong microbenchmark (#9192)
- Sparse array không còn phải trả chi phí ngay lập tức cho các hole, và
Array(20_000_000) chủ yếu được giữ ở dạng metadata thay vì thực hiện công việc tỷ lệ với 20 triệu phần tử ảo (#8847)
- Kiểu
JS::Substring lazy mới hỗ trợ regexp capture và các string builtin như slice, split, indexed access, cải thiện 1.066 lần trong benchmark regexp của Octane (#8863)
- Source position trong bytecode source map được bảo toàn end-to-end, giúp tiết kiệm khoảng 250ms trên x.com (#9027)
TransferArrayBuffer zero-copy giúp tiết kiệm khoảng 130ms khi tải YouTube (#9088)
- Typed-array view được cache chuyển từ
WeakHashSet sang intrusive list, giúp tiết kiệm khoảng 250ms khi pdf.js tải Intel ISA PDF (#9180)
- Cấu trúc trước đây, trong đó mọi
Promise đều cấp phát 2 ô PromiseResolvingFunction với closure AK::Function không capture, đã được thay bằng static function dispatch qua enum Kind, loại bỏ cấp phát riêng cho từng resolver (#9188)
- Bỏ qua property-table marking của non-dictionary shape giúp giảm 1,3 giây thời gian GC khi tải maptiler.com (#9044)
- Đã thêm fast path cho
Array.prototype.indexOf của packed array (#9123)
Array.prototype.sort tái sử dụng UTF-16 đã được cache thay vì transcoding lại ở mỗi lần so sánh (#9036)
- Đã thêm import WASM, JSON, CSS modules (#6029)
- Đề xuất
ShadowRealm bị gỡ hỗ trợ do đình trệ trong quá trình tiêu chuẩn hóa (#8753)
API nền tảng web và CSS
-
Cache và CacheStorage
Cache và CacheStorage đã được triển khai end-to-end(#8745)
- 9 phương thức gồm
open, has, delete, keys, match, matchAll, add, addAll, put hoạt động dựa trên bộ nhớ lưu trữ tạm thời trong bộ nhớ
-
Tính năng CSS và chỉnh sửa rendering
- Đã bổ sung hỗ trợ cơ bản cho dạng chuẩn và dạng có tiền tố
-webkit- của image-set(); tại thời điểm paint, trình duyệt chọn ứng viên độ phân giải khớp nhất với device pixel ratio và bỏ qua các MIME type không được hỗ trợ(#9090)
- Nhờ hỗ trợ
image-set(), ảnh header của gocomics.com nay đã được hiển thị
- Đã bổ sung hỗ trợ ban đầu cho
position-anchor và CSS anchor positioning, giúp sửa vị trí bàn tay và khẩu súng trên cssdoom.wtf(#8686)
- Nội suy màu đã được viết lại theo css-color-4: nội suy trên float thay vì
u8, đồng thời xử lý nhất quán missing/powerless component, out-of-gamut sRGB và alpha multiplier(#8934)
- Các HTML attribute trình bày legacy như
align, bgcolor không còn ghi trực tiếp vào cascaded properties mà đi qua cascade như declaration author thông thường, để var() substitution và fallback invalid-at-computed-value-time hoạt động chính xác(#9176)
- Thay đổi trong presentational hint cascade đã sửa lỗi crash trên html.spec.whatwg.org
<thead>, <tbody>, <tfoot>, <tr> nay phản ánh presentational attribute align, giúp sửa cách sắp xếp nút trên bricklink.com(#9177)
- Nhờ nội suy
stroke-dasharray, các nét đứt SVG nay được animate mượt mà(#9133)
- Các phần tử có attribute
autofocus nay thực sự nhận focus khi trang được tải(#9016)
- List marker của văn bản RTL nay được đặt ở bên phải, giúp sửa lỗi rendering danh sách trên Arabic Wikipedia(#9099)
- Baseline của inline flex/grid container nay được suy ra từ first line box của phần tử con thay vì dòng wrapped cuối cùng, giúp sửa căn chỉnh giữa văn bản liên kết và biểu tượng trên nos.nl(#9183)
Mạng và vô hiệu hóa kiểu
-
Mạng
getaddrinfo không còn chặn event loop nữa
- LibDNS chạy lookup trong thread pool, phát song song truy vấn
A và AAAA, đồng thời gộp các lookup đồng thời cho cùng một tên(#9109)
- Đường dẫn preconnect của RequestServer đã được sửa để đi qua cùng đường dẫn DNS pool thay vì bỏ qua resolver, vốn khiến threaded resolver của libcurl gây ra
pthread_join trên main thread(#9109)
- Khi WebContent chậm hơn mạng, việc drain queued response data của RequestServer có độ phức tạp O(n²), và khi mở video YouTube đã tiêu tốn khoảng 30 giây trong
memcpy và 3 giây trong Vector::remove
AllocatingMemoryStream đã được chuyển sang danh sách chunk liên kết đơn, giúp việc tiêu thụ trở thành O(1)(#9028)
- Header
Accept của các yêu cầu hình ảnh giờ quảng bá AVIF và WebP để đồng bộ với các engine khác; một số CDN dùng header này để quyết định có cung cấp định dạng mới hay fallback sang JPEG hay không(#9046)
-
Vô hiệu hóa kiểu
- Cơ chế selector invalidation trước đây đơn giản vì dựa trên giả định selector chỉ nhìn theo hướng xuống, nhưng với
:host và :has(), thay đổi ở descendant có thể làm đổi kết quả :has() của ancestor nên cần đi ngược lên trên
- Mutation của stylesheet không còn tái dựng toàn bộ style scope cache khi chỉ một scope thay đổi, giúp thời gian rebuild rule cache của Reddit giảm từ 13,2 giây xuống 3,2 giây(#9138)
- Sibling structural invalidation không còn lan sang các descendant không quan sát vị trí, giúp giảm 11% số lần recompute không cần thiết trong infinite scroll của Reddit(#9155)
:has() mutation invalidation bỏ qua các anchor không bị ảnh hưởng, và đã đo được mức giảm lớn trên azure.com(#9168)
- Trong PDF Intel ISA, số lần thăm
:has() child-list giảm từ 71k xuống 1,6k, tiết kiệm khoảng 650ms khi tải pdf.js(#9179)
- Bộ test structural-invalidation mới đã làm lộ ra nhiều trường hợp bỏ sót vô hiệu hóa và các lỗi này đã được sửa(#9095)
- Cũng bao gồm các cải tiến nhỏ quanh hover, phạm vi mutation của stylesheet, custom-property map và computed-style diffing(#9077, #9049, #9079, #9080, #9141)
Cấp phát bộ nhớ và hệ thống build
-
mimalloc làm allocator mặc định
- Mã C++ và Rust chia sẻ một allocator instance mimalloc v2 duy nhất mà không phải mỗi bên đi qua system allocator(#8752)
- Vì không override
malloc() trên toàn hệ thống nên các thư viện bên thứ ba vẫn giữ nguyên allocator contract riêng của chúng
- Benchmark JS nhìn chung đã được cải thiện
-
Rust trở thành bắt buộc và dọn dẹp hệ thống build
- Tùy chọn build
ENABLE_RUST đã bị loại bỏ, khiến Rust trở thành bắt buộc(#8742)
- Hệ thống build GN đã bị loại bỏ hoàn toàn, để CMake là chuẩn duy nhất còn lại(#8931)
-
Thay đổi liên quan đến GC và bộ nhớ
- Biên dịch với
-ftrivial-auto-var-init=zero để ghi đè các GC pointer cũ thành 0 khi vào hàm, nhờ đó conservative stack scanner ít bắt gặp chúng hơn(#9171)
- Property
UsedValues ít khi dùng đã được chuyển ra sau lazy pointer, làm struct giảm từ 424 byte xuống 176 byte, và trong khi tải sainsburys.co.uk, LayoutState::populate_node_from() giảm từ 139ms xuống 65ms(#9104)
- Fetch body chunk trước đây đi qua đường dẫn pull-promise và cấp phát 7 GC object cho mỗi chunk, nay đã được chuyển sang đi thẳng vào byte stream controller(#9169)
Cải thiện hoạt động của các trang web
-
Reddit
- Carousel thư viện ảnh của Reddit đã hoạt động, đồng thời sửa 2 lỗi layout không liên quan quanh descendant được định vị tuyệt đối của split inline và
::slotted() matching (#9148)
- Nhờ
TextDecoderStream, SPA không còn nuốt các lần nhấp liên kết nên có thể mở bình luận
- infinite scroll cũng chịu ảnh hưởng từ công việc structural invalidation
-
YouTube
- YouTube được hưởng lợi từ biên dịch JS top-level ngoài luồng, giải nén WOFF2 ngoài luồng, giảm fetch fanout của
@font-face, sửa memory churn của RequestServer và zero-copy TransferArrayBuffer
- Giải nén WOFF2 ngoài luồng cũng tiết kiệm khoảng 170ms trên Gmail (#8976)
- Ở lần tải ban đầu, fetch fanout của
@font-face giảm từ 177 → khoảng 9 (#9032)
-
Các trang khác
- gocomics.com nay hiển thị được ảnh header nhờ
image-set()
- yandex.com/maps đã chạy được kết xuất WebGL vector-tile nhờ các bản sửa WebGL, bao gồm extension
WEBGL_debug_renderer_info (#9043)
- strava.com đăng nhập được vì
Navigator.getBattery giờ ném ra kiểu lỗi theo đúng đặc tả thay vì lỗi tự tạo (#8770)
- GitHub Insights tải nhanh hơn khoảng 100ms nhờ selector cache của
Element.matches() và .closest() (#8987)
- Trang so sánh laptop của tweakers.net nhanh hơn khoảng 31% nhờ indexed
HTMLFormElement property name lookup (#9009)
- neon.com không còn bị crash nữa (#8812)
- channel4.com đã khắc phục vấn đề căn dọc của category text nhờ sửa flex auto-margin resolution (#9050)
- Cloudflare Turnstile vẫn chưa vượt qua được, nhưng thất bại nhanh hơn nhiều nhờ auth-scheme handling, tối ưu hóa
Array.prototype.shift(), và tăng cường UA event handler cho phần tử <input> kiểu range và number (#9063)
WPT và các thay đổi nền tảng khác
-
Web Platform Tests
- Điểm WPT tăng từ 2,003,537 → 2,067,263, ghi nhận mức tăng 63.726 subtest trong tháng này
- Tuy nhiên, WPT đã thêm 53.207 JavaScript subtest khi đưa test262, bộ kiểm tra độ tuân thủ ECMAScript chính thức, lên upstream
- Ladybird đã chạy test262 riêng trong nhiều năm và do độ tuân thủ của LibJS đang ở mức tốt, nên vượt qua 52.045 trong số đó, tức 97,8%
- Trong mức tăng 63,7k, khoảng 52k đến từ việc import test262, còn khoảng 11,7k là tiến bộ thực sự mới của nền tảng trình duyệt
- Việc import test262 giúp WPT đo lường độ tuân thủ JavaScript cùng với phần còn lại của nền tảng
-
Văn bản, layout, tiến trình và UI
- Việc selection và hit testing với văn bản có ligature đã chuyển từ cấu trúc giả định một code unit cho mỗi glyph sang cách duyệt grapheme cluster và phân bổ glyph advance cho các grapheme tương ứng (#8829)
- Việc đặt
innerHTML trên shadow root không còn làm vô hiệu hóa toàn bộ cây layout của document, giúp thời gian layout-and-paint trên pomax.github.io/bezierinfo giảm 21% (#9191)
- Điều hướng một popup tab sang site khác sẽ không còn làm tiến trình WebContent của trang cha bị kết thúc (#8730)
- Trong Qt UI, có thể chuyển vòng qua các tab đang mở bằng
Ctrl+Tab và Ctrl+Shift+Tab (#8704)
- Có thể cuộn bằng cách giữ nút chuột giữa rồi kéo, hoặc nhấp tại chỗ để vào chế độ autoscroll (#8881, #8928)
- Khi nội dung nhập vào thanh địa chỉ không thể được sanitize thành URL hoặc truy vấn tìm kiếm, một trang lỗi thích hợp sẽ được hiển thị thay vì âm thầm bỏ qua đầu vào (#9072)
TextDecoderStream, phiên bản streaming tương ứng của TextDecoder, đã được triển khai; nó giữ lại phần UTF-8 chưa hoàn chỉnh ở ranh giới giữa các chunk, giúp có thể chỉnh sửa bình luận trên Reddit (#9143)
- Các thông điệp
BroadcastChannel cross-process nay được định tuyến qua IPC giữa tiến trình WebContent và WebWorker, nên hoạt động giống các trình duyệt khác bất kể listener nằm ở tiến trình nào (#8865)
1 bình luận
Ý kiến trên Hacker News
Dioxus, một framework GUI viết bằng Rust, đang được phát triển như một phần của native renderer; hướng đi là tự xây dựng phương án thay thế Skia giống Flutter, nhưng thay vì chỉ dùng canvas như Flutter web thì trên web nó vẫn hoạt động theo chuẩn HTML/CSS
Nó không phụ thuộc vào các codebase trình duyệt hiện có như Chromium, Gecko hay WebKit, và gần như là một triển khai được xây lại từ đầu, tận dụng các Rust crate như stylo và taffy mà Servo cũng dùng: https://github.com/DioxusLabs/blitz (
/apps/browser)Nhiều website cố tình chặn việc tải trên một số trình duyệt nhất định và chỉ cho Chromium vào, đó sẽ là thực tế Ladybird phải đối mặt và là một yếu tố lớn ngăn cản cạnh tranh từ trình duyệt mới
DRM Widevine cũng cực kỳ khó để các trình duyệt mới có được, đến cả Zen Browser với 10 triệu người dùng còn không lấy được
Tôi đã chỉ dùng Firefox suốt 20 năm qua nhưng chưa từng gặp trang nào bắt tôi phải chuyển sang Chromium vì lý do tương thích
Widevine đúng là một rào cản thật sự, nhưng trên thực tế chủ yếu chỉ chặn phát 4K ở một số dịch vụ streaming như Netflix, Disney v.v.
Nhìn vào việc Zen vẫn thu hút được 10 triệu người dùng dù không có Widevine thì cũng khó nói nó là yếu tố sống còn
Nếu bạn kiểm soát chính trình duyệt, thì ngoài các vấn đề liên quan đến DRM ra, gần như không có gì là bất khả thi
Mấy bài như thế này khiến tôi nhớ tới niềm vui khi đọc cập nhật của các trình giả lập game
Kiểu như “sửa lỗi X để Y hoạt động đúng, và nhờ đó game Z chạy được”, mà lần này một trong những thứ được sửa là CSS Doom, nên cũng có chút giao thoa với mảng game
Tôi đã nhiều lần nghe Andreas nói rằng làm trình duyệt cũng giống như làm trình giả lập
Mỗi website dùng các tính năng khác nhau theo những cách khác nhau, và anh ấy ví các website như ROM
Tôi là người dùng Firefox lâu năm, nhưng khi Ladybird bước vào giai đoạn alpha rất sớm và bắt đầu có bản dựng biên dịch sẵn, tôi chắc chắn sẽ thử từ sớm
GTK4 / libadwaita frontendnghe rất hayTôi thích GTK UI/UX hơn Qt, nên khá mong chờ tiến triển phát triển ở phía này
strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).Tại sao Strava lại muốn biết mức pin của tôi?
Có thể tồn tại phiên bản chỉ dành cho web ở các nước đang phát triển, hoặc khi pin thấp thì họ muốn giảm tần suất truy vấn vị trí để tiết kiệm điện
Hoàn toàn là suy đoán thôi, nhưng việc một trang như Strava yêu cầu thông tin pin không hẳn là vô lý tuyệt đối, chỉ là nhìn chung hơi đáng ngờ
Nếu giả sử có thể dùng qua website, thì khả năng cao là họ muốn điều chỉnh tần suất truy vấn vị trí để cân bằng giữa độ chính xác và mức tiêu thụ điện năng
Tuy vậy, ảnh chụp màn hình dấu đầu dòng của văn bản RTL có vẻ vẫn giống nhau
Trong cả hai trường hợp, dấu đầu dòng đều nằm bên trái
Trong khi đó ở ảnh “before” https://ladybird.org/assets/img/newsletter-apr-2026-rtl-befo..., dấu đầu dòng không chỉ nằm bên trái văn bản mà còn lệch quá xa sang trái, gần như ra khỏi khung
Tôi thật sự nể người đã dùng Evangelion r/unixporn cho bài test Reddit của Ladybird
Tôi không xem Evangelion nhiều, nhưng đã xem vô số phim tài liệu phân tích về nó và từng dùng làm hình nền một thời gian vì quá thích
Điểm mấu chốt là Reddit hoạt động trên Ladybird là điều cực kỳ ấn tượng
Tôi không biết YouTube có chạy được không, nhưng mong là có, và cảm giác như Ladybird đang thực sự trở nên khả dụng cho nhu cầu hằng ngày
Cũng xin cảm ơn https://jakubsteplow.ski/ vì đã tài trợ cho Ladybird
Tôi muốn những người quyên góp cho các dự án mã nguồn mở được nhắc đến tích cực hơn như một cách tốt hơn quảng cáo Google, và chúc Jakub mọi điều tốt đẹp; cũng mong nhiều người khác sẽ quyên góp độc lập cho các dự án như Ladybird
Cũng cảm ơn Human Rights Foundation vì https://hrf.org/program/ai-for-individual-rights/
Thật đáng kinh ngạc và truyền cảm hứng khi gần như thị trường trình duyệt đang ở trạng thái độc quyền hoặc thiểu số độc quyền mà vẫn có một người đưa được dự án đi xa đến vậy
Nó có hai mặt rất rõ: một là SF mecha/người ngoài hành tinh/quái vật với phong cách thẩm mỹ rất ngầu, mặt kia là một drama cá nhân tập trung vào sự tự ghét bản thân và cô đơn
Với đa số người xem thì mặt đầu tiên có lẽ hấp dẫn hơn, nhưng thứ còn đọng lại đến tận bây giờ lại là mặt sau
Nếu định xem thì nên chú ý thứ tự xem
Có dòng thời gian bắt đầu từ series TV gốc rồi đến phim “End of Evangelion”, và một dòng riêng là loạt phim “Rebuild of Eva”, bắt đầu như một bản reboot hoàn toàn nhưng bằng cách nào đó lại trở thành reboot/remake/hậu truyện cuối cùng của tác phẩm gốc
Để trả lời câu hỏi “Hiện có bao nhiêu người đang làm việc trên trình duyệt?”, trang này nói rằng Ladybird hiện có 8 kỹ sư toàn thời gian được trả lương cùng một cộng đồng đóng góp tình nguyện lớn
Phần lớn mọi thứ cũng hoạt động, nhưng ngoài tốc độ ra thì vấn đề lớn nhất là nhiều bài kiểm tra ‘bạn có phải con người không’ không hoạt động đúng trên Ladybird