The road to out-of-process WebExtensions

Rob Wu <rob@robwu.nl>

Who is Rob Wu?

  • MSc student Information Security Technology @ TU/e (Netherlands)
  • Chromium contributor, extension developer
  • Reviewer at addons.mozilla.org
  • Firefox intern

WebExtensions

  • Cross-browser API to develop browser add-ons
  • Successor to XUL overlays, bootstrapped extensions and Add-on SDK
  • Shields the volatile internals of Firefox from add-ons
  • Compatible with multi-process Firefox (e10s)
  • Well-documented

Out-of-process WebExtensions

  • Goal: run add-ons in a separate process
  • Must stay compatible with single-process Firefox
  • Getting started:
    • Check correctness of existing implementation
    • Unique IDs must really be unique (1287245, 1287626, 1288279)
    • Script contexts must close upon page unload (1288276)
    • Namespace isolation for code in different "processes"

Registering API implementations

  • Script types: content scripts & extension pages
  • Separate JS sandbox for each "process" (main, content, addon)
  • Declare APIs with specific script and process types (1287010)
  • 
      extensions.registerSchemaAPI("runtime", "content_child", (context) => {
        return {
          runtime: {
            get id() { return context.extension.id; },
            sendMessage(message, callback) { /* ... */ },
          },
        };
      });
          
        
      
→ ExtensionContext (direct)  → addon API
→ ExtensionContext → ParentAPIManager → ProxyContext → content API
→ ExtensionContext → ChildA(asynchronous)
→ ExtensionContext → ChildAPIManager

→ ExtensionContext → WannabeChildAPIManager (direct)
→ ExtensionContext → Wan(asynchronous)
→ ExtensionContext → ParentAPIManager → ProxyContext → ... API
→ ExtensionContext → ChildA(asynchronous)
→ ExtensionContext → ChildAPIManager

→ ExtensionContext → ParentAPIManager → ... API
→ ExtensionContext → ChildA(asynchronous)
→ ExtensionContext → ChildAPIManager

Thanks to

  • Bill McCloskey
  • Andy McKay
  • WebExtensions team
  • Amy Tsay & ACE team
  • Fellow interns (Enes, Emilio, Nima, ...)
  • University team
  • Mozilla and Mozillians