diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/configure/BUILD.root.gn.in | 4 | ||||
-rw-r--r-- | src/core/devtools_frontend_qt.cpp | 164 | ||||
-rw-r--r-- | src/core/devtools_frontend_qt.h | 27 | ||||
-rw-r--r-- | src/core/net/webui_controller_factory_qt.cpp | 5 | ||||
-rw-r--r-- | src/core/pref_service_adapter.cpp | 4 |
5 files changed, 193 insertions, 11 deletions
diff --git a/src/core/configure/BUILD.root.gn.in b/src/core/configure/BUILD.root.gn.in index a4f78f3af..604470a68 100644 --- a/src/core/configure/BUILD.root.gn.in +++ b/src/core/configure/BUILD.root.gn.in @@ -246,6 +246,10 @@ source_set("qtwebengine_sources") { "//chrome/browser/accessibility/accessibility_ui.h", "//chrome/browser/devtools/devtools_eye_dropper.cc", "//chrome/browser/devtools/devtools_eye_dropper.h", + "//chrome/browser/devtools/devtools_file_helper.cc", + "//chrome/browser/devtools/devtools_file_helper.h", + "//chrome/browser/devtools/devtools_file_watcher.cc", + "//chrome/browser/devtools/devtools_file_watcher.h", "//chrome/browser/gcm/gcm_product_util.cc", "//chrome/browser/gcm/gcm_product_util.h", "//chrome/browser/gcm/gcm_profile_service_factory.cc", diff --git a/src/core/devtools_frontend_qt.cpp b/src/core/devtools_frontend_qt.cpp index e706c680a..93429057c 100644 --- a/src/core/devtools_frontend_qt.cpp +++ b/src/core/devtools_frontend_qt.cpp @@ -23,6 +23,7 @@ #include "base/task/post_task.h" #include "base/values.h" #include "chrome/browser/devtools/devtools_eye_dropper.h" +#include "chrome/browser/devtools/devtools_file_helper.h" #include "chrome/common/url_constants.h" #include "components/prefs/in_memory_pref_store.h" #include "components/prefs/json_pref_store.h" @@ -53,8 +54,18 @@ namespace { constexpr char kScreencastEnabled[] = "screencastEnabled"; -base::DictionaryValue BuildObjectForResponse(const net::HttpResponseHeaders *rh, - bool success, int net_error) +base::DictionaryValue CreateFileSystemValue(DevToolsFileHelper::FileSystem fileSystem) +{ + base::DictionaryValue fileSystemValue; + fileSystemValue.SetStringKey("type", fileSystem.type); + fileSystemValue.SetStringKey("fileSystemName", fileSystem.file_system_name); + fileSystemValue.SetStringKey("rootURL", fileSystem.root_url); + fileSystemValue.SetStringKey("fileSystemPath", fileSystem.file_system_path); + return fileSystemValue; +} + +base::DictionaryValue BuildObjectForResponse(const net::HttpResponseHeaders *rh, bool success, + int netError) { base::DictionaryValue response; int responseCode = 200; @@ -65,8 +76,8 @@ base::DictionaryValue BuildObjectForResponse(const net::HttpResponseHeaders *rh, responseCode = 404; } response.SetInteger("statusCode", responseCode); - response.SetInteger("netError", net_error); - response.SetString("netErrorName", net::ErrorToString(net_error)); + response.SetInteger("netError", netError); + response.SetString("netErrorName", net::ErrorToString(netError)); auto headers = std::make_unique<base::DictionaryValue>(); size_t iterator = 0; @@ -207,9 +218,11 @@ DevToolsFrontendQt::DevToolsFrontendQt(QSharedPointer<WebContentsAdapter> webCon CreateJsonPreferences(false); m_frontendDelegate = static_cast<WebContentsDelegateQt *>(webContentsAdapter->webContents()->GetDelegate()); + m_fileHelper = std::make_unique<DevToolsFileHelper>( + webContentsAdapter->webContents(), + static_cast<Profile *>(webContentsAdapter->webContents()->GetBrowserContext()), this); } - DevToolsFrontendQt::~DevToolsFrontendQt() { if (QSharedPointer<WebContentsAdapter> p = m_frontendAdapter) @@ -463,8 +476,10 @@ void DevToolsFrontendQt::HandleMessageFromDevToolsFrontend(base::Value message) } else if (method == "clearPreferences") { ClearPreferences(); } else if (method == "requestFileSystems") { - web_contents()->GetMainFrame()->ExecuteJavaScript(u"DevToolsAPI.fileSystemsLoaded([]);", - base::NullCallback()); + base::ListValue fileSystemsValue; + for (auto const &fileSystem : m_fileHelper->GetFileSystems()) + fileSystemsValue.Append(CreateFileSystemValue(fileSystem)); + CallClientFunction("DevToolsAPI", "fileSystemsLoaded", std::move(fileSystemsValue)); } else if (method == "reattach") { if (!m_agentHost) return; @@ -517,6 +532,34 @@ void DevToolsFrontendQt::HandleMessageFromDevToolsFrontend(base::Value message) if (!active) return; SetEyeDropperActive(*active); + } else if (method == "save" && params.size() == 3) { + const std::string *url = params[0].GetIfString(); + const std::string *content = params[1].GetIfString(); + absl::optional<bool> saveAs = params[2].GetIfBool(); + if (!url || !content || !saveAs) + return; + SaveToFile(*url, *content, *saveAs); + } else if (method == "append" && params.size() == 2) { + const std::string *url = params[0].GetIfString(); + const std::string *content = params[1].GetIfString(); + if (!url || !content) + return; + AppendToFile(*url, *content); + } else if (method == "addFileSystem" && params.size() == 1) { + const std::string *type = params[0].GetIfString(); + if (!type) + return; + AddFileSystem(*type); + } else if (method == "removeFileSystem" && params.size() == 1) { + const std::string *fileSystemPath = params[0].GetIfString(); + if (!fileSystemPath) + return; + RemoveFileSystem(*fileSystemPath); + } else if (method == "upgradeDraggedFileSystemPermissions" && params.size() == 1) { + const std::string *fileSystemUrl = params[0].GetIfString(); + if (!fileSystemUrl) + return; + UpgradeDraggedFileSystemPermissions(*fileSystemUrl); } else { VLOG(1) << "Unimplemented devtools method: " << message; return; @@ -593,6 +636,15 @@ void DevToolsFrontendQt::CallClientFunction(const std::string &object_name, } +// static +bool DevToolsFrontendQt::IsValidFrontendURL(const GURL &url) +{ + // NOTE: the inspector app does not change the frontend url. + // If we bring back the devtools_app, the url must be sanitized + // according to chrome/browser/devtools/devtools_ui_bindings.cc. + return url.spec() == GetFrontendURL(); +} + void DevToolsFrontendQt::SendMessageAck(int request_id, base::Value arg) { base::Value id_value(request_id); @@ -608,4 +660,102 @@ void DevToolsFrontendQt::AgentHostClosed(content::DevToolsAgentHost *agentHost) Close(); } +void DevToolsFrontendQt::SaveToFile(const std::string &url, const std::string &content, bool saveAs) +{ + m_fileHelper->Save( + url, content, saveAs, + base::BindOnce(&DevToolsFrontendQt::FileSavedAs, m_weakFactory.GetWeakPtr(), url), + base::BindOnce(&DevToolsFrontendQt::CanceledFileSaveAs, m_weakFactory.GetWeakPtr(), + url)); +} + +void DevToolsFrontendQt::FileSavedAs(const std::string &url, const std::string &fileSystemPath) +{ + CallClientFunction("DevToolsAPI", "savedURL", base::Value(url), base::Value(fileSystemPath)); +} + +void DevToolsFrontendQt::CanceledFileSaveAs(const std::string &url) +{ + CallClientFunction("DevToolsAPI", "canceledSaveURL", base::Value(url)); +} + +void DevToolsFrontendQt::AppendToFile(const std::string &url, const std::string &content) +{ + m_fileHelper->Append( + url, content, + base::BindOnce(&DevToolsFrontendQt::AppendedTo, m_weakFactory.GetWeakPtr(), url)); +} + +void DevToolsFrontendQt::AppendedTo(const std::string &url) +{ + CallClientFunction("DevToolsAPI", "appendedToURL", base::Value(url)); +} + +void DevToolsFrontendQt::AddFileSystem(const std::string &type) +{ + CHECK(IsValidFrontendURL(web_contents()->GetLastCommittedURL()) && m_frontendHost); + m_fileHelper->AddFileSystem(type, base::NullCallback()); +} + +void DevToolsFrontendQt::UpgradeDraggedFileSystemPermissions(const std::string &fileSystemUrl) +{ + CHECK(IsValidFrontendURL(web_contents()->GetLastCommittedURL()) && m_frontendHost); + m_fileHelper->UpgradeDraggedFileSystemPermissions(fileSystemUrl, base::NullCallback()); +} + +void DevToolsFrontendQt::RemoveFileSystem(const std::string &fileSystemPath) +{ + CHECK(IsValidFrontendURL(web_contents()->GetLastCommittedURL()) && m_frontendHost); + m_fileHelper->RemoveFileSystem(fileSystemPath); +} + +// DevToolsFileHelper::Delegate implementation +// based on chrome/browser/devtools/devtools_ui_bindings.cc +void DevToolsFrontendQt::FileSystemAdded(const std::string &error, + const DevToolsFileHelper::FileSystem *file_system) +{ + if (file_system) { + CallClientFunction("DevToolsAPI", "fileSystemAdded", base::Value(error), + CreateFileSystemValue(*file_system)); + } else { + CallClientFunction("DevToolsAPI", "fileSystemAdded", base::Value(error)); + } +} + +void DevToolsFrontendQt::FileSystemRemoved(const std::string &file_system_path) +{ + CallClientFunction("DevToolsAPI", "fileSystemRemoved", base::Value(file_system_path)); +} + +void DevToolsFrontendQt::FilePathsChanged(const std::vector<std::string> &changed_paths, + const std::vector<std::string> &added_paths, + const std::vector<std::string> &removed_paths) +{ + const int kMaxPathsPerMessage = 1000; + size_t changed_index = 0; + size_t added_index = 0; + size_t removed_index = 0; + // Dispatch limited amount of file paths in a time to avoid + // IPC max message size limit. See https://crbug.com/797817. + while (changed_index < changed_paths.size() || added_index < added_paths.size() + || removed_index < removed_paths.size()) { + int budget = kMaxPathsPerMessage; + base::ListValue changed, added, removed; + while (budget > 0 && changed_index < changed_paths.size()) { + changed.Append(changed_paths[changed_index++]); + --budget; + } + while (budget > 0 && added_index < added_paths.size()) { + added.Append(added_paths[added_index++]); + --budget; + } + while (budget > 0 && removed_index < removed_paths.size()) { + removed.Append(removed_paths[removed_index++]); + --budget; + } + CallClientFunction("DevToolsAPI", "fileSystemFilesChangedAddedRemoved", std::move(changed), + std::move(added), std::move(removed)); + } +} + } // namespace QtWebEngineCore diff --git a/src/core/devtools_frontend_qt.h b/src/core/devtools_frontend_qt.h index 78a3aaefc..e0ec993e2 100644 --- a/src/core/devtools_frontend_qt.h +++ b/src/core/devtools_frontend_qt.h @@ -11,6 +11,7 @@ #include "base/containers/unique_ptr_adapters.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/devtools/devtools_file_helper.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/web_contents_observer.h" @@ -29,8 +30,10 @@ class PersistentPrefStore; namespace QtWebEngineCore { -class DevToolsFrontendQt : public content::WebContentsObserver - , public content::DevToolsAgentHostClient { +class DevToolsFrontendQt : public content::WebContentsObserver, + public content::DevToolsAgentHostClient, + public DevToolsFileHelper::Delegate +{ public: static DevToolsFrontendQt *Show(QSharedPointer<WebContentsAdapter> frontendAdapter, content::WebContents *inspectedContents); @@ -53,6 +56,8 @@ public: return m_frontendDelegate; } + static bool IsValidFrontendURL(const GURL &url); + protected: DevToolsFrontendQt(QSharedPointer<WebContentsAdapter> webContentsAdapter, content::WebContents *inspectedContents); ~DevToolsFrontendQt() override; @@ -70,6 +75,14 @@ private: void DocumentOnLoadCompletedInPrimaryMainFrame() override; void WebContentsDestroyed() override; + // DevToolsFileHelper::Delegate overrides. + void FileSystemAdded(const std::string &error, + const DevToolsFileHelper::FileSystem *file_system) override; + void FileSystemRemoved(const std::string &file_system_path) override; + void FilePathsChanged(const std::vector<std::string> &changed_paths, + const std::vector<std::string> &added_paths, + const std::vector<std::string> &removed_paths) override; + void SendMessageAck(int request_id, base::Value arg1); void SetPreference(const std::string &name, const std::string &value); void RemovePreference(const std::string &name); @@ -78,6 +91,15 @@ private: void SetEyeDropperActive(bool active); void ColorPickedInEyeDropper(int r, int g, int b, int a); + void SaveToFile(const std::string &url, const std::string &content, bool saveAs); + void FileSavedAs(const std::string &url, const std::string &fileSystemPath); + void CanceledFileSaveAs(const std::string &url); + void AppendToFile(const std::string &url, const std::string &content); + void AppendedTo(const std::string &url); + void AddFileSystem(const std::string &type); + void UpgradeDraggedFileSystemPermissions(const std::string &fileSystem); + void RemoveFileSystem(const std::string &fileSystemPath); + // We shouldn't be keeping it alive QWeakPointer<WebContentsAdapter> m_frontendAdapter; WebContentsAdapter *m_inspectedAdapter; @@ -88,6 +110,7 @@ private: int m_inspect_element_at_y; std::unique_ptr<content::DevToolsFrontendHost> m_frontendHost; std::unique_ptr<DevToolsEyeDropper> m_eyeDropper; + std::unique_ptr<DevToolsFileHelper> m_fileHelper; class NetworkResourceLoader; std::set<std::unique_ptr<NetworkResourceLoader>, base::UniquePtrComparator> m_loaders; diff --git a/src/core/net/webui_controller_factory_qt.cpp b/src/core/net/webui_controller_factory_qt.cpp index 68bbb42fa..66491e019 100644 --- a/src/core/net/webui_controller_factory_qt.cpp +++ b/src/core/net/webui_controller_factory_qt.cpp @@ -9,6 +9,7 @@ #include "webui_controller_factory_qt.h" #include "build_config_qt.h" +#include "devtools_frontend_qt.h" #include "base/bind.h" #include "build/build_config.h" @@ -93,8 +94,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI *web_ui, Profile *profile, co return &NewWebUI<NetInternalsUI>; if (url.SchemeIs(content::kChromeDevToolsScheme)) { - // if (!DevToolsUIBindings::IsValidFrontendURL(url)) - // return nullptr; + if (!QtWebEngineCore::DevToolsFrontendQt::IsValidFrontendURL(url)) + return nullptr; return &NewWebUI<DevToolsUI>; } if (url.host() == chrome::kChromeUIAccessibilityHost) diff --git a/src/core/pref_service_adapter.cpp b/src/core/pref_service_adapter.cpp index dd544e35e..6445f3175 100644 --- a/src/core/pref_service_adapter.cpp +++ b/src/core/pref_service_adapter.cpp @@ -127,6 +127,10 @@ void PrefServiceAdapter::setup(const ProfileAdapter &profileAdapter) registry->RegisterBooleanPref(autofill::prefs::kAutofillJapanCityFieldMigratedDeprecated, false); + // devtools + registry->RegisterDictionaryPref(prefs::kDevToolsFileSystemPaths); + registry->RegisterDictionaryPref(prefs::kDevToolsEditedFiles); + { base::ScopedAllowBlocking allowBlock; m_prefService = factory.Create(registry); |