Persist DevTools preferences with CefSettings.persist_user_preferences (issue #2077)

This commit is contained in:
Marshall Greenblatt
2017-02-28 17:40:28 -05:00
parent d2f48f6e08
commit fe68aee82c
3 changed files with 26 additions and 6 deletions

View File

@@ -6,6 +6,7 @@
#include <stddef.h> #include <stddef.h>
#include "libcef/browser/browser_context.h"
#include "libcef/browser/devtools_manager_delegate.h" #include "libcef/browser/devtools_manager_delegate.h"
#include "libcef/browser/net/devtools_scheme_handler.h" #include "libcef/browser/net/devtools_scheme_handler.h"
@@ -17,6 +18,8 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
@@ -222,17 +225,19 @@ void CefDevToolsFrontend::WebContentsDestroyed() {
} }
void CefDevToolsFrontend::SetPreferences(const std::string& json) { void CefDevToolsFrontend::SetPreferences(const std::string& json) {
preferences_.Clear();
if (json.empty()) if (json.empty())
return; return;
base::DictionaryValue* dict = nullptr; base::DictionaryValue* dict = nullptr;
std::unique_ptr<base::Value> parsed = base::JSONReader::Read(json); std::unique_ptr<base::Value> parsed = base::JSONReader::Read(json);
if (!parsed || !parsed->GetAsDictionary(&dict)) if (!parsed || !parsed->GetAsDictionary(&dict))
return; return;
DictionaryPrefUpdate update(GetPrefs(), prefs::kDevToolsPreferences);
for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
if (!it.value().IsType(base::Value::Type::STRING)) if (!it.value().IsType(base::Value::Type::STRING))
continue; continue;
preferences_.SetWithoutPathExpansion(it.key(), it.value().CreateDeepCopy()); update.Get()->SetWithoutPathExpansion(it.key(),
it.value().CreateDeepCopy());
} }
} }
@@ -296,7 +301,8 @@ void CefDevToolsFrontend::HandleMessageFromDevToolsFrontend(
fetcher->Start(); fetcher->Start();
return; return;
} else if (method == "getPreferences") { } else if (method == "getPreferences") {
SendMessageAck(request_id, &preferences_); SendMessageAck(request_id,
GetPrefs()->GetDictionary(prefs::kDevToolsPreferences));
return; return;
} else if (method == "setPreference") { } else if (method == "setPreference") {
std::string name; std::string name;
@@ -305,12 +311,14 @@ void CefDevToolsFrontend::HandleMessageFromDevToolsFrontend(
!params->GetString(1, &value)) { !params->GetString(1, &value)) {
return; return;
} }
preferences_.SetStringWithoutPathExpansion(name, value); DictionaryPrefUpdate update(GetPrefs(), prefs::kDevToolsPreferences);
update.Get()->SetStringWithoutPathExpansion(name, value);
} else if (method == "removePreference") { } else if (method == "removePreference") {
std::string name; std::string name;
if (!params->GetString(0, &name)) if (!params->GetString(0, &name))
return; return;
preferences_.RemoveWithoutPathExpansion(name, nullptr); DictionaryPrefUpdate update(GetPrefs(), prefs::kDevToolsPreferences);
update.Get()->RemoveWithoutPathExpansion(name, nullptr);
} else if (method == "requestFileSystems") { } else if (method == "requestFileSystems") {
web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( web_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
base::ASCIIToUTF16("DevToolsAPI.fileSystemsLoaded([]);")); base::ASCIIToUTF16("DevToolsAPI.fileSystemsLoaded([]);"));
@@ -407,3 +415,8 @@ void CefDevToolsFrontend::AgentHostClosed(
agent_host_ = nullptr; agent_host_ = nullptr;
Close(); Close();
} }
PrefService* CefDevToolsFrontend::GetPrefs() const {
return static_cast<CefBrowserContext*>(
frontend_browser_->web_contents()->GetBrowserContext())->GetPrefs();
}

View File

@@ -28,6 +28,8 @@ class RenderViewHost;
class WebContents; class WebContents;
} }
class PrefService;
class CefDevToolsFrontend : public content::WebContentsObserver, class CefDevToolsFrontend : public content::WebContentsObserver,
public content::DevToolsAgentHostClient, public content::DevToolsAgentHostClient,
public net::URLFetcherDelegate { public net::URLFetcherDelegate {
@@ -81,6 +83,8 @@ class CefDevToolsFrontend : public content::WebContentsObserver,
void SendMessageAck(int request_id, void SendMessageAck(int request_id,
const base::Value* arg1); const base::Value* arg1);
PrefService* GetPrefs() const;
CefRefPtr<CefBrowserHostImpl> frontend_browser_; CefRefPtr<CefBrowserHostImpl> frontend_browser_;
content::WebContents* inspected_contents_; content::WebContents* inspected_contents_;
scoped_refptr<content::DevToolsAgentHost> agent_host_; scoped_refptr<content::DevToolsAgentHost> agent_host_;
@@ -88,7 +92,6 @@ class CefDevToolsFrontend : public content::WebContentsObserver,
std::unique_ptr<content::DevToolsFrontendHost> frontend_host_; std::unique_ptr<content::DevToolsFrontendHost> frontend_host_;
using PendingRequestsMap = std::map<const net::URLFetcher*, int>; using PendingRequestsMap = std::map<const net::URLFetcher*, int>;
PendingRequestsMap pending_requests_; PendingRequestsMap pending_requests_;
base::DictionaryValue preferences_;
base::WeakPtrFactory<CefDevToolsFrontend> weak_factory_; base::WeakPtrFactory<CefDevToolsFrontend> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(CefDevToolsFrontend); DISALLOW_COPY_AND_ASSIGN(CefDevToolsFrontend);

View File

@@ -234,6 +234,10 @@ std::unique_ptr<PrefService> CreatePrefService(
// Based on chrome/browser/ui/browser_ui_prefs.cc RegisterBrowserPrefs. // Based on chrome/browser/ui/browser_ui_prefs.cc RegisterBrowserPrefs.
registry->RegisterBooleanPref(prefs::kAllowFileSelectionDialogs, true); registry->RegisterBooleanPref(prefs::kAllowFileSelectionDialogs, true);
// DevTools preferences.
// Based on DevToolsWindow::RegisterProfilePrefs.
registry->RegisterDictionaryPref(prefs::kDevToolsPreferences);
if (command_line->HasSwitch(switches::kEnablePreferenceTesting)) { if (command_line->HasSwitch(switches::kEnablePreferenceTesting)) {
// Preferences used with unit tests. // Preferences used with unit tests.
registry->RegisterBooleanPref("test.bool", true); registry->RegisterBooleanPref("test.bool", true);