From 505bf24abb6a7d7e3dde11e09e6e2c3a6e9faa87 Mon Sep 17 00:00:00 2001 From: Dmitry Azaraev Date: Thu, 18 Mar 2021 13:17:33 -0400 Subject: [PATCH] chrome: Add DevTools protocol support (see issue #2969) Testable with the following: $ ceftests --enable-chrome-runtime --gtest_filter=DevToolsMessageTest.* --- .../browser/alloy/alloy_browser_host_impl.cc | 78 ------------------- .../browser/alloy/alloy_browser_host_impl.h | 14 ---- libcef/browser/browser_host_base.cc | 77 ++++++++++++++++++ libcef/browser/browser_host_base.h | 14 ++++ .../chrome/chrome_browser_host_impl.cc | 20 ----- .../browser/chrome/chrome_browser_host_impl.h | 6 -- libcef/browser/devtools/devtools_manager.cc | 24 +++--- libcef/browser/devtools/devtools_manager.h | 6 +- 8 files changed, 109 insertions(+), 130 deletions(-) diff --git a/libcef/browser/alloy/alloy_browser_host_impl.cc b/libcef/browser/alloy/alloy_browser_host_impl.cc index e96b7bee2..77f3b7af6 100644 --- a/libcef/browser/alloy/alloy_browser_host_impl.cc +++ b/libcef/browser/alloy/alloy_browser_host_impl.cc @@ -528,82 +528,6 @@ bool AlloyBrowserHostImpl::HasDevTools() { return devtools_manager_->HasDevTools(); } -bool AlloyBrowserHostImpl::SendDevToolsMessage(const void* message, - size_t message_size) { - if (!message || message_size == 0) - return false; - - if (!CEF_CURRENTLY_ON_UIT()) { - std::string message_str(static_cast(message), message_size); - CEF_POST_TASK( - CEF_UIT, - base::BindOnce( - [](CefRefPtr self, std::string message_str) { - self->SendDevToolsMessage(message_str.data(), message_str.size()); - }, - CefRefPtr(this), std::move(message_str))); - return false; - } - - if (!EnsureDevToolsManager()) - return false; - return devtools_manager_->SendDevToolsMessage(message, message_size); -} - -int AlloyBrowserHostImpl::ExecuteDevToolsMethod( - int message_id, - const CefString& method, - CefRefPtr params) { - if (!CEF_CURRENTLY_ON_UIT()) { - CEF_POST_TASK( - CEF_UIT, - base::BindOnce( - base::IgnoreResult(&AlloyBrowserHostImpl::ExecuteDevToolsMethod), - this, message_id, method, params)); - return 0; - } - - if (!EnsureDevToolsManager()) - return 0; - return devtools_manager_->ExecuteDevToolsMethod(message_id, method, params); -} - -CefRefPtr AlloyBrowserHostImpl::AddDevToolsMessageObserver( - CefRefPtr observer) { - if (!observer) - return nullptr; - auto registration = CefDevToolsManager::CreateRegistration(observer); - InitializeDevToolsRegistrationOnUIThread(registration); - return registration.get(); -} - -bool AlloyBrowserHostImpl::EnsureDevToolsManager() { - CEF_REQUIRE_UIT(); - if (!web_contents()) - return false; - - if (!devtools_manager_) { - devtools_manager_.reset(new CefDevToolsManager(this)); - } - return true; -} - -void AlloyBrowserHostImpl::InitializeDevToolsRegistrationOnUIThread( - CefRefPtr registration) { - if (!CEF_CURRENTLY_ON_UIT()) { - CEF_POST_TASK( - CEF_UIT, - base::BindOnce( - &AlloyBrowserHostImpl::InitializeDevToolsRegistrationOnUIThread, - this, registration)); - return; - } - - if (!EnsureDevToolsManager()) - return; - devtools_manager_->InitializeRegistrationOnUIThread(registration); -} - void AlloyBrowserHostImpl::SetAccessibilityState( cef_state_t accessibility_state) { if (!CEF_CURRENTLY_ON_UIT()) { @@ -857,8 +781,6 @@ void AlloyBrowserHostImpl::DestroyBrowser() { recently_audible_timer_.Stop(); audio_capturer_.reset(nullptr); - devtools_manager_.reset(nullptr); - CefBrowserHostBase::DestroyBrowser(); } diff --git a/libcef/browser/alloy/alloy_browser_host_impl.h b/libcef/browser/alloy/alloy_browser_host_impl.h index 1a0e510e0..89d8773b3 100644 --- a/libcef/browser/alloy/alloy_browser_host_impl.h +++ b/libcef/browser/alloy/alloy_browser_host_impl.h @@ -31,7 +31,6 @@ class CefAudioCapturer; class CefBrowserInfo; -class CefDevToolsManager; class SiteInstance; // CefBrowser implementation for the alloy runtime. Method calls are delegated @@ -112,12 +111,6 @@ class AlloyBrowserHostImpl : public CefBrowserHostBase, const CefPoint& inspect_element_at) override; void CloseDevTools() override; bool HasDevTools() override; - bool SendDevToolsMessage(const void* message, size_t message_size) override; - int ExecuteDevToolsMethod(int message_id, - const CefString& method, - CefRefPtr params) override; - CefRefPtr AddDevToolsMessageObserver( - CefRefPtr observer) override; bool IsWindowRenderingDisabled() override; void WasResized() override; void WasHidden(bool hidden) override; @@ -352,10 +345,6 @@ class AlloyBrowserHostImpl : public CefBrowserHostBase, void StartAudioCapturer(); void OnRecentlyAudibleTimerFired(); - bool EnsureDevToolsManager(); - void InitializeDevToolsRegistrationOnUIThread( - CefRefPtr registration); - void SetFocusInternal(bool focus); CefWindowHandle opener_; @@ -381,9 +370,6 @@ class AlloyBrowserHostImpl : public CefBrowserHostBase, // Used for creating and managing context menus. std::unique_ptr menu_manager_; - // Used for creating and managing DevTools instances. - std::unique_ptr devtools_manager_; - // Used for capturing audio for CefAudioHandler. std::unique_ptr audio_capturer_; diff --git a/libcef/browser/browser_host_base.cc b/libcef/browser/browser_host_base.cc index e30a9a21c..0520a5798 100644 --- a/libcef/browser/browser_host_base.cc +++ b/libcef/browser/browser_host_base.cc @@ -185,6 +185,8 @@ void CefBrowserHostBase::InitializeBrowser() { void CefBrowserHostBase::DestroyBrowser() { CEF_REQUIRE_UIT(); + devtools_manager_.reset(nullptr); + platform_delegate_.reset(nullptr); contents_delegate_->RemoveObserver(this); @@ -289,6 +291,54 @@ void CefBrowserHostBase::DownloadImage( max_image_size, callback)); } +bool CefBrowserHostBase::SendDevToolsMessage(const void* message, + size_t message_size) { + if (!message || message_size == 0) + return false; + + if (!CEF_CURRENTLY_ON_UIT()) { + std::string message_str(static_cast(message), message_size); + CEF_POST_TASK( + CEF_UIT, + base::BindOnce( + [](CefRefPtr self, std::string message_str) { + self->SendDevToolsMessage(message_str.data(), message_str.size()); + }, + CefRefPtr(this), std::move(message_str))); + return false; + } + + if (!EnsureDevToolsManager()) + return false; + return devtools_manager_->SendDevToolsMessage(message, message_size); +} + +int CefBrowserHostBase::ExecuteDevToolsMethod( + int message_id, + const CefString& method, + CefRefPtr params) { + if (!CEF_CURRENTLY_ON_UIT()) { + CEF_POST_TASK( + CEF_UIT, base::BindOnce(base::IgnoreResult( + &CefBrowserHostBase::ExecuteDevToolsMethod), + this, message_id, method, params)); + return 0; + } + + if (!EnsureDevToolsManager()) + return 0; + return devtools_manager_->ExecuteDevToolsMethod(message_id, method, params); +} + +CefRefPtr CefBrowserHostBase::AddDevToolsMessageObserver( + CefRefPtr observer) { + if (!observer) + return nullptr; + auto registration = CefDevToolsManager::CreateRegistration(observer); + InitializeDevToolsRegistrationOnUIThread(registration); + return registration.get(); +} + void CefBrowserHostBase::GetNavigationEntries( CefRefPtr visitor, bool current_only) { @@ -811,3 +861,30 @@ CefRefPtr CefBrowserHostBase::GetBrowserView() const { return nullptr; } #endif // defined(TOOLKIT_VIEWS) + +bool CefBrowserHostBase::EnsureDevToolsManager() { + CEF_REQUIRE_UIT(); + if (!contents_delegate_->web_contents()) + return false; + + if (!devtools_manager_) { + devtools_manager_.reset(new CefDevToolsManager(this)); + } + return true; +} + +void CefBrowserHostBase::InitializeDevToolsRegistrationOnUIThread( + CefRefPtr registration) { + if (!CEF_CURRENTLY_ON_UIT()) { + CEF_POST_TASK( + CEF_UIT, + base::BindOnce( + &CefBrowserHostBase::InitializeDevToolsRegistrationOnUIThread, this, + registration)); + return; + } + + if (!EnsureDevToolsManager()) + return; + devtools_manager_->InitializeRegistrationOnUIThread(registration); +} diff --git a/libcef/browser/browser_host_base.h b/libcef/browser/browser_host_base.h index 042d8ea0f..0b9e45f3b 100644 --- a/libcef/browser/browser_host_base.h +++ b/libcef/browser/browser_host_base.h @@ -12,6 +12,7 @@ #include "libcef/browser/browser_contents_delegate.h" #include "libcef/browser/browser_info.h" #include "libcef/browser/browser_platform_delegate.h" +#include "libcef/browser/devtools/devtools_manager.h" #include "libcef/browser/frame_host_impl.h" #include "libcef/browser/request_context_impl.h" @@ -165,6 +166,12 @@ class CefBrowserHostBase : public CefBrowserHost, void SendMouseWheelEvent(const CefMouseEvent& event, int deltaX, int deltaY) override; + bool SendDevToolsMessage(const void* message, size_t message_size) override; + int ExecuteDevToolsMethod(int message_id, + const CefString& method, + CefRefPtr params) override; + CefRefPtr AddDevToolsMessageObserver( + CefRefPtr observer) override; void GetNavigationEntries(CefRefPtr visitor, bool current_only) override; CefRefPtr GetVisibleNavigationEntry() override; @@ -256,6 +263,10 @@ class CefBrowserHostBase : public CefBrowserHost, #endif protected: + bool EnsureDevToolsManager(); + void InitializeDevToolsRegistrationOnUIThread( + CefRefPtr registration); + // Called from LoadMainFrameURL to perform the actual navigation. virtual bool Navigate(const content::OpenURLParams& params); @@ -284,6 +295,9 @@ class CefBrowserHostBase : public CefBrowserHost, bool is_fullscreen_ = false; CefRefPtr focused_frame_; + // Used for creating and managing DevTools instances. + std::unique_ptr devtools_manager_; + private: IMPLEMENT_REFCOUNTING(CefBrowserHostBase); DISALLOW_COPY_AND_ASSIGN(CefBrowserHostBase); diff --git a/libcef/browser/chrome/chrome_browser_host_impl.cc b/libcef/browser/chrome/chrome_browser_host_impl.cc index aac2b2a1d..4bd7e7879 100644 --- a/libcef/browser/chrome/chrome_browser_host_impl.cc +++ b/libcef/browser/chrome/chrome_browser_host_impl.cc @@ -283,26 +283,6 @@ bool ChromeBrowserHostImpl::HasDevTools() { return false; } -bool ChromeBrowserHostImpl::SendDevToolsMessage(const void* message, - size_t message_size) { - NOTIMPLEMENTED(); - return false; -} - -int ChromeBrowserHostImpl::ExecuteDevToolsMethod( - int message_id, - const CefString& method, - CefRefPtr params) { - NOTIMPLEMENTED(); - return 0; -} - -CefRefPtr ChromeBrowserHostImpl::AddDevToolsMessageObserver( - CefRefPtr observer) { - NOTIMPLEMENTED(); - return nullptr; -} - bool ChromeBrowserHostImpl::IsWindowRenderingDisabled() { return false; } diff --git a/libcef/browser/chrome/chrome_browser_host_impl.h b/libcef/browser/chrome/chrome_browser_host_impl.h index bcf32fadc..4f0e952f2 100644 --- a/libcef/browser/chrome/chrome_browser_host_impl.h +++ b/libcef/browser/chrome/chrome_browser_host_impl.h @@ -90,12 +90,6 @@ class ChromeBrowserHostImpl : public CefBrowserHostBase { const CefPoint& inspect_element_at) override; void CloseDevTools() override; bool HasDevTools() override; - bool SendDevToolsMessage(const void* message, size_t message_size) override; - int ExecuteDevToolsMethod(int message_id, - const CefString& method, - CefRefPtr params) override; - CefRefPtr AddDevToolsMessageObserver( - CefRefPtr observer) override; bool IsWindowRenderingDisabled() override; void WasResized() override; void WasHidden(bool hidden) override; diff --git a/libcef/browser/devtools/devtools_manager.cc b/libcef/browser/devtools/devtools_manager.cc index 8a07e8f0f..171ec6597 100644 --- a/libcef/browser/devtools/devtools_manager.cc +++ b/libcef/browser/devtools/devtools_manager.cc @@ -6,6 +6,7 @@ #include "libcef/browser/devtools/devtools_controller.h" #include "libcef/browser/devtools/devtools_frontend.h" +#include "libcef/features/runtime.h" #include "content/public/browser/web_contents.h" @@ -31,7 +32,7 @@ class CefDevToolsRegistrationImpl : public CefRegistration, controller_->RemoveObserver(this); } - void Initialize(AlloyBrowserHostImpl* browser, + void Initialize(CefBrowserHostBase* browser, base::WeakPtr controller) { CEF_REQUIRE_UIT(); DCHECK(browser && controller); @@ -83,7 +84,7 @@ class CefDevToolsRegistrationImpl : public CefRegistration, CefRefPtr observer_; - AlloyBrowserHostImpl* browser_ = nullptr; + CefBrowserHostBase* browser_ = nullptr; base::WeakPtr controller_; IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefDevToolsRegistrationImpl); @@ -92,7 +93,7 @@ class CefDevToolsRegistrationImpl : public CefRegistration, } // namespace -CefDevToolsManager::CefDevToolsManager(AlloyBrowserHostImpl* inspected_browser) +CefDevToolsManager::CefDevToolsManager(CefBrowserHostBase* inspected_browser) : inspected_browser_(inspected_browser), weak_ptr_factory_(this) { CEF_REQUIRE_UIT(); } @@ -115,10 +116,15 @@ void CefDevToolsManager::ShowDevTools(const CefWindowInfo& windowInfo, return; } - devtools_frontend_ = CefDevToolsFrontend::Show( - inspected_browser_, windowInfo, client, settings, inspect_element_at, - base::BindOnce(&CefDevToolsManager::OnFrontEndDestroyed, - weak_ptr_factory_.GetWeakPtr())); + if (cef::IsChromeRuntimeEnabled()) { + NOTIMPLEMENTED(); + } else { + auto alloy_browser = static_cast(inspected_browser_); + devtools_frontend_ = CefDevToolsFrontend::Show( + alloy_browser, windowInfo, client, settings, inspect_element_at, + base::BindOnce(&CefDevToolsManager::OnFrontEndDestroyed, + weak_ptr_factory_.GetWeakPtr())); + } } void CefDevToolsManager::CloseDevTools() { @@ -193,8 +199,8 @@ void CefDevToolsManager::OnFrontEndDestroyed() { bool CefDevToolsManager::EnsureController() { if (!devtools_controller_) { - devtools_controller_.reset( - new CefDevToolsController(inspected_browser_->web_contents())); + devtools_controller_.reset(new CefDevToolsController( + inspected_browser_->contents_delegate()->web_contents())); } return true; } diff --git a/libcef/browser/devtools/devtools_manager.h b/libcef/browser/devtools/devtools_manager.h index 27d6f763b..dfc968dbe 100644 --- a/libcef/browser/devtools/devtools_manager.h +++ b/libcef/browser/devtools/devtools_manager.h @@ -10,7 +10,7 @@ #include "base/memory/weak_ptr.h" -class AlloyBrowserHostImpl; +class CefBrowserHostBase; class CefDevToolsController; class CefDevToolsFrontend; @@ -23,7 +23,7 @@ class WebContents; class CefDevToolsManager { public: // |inspected_browser| will outlive this object. - explicit CefDevToolsManager(AlloyBrowserHostImpl* inspected_browser); + explicit CefDevToolsManager(CefBrowserHostBase* inspected_browser); ~CefDevToolsManager(); // See CefBrowserHost methods of the same name for documentation. @@ -52,7 +52,7 @@ class CefDevToolsManager { bool EnsureController(); - AlloyBrowserHostImpl* const inspected_browser_; + CefBrowserHostBase* const inspected_browser_; // CefDevToolsFrontend will delete itself when the frontend WebContents is // destroyed.