diff --git a/content/browser/devtools/BUILD.gn b/content/browser/devtools/BUILD.gn index d9812e6c609dfaca1de7e7569c6d7f4635ca5df9..20bcb660e9eb2501df446deac79dc3e2a429a239 100644 --- a/content/browser/devtools/BUILD.gn +++ b/content/browser/devtools/BUILD.gn @@ -10,7 +10,7 @@ import("//third_party/protobuf/proto_library.gni") import("//tools/grit/grit_rule.gni") # Android and iOS don't support DevTools front-end. -if (!is_android && !is_ios) { +if (!is_android) { source_set("devtools_resources_extern") { sources = [ "devtools_resources.cc" ] diff --git a/ohos_nweb/BUILD.gn b/ohos_nweb/BUILD.gn index 915b022d0a4c5dd31cd47842832fe1f742ee976f..49a7bde080bcde6708447d26355954966d8eae65 100644 --- a/ohos_nweb/BUILD.gn +++ b/ohos_nweb/BUILD.gn @@ -113,6 +113,8 @@ component("cef_nweb") { "src/cef_delegate/nweb_default_engine_prefetch_args_impl.h", "src/cef_delegate/nweb_delegate.cc", "src/cef_delegate/nweb_delegate.h", + "src/cef_delegate/nweb_devtools_message_handler_impl.cc", + "src/cef_delegate/nweb_devtools_message_handler_impl.h", "src/cef_delegate/nweb_display_listener.cc", "src/cef_delegate/nweb_display_listener.h", "src/cef_delegate/nweb_download_handler_delegate.cc", @@ -326,6 +328,7 @@ component("nweb_sources") { "include/nweb_value.h", "include/nweb_value_callback.h", "src/capi/nweb_app_client_extension_callback.h", + "src/capi/nweb_devtools_message_handler.h", "src/capi/nweb_storage_extension_callback.h", "src/nweb_adsblock_manager_impl.cc", "src/nweb_adsblock_manager_impl.h", diff --git a/ohos_nweb/src/capi/nweb_app_client_extension_callback.h b/ohos_nweb/src/capi/nweb_app_client_extension_callback.h index 7acefa0a79d035cc6d3ddbaa928bfae3d3ef444f..6102de87d6ab41c5edf9627106ad1ada0bb5b427 100644 --- a/ohos_nweb/src/capi/nweb_app_client_extension_callback.h +++ b/ohos_nweb/src/capi/nweb_app_client_extension_callback.h @@ -67,6 +67,8 @@ struct NWebAppClientExtensionCallback { const std::string& trackerHost, int nweb_id); #endif + + void (*OnRequestOpenDevTools)(int32_t nweb_id); }; #endif // OHOS_NWEB_SRC_NWEB_APP_CLIENT_EXTENSION_CALLBACK_H_ diff --git a/ohos_nweb/src/capi/nweb_devtools_message_handler.h b/ohos_nweb/src/capi/nweb_devtools_message_handler.h new file mode 100644 index 0000000000000000000000000000000000000000..a2c261f2142fe4386d456918c85816399967498a --- /dev/null +++ b/ohos_nweb/src/capi/nweb_devtools_message_handler.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_NWEB_SRC_CAPI_NWEB_DEVTOOLS_MESSAGE_HANDLER_H_ +#define OHOS_NWEB_SRC_CAPI_NWEB_DEVTOOLS_MESSAGE_HANDLER_H_ + +#include + +namespace OHOS::NWeb { +class NWebBoolValueCallback; +class NWebFileSelectorParams; +class NWebStringVectorValueCallback; +} + +class NWebDevtoolsMessageHandler; + +template +bool CheckValid(T* obj, MethodPointer* pointer) { + if (!obj || !pointer) { + return false; + } + typename T::Base* base = static_cast(obj); + uintptr_t start_pos = reinterpret_cast(base); + uintptr_t method_pos = reinterpret_cast(pointer); + if (start_pos + obj->struct_size < method_pos + sizeof(MethodPointer)) { + return false; + } + if (!(*pointer)) { + return false; + } + return true; +} + +struct NWebDevtoolsMessageHandlerBase { + const size_t struct_size = sizeof(NWebDevtoolsMessageHandlerBase); + bool (NWebDevtoolsMessageHandler::*show_file_chooser)( + std::shared_ptr param, + std::shared_ptr + file_path_callback) = nullptr; + void (NWebDevtoolsMessageHandler::*show_info_bar)( + const std::string& message, + const std::string& path, + std::shared_ptr callback) = nullptr; + bool (NWebDevtoolsMessageHandler::*bring_to_front)() = nullptr; + bool (NWebDevtoolsMessageHandler::*close_window)() = nullptr; + bool (NWebDevtoolsMessageHandler::*active_devtools_window)() = nullptr; + + NWebDevtoolsMessageHandlerBase() = default; + NWebDevtoolsMessageHandlerBase( + const NWebDevtoolsMessageHandlerBase& other) = delete; + NWebDevtoolsMessageHandlerBase( + NWebDevtoolsMessageHandlerBase&& other) = delete; + NWebDevtoolsMessageHandlerBase& operator=( + const NWebDevtoolsMessageHandlerBase& other) = delete; + NWebDevtoolsMessageHandlerBase& operator=( + NWebDevtoolsMessageHandlerBase&& other) = delete; +}; + +class NWebDevtoolsMessageHandler : public NWebDevtoolsMessageHandlerBase { + public: + using Base = NWebDevtoolsMessageHandlerBase; + NWebDevtoolsMessageHandler() : NWebDevtoolsMessageHandlerBase() { + this->show_file_chooser = + &NWebDevtoolsMessageHandler::ShowFileChooser; + this->show_info_bar = + &NWebDevtoolsMessageHandler::ShowInfoBar; + this->bring_to_front = + &NWebDevtoolsMessageHandler::BringToFront; + this->close_window = + &NWebDevtoolsMessageHandler::CloseWindow; + this->active_devtools_window = + &NWebDevtoolsMessageHandler::ActiveDevToolsWindow; + } + virtual ~NWebDevtoolsMessageHandler() = default; + + protected: + virtual bool ShowFileChooser( + std::shared_ptr param, + std::shared_ptr + file_path_callback) { return false; } + virtual void ShowInfoBar( + const std::string& message, + const std::string& path, + std::shared_ptr callback) {} + virtual bool BringToFront() { return false; } + virtual bool CloseWindow() { return false; } + virtual bool ActiveDevToolsWindow() { return false; } + + private: + static_assert(offsetof(Base, struct_size) == 0, + "Must NOT break the order of Base members."); + static_assert( + (offsetof(Base, show_file_chooser) - offsetof(Base, struct_size)) + == sizeof(Base::struct_size), + "Must NOT break the order of Base members."); + static_assert( + (offsetof(Base, show_info_bar) - offsetof(Base, show_file_chooser)) + == sizeof(Base::show_file_chooser), + "Must NOT break the order of Base members."); + static_assert( + (offsetof(Base, bring_to_front) - offsetof(Base, show_info_bar)) + == sizeof(Base::show_info_bar), + "Must NOT break the order of Base members."); + static_assert( + (offsetof(Base, close_window) - offsetof(Base, bring_to_front)) + == sizeof(Base::bring_to_front), + "Must NOT break the order of Base members."); + static_assert( + (offsetof(Base, active_devtools_window) - offsetof(Base, close_window)) + == sizeof(Base::close_window), + "Must NOT break the order of Base members."); +}; + +struct InspectPoint { + int x = 0; + int y = 0; +}; + +struct OpenDevToolsParam final { + int nweb_id = -1; + std::unique_ptr handler; + InspectPoint point; +}; + +#endif // OHOS_NWEB_SRC_CAPI_NWEB_DEVTOOLS_MESSAGE_HANDLER_H_ diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_delegate.cc index ffc4cdd39c4f97068fc61546799f18e808ca4ee0..f8bca768adbeb8a68311084417bda64043eb9472 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.cc @@ -82,6 +82,12 @@ #include "base/ohos/locale_utils.h" #endif +#include "ohos_nweb/src/capi/nweb_devtools_message_handler.h" +#include "ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.h" +#ifdef OHOS_DEVTOOLS +#include "cef/include/cef_devtools_message_handler_delegate.h" +#endif // OHOS_DEVTOOLS + namespace { static const float richtextDisplayRatio = 1.0; } @@ -4158,4 +4164,36 @@ int32_t NWebDelegate::GetArgumentByKey(const std::map& } return argument; } + +void NWebDelegate::OpenDevtoolsWith( + std::shared_ptr nweb_delegate, + std::unique_ptr param) { + LOG(INFO) << "NWebDelegate::OpenDevtoolsWith"; + if (!GetBrowser() || !GetBrowser()->GetHost()) { + LOG(INFO) << "OpenDevtoolsWith failed, no browser host"; + return; + } + NWebDelegate* devtools_delegate = + static_cast(nweb_delegate.get()); + +#ifdef OHOS_DEVTOOLS + auto devtools_message_handler = CefRefPtr( + new NWebDevToolsMessageHandlerImpl(std::move(param->handler))); + + CefPoint inspect_element_at(param->point.x, param->point.y); + GetBrowser()->GetHost()->ShowDevToolsWith( + devtools_delegate->GetBrowser()->GetHost(), + devtools_message_handler, inspect_element_at); +#endif // OHOS_DEVTOOLS +} + +void NWebDelegate::CloseDevtools() { + LOG(INFO) << "NWebDelegate::CloseDevtools"; + if (!GetBrowser() || !GetBrowser()->GetHost()) { + LOG(INFO) << "CloseDevtools failed, no browser host"; + return; + } + GetBrowser()->GetHost()->CloseDevTools(); +} + } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.h b/ohos_nweb/src/cef_delegate/nweb_delegate.h index ced7b49d93a0f2680128367abbde330e61add474..046b379c5b14f5ebe96be74fab4521b8b02a2e67 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.h @@ -40,6 +40,8 @@ #include "capi/nweb_download_delegate_callback.h" #endif // OHOS_EX_DOWNLOAD +struct OpenDevToolsParam; + namespace OHOS::NWeb { class JavaScriptResultCallbackImpl; class NWebDelegate : public NWebDelegateInterface, public virtual CefRefCount { @@ -549,6 +551,11 @@ class NWebDelegate : public NWebDelegateInterface, public virtual CefRefCount { void SetSurfaceDensity(const double& density) override; + void OpenDevtoolsWith( + std::shared_ptr nweb_delegate, + std::unique_ptr param) override; + void CloseDevtools() override; + public: int argc_; const char** argv_; diff --git a/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.cc b/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.cc new file mode 100644 index 0000000000000000000000000000000000000000..cfa2c65cb331303c68b246ee7db6643a5ddb1dce --- /dev/null +++ b/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.cc @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.h" + +#include "cef/include/base/cef_logging.h" +#include "ohos_nweb/include/nweb_file_selector_params.h" +#include "ohos_nweb/src/capi/nweb_devtools_message_handler.h" +#include "ohos_nweb/src/cef_delegate/nweb_file_selector_params_impl.h" + +namespace OHOS::NWeb { + +namespace { + +NWebFileSelectorParams::FileSelectorMode ConvertFileSelectorMode( + CefDialogHandler::FileDialogMode mode) { + NWebFileSelectorParams::FileSelectorMode result_mode = + NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_MODE; + switch (mode) { + case FILE_DIALOG_OPEN: + return NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_MODE; + case FILE_DIALOG_OPEN_MULTIPLE: + return NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_MULTIPLE_MODE; + case FILE_DIALOG_OPEN_FOLDER: + return NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_FOLDER_MODE; + case FILE_DIALOG_SAVE: + return NWebFileSelectorParams::FileSelectorMode::FILE_SAVE_MODE; + default: + break; + } + return result_mode; +} + +class InfoBarCallbackImpl : public NWebBoolValueCallback { + public: + InfoBarCallbackImpl( + CefRefPtr cef_callback) + : callback_(cef_callback) {} + ~InfoBarCallbackImpl() override { + if (callback_) { + callback_->Allow(default_value_); + } + } + + void OnReceiveValue(bool value) override { + if (callback_) { + callback_->Allow(value); + } + } + + private: + bool default_value_ = true; + CefRefPtr callback_; +}; + +} // namespace + +NWebDevToolsMessageHandlerImpl::NWebDevToolsMessageHandlerImpl( + std::unique_ptr handler) + : handler_(std::move(handler)) {} + +NWebDevToolsMessageHandlerImpl::~NWebDevToolsMessageHandlerImpl() = default; + +bool NWebDevToolsMessageHandlerImpl::ShowFileChooser( + FileDialogMode mode, + const CefString& title, + const CefString& default_file_path, + const std::vector& accept_filters, + bool capture, + CefRefPtr callback) { + if (!handler_) { + LOG(INFO) << "ShowFileChooser failed, handler_ is null"; + return false; + } + + std::string file_selector_title = title.ToString(); + NWebFileSelectorParams::FileSelectorMode file_mode = + ConvertFileSelectorMode(mode); + if (file_selector_title.empty()) { + switch (file_mode) { + case NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_MODE: + file_selector_title = "open file"; + break; + case NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_MULTIPLE_MODE: + file_selector_title = "open files"; + break; + case NWebFileSelectorParams::FileSelectorMode::FILE_OPEN_FOLDER_MODE: + file_selector_title = "open file folder"; + break; + case NWebFileSelectorParams::FileSelectorMode::FILE_SAVE_MODE: + file_selector_title = "save as"; + break; + default: + break; + } + } + std::shared_ptr param = + std::make_shared( + file_mode, file_selector_title, accept_filters, + default_file_path.ToString(), capture); + std::shared_ptr file_path_callback = + std::make_shared(callback); + if (!CheckValid(handler_.get(), &handler_->show_file_chooser)) { + LOG(ERROR) << "ShowFileChooser failed, method is invalid"; + return false; + } + return (handler_.get()->*(handler_->show_file_chooser))( + param, file_path_callback); +} + +void NWebDevToolsMessageHandlerImpl::ShowInfoBar( + const CefString& cef_message, + const CefString& cef_path, + CefRefPtr cef_callback) { + if (!handler_) { + LOG(INFO) << "ShowInfoBar failed, handler_ is null"; + return; + } + std::shared_ptr callback = + std::make_shared(cef_callback); + std::string message = cef_message.ToString(); + std::string path = cef_path.ToString(); + + if (!CheckValid(handler_.get(), &handler_->show_info_bar)) { + LOG(ERROR) << "ShowInfoBar failed, method is invalid"; + return ; + } + return (handler_.get()->*(handler_->show_info_bar))(message, path, callback); +} + +bool NWebDevToolsMessageHandlerImpl::BringToFront() { + if (!handler_) { + LOG(INFO) << "BringToFront failed, handler_ is null"; + return false; + } + if (!CheckValid(handler_.get(), &handler_->bring_to_front)) { + LOG(ERROR) << "BringToFront failed, method is invalid"; + return false; + } + return (handler_.get()->*(handler_->bring_to_front))(); +} + +bool NWebDevToolsMessageHandlerImpl::CloseWindow() { + if (!handler_) { + LOG(INFO) << "CloseWindow failed, handler_ is null"; + return false; + } + if (!CheckValid(handler_.get(), &handler_->close_window)) { + LOG(ERROR) << "CloseWindow failed, method is invalid"; + return false; + } + return (handler_.get()->*(handler_->close_window))(); +} + +bool NWebDevToolsMessageHandlerImpl::ActiveDevToolsWindow() { + if (!handler_) { + LOG(INFO) << "ActiveDevToolsWindow failed, handler_ is null"; + return false; + } + + if (!CheckValid(handler_.get(), &handler_->active_devtools_window)) { + LOG(ERROR) << "ActiveDevToolsWindow failed, method is invalid"; + return false; + } + return (handler_.get()->*(handler_->active_devtools_window))(); +} + +} // namespace diff --git a/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.h b/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..a5e5bcbaf8b4bcc43ca084344fff2d240ed87c03 --- /dev/null +++ b/ohos_nweb/src/cef_delegate/nweb_devtools_message_handler_impl.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_NWEB_SRC_CEF_DELEGATE_NWEB_DEVTOOLS_MESSAGE_HANDLER_IMPL_H_ +#define OHOS_NWEB_SRC_CEF_DELEGATE_NWEB_DEVTOOLS_MESSAGE_HANDLER_IMPL_H_ + +#include + +#include "cef/include/cef_devtools_message_handler_delegate.h" + +class NWebDevtoolsMessageHandler; + +namespace OHOS::NWeb { + +class NWebDevToolsMessageHandlerImpl + : public virtual CefDevToolsMessageHandlerDelegate { + public: + NWebDevToolsMessageHandlerImpl( + std::unique_ptr handler); + virtual ~NWebDevToolsMessageHandlerImpl(); + + bool ShowFileChooser( + FileDialogMode mode, + const CefString& title, + const CefString& default_file_path, + const std::vector& accept_filters, + bool capture, + CefRefPtr callback) override; + void ShowInfoBar( + const CefString& message, + const CefString& cef_path, + CefRefPtr callback) override; + bool BringToFront() override; + bool CloseWindow() override; + bool ActiveDevToolsWindow() override; + + private: + std::unique_ptr handler_; + + IMPLEMENT_REFCOUNTING(NWebDevToolsMessageHandlerImpl); +}; + +} // namespace + +#endif // OHOS_NWEB_SRC_CEF_DELEGATE_NWEB_DEVTOOLS_MESSAGE_HANDLER_IMPL_H_ diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc index 296d3be358bf23c0be41156c86860416252329c6..267a737d7b7f4a65bbec7292f8dffb2d0f2b2354 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc @@ -3831,4 +3831,17 @@ void NWebHandlerDelegate::logUrl(const CefString& url) { } #endif +void NWebHandlerDelegate::OnRequestOpenDevTools() { + if (!web_app_client_extension_listener_) { + LOG(WARNING) << "OnRequestOpenDevTools failed, no listener"; + return; + } + if (!web_app_client_extension_listener_->OnRequestOpenDevTools) { + LOG(WARNING) << "OnRequestOpenDevTools failed, no function"; + return; + } + web_app_client_extension_listener_->OnRequestOpenDevTools( + web_app_client_extension_listener_->nweb_id); +} + } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h index 1a91dd98a6d0a59622f5088a444ec18effddce37..b6bf00909bd4c5630aea717ae1c8ac4f6a0919d5 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h @@ -791,6 +791,8 @@ bool OnOpenURLFromTab(CefRefPtr browser, void logUrl(const CefString& url) override; #endif + void OnRequestOpenDevTools(); + private: void CopyImageToClipboard(CefRefPtr image); diff --git a/ohos_nweb/src/nweb_delegate_interface.h b/ohos_nweb/src/nweb_delegate_interface.h index 1df2b5ad4f04ca7cbb7482bfd7d1da14ecf33101..40c09b710c80f5ca8679b3793dbb92073277c819 100644 --- a/ohos_nweb/src/nweb_delegate_interface.h +++ b/ohos_nweb/src/nweb_delegate_interface.h @@ -38,6 +38,8 @@ #include "cef_delegate/nweb_custom_keyboard_handler_impl.h" +struct OpenDevToolsParam; + namespace OHOS::NWeb { class NWebValue; @@ -565,6 +567,11 @@ virtual int ScaleGestureChange(double scale, double centerX, double centerY) con #ifdef OHOS_MEDIA_NETWORK_TRAFFIC_PROMPT virtual void EnableMediaNetworkTrafficPrompt(bool enable) = 0; #endif // OHOS_MEDIA_NETWORK_TRAFFIC_PROMPT + + virtual void OpenDevtoolsWith( + std::shared_ptr nweb_delegate, + std::unique_ptr param) = 0; + virtual void CloseDevtools() = 0; }; } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/nweb_impl.cc b/ohos_nweb/src/nweb_impl.cc index 5a24004c4ec7c68f516a46c6ab167ac2dcdcd949..467e6da5893d8b682198fe3e762ef56202d92b7a 100644 --- a/ohos_nweb/src/nweb_impl.cc +++ b/ohos_nweb/src/nweb_impl.cc @@ -176,6 +176,9 @@ extern bool g_siteIsolationMode; #include "content/browser/gpu/gpu_process_host.h" #endif + +#include "ohos_nweb/src/capi/nweb_devtools_message_handler.h" + namespace { uint32_t g_nweb_count = 0; const uint32_t kSurfaceMaxWidth = 7680; @@ -2473,6 +2476,28 @@ void NWebImpl::RemoveWebExtensionApiCallback() { WVLOG_I("unreqister web extension api listener"); NWebHandlerDelegate::UnRegisterWebExtensionApiListener(); } + +void NWebImpl::OpenDevtools(std::unique_ptr param) { + if (nweb_delegate_ == nullptr) { + LOG(WARNING) << "OpenDevtools failed, no nweb_delegate"; + return; + } + int32_t devtools_nweb_id = param->nweb_id; + NWebImpl* nweb = NWebImpl::FromID(devtools_nweb_id); + if (!nweb) { + LOG(WARNING) << "OpenDevtools failed, no nweb"; + return; + } + nweb_delegate_->OpenDevtoolsWith(nweb->nweb_delegate_, std::move(param)); +} + +void NWebImpl::CloseDevtools() { + if (nweb_delegate_ == nullptr) { + LOG(WARNING) << "CloseDevtools failed, no nweb_delegate"; + return; + } + nweb_delegate_->CloseDevtools(); +} #endif // defined(OHOS_NWEB_EX) #ifdef OHOS_EX_NETWORK_CONNECTION diff --git a/ohos_nweb/src/nweb_impl.h b/ohos_nweb/src/nweb_impl.h index 752920b8db5af207b881675eecf1d5ed6c0f8ab9..e5765801c12ed245177eb05af0c034b7eb4e538e 100644 --- a/ohos_nweb/src/nweb_impl.h +++ b/ohos_nweb/src/nweb_impl.h @@ -37,6 +37,8 @@ #include "capi/nweb_permission_request.h" // #endif +struct OpenDevToolsParam; + namespace OHOS::NWeb { class NWebImpl : public NWeb { public: @@ -395,6 +397,8 @@ class NWebImpl : public NWeb { void GetImageFromCache(const std::string& url); void ReloadOriginalUrl() const; void SetBrowserUserAgentString(const std::string& user_agent); + void OpenDevtools(std::unique_ptr param); + void CloseDevtools(); #endif // defined(OHOS_NWEB_EX) #ifdef OHOS_EX_NETWORK_CONNECTION