Index: extensions/common/manifest_handlers/kiosk_mode_info.cc |
diff --git a/extensions/common/manifest_handlers/kiosk_mode_info.cc b/extensions/common/manifest_handlers/kiosk_mode_info.cc |
index d265c232787237b35eb09cc1e6c1b7f1c658142a..5ab5656e8a33fd084fdc8f4df4676b4002804acf 100644 |
--- a/extensions/common/manifest_handlers/kiosk_mode_info.cc |
+++ b/extensions/common/manifest_handlers/kiosk_mode_info.cc |
@@ -9,9 +9,21 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
+#include "base/version.h" |
#include "extensions/common/api/extensions_manifest_types.h" |
#include "extensions/common/manifest_constants.h" |
+namespace { |
+ |
+// Whether the given |version_string| is a valid ChromeOS platform version. |
+// The acceptable format is major[.minor[.micro]]. |
+bool IsValidPlatformVersion(const std::string& version_string) { |
+ const base::Version version(version_string); |
+ return version.IsValid() && version.components().size() <= 3u; |
+} |
+ |
+} // namespace |
+ |
namespace extensions { |
namespace keys = manifest_keys; |
@@ -19,8 +31,11 @@ namespace keys = manifest_keys; |
using api::extensions_manifest_types::KioskSecondaryAppsType; |
KioskModeInfo::KioskModeInfo(KioskStatus kiosk_status, |
- const std::vector<std::string>& secondary_app_ids) |
- : kiosk_status(kiosk_status), secondary_app_ids(secondary_app_ids) {} |
+ const std::vector<std::string>& secondary_app_ids, |
+ const std::string& required_platform_version) |
+ : kiosk_status(kiosk_status), |
+ secondary_app_ids(secondary_app_ids), |
+ required_platform_version(required_platform_version) {} |
KioskModeInfo::~KioskModeInfo() { |
} |
@@ -50,6 +65,7 @@ bool KioskModeInfo::HasSecondaryApps(const Extension* extension) { |
} |
KioskModeHandler::KioskModeHandler() { |
+ supported_keys_.push_back(keys::kKiosk); |
supported_keys_.push_back(keys::kKioskEnabled); |
supported_keys_.push_back(keys::kKioskOnly); |
supported_keys_.push_back(keys::kKioskSecondaryApps); |
@@ -93,11 +109,10 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) { |
// Kiosk secondary apps key is optional. |
std::vector<std::string> ids; |
- if (extension->manifest()->HasKey(keys::kKioskSecondaryApps)) { |
+ if (manifest->HasKey(keys::kKioskSecondaryApps)) { |
const base::Value* secondary_apps = nullptr; |
const base::ListValue* list = nullptr; |
- if (!extension->manifest()->Get(keys::kKioskSecondaryApps, |
- &secondary_apps) || |
+ if (!manifest->Get(keys::kKioskSecondaryApps, &secondary_apps) || |
!secondary_apps->GetAsList(&list)) { |
*error = base::ASCIIToUTF16(manifest_errors::kInvalidKioskSecondaryApps); |
return false; |
@@ -115,8 +130,20 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) { |
} |
} |
- extension->SetManifestData(keys::kKioskMode, |
- new KioskModeInfo(kiosk_status, ids)); |
+ // Optional kiosk.required_platform_version key. |
+ std::string required_platform_version; |
+ if (manifest->HasPath(keys::kKioskRequiredPlatformVersion) && |
+ (!manifest->GetString(keys::kKioskRequiredPlatformVersion, |
+ &required_platform_version) || |
+ !IsValidPlatformVersion(required_platform_version))) { |
+ *error = base::ASCIIToUTF16( |
+ manifest_errors::kInvalidKioskRequiredPlatformVersion); |
+ return false; |
+ } |
+ |
+ extension->SetManifestData( |
+ keys::kKioskMode, |
+ new KioskModeInfo(kiosk_status, ids, required_platform_version)); |
return true; |
} |