Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/api/extension_api.h" | 5 #include "chrome/common/extensions/api/extension_api.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 | 118 |
| 119 struct Static { | 119 struct Static { |
| 120 Static() | 120 Static() |
| 121 : api(ExtensionAPI::CreateWithDefaultConfiguration()) { | 121 : api(ExtensionAPI::CreateWithDefaultConfiguration()) { |
| 122 } | 122 } |
| 123 scoped_ptr<ExtensionAPI> api; | 123 scoped_ptr<ExtensionAPI> api; |
| 124 }; | 124 }; |
| 125 | 125 |
| 126 base::LazyInstance<Static> g_lazy_instance = LAZY_INSTANCE_INITIALIZER; | 126 base::LazyInstance<Static> g_lazy_instance = LAZY_INSTANCE_INITIALIZER; |
| 127 | 127 |
| 128 // If it exists and does not already specify a namespace, then the value stored | |
| 129 // with key |key| in |schema| will be updated to |schema_namespace| + "." + | |
| 130 // |schema[key]|. | |
| 131 void MaybePrefixFieldWithNamespace(const std::string& schema_namespace, | |
| 132 DictionaryValue* schema, | |
| 133 const std::string& key) { | |
| 134 if (!schema->HasKey(key)) | |
| 135 return; | |
| 136 | |
| 137 std::string old_id; | |
| 138 CHECK(schema->GetString(key, &old_id)); | |
| 139 if (old_id.find(".") == std::string::npos) | |
| 140 schema->SetString(key, schema_namespace + "." + old_id); | |
| 141 } | |
| 142 | |
| 143 // Modify all objects in the "types" section of the schema to be prefixed by | |
| 144 // |schema_namespace| if they do not already specify a namespace. | |
|
asargent_no_longer_on_chrome
2012/05/09 18:37:23
nit: looks like this comment should go with Prefix
bryeung
2012/05/09 19:12:00
Oops. Good catch! Done.
| |
| 145 void PrefixRefsWithNamespace(const std::string& schema_namespace, | |
| 146 Value* value) { | |
| 147 if (value->IsType(Value::TYPE_LIST)) { | |
| 148 ListValue* list; | |
| 149 CHECK(value->GetAsList(&list)); | |
| 150 for (ListValue::iterator i = list->begin(); i != list->end(); ++i) { | |
| 151 PrefixRefsWithNamespace(schema_namespace, *i); | |
| 152 } | |
| 153 } else if (value->IsType(Value::TYPE_DICTIONARY)) { | |
| 154 DictionaryValue* dict; | |
| 155 CHECK(value->GetAsDictionary(&dict)); | |
| 156 MaybePrefixFieldWithNamespace(schema_namespace, dict, "$ref"); | |
| 157 for (DictionaryValue::key_iterator i = dict->begin_keys(); | |
| 158 i != dict->end_keys(); ++i) { | |
| 159 Value* next_value; | |
| 160 CHECK(dict->GetWithoutPathExpansion(*i, &next_value)); | |
| 161 PrefixRefsWithNamespace(schema_namespace, next_value); | |
| 162 } | |
| 163 } | |
| 164 } | |
| 165 | |
| 166 // Modify all "$ref" keys anywhere in |schema| to be prefxied by | |
| 167 // |schema_namespace| if they do not already specify a namespace. | |
| 168 void PrefixTypesWithNamespace(const std::string& schema_namespace, | |
| 169 DictionaryValue* schema) { | |
| 170 if (!schema->HasKey("types")) | |
| 171 return; | |
| 172 | |
| 173 // Add the namespace to all of the types defined in this schema | |
| 174 ListValue *types; | |
| 175 CHECK(schema->GetList("types", &types)); | |
| 176 for (size_t i = 0; i < types->GetSize(); ++i) { | |
| 177 DictionaryValue *type; | |
| 178 CHECK(types->GetDictionary(i, &type)); | |
| 179 MaybePrefixFieldWithNamespace(schema_namespace, type, "id"); | |
| 180 MaybePrefixFieldWithNamespace(schema_namespace, type, "customBindings"); | |
| 181 } | |
| 182 } | |
| 183 | |
| 184 // Modify the schema so that all types are fully qualified. | |
| 185 void PrefixWithNamespace(const std::string& schema_namespace, | |
| 186 DictionaryValue* schema) { | |
| 187 PrefixTypesWithNamespace(schema_namespace, schema); | |
| 188 PrefixRefsWithNamespace(schema_namespace, schema); | |
| 189 } | |
| 190 | |
| 128 } // namespace | 191 } // namespace |
| 129 | 192 |
| 130 // static | 193 // static |
| 131 ExtensionAPI* ExtensionAPI::GetSharedInstance() { | 194 ExtensionAPI* ExtensionAPI::GetSharedInstance() { |
| 132 return g_lazy_instance.Get().api.get(); | 195 return g_lazy_instance.Get().api.get(); |
| 133 } | 196 } |
| 134 | 197 |
| 135 // static | 198 // static |
| 136 ExtensionAPI* ExtensionAPI::CreateWithDefaultConfiguration() { | 199 ExtensionAPI* ExtensionAPI::CreateWithDefaultConfiguration() { |
| 137 ExtensionAPI* api = new ExtensionAPI(); | 200 ExtensionAPI* api = new ExtensionAPI(); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 154 *feature_type = full_name.substr(0, colon_index); | 217 *feature_type = full_name.substr(0, colon_index); |
| 155 *feature_name = full_name.substr(colon_index + 1); | 218 *feature_name = full_name.substr(colon_index + 1); |
| 156 } | 219 } |
| 157 | 220 |
| 158 void ExtensionAPI::LoadSchema(const std::string& name, | 221 void ExtensionAPI::LoadSchema(const std::string& name, |
| 159 const base::StringPiece& schema) { | 222 const base::StringPiece& schema) { |
| 160 scoped_ptr<ListValue> schema_list(LoadSchemaList(name, schema)); | 223 scoped_ptr<ListValue> schema_list(LoadSchemaList(name, schema)); |
| 161 std::string schema_namespace; | 224 std::string schema_namespace; |
| 162 | 225 |
| 163 while (!schema_list->empty()) { | 226 while (!schema_list->empty()) { |
| 164 const DictionaryValue* schema = NULL; | 227 DictionaryValue* schema = NULL; |
| 165 { | 228 { |
| 166 Value* value = NULL; | 229 Value* value = NULL; |
| 167 schema_list->Remove(schema_list->GetSize() - 1, &value); | 230 schema_list->Remove(schema_list->GetSize() - 1, &value); |
| 168 CHECK(value->IsType(Value::TYPE_DICTIONARY)); | 231 CHECK(value->IsType(Value::TYPE_DICTIONARY)); |
| 169 schema = static_cast<const DictionaryValue*>(value); | 232 schema = static_cast<DictionaryValue*>(value); |
| 170 } | 233 } |
| 171 | 234 |
| 172 CHECK(schema->GetString("namespace", &schema_namespace)); | 235 CHECK(schema->GetString("namespace", &schema_namespace)); |
| 236 PrefixWithNamespace(schema_namespace, schema); | |
| 173 schemas_[schema_namespace] = make_linked_ptr(schema); | 237 schemas_[schema_namespace] = make_linked_ptr(schema); |
| 174 CHECK_EQ(1u, unloaded_schemas_.erase(schema_namespace)); | 238 CHECK_EQ(1u, unloaded_schemas_.erase(schema_namespace)); |
| 175 | 239 |
| 176 // Populate |{completely,partially}_unprivileged_apis_|. | 240 // Populate |{completely,partially}_unprivileged_apis_|. |
| 177 // | 241 // |
| 178 // For "partially", only need to look at functions/events; even though | 242 // For "partially", only need to look at functions/events; even though |
| 179 // there are unprivileged properties (e.g. in extensions), access to those | 243 // there are unprivileged properties (e.g. in extensions), access to those |
| 180 // never reaches C++ land. | 244 // never reaches C++ land. |
| 181 if (schema->HasKey("unprivileged")) { | 245 if (schema->HasKey("unprivileged")) { |
| 182 completely_unprivileged_apis_.insert(schema_namespace); | 246 completely_unprivileged_apis_.insert(schema_namespace); |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 726 | 790 |
| 727 void ExtensionAPI::LoadAllSchemas() { | 791 void ExtensionAPI::LoadAllSchemas() { |
| 728 while (unloaded_schemas_.size()) { | 792 while (unloaded_schemas_.size()) { |
| 729 std::map<std::string, base::StringPiece>::iterator it = | 793 std::map<std::string, base::StringPiece>::iterator it = |
| 730 unloaded_schemas_.begin(); | 794 unloaded_schemas_.begin(); |
| 731 LoadSchema(it->first, it->second); | 795 LoadSchema(it->first, it->second); |
| 732 } | 796 } |
| 733 } | 797 } |
| 734 | 798 |
| 735 } // namespace extensions | 799 } // namespace extensions |
| OLD | NEW |