Index: base/values.cc |
diff --git a/base/values.cc b/base/values.cc |
index 9228ca9b7690cc4644a19a9fda6c8aa24fd56f40..5ec8d582998fe37bf26114890e308ef756f32962 100644 |
--- a/base/values.cc |
+++ b/base/values.cc |
@@ -462,8 +462,8 @@ void DictionaryValue::SetStringWithoutPathExpansion( |
SetWithoutPathExpansion(path, CreateStringValue(in_value)); |
} |
-bool DictionaryValue::Get( |
- const std::string& path, const Value** out_value) const { |
+bool DictionaryValue::Get(const std::string& path, |
+ const Value** out_value) const { |
DCHECK(IsStringUTF8(path)); |
std::string current_path(path); |
const DictionaryValue* current_dictionary = this; |
@@ -751,6 +751,24 @@ bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, |
return true; |
} |
+bool DictionaryValue::RemovePath(const std::string& path, Value** out_value) { |
+ bool result = false; |
+ size_t delimiter_position = path.find('.'); |
+ if (delimiter_position == std::string::npos) { |
+ return RemoveWithoutPathExpansion(path, out_value); |
+ } else { |
+ const std::string subdict_path = path.substr(0, delimiter_position); |
+ DictionaryValue* subdict = NULL; |
+ if (!GetDictionary(subdict_path, &subdict)) |
+ return false; |
+ result = subdict->RemovePath(path.substr(delimiter_position + 1), |
+ out_value); |
+ if (result && subdict->empty()) |
+ Remove(subdict_path, NULL); |
+ } |
+ return result; |
+} |
+ |
DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() { |
Value* copy = CopyWithoutEmptyChildren(this); |
return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; |