From 87fb6baaa7c8e16e8cef14730822bcca763b61af Mon Sep 17 00:00:00 2001 From: samuelmaddock Date: Sun, 16 Feb 2020 19:25:08 -0500 Subject: [PATCH] fix(extensions): devtools now open for background pages --- .../browser/api/electron_api_web_contents.cc | 55 +++++++++++++++++-- shell/browser/api/electron_api_web_contents.h | 2 +- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 1cb8bf5fdacd8..04d7daf6197ff 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -114,6 +114,7 @@ #endif #if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) +#include "extensions/browser/view_type_utils.h" #include "shell/browser/extensions/electron_extension_web_contents_observer.h" #endif @@ -374,21 +375,56 @@ base::string16 GetDefaultPrinterAsync() { } // namespace +#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) + +WebContents::Type GetTypeFromViewType(extensions::ViewType view_type) { + switch (view_type) { + case extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE: + return WebContents::Type::BACKGROUND_PAGE; + + case extensions::VIEW_TYPE_APP_WINDOW: + case extensions::VIEW_TYPE_COMPONENT: + case extensions::VIEW_TYPE_EXTENSION_DIALOG: + case extensions::VIEW_TYPE_EXTENSION_POPUP: + case extensions::VIEW_TYPE_BACKGROUND_CONTENTS: + case extensions::VIEW_TYPE_EXTENSION_GUEST: + case extensions::VIEW_TYPE_TAB_CONTENTS: + case extensions::VIEW_TYPE_INVALID: + return WebContents::Type::REMOTE; + } +} + +#endif + WebContents::WebContents(v8::Isolate* isolate, content::WebContents* web_contents) : content::WebContentsObserver(web_contents), type_(Type::REMOTE), weak_factory_(this) { - web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent(), - false); - Init(isolate); - AttachAsUserData(web_contents); - InitZoomController(web_contents, gin::Dictionary::CreateEmpty(isolate)); #if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) + // WebContents created by extension host will have valid ViewType set. + // Must reassign type prior to calling 'Init'. + extensions::ViewType view_type = extensions::GetViewType(web_contents); + if (view_type != extensions::VIEW_TYPE_INVALID) { + type_ = GetTypeFromViewType(view_type); + + // Allow toggling DevTools for background pages + // TODO(samuelmaddock): this causes a crash on shutdown + Observe(web_contents); + InitWithWebContents(web_contents, GetBrowserContext(), IsGuest()); + managed_web_contents()->GetView()->SetDelegate(this); + } + extensions::ElectronExtensionWebContentsObserver::CreateForWebContents( web_contents); script_executor_.reset(new extensions::ScriptExecutor(web_contents)); #endif + + web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent(), + false); + Init(isolate); + AttachAsUserData(web_contents); + InitZoomController(web_contents, gin::Dictionary::CreateEmpty(isolate)); registry_.AddInterface(base::BindRepeating(&WebContents::BindElectronBrowser, base::Unretained(this))); bindings_.set_connection_error_handler(base::BindRepeating( @@ -1259,6 +1295,7 @@ void WebContents::DevToolsFocused() { void WebContents::DevToolsOpened() { v8::Locker locker(isolate()); v8::HandleScope handle_scope(isolate()); + DCHECK(managed_web_contents()); auto handle = FromOrCreate(isolate(), managed_web_contents()->GetDevToolsWebContents()); devtools_web_contents_.Reset(isolate(), handle.ToV8()); @@ -1576,6 +1613,8 @@ void WebContents::OpenDevTools(gin_helper::Arguments* args) { options.Get("activate", &activate); } } + + DCHECK(managed_web_contents()); managed_web_contents()->SetDockState(state); managed_web_contents()->ShowDevTools(activate); } @@ -1584,6 +1623,7 @@ void WebContents::CloseDevTools() { if (type_ == Type::REMOTE) return; + DCHECK(managed_web_contents()); managed_web_contents()->CloseDevTools(); } @@ -1591,6 +1631,7 @@ bool WebContents::IsDevToolsOpened() { if (type_ == Type::REMOTE) return false; + DCHECK(managed_web_contents()); return managed_web_contents()->IsDevToolsViewShowing(); } @@ -1598,6 +1639,7 @@ bool WebContents::IsDevToolsFocused() { if (type_ == Type::REMOTE) return false; + DCHECK(managed_web_contents()); return managed_web_contents()->GetView()->IsDevToolsViewFocused(); } @@ -1606,6 +1648,7 @@ void WebContents::EnableDeviceEmulation( if (type_ == Type::REMOTE) return; + DCHECK(web_contents()); auto* frame_host = web_contents()->GetMainFrame(); if (frame_host) { auto* widget_host = @@ -1621,6 +1664,7 @@ void WebContents::DisableDeviceEmulation() { if (type_ == Type::REMOTE) return; + DCHECK(web_contents()); auto* frame_host = web_contents()->GetMainFrame(); if (frame_host) { auto* widget_host = @@ -1646,6 +1690,7 @@ void WebContents::InspectElement(int x, int y) { if (!enable_devtools_) return; + DCHECK(managed_web_contents()); if (!managed_web_contents()->GetDevToolsWebContents()) OpenDevTools(nullptr); managed_web_contents()->InspectElement(x, y); diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index 3777df745f05f..4218944b5667f 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -97,7 +97,7 @@ class WebContents : public gin_helper::TrackableObject, public mojom::ElectronBrowser { public: enum class Type { - BACKGROUND_PAGE, // A DevTools extension background page. + BACKGROUND_PAGE, // An extension background page. BROWSER_WINDOW, // Used by BrowserWindow. BROWSER_VIEW, // Used by BrowserView. REMOTE, // Thin wrap around an existing WebContents.