1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/features/manifest_feature.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManifestFeature::ManifestFeature() {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManifestFeature::~ManifestFeature() {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Feature::Availability ManifestFeature::IsAvailableToContext(
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Feature::Context context,
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Feature::Platform platform) const {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Availability availability = SimpleFeature::IsAvailableToContext(extension,
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                                  context,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                                  url,
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                                  platform);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!availability.is_available())
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return availability;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We know we can skip manifest()->GetKey() here because we just did the same
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // validation it would do above.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (extension && !extension->manifest()->value()->HasKey(name()))
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CreateAvailability(NOT_PRESENT, extension->GetType());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateAvailability(IS_AVAILABLE);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string ManifestFeature::Parse(const base::DictionaryValue* value) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error = SimpleFeature::Parse(value);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!error.empty())
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return error;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (extension_types()->empty()) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return name() + ": Manifest features must specify at least one " +
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "value for extension_types.";
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (value->HasKey("contexts"))
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return name() + ": Manifest features do not support contexts.";
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return std::string();
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
54