Commit 9064e302 authored by Marshall Greenblatt's avatar Marshall Greenblatt

Update to Chromium revision 1ae106db (#414607)

parent c48cac8d
......@@ -101,9 +101,11 @@ import("//build/config/ui.gni")
import("//cef/cef_repack_locales.gni")
import("//media/media_options.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//third_party/icu/config.gni")
import("//third_party/widevine/cdm/widevine.gni")
import("//tools/grit/repack.gni")
import("//tools/grit/grit_rule.gni")
import("//v8/gni/v8.gni")
if (is_clang) {
import("//build/config/clang/clang.gni")
}
......@@ -124,6 +126,7 @@ if (is_win) {
#
# Verify required global arguments configured via `gn args`.
# Set by GetRequiredArgs() in //cef/tools/gn_args.py.
#
# Set ENABLE_PRINTING=1 ENABLE_BASIC_PRINTING=1.
......@@ -141,6 +144,10 @@ if (is_clang) {
assert(!clang_use_chrome_plugins)
}
# CEF does not currently support component builds. See
# https://bitbucket.org/chromiumembedded/cef/issues/1617
assert(!is_component_build)
#
# Local variables.
......@@ -541,6 +548,7 @@ static_library("libcef_static") {
# libcef/common/extensions/api/README.txt for details.
#"libcef/common/extensions/api",
#"libcef/common/extensions/api:api_registration",
"libcef/common/extensions/api:extensions_features",
# Normal build dependencies. Should be sorted alphabetically.
"//base",
......@@ -564,7 +572,6 @@ static_library("libcef_static") {
"//components/keyed_service/content:content",
"//components/keyed_service/core:core",
"//components/navigation_interception",
"//components/network_session_configurator:switches",
"//components/pdf/browser",
"//components/pdf/renderer",
"//components/plugins/renderer",
......@@ -590,6 +597,7 @@ static_library("libcef_static") {
"//content/public/utility",
"//crypto",
"//device/core",
"//device/geolocation:device_geolocation",
"//device/hid",
"//extensions/browser",
"//extensions/common/api",
......@@ -606,8 +614,7 @@ static_library("libcef_static") {
"//pdf",
"//skia",
"//storage/browser",
"//sync",
"//third_party/cld_2",
"//third_party/cld",
"//third_party/hunspell",
"//third_party/leveldatabase",
"//third_party/libxml",
......@@ -1152,7 +1159,7 @@ if (is_mac) {
tweak_info_plist("cef_framework_plist") {
info_plist = "libcef/resources/framework-Info.plist"
args = [
"--breakpad=1",
"--breakpad=0",
"--keystone=0",
"--scm=1",
"--version",
......@@ -1184,7 +1191,6 @@ if (is_mac) {
"$root_out_dir/cef_200_percent.pak",
"$root_out_dir/cef_extensions.pak",
"$root_out_dir/devtools_resources.pak",
"$root_out_dir/icudtl.dat",
# TODO(cef): Restore this line once Widevine build errors are resolved.
# "$root_out_dir/$widevine_cdm_path/widevinecdmadapter.plugin",
]
......@@ -1195,11 +1201,15 @@ if (is_mac) {
":pak_200_percent",
":pak_devtools",
":pak_extensions",
"//third_party/icu:icudata",
# TODO(cef): Restore this line once Widevine build errors are resolved.
# "//third_party/widevine/cdm:widevinecdmadapter",
]
if (icu_use_data_file) {
sources += [ "$root_out_dir/icudtl.dat" ]
public_deps += [ "//third_party/icu:icudata", ]
}
if (v8_use_external_startup_data) {
sources += [
"$root_out_dir/natives_blob.bin",
......
......@@ -7,5 +7,5 @@
# https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
{
'chromium_checkout': 'fc6aaca4ed6ff4f050e6f5c7fb19af85da8db574',
'chromium_checkout': '1ae106dbab4bddd85132d5b75c670794311f4c57',
}
......@@ -19,8 +19,9 @@
base::AtomicRefCount CefBrowserContext::DebugObjCt = 0;
#endif
CefBrowserContext::CefBrowserContext()
: extension_system_(NULL) {
CefBrowserContext::CefBrowserContext(bool is_proxy)
: is_proxy_(is_proxy),
extension_system_(NULL) {
#ifndef NDEBUG
base::AtomicRefCountInc(&DebugObjCt);
#endif
......@@ -39,7 +40,6 @@ void CefBrowserContext::Initialize() {
content::BrowserContext::Initialize(this, GetPath());
const bool extensions_enabled = extensions::ExtensionsEnabled();
bool extensions_initialized = false;
if (extensions_enabled) {
// Create the custom ExtensionSystem first because other KeyedServices
// depend on it.
......@@ -47,9 +47,11 @@ void CefBrowserContext::Initialize() {
// and CefBrowserContextProxy objects.
extension_system_ = static_cast<extensions::CefExtensionSystem*>(
extensions::ExtensionSystem::Get(this));
extensions_initialized = extension_system_->initialized();
if (!extensions_initialized)
if (is_proxy_) {
DCHECK(extension_system_->initialized());
} else {
extension_system_->InitForRegularProfile(true);
}
}
resource_context_.reset(new CefResourceContext(
......@@ -66,7 +68,7 @@ void CefBrowserContext::Initialize() {
DCHECK(pref_service);
user_prefs::UserPrefs::Set(this, pref_service);
if (extensions_enabled && !extensions_initialized)
if (extensions_enabled && !is_proxy_)
extension_system_->Init();
}
......@@ -76,17 +78,26 @@ void CefBrowserContext::Shutdown() {
// Send notifications to clean up objects associated with this Profile.
MaybeSendDestroyedNotification();
// Remove any BrowserContextKeyedServiceFactory associations. This must be
// called before the ProxyService owned by CefBrowserContextImpl is destroyed.
BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
this);
if (!is_proxy_) {
// Shuts down the storage partitions associated with this browser context.
// This must be called before the browser context is actually destroyed
// and before a clean-up task for its corresponding IO thread residents
// (e.g. ResourceContext) is posted, so that the classes that hung on
// StoragePartition can have time to do necessary cleanups on IO thread.
ShutdownStoragePartitions();
}
if (resource_context_.get()) {
// Destruction of the ResourceContext will trigger destruction of all
// associated URLRequests.
content::BrowserThread::DeleteSoon(
content::BrowserThread::IO, FROM_HERE, resource_context_.release());
}
// Remove any BrowserContextKeyedServiceFactory associations. This must be
// called before the ProxyService owned by CefBrowserContextImpl is destroyed.
BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
this);
}
content::ResourceContext* CefBrowserContext::GetResourceContext() {
......
......@@ -133,7 +133,7 @@ class CefBrowserContext
public base::RefCountedThreadSafe<
CefBrowserContext, content::BrowserThread::DeleteOnUIThread> {
public:
CefBrowserContext();
explicit CefBrowserContext(bool is_proxy);
// Must be called immediately after this object is created.
virtual void Initialize();
......@@ -188,6 +188,9 @@ class CefBrowserContext
content::BrowserThread::UI>;
friend class base::DeleteHelper<CefBrowserContext>;
// True if this CefBrowserContext is a CefBrowserContextProxy.
const bool is_proxy_;
std::unique_ptr<CefResourceContext> resource_context_;
// Owned by the KeyedService system.
......
......@@ -199,7 +199,8 @@ class CefVisitedLinkListener : public visitedlink::VisitedLinkMaster::Listener {
CefBrowserContextImpl::CefBrowserContextImpl(
const CefRequestContextSettings& settings)
: settings_(settings) {
: CefBrowserContext(false),
settings_(settings) {
g_manager.Get().AddImpl(this);
}
......@@ -278,6 +279,14 @@ void CefBrowserContextImpl::Initialize() {
// CefURLRequestContextImpl.
GetRequestContext();
DCHECK(url_request_getter_.get());
// Create the StoragePartitionImplMap and StoragePartitionImpl for this
// object. This must be done before the first WebContents is created using a
// CefBrowserContextProxy of this object, otherwise the StoragePartitionProxy
// will not be created (in that case
// CefBrowserContextProxy::CreateRequestContext will be called, which is
// incorrect).
GetDefaultStoragePartition(this);
}
void CefBrowserContextImpl::AddProxy(const CefBrowserContextProxy* proxy) {
......
......@@ -55,7 +55,8 @@ bool ShouldProxyUserData(const void* key) {
CefBrowserContextProxy::CefBrowserContextProxy(
CefRefPtr<CefRequestContextHandler> handler,
scoped_refptr<CefBrowserContextImpl> parent)
: handler_(handler),
: CefBrowserContext(true),
handler_(handler),
parent_(parent) {
DCHECK(handler_.get());
DCHECK(parent_.get());
......
......@@ -64,7 +64,7 @@
#include "third_party/WebKit/public/web/WebFindOptions.h"
#if defined(OS_MACOSX)
#include "chrome/browser/spellchecker/spellcheck_platform.h"
#include "components/spellcheck/browser/spellcheck_platform.h"
#endif
namespace {
......@@ -287,6 +287,11 @@ CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::Create(
request_context_impl->GetBrowserContext();
DCHECK(browser_context);
// A StoragePartitionImplMap must already exist for the BrowserContext. See
// additional comments in CefBrowserContextImpl::Initialize().
DCHECK(browser_context->GetUserData(
content::BrowserContext::GetStoragePartitionMapUserDataKey()));
if (!create_params.request_context) {
// Using the global request context.
create_params.request_context = request_context_impl.get();
......
......@@ -32,6 +32,9 @@
#include "content/public/browser/gpu_data_manager.h"
#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/content_switches.h"
#include "device/geolocation/access_token_store.h"
#include "device/geolocation/geolocation_delegate.h"
#include "device/geolocation/geolocation_provider.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/constants.h"
#include "net/base/net_module.h"
......@@ -56,6 +59,50 @@
#include "libcef/browser/printing/print_dialog_linux.h"
#endif
namespace {
// In-memory store for access tokens used by geolocation.
class CefAccessTokenStore : public device::AccessTokenStore {
public:
// |system_context| is used by NetworkLocationProvider to communicate with a
// remote geolocation service.
explicit CefAccessTokenStore(net::URLRequestContextGetter* system_context)
: system_context_(system_context) {}
void LoadAccessTokens(const LoadAccessTokensCallback& callback) override {
callback.Run(access_token_map_, system_context_);
}
void SaveAccessToken(
const GURL& server_url, const base::string16& access_token) override {
access_token_map_[server_url] = access_token;
}
private:
net::URLRequestContextGetter* system_context_;
AccessTokenMap access_token_map_;
DISALLOW_COPY_AND_ASSIGN(CefAccessTokenStore);
};
// A provider of services for geolocation.
class CefGeolocationDelegate : public device::GeolocationDelegate {
public:
explicit CefGeolocationDelegate(net::URLRequestContextGetter* system_context)
: system_context_(system_context) {}
scoped_refptr<device::AccessTokenStore> CreateAccessTokenStore() override {
return new CefAccessTokenStore(system_context_);
}
private:
net::URLRequestContextGetter* system_context_;
DISALLOW_COPY_AND_ASSIGN(CefGeolocationDelegate);
};
} // namespace
CefBrowserMainParts::CefBrowserMainParts(
const content::MainFunctionParams& parameters)
: BrowserMainParts(),
......@@ -163,6 +210,10 @@ void CefBrowserMainParts::PreMainMessageLoopRun() {
// Triggers initialization of the singleton instance on UI thread.
PluginFinder::GetInstance()->Init();
device::GeolocationProvider::SetGeolocationDelegate(
new CefGeolocationDelegate(
global_browser_context_->request_context().get()));
}
void CefBrowserMainParts::PostMainMessageLoopRun() {
......
......@@ -188,12 +188,12 @@ IconManager* ChromeBrowserProcessStub::icon_manager() {
return NULL;
}
GLStringManager* ChromeBrowserProcessStub::gl_string_manager() {
GpuModeManager* ChromeBrowserProcessStub::gpu_mode_manager() {
NOTIMPLEMENTED();
return NULL;
}
GpuModeManager* ChromeBrowserProcessStub::gpu_mode_manager() {
GpuProfileCache* ChromeBrowserProcessStub::gpu_profile_cache() {
NOTIMPLEMENTED();
return NULL;
}
......
......@@ -62,8 +62,8 @@ class ChromeBrowserProcessStub : public BrowserProcess,
policy::BrowserPolicyConnector* browser_policy_connector() override;
policy::PolicyService* policy_service() override;
IconManager* icon_manager() override;
GLStringManager* gl_string_manager() override;
GpuModeManager* gpu_mode_manager() override;
GpuProfileCache* gpu_profile_cache() override;
void CreateDevToolsHttpProtocolHandler(const std::string& ip,
uint16_t port) override;
void CreateDevToolsAutoOpener() override;
......
......@@ -6,7 +6,10 @@
#include "include/cef_version.h"
#include "base/version.h"
#include "chrome/common/pref_names.h"
#include "components/component_updater/configurator_impl.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/update_client/component_patcher_operation.h"
#include "content/public/browser/browser_thread.h"
......@@ -37,9 +40,10 @@ class CefConfigurator : public update_client::Configurator {
net::URLRequestContextGetter* RequestContext() const override;
scoped_refptr<update_client::OutOfProcessPatcher>
CreateOutOfProcessPatcher() const override;
bool DeltasEnabled() const override;
bool UseBackgroundDownloader() const override;
bool UseCupSigning() const override;
bool EnabledDeltas() const override;
bool EnabledComponentUpdates() const override;
bool EnabledBackgroundDownloader() const override;
bool EnabledCupSigning() const override;
scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner()
const override;
PrefService* GetPrefService() const override;
......@@ -59,6 +63,7 @@ CefConfigurator::CefConfigurator(
PrefService* pref_service)
: configurator_impl_(cmdline, url_request_getter, false),
pref_service_(pref_service) {
DCHECK(pref_service_);
}
int CefConfigurator::InitialDelay() const {
......@@ -126,16 +131,20 @@ CefConfigurator::CreateOutOfProcessPatcher() const {
return nullptr;
}
bool CefConfigurator::DeltasEnabled() const {
return configurator_impl_.DeltasEnabled();
bool CefConfigurator::EnabledDeltas() const {
return configurator_impl_.EnabledDeltas();
}
bool CefConfigurator::UseBackgroundDownloader() const {
return configurator_impl_.UseBackgroundDownloader();
bool CefConfigurator::EnabledComponentUpdates() const {
return pref_service_->GetBoolean(prefs::kComponentUpdatesEnabled);
}
bool CefConfigurator::UseCupSigning() const {
return configurator_impl_.UseCupSigning();
bool CefConfigurator::EnabledBackgroundDownloader() const {
return configurator_impl_.EnabledBackgroundDownloader();
}
bool CefConfigurator::EnabledCupSigning() const {
return configurator_impl_.EnabledCupSigning();
}
// Returns a task runner to run blocking tasks. The task runner continues to run
......@@ -156,6 +165,12 @@ PrefService* CefConfigurator::GetPrefService() const {
} // namespace
void RegisterPrefsForCefComponentUpdaterConfigurator(
PrefRegistrySimple* registry) {
// The component updates are enabled by default, if the preference is not set.
registry->RegisterBooleanPref(prefs::kComponentUpdatesEnabled, true);
}
scoped_refptr<update_client::Configurator>
MakeCefComponentUpdaterConfigurator(
const base::CommandLine* cmdline,
......
......@@ -16,10 +16,18 @@ namespace net {
class URLRequestContextGetter;
}
class PrefRegistrySimple;
class PrefService;
namespace component_updater {
// Registers preferences associated with the component updater configurator
// for CEF. The preferences must be registered with the local pref store
// before they can be queried by the configurator instance.
// This function is called before MakeCefComponentUpdaterConfigurator.
void RegisterPrefsForCefComponentUpdaterConfigurator(
PrefRegistrySimple* registry);
scoped_refptr<update_client::Configurator>
MakeCefComponentUpdaterConfigurator(
const base::CommandLine* cmdline,
......
......@@ -46,12 +46,10 @@
#include "content/browser/frame_host/navigation_handle_impl.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/plugin_service_impl.h"
#include "content/public/browser/access_token_store.h"
#include "content/public/browser/browser_ppapi_host.h"
#include "content/public/browser/browser_url_handler.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/client_certificate_delegate.h"
#include "content/public/browser/geolocation_delegate.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/page_navigator.h"
#include "content/public/browser/quota_permission_context.h"
......@@ -78,7 +76,7 @@
#include "url/gurl.h"
#if defined(OS_MACOSX)
#include "chrome/browser/spellchecker/spellcheck_message_filter_platform.h"
#include "components/spellcheck/browser/spellcheck_message_filter_platform.h"
#endif
#if defined(OS_POSIX) && !defined(OS_MACOSX)
......@@ -94,47 +92,6 @@
namespace {
// In-memory store for access tokens used by geolocation.
class CefAccessTokenStore : public content::AccessTokenStore {
public:
// |system_context| is used by NetworkLocationProvider to communicate with a
// remote geolocation service.
explicit CefAccessTokenStore(net::URLRequestContextGetter* system_context)
: system_context_(system_context) {}
void LoadAccessTokens(const LoadAccessTokensCallback& callback) override {
callback.Run(access_token_map_, system_context_);
}
void SaveAccessToken(
const GURL& server_url, const base::string16& access_token) override {
access_token_map_[server_url] = access_token;
}
private:
net::URLRequestContextGetter* system_context_;
AccessTokenMap access_token_map_;
DISALLOW_COPY_AND_ASSIGN(CefAccessTokenStore);
};
// A provider of services for geolocation.
class CefGeolocationDelegate : public content::GeolocationDelegate {
public:
explicit CefGeolocationDelegate(net::URLRequestContextGetter* system_context)
: system_context_(system_context) {}
scoped_refptr<content::AccessTokenStore> CreateAccessTokenStore() override {
return new CefAccessTokenStore(system_context_);
}
private:
net::URLRequestContextGetter* system_context_;
DISALLOW_COPY_AND_ASSIGN(CefGeolocationDelegate);
};
class CefQuotaCallbackImpl : public CefRequestCallback {
public:
explicit CefQuotaCallbackImpl(
......@@ -192,7 +149,7 @@ class CefQuotaCallbackImpl : public CefRequestCallback {
class CefAllowCertificateErrorCallbackImpl : public CefRequestCallback {
public:
typedef base::Callback<void(bool)> // NOLINT(readability/function)
typedef base::Callback<void(content::CertificateRequestResultType)>
CallbackType;
explicit CefAllowCertificateErrorCallbackImpl(const CallbackType& callback)
......@@ -236,7 +193,8 @@ class CefAllowCertificateErrorCallbackImpl : public CefRequestCallback {
private:
static void RunNow(const CallbackType& callback, bool allow) {
CEF_REQUIRE_UIT();
callback.Run(allow);
callback.Run(allow ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE :
content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
}
CallbackType callback_;
......@@ -701,15 +659,15 @@ void CefContentBrowserClient::AllowCertificateError(
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* result) {
const base::Callback<
void(content::CertificateRequestResultType)>& callback) {
CEF_REQUIRE_UIT();
if (resource_type != content::ResourceType::RESOURCE_TYPE_MAIN_FRAME) {
// A sub-resource has a certificate error. The user doesn't really
// have a context for making the right decision, so block the request
// hard.
*result = content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL;
callback.Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL);
return;
}
......@@ -735,8 +693,8 @@ void CefContentBrowserClient::AllowCertificateError(
if (!proceed)
callbackImpl->Disconnect();
*result = proceed ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE :
content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL;
callback.Run(proceed ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE :
content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL);
}
void CefContentBrowserClient::SelectClientCertificate(
......@@ -749,12 +707,6 @@ void CefContentBrowserClient::SelectClientCertificate(
}
}
content::GeolocationDelegate*
CefContentBrowserClient::CreateGeolocationDelegate() {
return new CefGeolocationDelegate(
browser_main_parts_->browser_context()->request_context().get());
}
bool CefContentBrowserClient::CanCreateWindow(
const GURL& opener_url,
const GURL& opener_top_level_frame_url,
......@@ -762,6 +714,7 @@ bool CefContentBrowserClient::CanCreateWindow(
WindowContainerType container_type,
const GURL& target_url,
const content::Referrer& referrer,
const std::string& frame_name,
WindowOpenDisposition disposition,
const blink::WebWindowFeatures& features,
bool user_gesture,
......@@ -792,7 +745,8 @@ void CefContentBrowserClient::OverrideWebkitPrefs(
content::WebPreferences* prefs) {
renderer_prefs::PopulateWebPreferences(rvh, *prefs);
if (rvh->GetWidget()->GetView()) {
if (rvh->GetWidget()->GetView() &&
rvh->GetWidget()->GetView()->GetNativeView()) {
rvh->GetWidget()->GetView()->SetBackgroundColor(
prefs->base_background_color);
}
......
......@@ -62,19 +62,19 @@ class CefContentBrowserClient : public content::ContentBrowserClient {
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* result) override;
const base::Callback<
void(content::CertificateRequestResultType)>& callback) override;
void SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
content::GeolocationDelegate* CreateGeolocationDelegate() override;
bool CanCreateWindow(const GURL& opener_url,
const GURL& opener_top_level_frame_url,
const GURL& source_origin,
WindowContainerType container_type,
const GURL& target_url,
const content::Referrer& referrer,
const std::string& frame_name,
WindowOpenDisposition disposition,
const blink::WebWindowFeatures& features,
bool user_gesture,
......
......@@ -21,7 +21,6 @@
#include "base/debug/debugger.h"
#include "base/files/file_util.h"
#include "base/synchronization/waitable_event.h"
#include "components/network_session_configurator/switches.h"
#include "content/public/app/content_main.h"
#include "content/public/app/content_main_runner.h"
#include "content/public/browser/notification_service.h"
......
......@@ -135,6 +135,6 @@ base::DictionaryValue* CefDevToolsManagerDelegate::HandleCommand(
base::DictionaryValue* command_dict) {
std::unique_ptr<base::DictionaryValue> result =
devtools_discovery::DevToolsDiscoveryManager::GetInstance()
->HandleNewTargetCommand(command_dict);
->HandleCreateTargetCommand(command_dict);
return result.release(); // Caller takes ownership.
}
......@@ -320,6 +320,21 @@ void CefDevToolsFrontend::DispatchProtocolMessage(
}
}
void CefDevToolsFrontend::SetPreferences(const std::string& json) {
preferences_.Clear();
if (json.empty())
return;
base::DictionaryValue* dict = nullptr;
std::unique_ptr<base::Value> parsed = base::JSONReader::Read(json);
if (!parsed || !parsed->GetAsDictionary(&dict))
return;
for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
if (!it.value().IsType(base::Value::TYPE_STRING))
continue;
preferences_.SetWithoutPathExpansion(it.key(), it.value().CreateDeepCopy());
}
}
void CefDevToolsFrontend::OnURLFetchComplete(const net::URLFetcher* source) {
// TODO(pfeldman): this is a copy of chrome's devtools_ui_bindings.cc.
// We should handle some of the commands including this one in content.
......
......@@ -62,7 +62,7 @@ class CefDevToolsFrontend : public content::WebContentsObserver,
bool replaced) override;
void DispatchProtocolMessage(content::DevToolsAgentHost* agent_host,
const std::string& message) override;
base::DictionaryValue* preferences() { return &preferences_; }
void SetPreferences(const std::string& json);