Index: base/values.cc |
diff --git a/base/values.cc b/base/values.cc |
index 2d3984e0d4247ddb2b82aed3758771fa19bf8e31..cf5a62dc76439aae97109416448afc68073ff53a 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)); |
// LOG(WARNING) << "\n1\n"; |
std::string current_path(path); |
@@ -755,6 +755,26 @@ bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, |
return true; |
} |
+bool DictionaryValue::RemovePath(const std::string& path, |
+ scoped_ptr<Value>* out_value) { |
+ bool result = false; |
+ size_t delimiter_position = path.find('.'); |
+ |
+ if (delimiter_position == std::string::npos) |
+ return RemoveWithoutPathExpansion(path, out_value); |
+ |
+ 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()) |
+ RemoveWithoutPathExpansion(subdict_path, NULL); |
+ |
+ return result; |
+} |
+ |
DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() const { |
Value* copy = CopyWithoutEmptyChildren(this); |
return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; |