Commit c13cf9fa authored by xiyuan's avatar xiyuan Committed by Commit bot

kiosk: Add kiosk.required_platform_version manifest key

BUG=577779
TEST=KioskModeInfoManifestTest.RequiredPlatformVersion*

Review URL: https://codereview.chromium.org/1595483004

Cr-Commit-Position: refs/heads/master@{#370722}
parent 98727ed4
...@@ -182,6 +182,14 @@ ...@@ -182,6 +182,14 @@
"channel": "stable", "channel": "stable",
"extension_types": "all" "extension_types": "all"
}, },
"kiosk": {
"channel": "dev",
"extension_types": ["platform_app"]
},
"kiosk.required_platform_version": {
"channel": "dev",
"extension_types": ["platform_app"]
},
"kiosk_enabled": { "kiosk_enabled": {
"channel": "stable", "channel": "stable",
"extension_types": [ "extension_types": [
......
...@@ -66,9 +66,11 @@ const char kIsolation[] = "app.isolation"; ...@@ -66,9 +66,11 @@ const char kIsolation[] = "app.isolation";
const char kJs[] = "js"; const char kJs[] = "js";
const char kKey[] = "key"; const char kKey[] = "key";
const char kKeycode[] = "keyCode"; const char kKeycode[] = "keyCode";
const char kKiosk[] = "kiosk";
const char kKioskEnabled[] = "kiosk_enabled"; const char kKioskEnabled[] = "kiosk_enabled";
const char kKioskOnly[] = "kiosk_only"; const char kKioskOnly[] = "kiosk_only";
const char kKioskMode[] = "kiosk_mode"; const char kKioskMode[] = "kiosk_mode";
const char kKioskRequiredPlatformVersion[] = "kiosk.required_platform_version";
const char kKioskSecondaryApps[] = "kiosk_secondary_apps"; const char kKioskSecondaryApps[] = "kiosk_secondary_apps";
const char kLanguage[] = "language"; const char kLanguage[] = "language";
const char kLaunch[] = "app.launch"; const char kLaunch[] = "app.launch";
...@@ -466,6 +468,8 @@ const char kInvalidKioskOnly[] = ...@@ -466,6 +468,8 @@ const char kInvalidKioskOnly[] =
"Invalid value for 'kiosk_only'."; "Invalid value for 'kiosk_only'.";
const char kInvalidKioskOnlyButNotEnabled[] = const char kInvalidKioskOnlyButNotEnabled[] =
"The 'kiosk_only' key is set, but 'kiosk_enabled' is not set."; "The 'kiosk_only' key is set, but 'kiosk_enabled' is not set.";
const char kInvalidKioskRequiredPlatformVersion[] =
"Invalid value for 'kiosk.required_platform_version'";
const char kInvalidKioskSecondaryApps[] = const char kInvalidKioskSecondaryApps[] =
"Invalid value for 'kiosk_secondary_apps'"; "Invalid value for 'kiosk_secondary_apps'";
const char kInvalidKioskSecondaryAppsBadAppEntry[] = const char kInvalidKioskSecondaryAppsBadAppEntry[] =
......
...@@ -70,9 +70,11 @@ extern const char kIsolation[]; ...@@ -70,9 +70,11 @@ extern const char kIsolation[];
extern const char kJs[]; extern const char kJs[];
extern const char kKey[]; extern const char kKey[];
extern const char kKeycode[]; extern const char kKeycode[];
extern const char kKiosk[];
extern const char kKioskEnabled[]; extern const char kKioskEnabled[];
extern const char kKioskOnly[]; extern const char kKioskOnly[];
extern const char kKioskMode[]; extern const char kKioskMode[];
extern const char kKioskRequiredPlatformVersion[];
extern const char kKioskSecondaryApps[]; extern const char kKioskSecondaryApps[];
extern const char kLanguage[]; extern const char kLanguage[];
extern const char kLaunch[]; extern const char kLaunch[];
...@@ -129,6 +131,7 @@ extern const char kPluginsPath[]; ...@@ -129,6 +131,7 @@ extern const char kPluginsPath[];
extern const char kPluginsPublic[]; extern const char kPluginsPublic[];
extern const char kPublicKey[]; extern const char kPublicKey[];
extern const char kRemoveButton[]; extern const char kRemoveButton[];
extern const char kRequiredPlatformVersion[];
extern const char kRequirements[]; extern const char kRequirements[];
extern const char kRunAt[]; extern const char kRunAt[];
extern const char kSandboxedPages[]; extern const char kSandboxedPages[];
...@@ -352,6 +355,7 @@ extern const char kInvalidKeyBindingUnknownPlatform[]; ...@@ -352,6 +355,7 @@ extern const char kInvalidKeyBindingUnknownPlatform[];
extern const char kInvalidKioskEnabled[]; extern const char kInvalidKioskEnabled[];
extern const char kInvalidKioskOnly[]; extern const char kInvalidKioskOnly[];
extern const char kInvalidKioskOnlyButNotEnabled[]; extern const char kInvalidKioskOnlyButNotEnabled[];
extern const char kInvalidKioskRequiredPlatformVersion[];
extern const char kInvalidKioskSecondaryApps[]; extern const char kInvalidKioskSecondaryApps[];
extern const char kInvalidKioskSecondaryAppsBadAppEntry[]; extern const char kInvalidKioskSecondaryAppsBadAppEntry[];
extern const char kInvalidKioskSecondaryAppsBadAppId[]; extern const char kInvalidKioskSecondaryAppsBadAppId[];
......
...@@ -9,9 +9,21 @@ ...@@ -9,9 +9,21 @@
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "base/version.h"
#include "extensions/common/api/extensions_manifest_types.h" #include "extensions/common/api/extensions_manifest_types.h"
#include "extensions/common/manifest_constants.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 extensions {
namespace keys = manifest_keys; namespace keys = manifest_keys;
...@@ -19,8 +31,11 @@ namespace keys = manifest_keys; ...@@ -19,8 +31,11 @@ namespace keys = manifest_keys;
using api::extensions_manifest_types::KioskSecondaryAppsType; using api::extensions_manifest_types::KioskSecondaryAppsType;
KioskModeInfo::KioskModeInfo(KioskStatus kiosk_status, KioskModeInfo::KioskModeInfo(KioskStatus kiosk_status,
const std::vector<std::string>& secondary_app_ids) const std::vector<std::string>& secondary_app_ids,
: kiosk_status(kiosk_status), secondary_app_ids(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() { KioskModeInfo::~KioskModeInfo() {
} }
...@@ -50,6 +65,7 @@ bool KioskModeInfo::HasSecondaryApps(const Extension* extension) { ...@@ -50,6 +65,7 @@ bool KioskModeInfo::HasSecondaryApps(const Extension* extension) {
} }
KioskModeHandler::KioskModeHandler() { KioskModeHandler::KioskModeHandler() {
supported_keys_.push_back(keys::kKiosk);
supported_keys_.push_back(keys::kKioskEnabled); supported_keys_.push_back(keys::kKioskEnabled);
supported_keys_.push_back(keys::kKioskOnly); supported_keys_.push_back(keys::kKioskOnly);
supported_keys_.push_back(keys::kKioskSecondaryApps); supported_keys_.push_back(keys::kKioskSecondaryApps);
...@@ -93,11 +109,10 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) { ...@@ -93,11 +109,10 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) {
// Kiosk secondary apps key is optional. // Kiosk secondary apps key is optional.
std::vector<std::string> ids; std::vector<std::string> ids;
if (extension->manifest()->HasKey(keys::kKioskSecondaryApps)) { if (manifest->HasKey(keys::kKioskSecondaryApps)) {
const base::Value* secondary_apps = nullptr; const base::Value* secondary_apps = nullptr;
const base::ListValue* list = nullptr; const base::ListValue* list = nullptr;
if (!extension->manifest()->Get(keys::kKioskSecondaryApps, if (!manifest->Get(keys::kKioskSecondaryApps, &secondary_apps) ||
&secondary_apps) ||
!secondary_apps->GetAsList(&list)) { !secondary_apps->GetAsList(&list)) {
*error = base::ASCIIToUTF16(manifest_errors::kInvalidKioskSecondaryApps); *error = base::ASCIIToUTF16(manifest_errors::kInvalidKioskSecondaryApps);
return false; return false;
...@@ -115,8 +130,20 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) { ...@@ -115,8 +130,20 @@ bool KioskModeHandler::Parse(Extension* extension, base::string16* error) {
} }
} }
extension->SetManifestData(keys::kKioskMode, // Optional kiosk.required_platform_version key.
new KioskModeInfo(kiosk_status, ids)); 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; return true;
} }
......
...@@ -24,7 +24,8 @@ struct KioskModeInfo : public Extension::ManifestData { ...@@ -24,7 +24,8 @@ struct KioskModeInfo : public Extension::ManifestData {
}; };
KioskModeInfo(KioskStatus kiosk_status, KioskModeInfo(KioskStatus kiosk_status,
const std::vector<std::string>& secondary_app_ids); const std::vector<std::string>& secondary_app_ids,
const std::string& required_platform_version);
~KioskModeInfo() override; ~KioskModeInfo() override;
// Gets the KioskModeInfo for |extension|, or NULL if none was // Gets the KioskModeInfo for |extension|, or NULL if none was
...@@ -44,6 +45,8 @@ struct KioskModeInfo : public Extension::ManifestData { ...@@ -44,6 +45,8 @@ struct KioskModeInfo : public Extension::ManifestData {
// The IDs of the kiosk secondary apps. // The IDs of the kiosk secondary apps.
const std::vector<std::string> secondary_app_ids; const std::vector<std::string> secondary_app_ids;
const std::string required_platform_version;
}; };
// Parses the "kiosk_enabled" and "kiosk_only" manifest keys. // Parses the "kiosk_enabled" and "kiosk_only" manifest keys.
......
...@@ -32,4 +32,25 @@ TEST_F(KioskModeInfoManifestTest, MultipleSecondaryApps) { ...@@ -32,4 +32,25 @@ TEST_F(KioskModeInfoManifestTest, MultipleSecondaryApps) {
std::equal(parsed_ids.begin(), parsed_ids.end(), expected_ids)); std::equal(parsed_ids.begin(), parsed_ids.end(), expected_ids));
} }
TEST_F(KioskModeInfoManifestTest, RequiredPlatformVersionOptional) {
scoped_refptr<Extension> extension(
LoadAndExpectSuccess("kiosk_required_platform_version_not_present.json"));
KioskModeInfo* info = KioskModeInfo::Get(extension.get());
EXPECT_TRUE(info->required_platform_version.empty());
}
TEST_F(KioskModeInfoManifestTest, RequiredPlatformVersion) {
scoped_refptr<Extension> extension(
LoadAndExpectSuccess("kiosk_required_platform_version.json"));
KioskModeInfo* info = KioskModeInfo::Get(extension.get());
EXPECT_EQ("1234.0.0", info->required_platform_version);
}
TEST_F(KioskModeInfoManifestTest, RequiredPlatformVersionInvalid) {
LoadAndExpectError("kiosk_required_platform_version_empty.json",
manifest_errors::kInvalidKioskRequiredPlatformVersion);
LoadAndExpectError("kiosk_required_platform_version_invalid.json",
manifest_errors::kInvalidKioskRequiredPlatformVersion);
}
} // namespace extensions } // namespace extensions
{
"manifest_version": 2,
"name": "Kiosk app",
"version": "1",
"app": {
"background": {
"scripts": ["main.js"]
}
},
"kiosk_enabled": true,
"kiosk": {
"required_platform_version": "1234.0.0"
}
}
{
"manifest_version": 2,
"name": "Kiosk app",
"version": "1",
"app": {
"background": {
"scripts": ["main.js"]
}
},
"kiosk_enabled": true,
"kiosk": {
"required_platform_version": ""
}
}
{
"manifest_version": 2,
"name": "Kiosk app",
"version": "1",
"app": {
"background": {
"scripts": ["main.js"]
}
},
"kiosk_enabled": true,
"kiosk": {
"required_platform_version": "bad.version"
}
}
{
"manifest_version": 2,
"name": "Kiosk app",
"version": "1",
"app": {
"background": {
"scripts": ["main.js"]
}
},
"kiosk_enabled": true
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment