| Index: extensions/common/features/json_feature_provider_source.cc
|
| diff --git a/extensions/common/features/json_feature_provider_source.cc b/extensions/common/features/json_feature_provider_source.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0a46f3f85094a16a81826097781bee4531b11539
|
| --- /dev/null
|
| +++ b/extensions/common/features/json_feature_provider_source.cc
|
| @@ -0,0 +1,54 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "extensions/common/features/json_feature_provider_source.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/json/json_reader.h"
|
| +#include "base/logging.h"
|
| +#include "ui/base/resource/resource_bundle.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +JSONFeatureProviderSource::JSONFeatureProviderSource(const std::string& name)
|
| + : name_(name) {
|
| +}
|
| +
|
| +JSONFeatureProviderSource::~JSONFeatureProviderSource() {
|
| +}
|
| +
|
| +void JSONFeatureProviderSource::LoadJSON(int resource_id) {
|
| + const std::string& features_file = ResourceBundle::GetSharedInstance()
|
| + .GetRawDataResource(resource_id)
|
| + .as_string();
|
| + int error_code = 0;
|
| + std::string error_message;
|
| + scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
|
| + features_file, base::JSON_PARSE_RFC, &error_code, &error_message));
|
| + DCHECK(value) << "Could not load features: " << name_ << " " << error_message;
|
| +
|
| + scoped_ptr<base::DictionaryValue> value_as_dict;
|
| + if (value) {
|
| + CHECK(value->IsType(base::Value::TYPE_DICTIONARY)) << name_;
|
| + value_as_dict.reset(static_cast<base::DictionaryValue*>(value.release()));
|
| + } else {
|
| + // There was some error loading the features file.
|
| + // http://crbug.com/176381
|
| + value_as_dict.reset(new base::DictionaryValue());
|
| + }
|
| +
|
| + // Ensure there are no key collisions.
|
| + for (base::DictionaryValue::Iterator iter(*value_as_dict); !iter.IsAtEnd();
|
| + iter.Advance()) {
|
| + if (dictionary_.GetWithoutPathExpansion(iter.key(), NULL))
|
| + LOG(FATAL) << "Key " << iter.key() << " is defined in " << name_
|
| + << " JSON feature files more than once.";
|
| + }
|
| +
|
| + // Merge.
|
| + dictionary_.MergeDictionary(value_as_dict.get());
|
| +}
|
| +
|
| +} // namespace
|
|
|