Eyes Above The Waves

submited by
Style Pass
2024-06-09 09:30:03

Robert O'Callahan. Christian. Repatriate Kiwi. Hacker. Archive 2024 June So You Want To Build A Browser Engine Real-Time Settlers Of Catan April Auckland Waterfront Half Marathon 2024 Whanganui River Journey 2024 2023 December Rees-Dart Track 2023 Caples/Routeburn Track 2023 Abel Tasman Kayaking November Mount Pirongia 2023 Blog Migrated April Why I Signed The "Pause" Letter Auckland Waterfront Half Marathon 2023 2022 December Travers-Sabine Circuit 2022 Paparoa Track September Aotea Track 2022 Success, Privilege And God July Tūrangi Road Trip May Round The Mountain Track: Ups and Downs and a Twist Ending April New Zealand's COVID Strategy Worked (But It Could Have Been Better) March Motutapu Island Camping Trip January Motatapu Track Hump Ridge Track The End Of The Runway 2021 December Mt Pirongia 2021 Do We Really Need A Link Step? November Some Observations On The NZ CovidPass System October How WHO Failed September Emulating AMD Approximate Arithmetic Instructions On Intel rr Trace Portability: Diverging Behavior of RSQRTSS in AMD vs Intel June Spectre Mitigations Murder *Userspace* Performance In The Presence Of Frequent Syscalls Tama Lakes Winter Tramp 2021 May Forward Compatibility Of rr Recordings Lake Waikaremoana 2021 April Print Debugging Should Go Away Demoing The Pernosco Omniscient Debugger: Debugging Crashes In Node.js And GDB Visualizing Control Flow In Pernosco March On-Premises Pernosco Now Available; Reflecting On Application Confinement What Would Jesus Do ... About Vaccination? February Mercer Bay January Dehydration Tongariro Northern Circuit 2021 2020 December Rees-Dart Track Kepler Track 2020 Exploiting Precognition In Binary Instrumentation Of rr Replays November rr remix: Efficient Replay-Only Binary Instrumentation DOM Recording For Web Application Demos Debugging With Screenshots In Pernosco rr Repository Moved To Independent Organisation Pernosco Now Available For Individual Developers Auckland Half Marathon 2020 October Pouakai Circuit 2020 The Parable Of The Two Bus Drivers September New Zealand's Long Term COVID19 Strategy August Surprising Words In Luke 1:16-17 What's So Amazing About Mark 10:32 Scaling Debuginfo For Zero-Cost Abstractions What Is The Minimal Set Of Optimizations Needed For Zero-Cost Abstraction? June Cape Brett 2020 My Google Maps Disaster May Why Forking HTML Into A Static Language Doesn't Make Sense Omniscient JS Debugging In Pernosco April Have Some Humility, Mike Hosking March What If C++ Abandoned Backward Compatibility? Debugging Gdb Using rr: Ptrace Emulation January Static Customization Of Function Signatures In Rust Updating Pernosco To Rust Futures 0.3 2019 December A Risk Of Transactional Politics For Christians Nelson Lakes Tramping: Lessons And Observations Nelson Lakes Tramping: Travers-Sabine Circuit Nelson Lakes Tramping: Angelus Basin November Your Debugger Sucks Supercharging Gdb With Pernosco The Power Of Collaborative Debugging Omniscient Printf Debugging In Pernosco The BBC's "War Of The Worlds" Explaining Dataflow In Pernosco October Improving Debugging Workflow With Pernosco Auckland Half Marathon 2019 Pernosco Demo Video Food In Auckland 2019 Pouakai Circuit Is Richard Dawkins A Moral Realist? September Dissatisfied With Docker July Cape Brett 2019 Auckland Rust Meetup: "Building An Omniscient Debugger In Rust" June Stack Write Traffic In Firefox Binaries Winter Tramp: Waihohonu Hut To Tama Lakes May A Few Comments On "Sparse Record And Replay With Controlled Scheduling" Microsoft's Azure Time-Travel Debugging Don't Call Socially Conservative Politicial Parties "Christian" Debugging Talk At Auckland Rust Meetup April Goodbye Mozilla IRC Update To rr Master To Debug Firefox Trunk Mysteriously Low Hanging Fruit: A Big Improvement To LLD For Rust Debug Builds Rust Discussion At IFP WG2.4 March Marama Davidson And The Truth About Auckland's History February Banning Huawei Is The Right Decision Rust's Affine Types Catch An Interesting Bug Mt Taranaki 2019 January Experimental Data On Reproducing Intermittent MongoDB Test Failures With rr Chaos Mode 2018 December Vox On Nietzsche Hollyford Track Milford Track 2018 November Capitalism, Competition And Microsoft Antitrust Action Raglan Comparing The Quality Of Debug Information Produced By Clang And Gcc What Is "Evil" Anyway? Comments on "REPT: Reverse Debugging of Failures in Deployed Software" October Auckland Half Marathon 2018 Problems Scaling A Large Multi-Crate Rust Project Harmful Clickbait Headline About IT Automation The Fine Line Between Being A Good Parent And A Bad Parent The Costs Of Programming Language Fragmentation September More Realistic Goals For C++ Lifetimes 1.0 The Danger Of GMail's "Smart Replies" "Crazy Rich Asians" Rangitoto Fog August Long Live The Desktop Computer ASAN And LSAN Work In rr Diagnosing A Weak Memory Ordering Bug The Parallel Stream Multiplexing Problem July Gerv Why Isn't Debugging Treated As A First-Class Activity? June Yosemite: Clouds Rest And Half Dome Bay Area Visit Crypto-Christians In Tech May rr 5.2.0 Released Intel CPU Bug Affecting rr Watchpoints Update: Pernosco rr Chaos Mode Improvements Research Wishlist: A Filesystem For Efficient Host-Guest File Sharing Priority Is Overrated April rr Trace Portability: x87 "Data Pointer" Broken On Skylake CPUID Features, XSAVE, And rr Trace Portability Heaphy Track #2 Payment Express's "Account2Account" Is Bad For Security March Speeding Up `dwarfdump` With Rust Too Many DWARF Packaging Options "Zach": AI Fraud In Christchurch Tongariro Northern Circuit #2 January Neal Stephenson's "Seveneves" (Mild Spoilers) Long-Term Consequences Of Spectre And Its Mitigations Captain Sonar Hooray For cargo build --all-targets The Fight For Patent-Unencumbered Media Codecs Is Nearly Won Ancient Browser-Wars History: MD5-Hashed Posts Declassified On Keeping Secrets Meltdown/Spectre Needs Better Disclosure 2017 December Mixed Blessings Of Greenfield Software Development Marriage On Credit Routeburn-Caples rr 5.1.0 Released Maintaining An Independent Browser Is Incredibly Expensive November In Praise Of Rust's structopt For Command Line Parsing Tararua Southern Crossing October Auckland Half Marathon 2017 Microsoft's Chrome Exploitation And The Limitations Of Control Flow Integrity "Slow To Become Angry" Type Safety And Data Flow Integrity Legacy Code Strikes Again Thoughts On Microsoft's Time-Travel Debugger Building On Rock, Not Sand Microsoft Using Chromium On Android Is Bad For The Web September Complaining About Twitter Again Dreaming The Singularity Facebook's "Explaining React's License" Doesn't Some Opinions On The History Of Web Audio Sonny The Prophet rr 5.0 Released rr Trace Portability August Fedora/Ubuntu Kernels Work With rr Again Igloos Are Hard Epsom Electorate Town Hall Meeting Public Service Announcement: "localhost" Is Not Necessarily Local When Virtue Fails Stabilizing The rr Trace Format With Cap’n Proto July Selecting A Compression Algorithm For rr Upstream Stable Kernels Work With rr Again Let's Never Create An Ad-Hoc Text Format Again Confession Of A C/C++ Programmer Usenix ATC 2017 An Inflection Point In The Evolution Of Programming Langauges Bay Area Progress Report June Patch On Linux Kernel Stable Branches Breaks rr Rising Tolerance For Static Analysis False Positives? Lazy Religion Tropes In Mass Media Is The x86 Architecture Sustainable? New "rr pack" Command How I Found A 20-Year-Old Linux Kernel Bug Another Case Of Obscure CPU Nondeterminism WebAssembly: Mozilla Won May Should Debuggers Report Idempotent Writes? A Couple Of Papers About Commodity Multicore Record And Replay, And A Possible Way Forward rr Usenix Paper And Technical Report Obscurity Inhibits Persuasion Perceptions Of Violent Crime April Call Out China For Their Treatment Of NK Escapees One Does Simply Walk Into Mordor Rust Optimizations That C++ Can't Do (Version 2) Rust Optimizations That C++ Can't Do Pararaha Valley Let's Make NZ More Expensive For Tourists March The Parable Of The Workers In The Vineyard Really Is About Grace Blogging Vs Academic Publishing Thoughts On "Java and Scala’s Type Systems are Unsound" And Fuzz Testing Deterministic Hardware Performance Counters And Information Leaks Using rr To Debug Go Programs February Against Online Voting 306 Points In "Lords Of Waterdeep" "New Scientist" And The Meaning Of Life What Rust Can Do That Other Languages Can't, In Six Short Lines rr 4.5.0 Released I Really Admire Jehovah's Witnesses January A Followup About AV Test Reports Tripling Down Against USA Conference Hosting Rustbelt Is Hiring rr Talk At Auckland C++ Meetup, February 21 Really, Please Stop Booking International Conferences In The USA Disable Your Antivirus Software (Except Microsoft's) Browser Vendors And Business Interests Browser Vendors Are Responsible For The State Of Web Standards Parenting Notes Cheltenham Beach How China Can Pressure North Korea Is CMS Software Generally Really Bad? 2016 December On "Arrival" October rr Talk Online Disemploy The Middle/Upper Class Some Comments On "Sapiens" November Overcoming Stereotypes One Parent At A Time Stop Saying "Xs Do Y" Disingenuously Handling Hardware Lock Elision In rr Misinterpreting Close Contests Welcoming Richard Dawkins Dangerous Permissions October Auckland Half Marathon #4 Implications Of ASLR Side-Channel Attacks Valuing America Dell, Your Website Security Is Broken Pivoting To Cyber-Forestry Ironic World Standards Day Tawharanui Revisited rr Paper: "Lightweight User-Space Record And Replay" Bay Area Talks About rr And Beyond, October 2-7 rr 4.4.0 Released September Is Apple A Christian Environment? Theism And The Simulation Argument Auckland Food 2016 August Avoiding Cache Writebacks For Freed Memory Random Thoughts On Rust: crates.io And IDEs Saga Of The Exiles False Accusations Why I Don't Watch "Game Of Thrones" Changing Attitudes To Pornography July The True Story Of "Amazing Grace" Further Improving My Personal Digital Security Ordered Maps For Stable Rust Itanium Zombie Claims Another Victim June rr 4.3.0 Released Nexus 5X vs Wettest June Hour In Auckland's History Relearning Debugging With rr Handling Read-Only Shared Memory Usage In rr Dear Ubuntu, Please Fix Your Debuginfo Packaging Democracy Is Impressive PlayCanvas Is Impressive Managing Vast, Sparse Memory On Linux Nastiness Works "Safe C++ Subset" Is Vapourware Mt Pirongia Whanganui River Journey Some Dynamic Measurements Of Firefox On x86-64 Are Dynamic Control-Flow Integrity Schemes Worth Deploying? How To Track Down Divergence Bugs In rr The Diving Bell And Twitter Research Needed: A Meta (Dis) Assembler May Men Behaving Badly Stop Booking Conferences In The USA Data > Personal Anecdotes > Media Anecdotes x86-64 SSE/AVX Register Usage Autonomous Vehicles: I Want To Believe Data On x86-64 Register Usage Pain Management History Rhymes April Android's Update System Is Ridiculous Leveraging Modern Filesystems In rr Skylake Erratum Affecting rr GNOME High-DPI Issues March Using rr To Debug rr Obituary Running Firefox For Windows With rr SIGKILL And PTRACE_EXIT_EVENT Digital Spring Cleaning My Self-Identification Leaving Mozilla February "These Bugs Are Impossible To Fix Without rr" Deeper Into Chaos Rewrite Everything In Rust Introducing rr Chaos Mode rr Talk At linux.conf.au rr 4.1.0 Released Reflecting On The The Lord Of The Rings Movies Rakiura Track Kepler Track January Making Honest Money With The Internet Of Things Kereru innerText: Cleaning A Dark Corner Of the Web 2015 December Feelings Versus Facts At Christmas Abel Tasman Track CppCast rr Podcast November Even More rr Replay Performance Improvements! rr Replay Performance Improvements Debugging Leaks With rr TPPA Protest Perfection In Imperfection rr In VMWare: Solved! An Extraordinary Sunday October Research Projects That Should NOT Be Funded KPMG Gets It Totally Wrong About Pittsburgh And Auckland rr 4.0 Released With Reverse Execution Hobbiton Heaphy Track September Apple's Next Frontier: Fusion Booting Fedora 22 On A Lenovo ThinkCentre M53 August Hooray For WebExtensions Parenting July Two Reverse-Execution Optimizations Midwinter Road Trip rr Talk Video From TCE 2015 June Whistler Hike Bug In Newer Linux Kernels Affecting rr Israel, Part 3 Israel, Part 2 Israel, Part 1 Small Change To rr Behavior May rr Performance Update BlinkOn 4 Using rr To Debug Dropped Video Frames In Gecko Piha Night Walk April rr 3.1 Released Another VMWare Hypervisor Bug Reverse Execution And Signals March Eclipse + Gecko = Win Paper Titles Auckland University rr Talk Next Week The Problems Of Significance Testing (aka What's Wrong With Computer Science) Debugging Gecko With Reverse Execution What Is The Endgame Of Weak Computer Security? February Great Barrier Island Computer Industry T-Shirt Museum January Routeburn-Greenstone 2014 December Is Human Immortality Possible? Queen Charlotte Track rr 3.0 Released With x86-64 Support Portland We Aren't Really Going To Have "Firefox On iOS" November The Rise Of "Versing" Mount Te Aroha Relax, Scaling User Interfaces By Non-Integer Scale Factors Is Okay Sci-Fi HTML5 Video Correctness Across Browsers Auckland Half Marathon --- Barefoot October Are We Fast Yet? Yes We Are! Pinnacles Tramp #2 Photos From North America Back In New Zealand September Upcoming rr Talk rr 2.0 Released VMWare CPUID Conditional Branch Performance Counter Bug August Milestones On The Road To Christianity cf1e5386ecde9c2eb9416c9b07416686 Choose Firefox Now, Or Later You Won't Get A Choice July Multiverses And Anthropic Reasoning Implementing Scroll Animations Using Web Animations May Unnecessary Dichotomy Against The "Internet Of Things" Milford Track April Getting Back To Work Fighting Media Narratives Mozilla Matters Responsible Self-Censorship March Conflict Introducing rr Mozilla And The Silicon Valley Cartel Taroko National Park Maokong Introducing Chaos Mode My Linkedin Account Is Dead, And Why Is Google Being Stupid? Fine-Tuning Arguments Internet Connectivity As A Geopolitical Tool Te Henga Walkway Q&A Panel At ACPC This Friday February 3 Mile Limit World Famous In Newmarket Implementing Virtual Widgets On The Web Platform Mozilla At Motuihe Camels January Lake Waikaremoana Web Specifications And The Frame Problem Tiritiri Matangi Island Boating 2013 December We Need A "Dumb Device" Movement Blood Clot Why I Don't Worry About Global Warming (Much) One Day The Luddites Will Be Right WebRTC And People-Oriented Communications Another Knee-Jerk Reaction To International Rankings Does John Banks Only Do Good? Wanaka November Mozillians At The Tongariro Crossing And Orakei Korako A Tale Of Two Cities October Summit Day Zero Prescriptive Vs Descriptive Frameworks Avoiding Burnout Travel Madness September The Forge Of Disappointment A Tip For The Surivial Of Humanity Unexpected Visitors Debugging Transient Rendering Issues With GNOME Shell Screencasts Servant Leadership August Indoi Creating Screencasts On Linux SVG-In-OpenType Progress Update Mozilla Code Reviews Talk On Air Mozilla Prepare To Stop Mozilla Engineering Culture Talk Now Online July A Shock Of The Ordinary Happy Days Avoiding Copies In Web APIs Movie Picoreviews Contributing Advocacy June Gradual Changes Afoot Developer Parallelism Meeting Absenteeism May Blink, PNaCl, And Standards Taiwan Travelogue Travel The Direct Route Web Audio Progress April Rotorua Hunuas Tramp Upcoming Travel Plans Google Vs New Zealand The Chris Problem The Future Of Cheating Blink March Mitigating Control-Flow Exploits With x86 ISA Extensions RIP Crazy Noodle Getting The Facts Why I Work Seeking Relevance There Is No Such Thing As Computer Security Technical Advantages Of A Web-Only Platform February A Small Example Of The Value Of Browser Engine Diversity And Then There Were Three Waiheke Island Sculpture Trail SVG In OpenType: A New Approach To SVG Fonts January Mount Taranaki Optimizing Bugzilla Usage 2012 December Great Barrier Island November More Movie Reviews What To Do When Visiting New Zealand October Trouble Ahead For SVG Stacks (Maybe) Motutapu Camping Karekare September Web Audio In Firefox Blast From The Past August Granularity Of Import Directives In Programming Languages A Confession Of Sorts Attention NZ TV Sports Interviewers July In-Flight Movies North Head To Takapuna Tawharanui Muriwai June Bolo Computer Science In Beijing Google Plus Spam Experiencing Beijing To Beijing Leaving Linkedin The City And The City Mangawhai May The Canvas getContext() Mistake Firefox Vs The New York Times Crosbie's Hut Accelerated Scrolling In Firefox: Past, Present And Future Sad And Pathetic Machines April Korea The Internet Experiment Has Failed March Retrospective On Our Trip To Europe Wakaraanga Creek I'm Back Retro Movie Showcase Requiring Planet Mozilla Content To Be Mozilla-Project-Related February Movie Overdose Upcoming Travel Foo Camp, ECOOP, And Conferences Alternatives To Supporting -webkit Prefixes In Other Engines The Problem With Counting Browser Features January Mozilla Tree Adventures You Know You're In Australia When... MediaStreams Processing Demos "Cut The Rope" and HTML5 Audio Risk Tolerance 2011 December A Case For Non-Fatal Assertions Revelation Television Love Developernomics November Moves In Computer Science Education Politics ITEX And TVNZ Latency Of HTML5 <audio> Sounds Freedom Never Gets Old Computerworld Interview HTML Video DRM The End Of Plugins Drawing DOM Content To Canvas Fun Things To Do In Auckland October Public Service Reminder For GMail Users A Sermon For The Rugby World Cup Final A Few Words On The Rugby World Cup Web Directions South Jobs September Shifts In Promoting The Open Web Graphics API Design Risks Of Exposing Web Page Pixel Data To Web Applications Doing The Same Thing Over And Over Again And Expecting Different Results France Vs Japan So It Begins August Cost Of Living Thoughts On Management New Mozilla Auckland Office Is Live! Securing Full-Screen Eden Park South Island Holiday Blog Update Books Rugby Fandom June Permissions For Web Applications Auckland Web Meetup Recap Auckland Web Meetup CS Unplugged Media Processing Some Advice Running May Singing The Pinnacles April "My Wedding And Other Secrets" Gangly, Bespectacled And Cerebral Shy Movies March White Island Investigating Performance Differences Between Firefox 4 And IE9 The Myth Of "Full Hardware Acceleration" February Cape Brett Tongariro Distinguishing "Embeddable" Versus "Readable" Web Resources Considered Harmful January 3433aed5e4a1ca4ca1fc8db580d60c2b Tongariro Pleasure Coincidence Playing The Game A Big Day For Free Video Theodicy And The Prime Directive I'm Back Interannual Status 2010 December Iterated Prisoner's Dilemma GPU-Accelerated Video Playback In Firefox 4 November Measuring FPS Most Unusual Rugby Commentary Herald Interview Brain Drain Vs Foreign Invasion Clinton Bedogni Prize Eclipse Breakthrough Implementing A High-Performance Emulator In Javascript Using Run-Time Code Generation October Stepping Stones Bye Bye HWNDs Distrusting Research Mitigating Dangling Pointer Bugs Using Frame Poisoning South Island Trip Raising Awareness September Travel The Ten Commandments "Full Hardware Acceleration" New Google Maps Imagery Of Auckland August A Night Out TechEd More Dell Fail (Or Maybe NVidia) Sunshine Rises Again -moz-element Landed Vinge CSS Units Changes Landed The mozRequestAnimationFrame Frame Rate Limit Auckland Food Firefox Sync mozRequestAnimationFrame Google vs Oracle Dell Fail Choosing Sides July Unexpected Downtime Coding Style As A Failure Of Language Design Perks Summit Retained Layers Mozilla And Software Patents In New Zealand June Thank God For Science LFX Video Available! Sleepless In Toronto WebM Landed Not Implementing Features Is Hard May Visiting Toronto Dear Conservatives Nero Vs MPEG-LA Ip Man Fail WebM Discontent On The Web Standardizing XUL Flexible Boxes In CSS CGLayer Performance Trap With isFlipped April Kingitanga Day Changing The World Accelerating Theora On The N900 API Design For The Masses Fermi, Darwin, and Christians More Apple Evil Upcoming Events Big Week Anawhata Layers March Fun With BCC Amor Robustum Rainbows End Nightmare On Infinite Loop February High-Performance Browser Developers Post Foo Camp Reality Wins January Ruapehu Redux Three Lessons From A Pernicious Bug H.264 Licensing And Free Software ActiveX All Over Again LCA Video, Freedom And Mozilla The Road To LCA: Ruapehu Volcanoes And Penguins More On Patch Division CSS Absolute Length Units Unifying Abstractions, Dividing Patches There Can Be Only One 19e63a20e092ca81c1ae44694a3e6558 d525fd19a91535e97ead3f9afa9bfa58 2009 December Idiots Indeed Important Questions November Sword +5 Against Orange CSS Gradient Syntax Challenges In Software Research October Removing The Media Element 'load' Event Melbourne September Melbourne No Worries Somewhere On The Internet... mozLoadFrom And The Media Cache Auckland Web Meetup 2009 Cheap Broadband Doesn't Matter August Post-Holiday On The Road Homework Answers Winter's Day On The West Coast Homework July Idiots Justifying Evil Approved For The Intelligence Community On Not Being Evil Faces Of The Web Video Revolution Progress June Native Widgets Begone Whitespace Begone DirectShow And Platform Media Frameworks The Price Of Freedom Stupid X Tricks May Status 4d2f8648efd45acd8e4f0c4b24b4ed51 Mozilla Corporation All-Hands And Other Adventures April Travel The Ultimate Emulator Reflecting on NZCSRSC 2009 The Man In The Middle Media Cache March Seductive Infrastructure February Checking The Rear-View Mirror Filters, Libraries And The Web Columns Conversations SVG Filter Effects For Plain Old HTML Hazardous Biology On Conversations Kiwifoo 2009 Telling It Like It Is Mozilla Afloat Mozilla At Karekare January Tips For Getting Patches Landed Post-3.1 Plans Mountain Fun Scheduled Downtime Invalidation Reftests Right And Wrong 2008 December Wikipedia Ship's Blog Offline Blast From The Past 0d9430209720a141205bf8986cdc9598 New Game, Old Rules Reftests Places I've Been Mozilla NZ West Coast Waiheke November Miscellany The Essence Of Web Applications Grumble Grumble October American Tidbits The Tragedy Of Naive Software Development October Travel Invalidation SVG Bling Update Hating Pixels Coromandel Interesting Developments In Program Recording September Chronicle Update Dear Nat Torkington New Zealand Open Source Awards Whatipu Whiny Expats CSS Transforms Auckland Web Meetup Summary Some Boring CSS/Acid3 Stuff 4a8dec89f08156ec972ddc3ff319eb01 Auckland Web Meetup Chrome August Kitekite Falls Disruption In Progress Analyzing Deer The Coming Battle Over Web Fonts Eureka My Summit Why Ogg Matters July Mixed News SVG Filter Performance Improvements In Gecko 1.9.1 Wellington ROC Scheduled Maintenance - Wednesday 16/7/2008 to Sunday 20/7/2008 Using Arbitrary Elements As Paint Servers SVG Paint Servers For HTML Fun June Some 1.9.1 Updates Hits And Misses Eager Backouts Advanced Topics In Computer Science #2: Rectangles Working Overtime 5ce9134be8a642e1fbf3b93593da33e9 Applying SVG Effects To HTML Content May Ergonomics Well, I'm Back Again Status Perspective Don't Stop On The Freeway More Travel Fermi's Paradox April Visiting Hamilton Te Henga The Ozymandias Ultimatum The Good Fight Specification Superheroes The Shadow Of The Moon Additional Austral Peregrinations Kindling Enthusiasm March Travel Plans NOT A Cross-Browser Implementation Of XBL2 Initial IE8 Thoughts February Platform Tilt Rounding Towards (Or Away From) Zero Considered Harmful The Best Of Intentions Recap Part 2: Foo/Baa Camp Recap Part 1: California January Different Approaches To Compability Modes Travel Slipping The Ball And Chain &lt;META HTTP-EQUIV="X-BALL-CHAIN"&gt; Subpixel Layout And Rendering GTK Printing Auckland Mozillans At Play Auckland Mozillans String Theory The Dark Side Of The Moon Christmas Excursions 2007 December Our Rectangles Overfloweth Drive-By Debugging Official Notice 2007-2008 Barcamp Auckland Video Wars Video Star Interpreting Failure Small Mammals Script Safety Annotations e0f4ffc0ddc898cd033567bc2d1fe084 November A New Antipodean Free Software Outpost Gripping Reality Pegs, Holes And Reflow 8 Kent St Intranet Explorer Finding The Core Status October Linux Matters, Addendum Linux Matters Growing Pains Abstraction Penalties, Stack Allocation And Ownership Types Backing Store #2: Dependency Tracking A Tale Of Two Zooms Exploring Auckland Welcome To My Backing Store One More Reason Why We Need Audio (And Video) In The Browser Fish, Water Tabula Fracta Changing Horses Tragic Vindication If I Did It Triage September Parallel DOM Access Textalicious My World Cup Predictions Why Erlang Is Not The (Whole) Answer Parallel Browsing Trust No One Federal Government +1 Chickenfoot/Koala/CoScripter Gloom-o-rama Bruce Willis And Quantum Computing August Mercurial OOXML Wars Announcing Chronomancer Post Vivem High And Low Flood Control Dam Number Three July Major Chronicle Bug Fixed Ozzie Oddity Upcoming Events Brrrrrr Chronicle Contribution Status Camera Features I Want Fashionable Controversies Holiday Photos Rotovegas Media Superstar Things I Hate Holidays Text Status Mea Maxima Culpa June Durban, Paris, Valencia, Mangere Webstock Press Wellington 15 Minutes With A Tucked-In T-Shirt Bad Steve This Week's Madness Shrike Waikowhai Status Update May We Don't Need No Office Education Things I've Seen With My Eyes Record-And-Replay In Virtual Machines The Glyph Bounds Problem Performance Observation Chronicle Update Speeding Up Mkdepend Authentication Status Collision Desperate Measures April Travel Bethell's Beach History Based Stack Reconstruction Chronicle Released MoCo All-Hands Google Maps Fails Me Travel Plans March Questions That Must Be Answered Text Text Text Festival Mania February Miscellany Computerworld Article Faith Offline Web Applications Superlaser Targeting Cupertino ATSUI Woes Now Witness... Evil Units Patch Landed Mozilla In Auckland Post Baa Camp Baa Camp January Anniversary Weekend ec06b3461cf0eaf3d3e4d7a2e429bddb Sharing Sources Across Virtual Machines Babes In Toyland Fortress Status 2006 December More About Amber A New Approach To Debugging Pohutukawa Parallelism Changes Afoot The Ultimate Square Peg Patent Sea Change Congratulations David! XUL Dark Matter Linux NetworkManager, dbus and Offline Status November Firefox Summit Prophecy Fulfilled Mail Forwarding Making Web Applications First Class Desktop Citizens October Miscellany Partial Ligatures Thinking About Performance Motutapu Island Mysterious Cargo More Text Insufficiently Paranoid Text Progress My Father's Days Of Piracy September Here Comes A New Challenger! Status Static Analysis And Scary Headlines Dream Time II Crazy Noodle August More Status Out Of Action What's Wrong With The SVG Working Group Sweet Sorrow July RGBA Windows Worlds In Collision The Good, The Bad, And The Three-D Necrolicious On The Road Eighty Minutes Of Terror June CORBA Post Mortem The Future Is Now The Wild West Duder Regional Park The Future Of Western Civilization May Bad Choices DVD Madness Assorted Thoughts April Dream Time GNOME Themes In HTML Asiana IV Read My Lips Having A Miserable April Fool's Day March And So It Begins ... February Linker Performance Revisited Choosing Sides Cairo, Linux And GTK2 Themes Irrational Glumness The Greatest Movies Of All Time Anatomy Of Bloat The Joy Of Text Tongariro January Stormy Conditions, Outlook Fair One Year On Morning Light 2005 December Port Waikato Frame Display Lists And Next Steps Night Of The Living Threads The BBC Gets It Wrong Web Standards, Mozilla Extensions And Other Ranting Means And Ends November Ambushed Gloomocracy IV Frame Display Lists "Premature Optimization Is The Root Of All Evil" Is The Root Of Some Evil October Travels September Upcoming Travel Blast From The Past August SVG Interoperation Speaking The Truth In Love (I Hope) IE7 To Fix A Number Of Standards-Compliance Issues July Gecko 1.9 Whatipu EU Patent Law Defeated June Eclipse CDT 'Talisman' and Programming Language Semantics I Have A Dream Avalon Lockdown display:inline and tables Around The World In 22 Days Graphics Thoughts An Unexpected Journey May Xgl XTech Landed Canvas drawWindow API Socialized Medicine Travel Rendering Web Page To Images Light-Weight Instrumentation from Relational Queries Over Program Traces The Language Of Doom Cairo Progress April Globalization Cairo Status Star Wars Glimpse Of The Future Acid2 Rangitoto April Curmudgeon March Rediscovering Auckland Gecko 1.8 For Web Developers: Collapsing Margins And The 'Clear' Property Gecko 1.8 For Web Developers: Columns The Great U-Turn Gloomocracy III Gloomocracy II: Gloomocrats United Slough of Despond Heroes Visual Regression Tests February Lizard Engineer Cultural Synthesis Lantern Festival Just Swell Urupukapuka Island Sunshine Optimizing GNU ld The Usable Society The Joy Of Benchmarking Asiana III Nazis, Computers and Me Lizard Time Asiana II Herald Interview Living the Dream January Perambulations Sharing binaries across multiple Mozilla trees with ccache Asiana Forestry Branded Well, I'm Back The Gloomocracy Counting Down 2004 December Fog of War Why Mozilla Why New Zealand Well, I'm Almost Back Saturday 8 June 2024 So You Want To Build A Browser Engine If you’re building a browser engine from scratch just for fun, stop reading now and I wish you the best. If you want to build an engine that’s competitive with Chromium, and surpasses it in some respects, here’s my advice. Security and performance requirements tightly constrain your design When designing your engine, focusing from the beginning on the right set of important and hard use-cases will help you a lot: much of your design will be dictated by the performance and security requirements of those use-cases. Here some use-cases I think are very constraining, and how I think they constrain browser engine designs in interesting ways. Site isolation In the post-Spectre world you must have site isolation. The JS for a site (roughly, eTLD+1) must have its own OS address space separate from other sites. (This means IFRAMEs must work across process boundaries.) A key part of engine design is determining exactly what is in these sandboxed content processes and how they interface with the rest of the browser. To minimize RAM usage, and the risks of exposing data to site JS via Spectre or engine bugs, you want to put the bare minimum in these processes, starting with JS application state. JS needs very fast access to the DOM state, so the page DOM needs to be in the content process. CSS layout is also tightly coupled to the DOM and JS so you’ll have your layout data structures and logic in there too. Beyond that, it’s less clear, but you don’t want image data in your content processes for example. The design of your JS engine and DOM and layout implementation will be partly driven by the need to keep RAM usage per content process to a minimum. Any caches that could be useful across sites should be shared between content processes whenever you can do that safely, e.g. supply font metrics via read-only shared memory from some other process. Content main thread sanctity Normal page JS runs on a single “main thread”, which is very often the bottleneck for application execution. So don’t block those threads for other work unless you absolutely have to because it can’t run concurrently with page JS. Will you be running layout on those threads? Rendering? Since page JS often blocks for significant time, for responsiveness you want to avoid browser features blocking on those main threads as much as possible. Because they’re so critical, modern browser engines have sophisticated heuristics for scheduling the activities of these main threads. Yours probably will too. Fast JS-DOM calls (WebIDL) Many applications depend on making lots of DOM API calls, so calling DOM APIs from JS must be as efficient as possible. You’ll be counting instructions and cycles. You’ll want to share strings across interface boundaries, etc. Get your JS JIT involved. On the other hand, you’ll be implementing a huge number of WebIDL interfaces so make that as ergonomic for developers as possible. You’ll need to GC cycles spanning DOM/JS boundaries. This heavily constrains DOM memory management and JS GC. Page load performance The latency from starting to load a URL to getting content on screen must be absolutely minimized. This means you need to do a lot of things well. You need prerendering — when it looks like the user is going to load a URL but hasn’t commited, be able to start loading and rendering early. You need to implement modern HTTP with aggressive caching, bandwidth management, prioritization etc. Your HTML parser must be incremental so you can get content on the screen before you have loaded the entire document. It must support prefetching — as soon as you see the URL of a subresource, start fetching it. As noted above, it can’t block the site JS main threads. (Although you will need to be able to invoke it synchronously for innerHTML.) It’s a similar story for parsing other kinds of resources — CSS, JS, images. At what point is loaded content injected into your content processes? Having built the DOM, you need crazy fast CSS style resolution and layout. This is a huge topic because DOMs are so varied. You will need very fast text shaping (probably with shaped-word caching). Then you need really fast rendering of laid-out DOM into whatever your compositor (see below) needs. You will probably need to use the GPU to be competitive, so maybe this is split into a CPU side and a GPU side. At what point does the output leave the content process? Scrolling and animations Scrolling and animations must not stutter just because page JS is running. So, you need to make sure you can render scrolling and animation updates without blocking on the page main threads. Typically this is done by building a scene graph that a “compositor” can render without blocking on those threads. The compositor will need a way to process scrolling input events without blocking on DOM event dispatch in JS main threads. For smooth animations the compositor needs to be aware of vsync, and this has to be plumbed through to content process DOM APIs like requestAnimationFrame; your vsync architecture will be a story in itself. Your compositor will need to support the full set of SVG and CSS filters, plus cropping, masking and other effects, across frame boundaries. Typing latency You must minimize the latency of responding to input with screen output. A good proxy for this is latency of typing into a textarea or, say, Google Docs. Study your pipeline for receiving a system keyboard event, dispatching a DOM event in the content process, laying out the updated DOM, rendering and compositing the result to the screen and make sure it’s minimal. See vsync above! Quality video playback High-quality video streaming is hard and constrains your audio and graphical output systems. Obviously you need to implement the basic DOM APIs and relevant extensions such as EME and MSE. You’ll want to sandbox container demuxing in its own process. You will need to integrate modern codecs. You will need to support hardware decoding when that’s available. For A/V sync you need to present a queue of decoded frames to your compositor, which will sync on the audio output clock. You need to minimize power usage by integrating with the system compositor where that’s possible. Obviously this has to be zero-copy for decoded frames. Going beyond If you’ve done all that and implemented all the Web specs, you might still only be a less-Web-compatible Firefox or Chromium. What can you do better? My knowledge is a bit out of date, but here are a few guesses. Go parallel from the ground up. You’ll get more and more E-cores, so you should try to use them. Parallel parsing and layout seem like endless opportunity. Use a programming language that lets you write clean, fast, memory-safe, parallel data-race-free code — probably Rust. It’s annoying how current browsers lose state when they restart for updates etc. In principle you can serialize content process state, restart the browser, and restore the full page state. This probably has other uses. You are going to spend an infinite amount of time diagnosing your engine’s bugs on inscrutable Web sites. Build really incredible tools for that and maybe Web developers will like them too. Consider replay.io, AI, and whatever else you can think of. Instead of being a Web browser, you might want to initially try just being a faster, lighter or lower-power Electron or WebView. Then the Web compatibility barrier would be much less of an issue. Good luck! You deserve it, and you’ll need it!

If you’re building a browser engine from scratch just for fun, stop reading now and I wish you the best. If you want to build an engine that’s competitive with Chromium, and surpasses it in some respects, here’s my advice.

Leave a Comment