Upstream version 7.35.138.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / common / manifest_handlers / main_document_handler.cc
1 // Copyright (c) 2013 Intel Corporation. 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 "xwalk/application/common/manifest_handlers/main_document_handler.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "xwalk/application/common/application_manifest_constants.h"
9 #include "xwalk/application/common/constants.h"
10
11 namespace xwalk {
12
13 namespace keys = application_manifest_keys;
14
15 namespace application {
16
17 MainDocumentInfo::MainDocumentInfo() {
18 }
19
20 MainDocumentInfo::~MainDocumentInfo() {
21 }
22
23 MainDocumentHandler::MainDocumentHandler() {
24 }
25
26 MainDocumentHandler::~MainDocumentHandler() {
27 }
28
29 bool MainDocumentHandler::Parse(scoped_refptr<ApplicationData> application,
30                                 base::string16* error) {
31   const Manifest* manifest = application->GetManifest();
32   const base::DictionaryValue* dict = NULL;
33   if (!manifest->GetDictionary(keys::kAppMainKey, &dict)) {
34     *error = base::ASCIIToUTF16("Invalid value of app.main.");
35     return false;
36   }
37
38   scoped_ptr<MainDocumentInfo> main_doc_info(new MainDocumentInfo);
39   if (!ParseMainScripts(main_doc_info.get(), application, error) ||
40       !ParseMainSource(main_doc_info.get(), application, error))
41     return false;
42   if (!main_doc_info->GetMainURL().is_valid()) {
43     *error = base::ASCIIToUTF16("app.main doesn't contain a valid main document.");
44     return false;
45   }
46
47   application->SetManifestData(keys::kAppMainKey, main_doc_info.release());
48   return true;
49 }
50
51 std::vector<std::string> MainDocumentHandler::Keys() const {
52   return std::vector<std::string>(1, keys::kAppMainKey);
53 }
54
55 bool MainDocumentHandler::ParseMainSource(MainDocumentInfo* info,
56                                           const ApplicationData* application,
57                                           base::string16* error) {
58   const Manifest* manifest = application->GetManifest();
59   std::string main_source;
60   if (manifest->HasPath(keys::kAppMainSourceKey) &&
61       !manifest->GetString(keys::kAppMainSourceKey, &main_source)) {
62     *error = base::ASCIIToUTF16("Invalid value of app.main.source");
63     return false;
64   }
65
66   if (!main_source.empty()) {
67     if (!info->GetMainURL().is_empty())
68       LOG(WARNING) << "Manifest contains more than one main document.";
69     info->SetMainURL(application->GetResourceURL(main_source));
70   }
71   return true;
72 }
73
74 bool MainDocumentHandler::ParseMainScripts(MainDocumentInfo* info,
75                                            const ApplicationData* application,
76                                            base::string16* error) {
77   const Manifest* manifest = application->GetManifest();
78   const base::ListValue* main_scripts = NULL;
79   if (manifest->HasPath(keys::kAppMainScriptsKey) &&
80       !manifest->GetList(keys::kAppMainScriptsKey, &main_scripts)) {
81     *error = base::ASCIIToUTF16("Invalid value of app.main.scripts");
82     return false;
83   }
84
85   if (main_scripts && main_scripts->GetSize()) {
86     std::vector<std::string> scripts;
87     for (size_t i = 0; i < main_scripts->GetSize(); ++i) {
88       std::string script;
89       if (!main_scripts->GetString(i, &script)) {
90         *error = base::ASCIIToUTF16("Invalid value of app.main.scripts list");
91         return false;
92       }
93       scripts.push_back(script);
94     }
95     // We implicitly creat a main document to include these scripts.
96     info->SetMainURL(
97         application->GetResourceURL(kGeneratedMainDocumentFilename));
98     info->SetMainScripts(scripts);
99   }
100   return true;
101 }
102
103 }  // namespace application
104 }  // namespace xwalk