diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 12:13:08 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 12:13:08 +0000 |
commit | 0df3012fff2579aa4c09378fec0873f5c4589aab (patch) | |
tree | f63ad10d3efae0c81c3240293e20e7b003ea281b /webkit | |
parent | ce29eeeb501db818f8f91158fd0f740a9673db61 (diff) | |
download | chromium_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.cc | 106 | ||||
-rw-r--r-- | webkit/glue/inspector_client_impl.h | 16 | ||||
-rw-r--r-- | webkit/glue/webpreferences.h | 2 | ||||
-rw-r--r-- | webkit/glue/webview_delegate.h | 4 |
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() { |