Index: chrome/common/extensions/api/extension_api.cc |
diff --git a/chrome/common/extensions/api/extension_api.cc b/chrome/common/extensions/api/extension_api.cc |
index 5c2ba8b039f061a09adfefcb2b2ad143203c3414..d315a64bf35e682683c6649951c481290179b02d 100644 |
--- a/chrome/common/extensions/api/extension_api.cc |
+++ b/chrome/common/extensions/api/extension_api.cc |
@@ -125,6 +125,69 @@ struct Static { |
base::LazyInstance<Static> g_lazy_instance = LAZY_INSTANCE_INITIALIZER; |
+// If it exists and does not already specify a namespace, then the value stored |
+// with key |key| in |schema| will be updated to |schema_namespace| + "." + |
+// |schema[key]|. |
+void MaybePrefixFieldWithNamespace(const std::string& schema_namespace, |
+ DictionaryValue* schema, |
+ const std::string& key) { |
+ if (!schema->HasKey(key)) |
+ return; |
+ |
+ std::string old_id; |
+ CHECK(schema->GetString(key, &old_id)); |
+ if (old_id.find(".") == std::string::npos) |
+ schema->SetString(key, schema_namespace + "." + old_id); |
+} |
+ |
+// Modify all "$ref" keys anywhere in |schema| to be prefxied by |
+// |schema_namespace| if they do not already specify a namespace. |
+void PrefixRefsWithNamespace(const std::string& schema_namespace, |
+ Value* value) { |
+ if (value->IsType(Value::TYPE_LIST)) { |
+ ListValue* list; |
+ CHECK(value->GetAsList(&list)); |
+ for (ListValue::iterator i = list->begin(); i != list->end(); ++i) { |
+ PrefixRefsWithNamespace(schema_namespace, *i); |
+ } |
+ } else if (value->IsType(Value::TYPE_DICTIONARY)) { |
+ DictionaryValue* dict; |
+ CHECK(value->GetAsDictionary(&dict)); |
+ MaybePrefixFieldWithNamespace(schema_namespace, dict, "$ref"); |
+ for (DictionaryValue::key_iterator i = dict->begin_keys(); |
+ i != dict->end_keys(); ++i) { |
+ Value* next_value; |
+ CHECK(dict->GetWithoutPathExpansion(*i, &next_value)); |
+ PrefixRefsWithNamespace(schema_namespace, next_value); |
+ } |
+ } |
+} |
+ |
+// Modify all objects in the "types" section of the schema to be prefixed by |
+// |schema_namespace| if they do not already specify a namespace. |
+void PrefixTypesWithNamespace(const std::string& schema_namespace, |
+ DictionaryValue* schema) { |
+ if (!schema->HasKey("types")) |
+ return; |
+ |
+ // Add the namespace to all of the types defined in this schema |
+ ListValue *types; |
+ CHECK(schema->GetList("types", &types)); |
+ for (size_t i = 0; i < types->GetSize(); ++i) { |
+ DictionaryValue *type; |
+ CHECK(types->GetDictionary(i, &type)); |
+ MaybePrefixFieldWithNamespace(schema_namespace, type, "id"); |
+ MaybePrefixFieldWithNamespace(schema_namespace, type, "customBindings"); |
+ } |
+} |
+ |
+// Modify the schema so that all types are fully qualified. |
+void PrefixWithNamespace(const std::string& schema_namespace, |
+ DictionaryValue* schema) { |
+ PrefixTypesWithNamespace(schema_namespace, schema); |
+ PrefixRefsWithNamespace(schema_namespace, schema); |
+} |
+ |
} // namespace |
// static |
@@ -161,15 +224,16 @@ void ExtensionAPI::LoadSchema(const std::string& name, |
std::string schema_namespace; |
while (!schema_list->empty()) { |
- const DictionaryValue* schema = NULL; |
+ DictionaryValue* schema = NULL; |
{ |
Value* value = NULL; |
schema_list->Remove(schema_list->GetSize() - 1, &value); |
CHECK(value->IsType(Value::TYPE_DICTIONARY)); |
- schema = static_cast<const DictionaryValue*>(value); |
+ schema = static_cast<DictionaryValue*>(value); |
} |
CHECK(schema->GetString("namespace", &schema_namespace)); |
+ PrefixWithNamespace(schema_namespace, schema); |
schemas_[schema_namespace] = make_linked_ptr(schema); |
CHECK_EQ(1u, unloaded_schemas_.erase(schema_namespace)); |