1 // Copyright (c) 2014 Samsung Electronics Co., Ltd 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.
5 #include "xwalk/application/common/manifest_handlers/tizen_app_control_handler.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/third_party/xdg_mime/xdgmime.h"
10 #include "base/values.h"
11 #include "xwalk/application/common/application_manifest_constants.h"
15 namespace keys = application_widget_keys;
17 namespace application {
21 void ParseAppControlEntryAndStore(const base::DictionaryValue& control_dict,
22 AppControlInfoList* aplist) {
24 const base::DictionaryValue* src_dict;
25 if (control_dict.GetDictionary(keys::kTizenApplicationAppControlSrcKey,
28 keys::kTizenApplicationAppControlChildNameAttrKey, &src);
31 std::string operation;
32 const base::DictionaryValue* operation_dict;
33 if (control_dict.GetDictionary(
34 keys::kTizenApplicationAppControlOperationKey,
36 operation_dict->GetString(
37 keys::kTizenApplicationAppControlChildNameAttrKey, &operation);
41 const base::DictionaryValue* uri_dict;
42 if (control_dict.GetDictionary(keys::kTizenApplicationAppControlUriKey,
45 keys::kTizenApplicationAppControlChildNameAttrKey, &uri);
49 const base::DictionaryValue* mime_dict;
50 if (control_dict.GetDictionary(keys::kTizenApplicationAppControlMimeKey,
53 keys::kTizenApplicationAppControlChildNameAttrKey, &mime);
56 aplist->controls.emplace_back(src, operation, uri, mime);
61 TizenAppControlHandler::TizenAppControlHandler() {
64 TizenAppControlHandler::~TizenAppControlHandler() {
67 bool TizenAppControlHandler::Parse(scoped_refptr<ApplicationData> application,
68 base::string16* error) {
69 const Manifest* manifest = application->GetManifest();
70 scoped_ptr<AppControlInfoList> aplist(new AppControlInfoList());
72 manifest->Get(keys::kTizenApplicationAppControlsKey, &value);
74 if (value->GetType() == base::Value::TYPE_LIST) {
76 const base::ListValue* list;
77 value->GetAsList(&list);
78 for (const auto& item : *list) {
79 const base::DictionaryValue* control_dict;
80 if (!item->GetAsDictionary(&control_dict)) {
81 *error = base::ASCIIToUTF16("Parsing app-control element failed");
85 ParseAppControlEntryAndStore(*control_dict, aplist.get());
87 } else if (value->GetType() == base::Value::TYPE_DICTIONARY) {
89 const base::DictionaryValue* dict;
90 value->GetAsDictionary(&dict);
91 ParseAppControlEntryAndStore(*dict, aplist.get());
93 *error = base::ASCIIToUTF16("Cannot parsing app-control element");
97 application->SetManifestData(
98 keys::kTizenApplicationAppControlsKey,
103 bool TizenAppControlHandler::Validate(
104 scoped_refptr<const ApplicationData> application,
105 std::string* error) const {
106 const AppControlInfoList* app_controls =
107 static_cast<const AppControlInfoList*>(
108 application->GetManifestData(keys::kTizenApplicationAppControlsKey));
110 for (const auto& item : app_controls->controls) {
111 if (item.src().empty()) {
112 *error = "The src child element of app-control element is obligatory";
116 const std::string& operation = item.operation();
117 if (operation.empty()) {
119 "The operation child element of app-control element is obligatory";
122 if (GURL(operation).spec().empty()) {
124 "The operation child element of app-control element is not valid url";
128 const std::string& uri = item.uri();
129 if (!uri.empty() && GURL(uri).spec().empty()) {
131 "The url child element of app-control element is not valid url";
135 const std::string& mime = item.mime();
136 if (!mime.empty() && !xdg_mime_is_valid_mime_type(mime.c_str())) {
138 "The mime child element of app-control "
139 "element is not valid mime type";
146 std::vector<std::string> TizenAppControlHandler::Keys() const {
147 return std::vector<std::string>(1, keys::kTizenApplicationAppControlsKey);
150 } // namespace application