summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/configure/BUILD.root.gn.in4
-rw-r--r--src/core/devtools_frontend_qt.cpp164
-rw-r--r--src/core/devtools_frontend_qt.h27
-rw-r--r--src/core/net/webui_controller_factory_qt.cpp5
-rw-r--r--src/core/pref_service_adapter.cpp4
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);