Browse Source

feat: support `minimum_chrome_version` manifest key (#39357)

feat: support minimum_chrome_version extension key

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 1 year ago
parent
commit
5f1ada46f5

+ 2 - 0
electron_paks.gni

@@ -174,6 +174,7 @@ template("electron_paks") {
     }
 
     source_patterns = [
+      "${root_gen_dir}/chrome/chromium_strings_",
       "${root_gen_dir}/chrome/locale_settings_",
       "${root_gen_dir}/chrome/platform_locale_settings_",
       "${root_gen_dir}/chrome/generated_resources_",
@@ -189,6 +190,7 @@ template("electron_paks") {
       "${root_gen_dir}/ui/strings/ui_strings_",
     ]
     deps = [
+      "//chrome/app:chromium_strings",
       "//chrome/app:generated_resources",
       "//chrome/app/resources:locale_settings",
       "//chrome/app/resources:platform_locale_settings",

+ 4 - 0
shell/common/extensions/api/_manifest_features.json

@@ -14,5 +14,9 @@
   "devtools_page": {
     "channel": "stable",
     "extension_types": ["extension"]
+  },
+  "minimum_chrome_version": {
+    "channel": "stable",
+    "extension_types": ["extension"]
   }
 }

+ 3 - 0
shell/common/extensions/electron_extensions_api_provider.cc

@@ -10,6 +10,7 @@
 #include "base/containers/span.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/common/extensions/chrome_manifest_url_handlers.h"
+#include "chrome/common/extensions/manifest_handlers/minimum_chrome_version_checker.h"
 #include "electron/buildflags/buildflags.h"
 #include "electron/shell/common/extensions/api/generated_schemas.h"
 #include "extensions/common/alias.h"
@@ -99,6 +100,8 @@ void ElectronExtensionsAPIProvider::RegisterManifestHandlers() {
       extensions::ManifestHandlerRegistry::Get();
   registry->RegisterHandler(
       std::make_unique<extensions::DevToolsPageHandler>());
+  registry->RegisterHandler(
+      std::make_unique<extensions::MinimumChromeVersionChecker>());
 }
 
 }  // namespace electron

+ 19 - 0
spec/extensions-spec.ts

@@ -69,6 +69,25 @@ describe('chrome extensions', () => {
     `)).to.eventually.have.property('id');
   });
 
+  it('supports minimum_chrome_version manifest key', async () => {
+    const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
+    const w = new BrowserWindow({
+      show: false,
+      webPreferences: {
+        session: customSession,
+        sandbox: true
+      }
+    });
+
+    await w.loadURL('about:blank');
+
+    const extPath = path.join(fixtures, 'extensions', 'chrome-too-low-version');
+    const load = customSession.loadExtension(extPath);
+    await expect(load).to.eventually.be.rejectedWith(
+      `Loading extension at ${extPath} failed with: This extension requires Chromium version 999 or greater.`
+    );
+  });
+
   it('can open WebSQLDatabase in a background page', async () => {
     const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
     const w = new BrowserWindow({ show: false, webPreferences: { session: customSession, sandbox: true } });

+ 1 - 0
spec/fixtures/extensions/chrome-too-low-version/main.js

@@ -0,0 +1 @@
+document.documentElement.style.backgroundColor = 'blue';

+ 14 - 0
spec/fixtures/extensions/chrome-too-low-version/manifest.json

@@ -0,0 +1,14 @@
+{
+  "name": "chrome-too-low-version",
+  "version": "1.0",
+  "minimum_chrome_version": "999",
+  "content_scripts": [
+    {
+      "matches": ["<all_urls>"],
+      "js": ["main.js"],
+      "run_at": "document_start"
+    }
+  ],
+  "permissions": ["storage"],
+  "manifest_version": 3
+}