1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "extensions/common/manifest_handler_helpers.h"
6
7#include "base/logging.h"
8#include "base/strings/string_number_conversions.h"
9#include "base/strings/utf_string_conversions.h"
10#include "base/values.h"
11#include "extensions/common/error_utils.h"
12#include "extensions/common/extension.h"
13#include "extensions/common/extension_icon_set.h"
14#include "extensions/common/manifest_constants.h"
15
16
17namespace extensions {
18
19namespace errors = manifest_errors;
20
21namespace manifest_handler_helpers {
22
23bool NormalizeAndValidatePath(std::string* path) {
24  size_t first_non_slash = path->find_first_not_of('/');
25  if (first_non_slash == std::string::npos) {
26    *path = "";
27    return false;
28  }
29
30  *path = path->substr(first_non_slash);
31  return true;
32}
33
34bool LoadIconsFromDictionary(const base::DictionaryValue* icons_value,
35                             const int* icon_sizes,
36                             size_t num_icon_sizes,
37                             ExtensionIconSet* icons,
38                             base::string16* error) {
39  DCHECK(icons);
40  for (size_t i = 0; i < num_icon_sizes; ++i) {
41    std::string key = base::IntToString(icon_sizes[i]);
42    if (icons_value->HasKey(key)) {
43      std::string icon_path;
44      if (!icons_value->GetString(key, &icon_path)) {
45        *error = ErrorUtils::FormatErrorMessageUTF16(
46            errors::kInvalidIconPath, key);
47        return false;
48      }
49
50      if (!NormalizeAndValidatePath(&icon_path)) {
51        *error = ErrorUtils::FormatErrorMessageUTF16(
52            errors::kInvalidIconPath, key);
53        return false;
54      }
55
56      icons->Add(icon_sizes[i], icon_path);
57    }
58  }
59  return true;
60}
61
62}  // namespace manifest_handler_helpers
63
64}  // namespace extensions
65