diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index e3b86572d9f..e9dfd9f47f4 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -95,17 +95,21 @@ content::ServiceWorkerContext* GetServiceWorkerContext( if (!context || !site_instance) return nullptr; - content::StoragePartition* storage_partition = - content::BrowserContext::GetStoragePartition( - context, site_instance); - - DCHECK(storage_partition); + auto storage_partition = + content::BrowserContext::GetStoragePartition(context, site_instance); + if (!storage_partition) + return nullptr; return storage_partition->GetServiceWorkerContext(); } } // namespace +WebContents::WebContents(brightray::InspectableWebContents* web_contents) + : WebContents(web_contents->GetWebContents()) { + inspectable_web_contents_ = web_contents; +} + WebContents::WebContents(content::WebContents* web_contents) : CommonWebContentsDelegate(false), content::WebContentsObserver(web_contents), @@ -113,7 +117,8 @@ WebContents::WebContents(content::WebContents* web_contents) guest_opaque_(true), guest_host_(nullptr), auto_size_enabled_(false), - is_full_page_plugin_(false) { + is_full_page_plugin_(false), + inspectable_web_contents_(nullptr) { } WebContents::WebContents(const mate::Dictionary& options) @@ -136,6 +141,7 @@ WebContents::WebContents(const mate::Dictionary& options) auto web_contents = content::WebContents::Create(params); InitWithWebContents(web_contents, GetWindowFromGuest(web_contents)); + inspectable_web_contents_ = managed_web_contents(); Observe(GetWebContents()); } @@ -525,25 +531,67 @@ void WebContents::ExecuteJavaScript(const base::string16& code) { } void WebContents::OpenDevTools() { + if (!inspectable_web_contents()) + return; inspectable_web_contents()->SetCanDock(false); inspectable_web_contents()->ShowDevTools(); } void WebContents::CloseDevTools() { + if (!inspectable_web_contents()) + return; inspectable_web_contents()->CloseDevTools(); } bool WebContents::IsDevToolsOpened() { + if (!inspectable_web_contents()) + return false; return inspectable_web_contents()->IsDevToolsViewShowing(); } void WebContents::InspectElement(int x, int y) { + if (!inspectable_web_contents()) + return; OpenDevTools(); scoped_refptr agent( content::DevToolsAgentHost::GetOrCreateFor(web_contents())); agent->InspectElement(x, y); } +void WebContents::InspectServiceWorker() { + if (!inspectable_web_contents()) + return; + for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { + if (agent_host->GetType() == + content::DevToolsAgentHost::TYPE_SERVICE_WORKER) { + OpenDevTools(); + inspectable_web_contents()->AttachTo(agent_host); + break; + } + } +} + +void WebContents::HasServiceWorker( + const base::Callback& callback) { + auto context = GetServiceWorkerContext(web_contents()); + if (!context) + return; + + context->CheckHasServiceWorker(web_contents()->GetLastCommittedURL(), + GURL::EmptyGURL(), + callback); +} + +void WebContents::UnregisterServiceWorker( + const base::Callback& callback) { + auto context = GetServiceWorkerContext(web_contents()); + if (!context) + return; + + context->UnregisterServiceWorker(web_contents()->GetLastCommittedURL(), + callback); +} + void WebContents::Undo() { web_contents()->Undo(); } @@ -669,38 +717,6 @@ bool WebContents::IsGuest() const { return is_guest(); } -void WebContents::HasServiceWorker( - const base::Callback& callback) { - auto context = GetServiceWorkerContext(web_contents()); - if (!context) - return; - - context->CheckHasServiceWorker(web_contents()->GetLastCommittedURL(), - GURL::EmptyGURL(), - callback); -} - -void WebContents::UnregisterServiceWorker( - const base::Callback& callback) { - auto context = GetServiceWorkerContext(web_contents()); - if (!context) - return; - - context->UnregisterServiceWorker(web_contents()->GetLastCommittedURL(), - callback); -} - -void WebContents::InspectServiceWorker() { - for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { - if (agent_host->GetType() == - content::DevToolsAgentHost::TYPE_SERVICE_WORKER) { - OpenDevTools(); - inspectable_web_contents()->AttachTo(agent_host); - break; - } - } -} - mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder( v8::Isolate* isolate) { if (template_.IsEmpty()) @@ -781,6 +797,12 @@ gfx::Size WebContents::GetDefaultSize() const { } } +// static +mate::Handle WebContents::CreateFrom( + v8::Isolate* isolate, brightray::InspectableWebContents* web_contents) { + return mate::CreateHandle(isolate, new WebContents(web_contents)); +} + // static mate::Handle WebContents::CreateFrom( v8::Isolate* isolate, content::WebContents* web_contents) { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 278426e7359..486c61c5dda 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -52,6 +52,8 @@ class WebContents : public mate::EventEmitter, public content::GpuDataManagerObserver { public: // Create from an existing WebContents. + static mate::Handle CreateFrom( + v8::Isolate* isolate, brightray::InspectableWebContents* web_contents); static mate::Handle CreateFrom( v8::Isolate* isolate, content::WebContents* web_contents); @@ -80,9 +82,9 @@ class WebContents : public mate::EventEmitter, void CloseDevTools(); bool IsDevToolsOpened(); void InspectElement(int x, int y); + void InspectServiceWorker(); void HasServiceWorker(const base::Callback&); void UnregisterServiceWorker(const base::Callback&); - void InspectServiceWorker(); // Editing commands. void Undo(); @@ -113,11 +115,14 @@ class WebContents : public mate::EventEmitter, // Returns whether this guest has an associated embedder. bool attached() const { return !!embedder_web_contents_; } - content::WebContents* web_contents() const { - return content::WebContentsObserver::web_contents(); + // Returns the current InspectableWebContents object, nullptr will be returned + // if current WebContents can not beinspected, e.g. it is the devtools. + brightray::InspectableWebContents* inspectable_web_contents() const { + return inspectable_web_contents_; } protected: + explicit WebContents(brightray::InspectableWebContents* web_contents); explicit WebContents(content::WebContents* web_contents); explicit WebContents(const mate::Dictionary& options); ~WebContents(); @@ -257,6 +262,10 @@ class WebContents : public mate::EventEmitter, // Whether the guest view is inside a plugin document. bool is_full_page_plugin_; + // Current InspectableWebContents object, can be nullptr for WebContents of + // devtools. It is a weak reference. + brightray::InspectableWebContents* inspectable_web_contents_; + DISALLOW_COPY_AND_ASSIGN(WebContents); }; diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index f689af1288b..fec072e27f9 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -473,7 +473,7 @@ bool Window::IsVisibleOnAllWorkspaces() { } mate::Handle Window::GetWebContents(v8::Isolate* isolate) const { - return WebContents::CreateFrom(isolate, window_->GetWebContents()); + return WebContents::CreateFrom(isolate, window_->managed_web_contents()); } mate::Handle Window::GetDevToolsWebContents( diff --git a/atom/browser/common_web_contents_delegate.h b/atom/browser/common_web_contents_delegate.h index 6366e7410cc..5d80ac42c36 100644 --- a/atom/browser/common_web_contents_delegate.h +++ b/atom/browser/common_web_contents_delegate.h @@ -38,7 +38,7 @@ class CommonWebContentsDelegate // Returns the WebContents of devtools. content::WebContents* GetDevToolsWebContents() const; - brightray::InspectableWebContents* inspectable_web_contents() const { + brightray::InspectableWebContents* managed_web_contents() const { return web_contents_.get(); } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 1726d9d372d..f6b88e4e401 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -212,6 +212,10 @@ class NativeWindow : public CommonWebContentsDelegate, observers_.RemoveObserver(obs); } + brightray::InspectableWebContents* inspectable_web_contents() const { + return managed_web_contents(); + } + bool has_frame() const { return has_frame_; } bool is_html_api_fullscreen() const { return html_fullscreen_; }