17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/api/preference/chrome_direct_setting.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/containers/hash_tables.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/lazy_instance.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/prefs/pref_service.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/values.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/extensions/api/preference/chrome_direct_setting_api.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/api/preference/preference_api_constants.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profiles/profile.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace extensions {
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace chromedirectsetting {
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDirectSettingFunctionBase::DirectSettingFunctionBase() {}
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDirectSettingFunctionBase::~DirectSettingFunctionBase() {}
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochPrefService* DirectSettingFunctionBase::GetPrefService() {
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return GetProfile()->GetPrefs();
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DirectSettingFunctionBase::IsCalledFromComponentExtension() {
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return extension()->location() == Manifest::COMPONENT;
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGetDirectSettingFunction::GetDirectSettingFunction() {}
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool GetDirectSettingFunction::RunSync() {
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(IsCalledFromComponentExtension());
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string pref_key;
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key));
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(ChromeDirectSettingAPI::Get(GetProfile())
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  ->IsPreferenceOnWhitelist(pref_key));
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const PrefService::Preference* preference =
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetPrefService()->FindPreference(pref_key.c_str());
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(preference);
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::Value* value = preference->GetValue();
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue);
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  result->Set(preference_api_constants::kValue, value->DeepCopy());
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetResult(result.release());
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGetDirectSettingFunction::~GetDirectSettingFunction() {}
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSetDirectSettingFunction::SetDirectSettingFunction() {}
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SetDirectSettingFunction::RunSync() {
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(IsCalledFromComponentExtension());
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string pref_key;
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key));
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(ChromeDirectSettingAPI::Get(GetProfile())
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  ->IsPreferenceOnWhitelist(pref_key));
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* details = NULL;
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* value = NULL;
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      details->Get(preference_api_constants::kValue, &value));
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PrefService* pref_service = GetPrefService();
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const PrefService::Preference* preference =
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      pref_service->FindPreference(pref_key.c_str());
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(preference);
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(value->GetType() == preference->GetType());
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pref_service->Set(pref_key.c_str(), *value);
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSetDirectSettingFunction::~SetDirectSettingFunction() {}
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochClearDirectSettingFunction::ClearDirectSettingFunction() {}
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool ClearDirectSettingFunction::RunSync() {
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(IsCalledFromComponentExtension());
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string pref_key;
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key));
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(ChromeDirectSettingAPI::Get(GetProfile())
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  ->IsPreferenceOnWhitelist(pref_key));
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetPrefService()->ClearPref(pref_key.c_str());
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochClearDirectSettingFunction::~ClearDirectSettingFunction() {}
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace chromedirectsetting
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace extensions
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
104