Upstream version 6.35.131.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / common / application_data.cc
index 8660c4a..54a6762 100644 (file)
 #include "xwalk/application/common/manifest.h"
 #include "xwalk/application/common/manifest_handler.h"
 #include "xwalk/application/common/manifest_handlers/main_document_handler.h"
+#include "xwalk/application/common/manifest_handlers/permissions_handler.h"
+#include "xwalk/application/common/permission_policy_manager.h"
 #include "content/public/common/url_constants.h"
 #include "url/url_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if defined(OS_TIZEN_MOBILE)
-#include "xwalk/tizen/appcore_context.h"
-#endif
-
 namespace keys = xwalk::application_manifest_keys;
+namespace widget_keys = xwalk::application_widget_keys;
 namespace errors = xwalk::application_manifest_errors;
 
 namespace xwalk {
@@ -43,19 +42,19 @@ namespace application {
 
 // static
 scoped_refptr<ApplicationData> ApplicationData::Create(
-                                           const base::FilePath& path,
-                                           Manifest::SourceType source_type,
-                                           const DictionaryValue& manifest_data,
-                                           const std::string& explicit_id,
-                                           std::string* error_message) {
+    const base::FilePath& path,
+    Manifest::SourceType source_type,
+    const base::DictionaryValue& manifest_data,
+    const std::string& explicit_id,
+    std::string* error_message) {
   DCHECK(error_message);
-  string16 error;
+  base::string16 error;
   scoped_ptr<xwalk::application::Manifest> manifest(
       new xwalk::application::Manifest(source_type,
-                 scoped_ptr<DictionaryValue>(manifest_data.DeepCopy())));
+                 scoped_ptr<base::DictionaryValue>(manifest_data.DeepCopy())));
 
   if (!InitApplicationID(manifest.get(), path, explicit_id, &error)) {
-    *error_message = UTF16ToUTF8(error);
+    *error_message = base::UTF16ToUTF8(error);
     return NULL;
   }
 
@@ -69,7 +68,7 @@ scoped_refptr<ApplicationData> ApplicationData::Create(
   application->install_warnings_.swap(install_warnings);
 
   if (!application->Init(&error)) {
-    *error_message = UTF16ToUTF8(error);
+    *error_message = base::UTF16ToUTF8(error);
     return NULL;
   }
 
@@ -138,7 +137,10 @@ const std::string& ApplicationData::ID() const {
 }
 
 const std::string ApplicationData::VersionString() const {
-  return Version()->GetString();
+  if (!version_->components().empty())
+    return Version()->GetString();
+
+  return "";
 }
 
 bool ApplicationData::IsPlatformApp() const {
@@ -149,6 +151,10 @@ bool ApplicationData::IsHostedApp() const {
   return GetManifest()->IsHosted();
 }
 
+Manifest::PackageType ApplicationData::GetPackageType() const {
+  return manifest_->GetPackageType();
+}
+
 bool ApplicationData::HasMainDocument() const {
   MainDocumentInfo* main_info = ToMainDocumentInfo(
       GetManifestData(application_manifest_keys::kAppMainKey));
@@ -160,7 +166,7 @@ bool ApplicationData::HasMainDocument() const {
 bool ApplicationData::InitApplicationID(xwalk::application::Manifest* manifest,
                                 const base::FilePath& path,
                                 const std::string& explicit_id,
-                                string16* error) {
+                                base::string16* error) {
   std::string application_id;
 #if defined(OS_TIZEN)
   if (manifest->HasKey(keys::kTizenAppIdKey)) {
@@ -227,7 +233,7 @@ Manifest::Type ApplicationData::GetType() const {
   return manifest_->GetType();
 }
 
-bool ApplicationData::Init(string16* error) {
+bool ApplicationData::Init(base::string16* error) {
   DCHECK(error);
 
   if (!LoadName(error))
@@ -241,55 +247,62 @@ bool ApplicationData::Init(string16* error) {
 
   application_url_ = ApplicationData::GetBaseURLFromApplicationId(ID());
 
-  if (!ManifestHandlerRegistry::GetInstance()->ParseAppManifest(this, error))
+  ManifestHandlerRegistry* registry =
+      ManifestHandlerRegistry::GetInstance(GetPackageType());
+  if (!registry->ParseAppManifest(this, error))
     return false;
 
   finished_parsing_manifest_ = true;
-#if defined(OS_TIZEN_MOBILE)
-  appcore_context_ = tizen::AppcoreContext::Create();
-#endif
   return true;
 }
 
-bool ApplicationData::LoadName(string16* error) {
+bool ApplicationData::LoadName(base::string16* error) {
   DCHECK(error);
-  string16 localized_name;
-  if (!manifest_->GetString(keys::kNameKey, &localized_name)) {
-    *error = ASCIIToUTF16(errors::kInvalidName);
+  base::string16 localized_name;
+  std::string name_key(GetNameKey(GetPackageType()));
+
+  if (!manifest_->GetString(name_key, &localized_name) &&
+      manifest_->IsXPKPackaged()) {
+    *error = base::ASCIIToUTF16(errors::kInvalidName);
     return false;
   }
-  non_localized_name_ = UTF16ToUTF8(localized_name);
+  non_localized_name_ = base::UTF16ToUTF8(localized_name);
   base::i18n::AdjustStringForLocaleDirection(&localized_name);
-  name_ = UTF16ToUTF8(localized_name);
+  name_ = base::UTF16ToUTF8(localized_name);
   return true;
 }
 
-bool ApplicationData::LoadVersion(string16* error) {
+bool ApplicationData::LoadVersion(base::string16* error) {
   DCHECK(error);
   std::string version_str;
-  if (!manifest_->GetString(keys::kVersionKey, &version_str)) {
-    *error = ASCIIToUTF16(errors::kInvalidVersion);
+  std::string version_key(GetVersionKey(GetPackageType()));
+
+  if (!manifest_->GetString(version_key, &version_str) &&
+      manifest_->IsXPKPackaged()) {
+    *error = base::ASCIIToUTF16(errors::kInvalidVersion);
     return false;
   }
   version_.reset(new base::Version(version_str));
-  if (!version_->IsValid() || version_->components().size() > 4) {
-    *error = ASCIIToUTF16(errors::kInvalidVersion);
+  if (manifest_->IsXPKPackaged() &&
+      (!version_->IsValid() || version_->components().size() > 4)) {
+    *error = base::ASCIIToUTF16(errors::kInvalidVersion);
     return false;
   }
   return true;
 }
 
-bool ApplicationData::LoadDescription(string16* error) {
+bool ApplicationData::LoadDescription(base::string16* error) {
   DCHECK(error);
   if (manifest_->HasKey(keys::kDescriptionKey) &&
-      !manifest_->GetString(keys::kDescriptionKey, &description_)) {
-    *error = ASCIIToUTF16(errors::kInvalidDescription);
+      !manifest_->GetString(keys::kDescriptionKey, &description_) &&
+      manifest_->IsXPKPackaged()) {
+    *error = base::ASCIIToUTF16(errors::kInvalidDescription);
     return false;
   }
   return true;
 }
 
-bool ApplicationData::LoadManifestVersion(string16* error) {
+bool ApplicationData::LoadManifestVersion(base::string16* error) {
   DCHECK(error);
   // Get the original value out of the dictionary so that we can validate it
   // more strictly.
@@ -297,8 +310,10 @@ bool ApplicationData::LoadManifestVersion(string16* error) {
     int manifest_version = 1;
     if (!manifest_->GetInteger(keys::kManifestVersionKey, &manifest_version) ||
         manifest_version < 1) {
-      *error = ASCIIToUTF16(errors::kInvalidManifestVersion);
-      return false;
+      if (manifest_->IsXPKPackaged()) {
+        *error = base::ASCIIToUTF16(errors::kInvalidManifestVersion);
+        return false;
+      }
     }
   }
 
@@ -315,5 +330,56 @@ const std::set<std::string>& ApplicationData::GetEvents() const {
   return events_;
 }
 
+StoredPermission ApplicationData::GetPermission(
+    std::string& permission_name) const {
+  StoredPermissionMap::const_iterator iter =
+      permission_map_.find(permission_name);
+  if (iter == permission_map_.end())
+    return UNDEFINED_STORED_PERM;
+  return iter->second;
+}
+
+bool ApplicationData::SetPermission(const std::string& permission_name,
+                                    StoredPermission perm) {
+  if (perm != UNDEFINED_STORED_PERM) {
+    permission_map_[permission_name] = perm;
+    is_dirty_ = true;
+    return true;
+  }
+  return false;
+}
+
+void ApplicationData::ClearPermissions() {
+  permission_map_.clear();
+}
+
+PermissionSet ApplicationData::GetManifestPermissions() const {
+  PermissionSet permissions;
+  if (manifest_->value()->HasKey(keys::kPermissionsKey)) {
+    const PermissionsInfo* perm_info = static_cast<PermissionsInfo*>(
+                           GetManifestData(keys::kPermissionsKey));
+    permissions = perm_info->GetAPIPermissions();
+  }
+  return permissions;
+}
+
+#if defined(OS_TIZEN)
+bool ApplicationData::HasCSPDefined() const {
+  return (manifest_->HasPath(widget_keys::kCSPKey) ||
+          manifest_->HasPath(widget_keys::kCSPReportOnlyKey) ||
+          manifest_->HasPath(widget_keys::kAllowNavigationKey));
+}
+#endif
+
+bool ApplicationData::SetApplicationLocale(const std::string& locale,
+                                           base::string16* error) {
+  manifest_->SetSystemLocale(locale);
+  if (!LoadName(error))
+    return false;
+  if (!LoadDescription(error))
+    return false;
+  return true;
+}
+
 }   // namespace application
 }   // namespace xwalk