| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | // Copyright 2018 The Chromium Authors. All rights reserved.
 | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 08:34:31 +01:00
										 |  |  | #ifndef ELECTRON_SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
 | 
					
						
							|  |  |  | #define ELECTRON_SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-03 12:43:42 +01:00
										 |  |  | #include "base/functional/callback.h"
 | 
					
						
							| 
									
										
										
										
											2023-05-11 16:07:39 -04:00
										 |  |  | #include "base/memory/raw_ptr.h"
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | #include "base/memory/weak_ptr.h"
 | 
					
						
							|  |  |  | #include "extensions/browser/extension_registrar.h"
 | 
					
						
							|  |  |  | #include "extensions/common/extension_id.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace base { | 
					
						
							|  |  |  | class FilePath; | 
					
						
							| 
									
										
										
										
											2021-07-01 17:51:37 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace content { | 
					
						
							|  |  |  | class BrowserContext; | 
					
						
							| 
									
										
										
										
											2021-07-01 17:51:37 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace extensions { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Extension; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Handles extension loading and reloading using ExtensionRegistrar.
 | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  | class ElectronExtensionLoader : public ExtensionRegistrar::Delegate { | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |  public: | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  |   explicit ElectronExtensionLoader(content::BrowserContext* browser_context); | 
					
						
							|  |  |  |   ~ElectronExtensionLoader() override; | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-03 12:41:45 +01:00
										 |  |  |   // disable copy
 | 
					
						
							|  |  |  |   ElectronExtensionLoader(const ElectronExtensionLoader&) = delete; | 
					
						
							|  |  |  |   ElectronExtensionLoader& operator=(const ElectronExtensionLoader&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |   // Loads an unpacked extension from a directory synchronously. Returns the
 | 
					
						
							|  |  |  |   // extension on success, or nullptr otherwise.
 | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  |   void LoadExtension(const base::FilePath& extension_dir, | 
					
						
							| 
									
										
										
										
											2021-02-02 01:41:08 +03:00
										 |  |  |                      int load_flags, | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  |                      base::OnceCallback<void(const Extension* extension, | 
					
						
							|  |  |  |                                              const std::string&)> cb); | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Starts reloading the extension. A keep-alive is maintained until the
 | 
					
						
							|  |  |  |   // reload succeeds/fails. If the extension is an app, it will be launched upon
 | 
					
						
							|  |  |  |   // reloading.
 | 
					
						
							|  |  |  |   // This may invalidate references to the old Extension object, so it takes the
 | 
					
						
							|  |  |  |   // ID by value.
 | 
					
						
							| 
									
										
										
										
											2020-01-13 14:56:28 -08:00
										 |  |  |   void ReloadExtension(const ExtensionId& extension_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void UnloadExtension(const ExtensionId& extension_id, | 
					
						
							|  |  |  |                        extensions::UnloadedExtensionReason reason); | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-12 16:39:12 -08:00
										 |  |  |   ExtensionRegistrar* registrar() { return &extension_registrar_; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |  private: | 
					
						
							|  |  |  |   // If the extension loaded successfully, enables it. If it's an app, launches
 | 
					
						
							|  |  |  |   // it. If the load failed, updates ShellKeepAliveRequester.
 | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  |   void FinishExtensionReload( | 
					
						
							|  |  |  |       const ExtensionId& old_extension_id, | 
					
						
							|  |  |  |       std::pair<scoped_refptr<const Extension>, std::string> result); | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-03 14:01:10 -08:00
										 |  |  |   void FinishExtensionLoad( | 
					
						
							|  |  |  |       base::OnceCallback<void(const Extension*, const std::string&)> cb, | 
					
						
							|  |  |  |       std::pair<scoped_refptr<const Extension>, std::string> result); | 
					
						
							| 
									
										
										
										
											2020-01-21 09:43:18 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |   // ExtensionRegistrar::Delegate:
 | 
					
						
							|  |  |  |   void PreAddExtension(const Extension* extension, | 
					
						
							|  |  |  |                        const Extension* old_extension) override; | 
					
						
							|  |  |  |   void PostActivateExtension(scoped_refptr<const Extension> extension) override; | 
					
						
							|  |  |  |   void PostDeactivateExtension( | 
					
						
							|  |  |  |       scoped_refptr<const Extension> extension) override; | 
					
						
							| 
									
										
										
										
											2025-02-03 15:10:57 -05:00
										 |  |  |   void PreUninstallExtension(scoped_refptr<const Extension> extension) override; | 
					
						
							|  |  |  |   void PostUninstallExtension(scoped_refptr<const Extension> extension, | 
					
						
							|  |  |  |                               base::OnceClosure done_callback) override; | 
					
						
							|  |  |  |   void PostNotifyUninstallExtension( | 
					
						
							|  |  |  |       scoped_refptr<const Extension> extension) override; | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |   void LoadExtensionForReload( | 
					
						
							|  |  |  |       const ExtensionId& extension_id, | 
					
						
							|  |  |  |       const base::FilePath& path, | 
					
						
							|  |  |  |       ExtensionRegistrar::LoadErrorBehavior load_error_behavior) override; | 
					
						
							| 
									
										
										
										
											2025-02-03 15:10:57 -05:00
										 |  |  |   void ShowExtensionDisabledError(const Extension* extension, | 
					
						
							|  |  |  |                                   bool is_remote_install) override; | 
					
						
							|  |  |  |   void FinishDelayedInstallationsIfAny() override; | 
					
						
							|  |  |  |   bool CanAddExtension(const Extension* extension) override; | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  |   bool CanEnableExtension(const Extension* extension) override; | 
					
						
							|  |  |  |   bool CanDisableExtension(const Extension* extension) override; | 
					
						
							|  |  |  |   bool ShouldBlockExtension(const Extension* extension) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-11 16:07:39 -04:00
										 |  |  |   raw_ptr<content::BrowserContext> browser_context_;  // Not owned.
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Registers and unregisters extensions.
 | 
					
						
							|  |  |  |   ExtensionRegistrar extension_registrar_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Holds keep-alives for relaunching apps.
 | 
					
						
							|  |  |  |   //   ShellKeepAliveRequester keep_alive_requester_;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Indicates that we posted the (asynchronous) task to start reloading.
 | 
					
						
							|  |  |  |   // Used by ReloadExtension() to check whether ExtensionRegistrar calls
 | 
					
						
							|  |  |  |   // LoadExtensionForReload().
 | 
					
						
							|  |  |  |   bool did_schedule_reload_ = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 19:16:21 +01:00
										 |  |  |   base::WeakPtrFactory<ElectronExtensionLoader> weak_factory_{this}; | 
					
						
							| 
									
										
										
										
											2019-07-24 19:01:08 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace extensions
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 08:34:31 +01:00
										 |  |  | #endif  // ELECTRON_SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
 |