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.
5 #include "xwalk/application/common/manifest_handlers/main_document_handler.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "xwalk/application/common/application_manifest_constants.h"
9 #include "xwalk/application/common/constants.h"
13 namespace keys = application_manifest_keys;
15 namespace application {
17 MainDocumentInfo::MainDocumentInfo() {
20 MainDocumentInfo::~MainDocumentInfo() {
23 MainDocumentHandler::MainDocumentHandler() {
26 MainDocumentHandler::~MainDocumentHandler() {
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.");
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))
42 if (!main_doc_info->GetMainURL().is_valid()) {
43 *error = base::ASCIIToUTF16("app.main doesn't contain a valid main document.");
47 application->SetManifestData(keys::kAppMainKey, main_doc_info.release());
51 std::vector<std::string> MainDocumentHandler::Keys() const {
52 return std::vector<std::string>(1, keys::kAppMainKey);
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");
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));
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");
85 if (main_scripts && main_scripts->GetSize()) {
86 std::vector<std::string> scripts;
87 for (size_t i = 0; i < main_scripts->GetSize(); ++i) {
89 if (!main_scripts->GetString(i, &script)) {
90 *error = base::ASCIIToUTF16("Invalid value of app.main.scripts list");
93 scripts.push_back(script);
95 // We implicitly creat a main document to include these scripts.
97 application->GetResourceURL(kGeneratedMainDocumentFilename));
98 info->SetMainScripts(scripts);
103 } // namespace application