Browse Source

fix: crash when loadExtension fails (#27589)

Co-authored-by: samuelmaddock <[email protected]>
trop[bot] 4 years ago
parent
commit
cc4db3359d

+ 15 - 15
shell/browser/extensions/electron_extension_loader.cc

@@ -112,22 +112,22 @@ void ElectronExtensionLoader::FinishExtensionLoad(
   scoped_refptr<const Extension> extension = result.first;
   if (extension) {
     extension_registrar_.AddExtension(extension);
-  }
 
-  // Write extension install time to ExtensionPrefs. This is required by
-  // WebRequestAPI which calls extensions::ExtensionPrefs::GetInstallTime.
-  //
-  // Implementation for writing the pref was based on
-  // PreferenceAPIBase::SetExtensionControlledPref.
-  {
-    ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser_context_);
-    ExtensionPrefs::ScopedDictionaryUpdate update(
-        extension_prefs, extension.get()->id(),
-        extensions::pref_names::kPrefPreferences);
-    auto preference = update.Create();
-    const base::Time install_time = base::Time().Now();
-    preference->SetString("install_time",
-                          base::NumberToString(install_time.ToInternalValue()));
+    // Write extension install time to ExtensionPrefs. This is required by
+    // WebRequestAPI which calls extensions::ExtensionPrefs::GetInstallTime.
+    //
+    // Implementation for writing the pref was based on
+    // PreferenceAPIBase::SetExtensionControlledPref.
+    {
+      ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser_context_);
+      ExtensionPrefs::ScopedDictionaryUpdate update(
+          extension_prefs, extension.get()->id(),
+          extensions::pref_names::kPrefPreferences);
+      auto preference = update.Create();
+      const base::Time install_time = base::Time().Now();
+      preference->SetString(
+          "install_time", base::NumberToString(install_time.ToInternalValue()));
+    }
   }
 
   std::move(cb).Run(extension.get(), result.second);

+ 6 - 0
spec-main/extensions-spec.ts

@@ -107,6 +107,12 @@ describe('chrome extensions', () => {
     expect(bg).to.equal('red');
   });
 
+  it('does not crash when failing to load an extension', async () => {
+    const customSession = session.fromPartition(`persist:${uuid.v4()}`);
+    const promise = customSession.loadExtension(path.join(fixtures, 'extensions', 'load-error'));
+    await expect(promise).to.eventually.be.rejected();
+  });
+
   it('serializes a loaded extension', async () => {
     const extensionPath = path.join(fixtures, 'extensions', 'red-bg');
     const manifest = JSON.parse(fs.readFileSync(path.join(extensionPath, 'manifest.json'), 'utf-8'));

+ 8 - 0
spec-main/fixtures/extensions/load-error/manifest.json

@@ -0,0 +1,8 @@
+{
+  "name": "load-error",
+  "version": "1.0",
+  "icons": {
+    "16": "/images/error.png"
+  },
+  "manifest_version": 2
+}