{"id":161,"date":"2026-04-02T11:32:34","date_gmt":"2026-04-02T11:32:34","guid":{"rendered":"https:\/\/blogs.igalia.com\/mshin\/?p=161"},"modified":"2026-04-02T11:32:34","modified_gmt":"2026-04-02T11:32:34","slug":"extension-migration-progress-update-part-1","status":"publish","type":"post","link":"https:\/\/blogs.igalia.com\/mshin\/2026\/04\/02\/extension-migration-progress-update-part-1\/","title":{"rendered":"Extension Migration Progress Update &#8211; Part 1"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Background<\/h1>\n\n\n\n<p>Following up on my previous post, I would like to share an update on the progress of the <strong>Extension migration work<\/strong> that has been underway over the past few months.<\/p>\n\n\n\n<p>To briefly recap the motivation behind this effort: Igalia&#8217;s long-term goal is to enable <strong>embedders<\/strong> to use the Extension system <strong>without depending on the <code>\/\/chrome<\/code> layer<\/strong>. In other words, we want to make it possible to support Extension functionality with minimal implementation effort using only <code>\/\/content + \/\/extensions<\/code>.<\/p>\n\n\n\n<p>Currently, some parts of the Extension system still rely on the <code>\/\/chrome<\/code> layer. Our objective is to remove those dependencies so that embedders can integrate Extension capabilities without needing to include the entire <code>\/\/chrome<\/code> layer.<\/p>\n\n\n\n<p>As a <strong>short-term milestone<\/strong>, we focused on migrating the <strong>Extension installation implementation<\/strong> from <code>\/\/chrome<\/code> to <code>\/\/extensions<\/code>. This phase of the work has now been completed, which is why I\u2019m sharing this progress update.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Extension Installation Formats<\/h1>\n\n\n\n<p>Chromium supports several formats for installing Extensions. The most common ones are <strong>zip<\/strong>, <strong>unpacked<\/strong> and <strong>crx.<\/strong><\/p>\n\n\n\n<p>Each format serves a different purpose:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>zip<\/strong> \u2013 commonly used for internal distribution or packaged deployment<\/li>\n\n\n\n<li><strong>unpacked<\/strong> \u2013 primarily used during development and debugging<\/li>\n\n\n\n<li><strong>crx<\/strong> \u2013 the standard packaged format used by the Chrome Web Store<\/li>\n<\/ul>\n\n\n\n<p>During this migration effort, the code responsible for supporting all three installation formats has been successfully moved to the <code>\/\/extensions<\/code> layer.<\/p>\n\n\n\n<p>As a result, the Extension installation pipeline is now significantly less dependent on the <code>\/\/chrome<\/code> layer, bringing us closer to enabling Extension support directly on top of <code>\/\/content + \/\/extensions<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Patch and References<\/h2>\n\n\n\n<p>To support this migration, several patches were introduced to move installation-related components into the <code>\/\/extensions<\/code> layer and decouple them from <code>\/\/chrome<\/code>.<\/p>\n\n\n\n<p>For readers who are interested in the implementation details, you can find the related changes and discussions here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chromium issue tracking this work:<br><a href=\"https:\/\/issues.chromium.org\/issues\/358567092\">https:\/\/issues.chromium.org\/issues\/358567092<\/a><\/li>\n\n\n\n<li>Related code reviews and patches:<br><a href=\"https:\/\/chromium-review.googlesource.com\/q\/myid.shin@igalia.com\">https:\/\/chromium-review.googlesource.com\/q\/myid.shin@igalia.com<\/a><\/li>\n<\/ul>\n\n\n\n<p>These links provide more insight into the design decisions, code changes, and ongoing discussions around the migration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Demo<\/h1>\n\n\n\n<p>Below is a short demo showing the current setup in action.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/blogs.igalia.com\/mshin\/files\/2026\/03\/demo-extension_installation.mp4\"><\/video><\/figure>\n\n\n\n<p>This demo was recorded using\u00a0<code>app_shell<\/code> on Linux, the minimal stripped-down browser container designed to run Chrome Apps and using only\u00a0<code>\/\/content<\/code>\u00a0and\u00a0<code>\/\/extensions<\/code>\/ layers.<\/p>\n\n\n\n<p>To have this executable launcher, we also extended <strong><code>app_shell<\/code> <\/strong>with the minimal functionality required for embedders to install the extension app.<\/p>\n\n\n\n<p>This allows Extensions to be installed and executed <strong>without relying on the full Chrome browser implementation<\/strong>, making it easier to experiment with and validate the migration work.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Next Steps<\/h1>\n\n\n\n<p>The next short-term goal is to <strong>migrate the code required for installing Extensions via the Chrome Web Store<\/strong> into the <code>\/\/extensions<\/code> layer as well.<\/p>\n\n\n\n<p>At the moment, parts of the Web Store installation flow still depend on the <code>\/\/chrome<\/code> layer. The next phase of this project will focus on removing those dependencies so that Web Store-based installation can also function within the <code>\/\/extensions<\/code> layer.<\/p>\n\n\n\n<p>Once this work is completed, embedders will be able to install Extension apps from Chrome WebStore with a significantly simpler architecture (<code>\/\/content + \/\/extensions<\/code>). <\/p>\n\n\n\n<p>This will make the Extension platform <strong>more modular, reusable, and easier to integrate into custom Chromium-based products<\/strong>.<\/p>\n\n\n\n<p>I will continue to share updates as the migration progresses.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Background Following up on my previous post, I would like to share an update on the progress of the Extension migration work that has been underway over the past few months. To briefly recap the motivation behind this effort: Igalia&#8217;s long-term goal is to enable embedders to use the Extension system without depending on the &hellip; <a href=\"https:\/\/blogs.igalia.com\/mshin\/2026\/04\/02\/extension-migration-progress-update-part-1\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Extension Migration Progress Update &#8211; Part 1<\/span><\/a><\/p>\n","protected":false},"author":58,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[4,10,6],"class_list":["post-161","post","type-post","status-publish","format-standard","hentry","category-chromium","category-igalia","tag-chromium","tag-extensions","tag-igalia"],"_links":{"self":[{"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/posts\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/users\/58"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/comments?post=161"}],"version-history":[{"count":4,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/posts\/161\/revisions"}],"predecessor-version":[{"id":167,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/posts\/161\/revisions\/167"}],"wp:attachment":[{"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/media?parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/categories?post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.igalia.com\/mshin\/wp-json\/wp\/v2\/tags?post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}