From 8baf1dc0e560bd3f801e67b429cc6f602571d5dc Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Wed, 3 Feb 2021 16:29:09 +0900 Subject: [PATCH] fix: crash when loadExtension fails (#27590) Co-authored-by: samuelmaddock --- .../extensions/electron_extension_loader.cc | 30 +++++++++---------- spec-main/extensions-spec.ts | 6 ++++ .../extensions/load-error/manifest.json | 8 +++++ 3 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 spec-main/fixtures/extensions/load-error/manifest.json diff --git a/shell/browser/extensions/electron_extension_loader.cc b/shell/browser/extensions/electron_extension_loader.cc index 7f1dcc3d672a8..4ddacb3309280 100644 --- a/shell/browser/extensions/electron_extension_loader.cc +++ b/shell/browser/extensions/electron_extension_loader.cc @@ -112,22 +112,22 @@ void ElectronExtensionLoader::FinishExtensionLoad( scoped_refptr 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); diff --git a/spec-main/extensions-spec.ts b/spec-main/extensions-spec.ts index 3accb66a8efef..0fc618505210e 100644 --- a/spec-main/extensions-spec.ts +++ b/spec-main/extensions-spec.ts @@ -111,6 +111,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')); diff --git a/spec-main/fixtures/extensions/load-error/manifest.json b/spec-main/fixtures/extensions/load-error/manifest.json new file mode 100644 index 0000000000000..29a9cd7975e3d --- /dev/null +++ b/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 +}