- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / permissions / media_galleries_permission.cc
1 // Copyright (c) 2013 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 "chrome/common/extensions/permissions/media_galleries_permission.h"
6
7 #include <set>
8 #include <string>
9
10 #include "base/logging.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "extensions/common/permissions/permissions_info.h"
13 #include "grit/generated_resources.h"
14 #include "ui/base/l10n/l10n_util.h"
15
16 namespace extensions {
17
18 const char MediaGalleriesPermission::kAllAutoDetectedPermission[] =
19     "allAutoDetected";
20 const char MediaGalleriesPermission::kReadPermission[] = "read";
21 const char MediaGalleriesPermission::kCopyToPermission[] = "copyTo";
22
23 MediaGalleriesPermission::MediaGalleriesPermission(
24     const APIPermissionInfo* info)
25   : SetDisjunctionPermission<MediaGalleriesPermissionData,
26                              MediaGalleriesPermission>(info) {
27 }
28
29 MediaGalleriesPermission::~MediaGalleriesPermission() {
30 }
31
32 bool MediaGalleriesPermission::FromValue(const base::Value* value) {
33   if (!SetDisjunctionPermission<MediaGalleriesPermissionData,
34                                 MediaGalleriesPermission>::FromValue(value)) {
35     return false;
36   }
37
38   bool has_read = false;
39   bool has_copy_to = false;
40   for (std::set<MediaGalleriesPermissionData>::const_iterator it =
41       data_set_.begin(); it != data_set_.end(); ++it) {
42     if (it->permission() == kAllAutoDetectedPermission) {
43       continue;
44     }
45     if (it->permission() == kReadPermission) {
46       has_read = true;
47       continue;
48     }
49     if (it->permission() == kCopyToPermission) {
50       has_copy_to = true;
51       continue;
52     }
53
54     // No other permissions, so reaching this means
55     // MediaGalleriesPermissionData is probably out of sync in some way.
56     // Fail so developers notice this.
57     NOTREACHED();
58     return false;
59   }
60
61   return has_read || !has_copy_to;
62 }
63
64 PermissionMessages MediaGalleriesPermission::GetMessages() const {
65   DCHECK(HasMessages());
66   PermissionMessages result;
67
68   bool has_all_auto_detected = false;
69   bool has_read = false;
70   bool has_copy_to = false;
71
72   for (std::set<MediaGalleriesPermissionData>::const_iterator it =
73       data_set_.begin(); it != data_set_.end(); ++it) {
74     if (it->permission() == kAllAutoDetectedPermission)
75       has_all_auto_detected = true;
76     else if (it->permission() == kReadPermission)
77       has_read = true;
78     else if (it->permission() == kCopyToPermission)
79       has_copy_to = true;
80   }
81
82   if (has_copy_to && !has_read) {
83     NOTREACHED();
84     return result;
85   }
86
87   // If |has_all_auto_detected| is false, then Chrome will prompt the user at
88   // runtime when the extension call the getMediaGalleries API.
89   if (!has_all_auto_detected || !(has_read || has_copy_to))
90     return result;
91
92   // Separate PermissionMessage IDs for read and copyTo. Otherwise an extension
93   // can silently gain new access capabilities.
94   if (has_read) {
95     result.push_back(PermissionMessage(
96         PermissionMessage::kMediaGalleriesAllGalleriesRead,
97         l10n_util::GetStringUTF16(
98             IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ)));
99     if (has_copy_to) {
100       result.push_back(PermissionMessage(
101           PermissionMessage::kMediaGalleriesAllGalleriesCopyTo,
102           l10n_util::GetStringUTF16(
103               IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE)));
104     }
105   }
106   return result;
107 }
108
109 }  // namespace extensions