diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 2866871a004b..5a91062340d6 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -24,6 +24,7 @@ #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/plugin_service.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" @@ -223,6 +224,19 @@ void WebContents::RenderProcessGone(base::TerminationStatus status) { Emit("crashed"); } +void WebContents::PluginCrashed(const base::FilePath& plugin_path, + base::ProcessId plugin_pid) { + content::WebPluginInfo info; + auto plugin_service = content::PluginService::GetInstance(); + plugin_service->GetPluginInfoByPath(plugin_path, &info); + Emit("plugin-crashed", info.name, info.version); +} + +void WebContents::OnGpuProcessCrashed(base::TerminationStatus exit_code) { + if (exit_code == base::TERMINATION_STATUS_PROCESS_CRASHED) + Emit("gpu-crashed"); +} + void WebContents::DocumentLoadedInFrame( content::RenderFrameHost* render_frame_host) { if (!render_frame_host->GetParent()) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index e75cfb0267f0..4d0937436f36 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -14,6 +14,7 @@ #include "content/public/common/favicon_url.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/gpu_data_manager_observer.h" #include "native_mate/handle.h" #include "ui/gfx/image/image.h" @@ -35,7 +36,8 @@ namespace api { class WebContents : public mate::EventEmitter, public content::BrowserPluginGuestDelegate, public content::WebContentsDelegate, - public content::WebContentsObserver { + public content::WebContentsObserver, + public content::GpuDataManagerObserver { public: // Create from an existing WebContents. static mate::Handle CreateFrom( @@ -182,6 +184,8 @@ class WebContents : public mate::EventEmitter, void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override; void DidUpdateFaviconURL( const std::vector& urls) override; + void PluginCrashed(const base::FilePath& plugin_path, + base::ProcessId plugin_pid) override; // content::BrowserPluginGuestDelegate: void DidAttach(int guest_proxy_routing_id) final; @@ -194,6 +198,9 @@ class WebContents : public mate::EventEmitter, int element_instance_id, bool is_full_page_plugin) final; + // content::GpuDataManagerObserver: + void OnGpuProcessCrashed(base::TerminationStatus exit_code) override; + private: // Called when received a message from renderer. void OnRendererMessage(const base::string16& channel, diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index a02a1676e8e6..9403466f27a7 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -15,6 +15,8 @@ supportedWebViewEvents = [ 'new-window' 'close' 'crashed' + 'gpu-crashed' + 'plugin-crashed' 'destroyed' 'page-title-set' 'page-favicon-updated' diff --git a/atom/renderer/lib/web-view/guest-view-internal.coffee b/atom/renderer/lib/web-view/guest-view-internal.coffee index 04aa5c5494f0..fb1b40d27e1f 100644 --- a/atom/renderer/lib/web-view/guest-view-internal.coffee +++ b/atom/renderer/lib/web-view/guest-view-internal.coffee @@ -17,6 +17,8 @@ WEB_VIEW_EVENTS = 'new-window': ['url', 'frameName', 'disposition'] 'close': [] 'crashed': [] + 'gpu-crashed': [] + 'plugin-crashed': ['name', 'version'] 'destroyed': [] 'page-title-set': ['title', 'explicitSet'] 'page-favicon-updated': ['favicons'] diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index f8ff8e7b9e0c..9808e3abfd15 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -724,6 +724,18 @@ Calling `event.preventDefault()` can prevent the navigation. Emitted when the renderer process is crashed. +### Event: 'gpu-crashed' + +Emitted when the gpu process is crashed. + +### Event: 'plugin-crashed' + +* `event` Event +* `name` String +* `version` String + +Emitted when a plugin process is crashed. + ### Event: 'destroyed' Emitted when the WebContents is destroyed. diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index 3e008a5db258..49c16fabae93 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -434,6 +434,17 @@ ipc.on('ping', function() { Fired when the renderer process is crashed. +### gpu-crashed + +Fired when the gpu process is crashed. + +### plugin-crashed + +* `name` String +* `version` String + +Fired when a plugin process is crashed. + ### destroyed Fired when the WebContents is destroyed.