atom_api_app.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. // Copyright (c) 2013 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ATOM_BROWSER_API_ATOM_API_APP_H_
  5. #define ATOM_BROWSER_API_ATOM_API_APP_H_
  6. #include <memory>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <utility>
  10. #include <vector>
  11. #include "atom/browser/api/event_emitter.h"
  12. #include "atom/browser/atom_browser_client.h"
  13. #include "atom/browser/browser.h"
  14. #include "atom/browser/browser_observer.h"
  15. #include "atom/common/native_mate_converters/callback.h"
  16. #include "atom/common/promise_util.h"
  17. #include "base/process/process_iterator.h"
  18. #include "base/task/cancelable_task_tracker.h"
  19. #include "chrome/browser/icon_manager.h"
  20. #include "chrome/browser/process_singleton.h"
  21. #include "content/public/browser/browser_child_process_observer.h"
  22. #include "content/public/browser/gpu_data_manager_observer.h"
  23. #include "content/public/browser/render_process_host.h"
  24. #include "native_mate/dictionary.h"
  25. #include "native_mate/handle.h"
  26. #include "net/base/completion_callback.h"
  27. #include "net/ssl/client_cert_identity.h"
  28. #if defined(USE_NSS_CERTS)
  29. #include "chrome/browser/certificate_manager_model.h"
  30. #endif
  31. namespace base {
  32. class FilePath;
  33. }
  34. namespace mate {
  35. class Arguments;
  36. } // namespace mate
  37. namespace atom {
  38. #if defined(OS_WIN)
  39. enum class JumpListResult : int;
  40. #endif
  41. struct ProcessMetric {
  42. int type;
  43. base::ProcessId pid;
  44. std::unique_ptr<base::ProcessMetrics> metrics;
  45. ProcessMetric(int type,
  46. base::ProcessId pid,
  47. std::unique_ptr<base::ProcessMetrics> metrics);
  48. ~ProcessMetric();
  49. };
  50. namespace api {
  51. class App : public AtomBrowserClient::Delegate,
  52. public mate::EventEmitter<App>,
  53. public BrowserObserver,
  54. public content::GpuDataManagerObserver,
  55. public content::BrowserChildProcessObserver {
  56. public:
  57. using FileIconCallback =
  58. base::Callback<void(v8::Local<v8::Value>, const gfx::Image&)>;
  59. static mate::Handle<App> Create(v8::Isolate* isolate);
  60. static void BuildPrototype(v8::Isolate* isolate,
  61. v8::Local<v8::FunctionTemplate> prototype);
  62. #if defined(USE_NSS_CERTS)
  63. void OnCertificateManagerModelCreated(
  64. std::unique_ptr<base::DictionaryValue> options,
  65. const net::CompletionCallback& callback,
  66. std::unique_ptr<CertificateManagerModel> model);
  67. #endif
  68. base::FilePath GetAppPath() const;
  69. void RenderProcessReady(content::RenderProcessHost* host);
  70. void RenderProcessDisconnected(base::ProcessId host_pid);
  71. void PreMainMessageLoopRun();
  72. protected:
  73. explicit App(v8::Isolate* isolate);
  74. ~App() override;
  75. // BrowserObserver:
  76. void OnBeforeQuit(bool* prevent_default) override;
  77. void OnWillQuit(bool* prevent_default) override;
  78. void OnWindowAllClosed() override;
  79. void OnQuit() override;
  80. void OnOpenFile(bool* prevent_default, const std::string& file_path) override;
  81. void OnOpenURL(const std::string& url) override;
  82. void OnActivate(bool has_visible_windows) override;
  83. void OnWillFinishLaunching() override;
  84. void OnFinishLaunching(const base::DictionaryValue& launch_info) override;
  85. void OnLogin(scoped_refptr<LoginHandler> login_handler,
  86. const base::DictionaryValue& request_details) override;
  87. void OnAccessibilitySupportChanged() override;
  88. void OnPreMainMessageLoopRun() override;
  89. #if defined(OS_MACOSX)
  90. void OnWillContinueUserActivity(bool* prevent_default,
  91. const std::string& type) override;
  92. void OnDidFailToContinueUserActivity(const std::string& type,
  93. const std::string& error) override;
  94. void OnContinueUserActivity(bool* prevent_default,
  95. const std::string& type,
  96. const base::DictionaryValue& user_info) override;
  97. void OnUserActivityWasContinued(
  98. const std::string& type,
  99. const base::DictionaryValue& user_info) override;
  100. void OnUpdateUserActivityState(
  101. bool* prevent_default,
  102. const std::string& type,
  103. const base::DictionaryValue& user_info) override;
  104. void OnNewWindowForTab() override;
  105. #endif
  106. // content::ContentBrowserClient:
  107. void AllowCertificateError(
  108. content::WebContents* web_contents,
  109. int cert_error,
  110. const net::SSLInfo& ssl_info,
  111. const GURL& request_url,
  112. content::ResourceType resource_type,
  113. bool strict_enforcement,
  114. bool expired_previous_decision,
  115. const base::Callback<void(content::CertificateRequestResultType)>&
  116. callback) override;
  117. void SelectClientCertificate(
  118. content::WebContents* web_contents,
  119. net::SSLCertRequestInfo* cert_request_info,
  120. net::ClientCertIdentityList client_certs,
  121. std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
  122. bool CanCreateWindow(content::RenderFrameHost* opener,
  123. const GURL& opener_url,
  124. const GURL& opener_top_level_frame_url,
  125. const GURL& source_origin,
  126. content::mojom::WindowContainerType container_type,
  127. const GURL& target_url,
  128. const content::Referrer& referrer,
  129. const std::string& frame_name,
  130. WindowOpenDisposition disposition,
  131. const blink::mojom::WindowFeatures& features,
  132. const std::vector<std::string>& additional_features,
  133. const scoped_refptr<network::ResourceRequestBody>& body,
  134. bool user_gesture,
  135. bool opener_suppressed,
  136. bool* no_javascript_access) override;
  137. // content::GpuDataManagerObserver:
  138. void OnGpuProcessCrashed(base::TerminationStatus status) override;
  139. // content::BrowserChildProcessObserver:
  140. void BrowserChildProcessLaunchedAndConnected(
  141. const content::ChildProcessData& data) override;
  142. void BrowserChildProcessHostDisconnected(
  143. const content::ChildProcessData& data) override;
  144. void BrowserChildProcessCrashed(
  145. const content::ChildProcessData& data,
  146. const content::ChildProcessTerminationInfo& info) override;
  147. void BrowserChildProcessKilled(
  148. const content::ChildProcessData& data,
  149. const content::ChildProcessTerminationInfo& info) override;
  150. private:
  151. void SetAppPath(const base::FilePath& app_path);
  152. void ChildProcessLaunched(int process_type, base::ProcessHandle handle);
  153. void ChildProcessDisconnected(base::ProcessId pid);
  154. // Get/Set the pre-defined path in PathService.
  155. base::FilePath GetPath(mate::Arguments* args, const std::string& name);
  156. void SetPath(mate::Arguments* args,
  157. const std::string& name,
  158. const base::FilePath& path);
  159. void SetDesktopName(const std::string& desktop_name);
  160. std::string GetLocale();
  161. void OnSecondInstance(const base::CommandLine::StringVector& cmd,
  162. const base::FilePath& cwd);
  163. bool HasSingleInstanceLock() const;
  164. bool RequestSingleInstanceLock();
  165. void ReleaseSingleInstanceLock();
  166. bool Relaunch(mate::Arguments* args);
  167. void DisableHardwareAcceleration(mate::Arguments* args);
  168. void DisableDomainBlockingFor3DAPIs(mate::Arguments* args);
  169. bool IsAccessibilitySupportEnabled();
  170. void SetAccessibilitySupportEnabled(bool enabled, mate::Arguments* args);
  171. Browser::LoginItemSettings GetLoginItemSettings(mate::Arguments* args);
  172. #if defined(USE_NSS_CERTS)
  173. void ImportCertificate(const base::DictionaryValue& options,
  174. const net::CompletionCallback& callback);
  175. #endif
  176. void GetFileIcon(const base::FilePath& path, mate::Arguments* args);
  177. std::vector<mate::Dictionary> GetAppMetrics(v8::Isolate* isolate);
  178. v8::Local<v8::Value> GetGPUFeatureStatus(v8::Isolate* isolate);
  179. v8::Local<v8::Promise> GetGPUInfo(v8::Isolate* isolate,
  180. const std::string& info_type);
  181. void EnableSandbox(mate::Arguments* args);
  182. void EnableMixedSandbox(mate::Arguments* args);
  183. #if defined(OS_MACOSX)
  184. bool MoveToApplicationsFolder(mate::Arguments* args);
  185. bool IsInApplicationsFolder();
  186. #endif
  187. #if defined(MAS_BUILD)
  188. base::Callback<void()> StartAccessingSecurityScopedResource(
  189. mate::Arguments* args);
  190. #endif
  191. #if defined(OS_WIN)
  192. // Get the current Jump List settings.
  193. v8::Local<v8::Value> GetJumpListSettings();
  194. // Set or remove a custom Jump List for the application.
  195. JumpListResult SetJumpList(v8::Local<v8::Value> val, mate::Arguments* args);
  196. #endif // defined(OS_WIN)
  197. std::unique_ptr<ProcessSingleton> process_singleton_;
  198. #if defined(USE_NSS_CERTS)
  199. std::unique_ptr<CertificateManagerModel> certificate_manager_model_;
  200. #endif
  201. // Tracks tasks requesting file icons.
  202. base::CancelableTaskTracker cancelable_task_tracker_;
  203. base::FilePath app_path_;
  204. using ProcessMetricMap =
  205. std::unordered_map<base::ProcessId, std::unique_ptr<atom::ProcessMetric>>;
  206. ProcessMetricMap app_metrics_;
  207. DISALLOW_COPY_AND_ASSIGN(App);
  208. };
  209. } // namespace api
  210. } // namespace atom
  211. #endif // ATOM_BROWSER_API_ATOM_API_APP_H_