summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-03 12:13:08 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-03 12:13:08 +0000
commit0df3012fff2579aa4c09378fec0873f5c4589aab (patch)
treef63ad10d3efae0c81c3240293e20e7b003ea281b /webkit
parentce29eeeb501db818f8f91158fd0f740a9673db61 (diff)
downloadchromium_src-0df3012fff2579aa4c09378fec0873f5c4589aab.zip
chromium_src-0df3012fff2579aa4c09378fec0873f5c4589aab.tar.gz
chromium_src-0df3012fff2579aa4c09378fec0873f5c4589aab.tar.bz2
Implement InspectorClient's Settings API.
This CL implements InspectorClient's API for reading / writing inspector settings. Here is how this is done: - inspector_client_impl.cc caches / serializes preferences into raw strings. It supports all kinds of settings except for string vector. I did not implement it since a) it requires more escaping b) I think we should get rid of it upstream. It then passes serialized settings string over IPC. - There is a dedicated IPC message called UpdateInspectorSettings that takes care of settings update. Two things I don't like: 1) reading settings and writing settings follow different paths: WebPreferences interface for read, delegate -> IPC for write. WebPreferences on read is used since these settings are needed very early in the page cycle. delegate -> IPC on write is the only option. 2) this looks like too much code on the Chrome side for functionality like this. Is there a more generic way of settings and persisting WebKit's preferences in Chrome? Should there be one? Review URL: http://codereview.chromium.org/119041 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17473 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/glue/inspector_client_impl.cc106
-rw-r--r--webkit/glue/inspector_client_impl.h16
-rw-r--r--webkit/glue/webpreferences.h2
-rw-r--r--webkit/glue/webview_delegate.h4
4 files changed, 121 insertions, 7 deletions
diff --git a/webkit/glue/inspector_client_impl.cc b/webkit/glue/inspector_client_impl.cc
index f78810c..0db4da1 100644
--- a/webkit/glue/inspector_client_impl.cc
+++ b/webkit/glue/inspector_client_impl.cc
@@ -12,13 +12,17 @@ MSVC_PUSH_WARNING_LEVEL(0);
#include "InspectorController.h"
#include "Page.h"
#include "Settings.h"
+#include <wtf/Vector.h>
MSVC_POP_WARNING();
#undef LOG
#include "base/logging.h"
#include "base/gfx/rect.h"
+#include "base/string_util.h"
#include "webkit/api/public/WebRect.h"
+#include "webkit/glue/glue_util.h"
#include "webkit/glue/inspector_client_impl.h"
+#include "webkit/glue/webdevtoolsagent_impl.h"
#include "webkit/glue/webkit_glue.h"
#include "webkit/glue/weburlrequest.h"
#include "webkit/glue/webview_impl.h"
@@ -188,15 +192,107 @@ String WebInspectorClient::hiddenPanels() {
}
void WebInspectorClient::populateSetting(
- const String& key, InspectorController::Setting&) {
- NOTIMPLEMENTED();
+ const String& key,
+ InspectorController::Setting& setting) {
+ LoadSettings();
+ if (settings_->contains(key))
+ setting = settings_->get(key);
}
void WebInspectorClient::storeSetting(
- const String& key, const InspectorController::Setting&) {
- NOTIMPLEMENTED();
+ const String& key,
+ const InspectorController::Setting& setting) {
+ LoadSettings();
+ settings_->set(key, setting);
+ SaveSettings();
}
void WebInspectorClient::removeSetting(const String& key) {
- NOTIMPLEMENTED();
+ LoadSettings();
+ settings_->remove(key);
+ SaveSettings();
+}
+
+void WebInspectorClient::LoadSettings() {
+ if (settings_)
+ return;
+
+ settings_.set(new SettingsMap);
+ String data = webkit_glue::StdWStringToString(
+ inspected_web_view_->GetPreferences().inspector_settings);
+ if (data.isEmpty())
+ return;
+
+ Vector<String> entries;
+ data.split("\n", entries);
+ for (Vector<String>::iterator it = entries.begin();
+ it != entries.end(); ++it) {
+ Vector<String> tokens;
+ it->split(":", tokens);
+ if (tokens.size() != 3)
+ continue;
+
+ String name = decodeURLEscapeSequences(tokens[0]);
+ String type = tokens[1];
+ InspectorController::Setting setting;
+ bool ok = true;
+ if (type == "string")
+ setting.set(decodeURLEscapeSequences(tokens[2]));
+ else if (type == "double")
+ setting.set(tokens[2].toDouble(&ok));
+ else if (type == "integer")
+ setting.set(static_cast<long>(tokens[2].toInt(&ok)));
+ else if (type == "boolean")
+ setting.set(tokens[2] == "true");
+ else
+ continue;
+
+ if (ok)
+ settings_->set(name, setting);
+ }
+}
+
+void WebInspectorClient::SaveSettings() {
+ String data;
+ for (SettingsMap::iterator it = settings_->begin(); it != settings_->end();
+ ++it) {
+ String entry;
+ InspectorController::Setting value = it->second;
+ String name = encodeWithURLEscapeSequences(it->first);
+ switch (value.type()) {
+ case InspectorController::Setting::StringType:
+ entry = String::format(
+ "%s:string:%s",
+ name.utf8().data(),
+ encodeWithURLEscapeSequences(value.string())).utf8().data();
+ break;
+ case InspectorController::Setting::DoubleType:
+ entry = String::format(
+ "%s:double:%f",
+ name.utf8().data(),
+ value.doubleValue());
+ break;
+ case InspectorController::Setting::IntegerType:
+ entry = String::format(
+ "%s:integer:%d",
+ name.utf8().data(),
+ value.integerValue());
+ break;
+ case InspectorController::Setting::BooleanType:
+ entry = String::format("%s:boolean:%s",
+ name.utf8().data(),
+ value.booleanValue() ? "true" : "false");
+ break;
+ case InspectorController::Setting::StringVectorType:
+ NOTIMPLEMENTED();
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ data.append(entry);
+ data.append("\n");
+ }
+ inspected_web_view_->delegate()->UpdateInspectorSettings(
+ webkit_glue::StringToStdWString(data));
}
diff --git a/webkit/glue/inspector_client_impl.h b/webkit/glue/inspector_client_impl.h
index 6998f29..d4e2cd1 100644
--- a/webkit/glue/inspector_client_impl.h
+++ b/webkit/glue/inspector_client_impl.h
@@ -6,6 +6,9 @@
#define WEBKIT_GLUE_INSPECTOR_CLIENT_IMPL_H__
#include "InspectorClient.h"
+#include "InspectorController.h"
+#include <wtf/OwnPtr.h>
+
#include "base/ref_counted.h"
class WebNodeHighlight;
@@ -36,17 +39,26 @@ public:
virtual void inspectedURLChanged(const WebCore::String& newURL);
virtual void populateSetting(
- const WebCore::String& key, WebCore::InspectorController::Setting&);
+ const WebCore::String& key,
+ WebCore::InspectorController::Setting&);
virtual void storeSetting(
- const WebCore::String& key, const WebCore::InspectorController::Setting&);
+ const WebCore::String& key,
+ const WebCore::InspectorController::Setting&);
virtual void removeSetting(const WebCore::String& key);
private:
~WebInspectorClient();
+ void LoadSettings();
+ void SaveSettings();
+
// The WebViewImpl of the page being inspected; gets passed to the constructor
scoped_refptr<WebViewImpl> inspected_web_view_;
+ typedef HashMap<WebCore::String, WebCore::InspectorController::Setting>
+ SettingsMap;
+ OwnPtr<SettingsMap> settings_;
+
// The WebView of the Inspector popup window
WebViewImpl* inspector_web_view_;
};
diff --git a/webkit/glue/webpreferences.h b/webkit/glue/webpreferences.h
index ab38077..34c93b5 100644
--- a/webkit/glue/webpreferences.h
+++ b/webkit/glue/webpreferences.h
@@ -33,6 +33,7 @@ struct WebPreferences {
bool plugins_enabled;
bool dom_paste_enabled;
bool developer_extras_enabled;
+ std::wstring inspector_settings;
bool shrinks_standalone_images_to_fit;
bool uses_universal_detector;
bool text_areas_are_resizable;
@@ -68,6 +69,7 @@ struct WebPreferences {
plugins_enabled(true),
dom_paste_enabled(false), // enables execCommand("paste")
developer_extras_enabled(false), // Requires extra work by embedder
+ inspector_settings(L""),
shrinks_standalone_images_to_fit(true),
uses_universal_detector(false), // Disabled: page cycler regression
text_areas_are_resizable(true),
diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h
index 3d91eb0..e6e0891 100644
--- a/webkit/glue/webview_delegate.h
+++ b/webkit/glue/webview_delegate.h
@@ -745,6 +745,10 @@ class WebViewDelegate : virtual public WebWidgetDelegate {
virtual void DownloadUrl(const GURL& url, const GURL& referrer) { }
+ // InspectorClient ---------------------------------------------------------
+
+ virtual void UpdateInspectorSettings(const std::wstring& raw_settings) { }
+
// DevTools ----------------------------------------------------------------
virtual WebDevToolsAgentDelegate* GetWebDevToolsAgentDelegate() {