atom_api_app.h 8.6 KB

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