atom_api_app.h 9.4 KB

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