Upstream version 9.38.207.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / browser / application_protocols.cc
index 0a8a360..dcce8d4 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include <map>
+#include <list>
 #include <string>
 #include <utility>
 #include <vector>
@@ -33,7 +34,7 @@
 #include "xwalk/application/common/application_resource.h"
 #include "xwalk/application/common/constants.h"
 #include "xwalk/application/common/manifest_handlers/csp_handler.h"
-#include "xwalk/application/common/manifest_handlers/main_document_handler.h"
+#include "xwalk/runtime/common/xwalk_system_locale.h"
 
 using content::BrowserThread;
 using content::ResourceRequestInfo;
@@ -84,58 +85,6 @@ net::HttpResponseHeaders* BuildHttpHeaders(
   return new net::HttpResponseHeaders(raw_headers);
 }
 
-class GeneratedMainDocumentJob: public net::URLRequestSimpleJob {
- public:
-  GeneratedMainDocumentJob(
-      net::URLRequest* request,
-      net::NetworkDelegate* network_delegate,
-      const base::FilePath& relative_path,
-      const scoped_refptr<const ApplicationData> application,
-      const std::string& content_security_policy)
-    : net::URLRequestSimpleJob(request, network_delegate),
-      application_(application),
-      mime_type_("text/html"),
-      relative_path_(relative_path),
-      content_security_policy_(content_security_policy) {
-  }
-
-  // Overridden from URLRequestSimpleJob:
-  virtual int GetData(std::string* mime_type,
-                      std::string* charset,
-                      std::string* data,
-                      const net::CompletionCallback& callback) const OVERRIDE {
-    *mime_type = mime_type_;
-    *charset = "utf-8";
-    *data = "<!DOCTYPE html>\n<body>\n";
-
-    MainDocumentInfo* main_info = xwalk::application::ToMainDocumentInfo(
-        application_->GetManifestData(keys::kAppMainKey));
-    const std::vector<std::string>& main_scripts = main_info->GetMainScripts();
-    for (size_t i = 0; i < main_scripts.size(); ++i) {
-      *data += "<script src=\"";
-      *data += main_scripts[i];
-      *data += "\"></script>\n";
-    }
-    return net::OK;
-  }
-
-  virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE {
-    response_info_.headers = BuildHttpHeaders(content_security_policy_,
-                                              mime_type_, "GET", relative_path_,
-                                              relative_path_, true);
-    *info = response_info_;
-  }
-
- private:
-  virtual ~GeneratedMainDocumentJob() {}
-
-  scoped_refptr<const ApplicationData> application_;
-  const std::string mime_type_;
-  const base::FilePath relative_path_;
-  net::HttpResponseInfo response_info_;
-  std::string content_security_policy_;
-};
-
 void ReadResourceFilePath(
     const ApplicationResource& resource,
     base::FilePath* file_path) {
@@ -152,6 +101,7 @@ class URLRequestApplicationJob : public net::URLRequestFileJob {
       const base::FilePath& directory_path,
       const base::FilePath& relative_path,
       const std::string& content_security_policy,
+      const std::list<std::string>& locales,
       bool is_authority_match)
       : net::URLRequestFileJob(
           request, network_delegate, base::FilePath(), file_task_runner),
@@ -159,6 +109,7 @@ class URLRequestApplicationJob : public net::URLRequestFileJob {
         content_security_policy_(content_security_policy),
         is_authority_match_(is_authority_match),
         resource_(application_id, directory_path, relative_path),
+        locales_(locales),
         weak_factory_(this) {
   }
 
@@ -175,6 +126,7 @@ class URLRequestApplicationJob : public net::URLRequestFileJob {
   virtual void Start() OVERRIDE {
     base::FilePath* read_file_path = new base::FilePath;
 
+    resource_.SetLocales(locales_);
     bool posted = base::WorkerPool::PostTaskAndReply(
         FROM_HERE,
         base::Bind(&ReadResourceFilePath, resource_,
@@ -202,6 +154,7 @@ class URLRequestApplicationJob : public net::URLRequestFileJob {
   std::string content_security_policy_;
   bool is_authority_match_;
   ApplicationResource resource_;
+  std::list<std::string> locales_;
   base::WeakPtrFactory<URLRequestApplicationJob> weak_factory_;
 };
 
@@ -260,12 +213,33 @@ class ApplicationProtocolHandler
   DISALLOW_COPY_AND_ASSIGN(ApplicationProtocolHandler);
 };
 
+// The |locale| should be expanded to user agent locale.
+// Such as, "en-us" will be expaned as "en-us, en".
+void GetUserAgentLocales(const std::string& sys_locale,
+                         std::list<std::string>& ua_locales) {  // NOLINT
+  if (sys_locale.empty())
+    return;
+
+  std::string locale = base::StringToLowerASCII(sys_locale);
+  size_t position;
+  do {
+    ua_locales.push_back(locale);
+    position = locale.find_last_of("-");
+    locale = locale.substr(0, position);
+  } while (position != std::string::npos);
+}
+
 net::URLRequestJob*
 ApplicationProtocolHandler::MaybeCreateJob(
     net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
   const std::string& application_id = request->url().host();
   scoped_refptr<ApplicationData> application =
       cache_.GetApplicationData(application_id);
+
+  if (!application)
+    return new net::URLRequestErrorJob(
+        request, network_delegate, net::ERR_FILE_NOT_FOUND);
+
   base::FilePath relative_path =
       ApplicationURLToRelativeFilePath(request->url());
   base::FilePath directory_path;
@@ -273,7 +247,7 @@ ApplicationProtocolHandler::MaybeCreateJob(
   if (application) {
     directory_path = application->Path();
 
-    const char* csp_key = GetCSPKey(application->GetPackageType());
+    const char* csp_key = GetCSPKey(application->manifest_type());
     const CSPInfo* csp_info = static_cast<CSPInfo*>(
           application->GetManifestData(csp_key));
     if (csp_info) {
@@ -288,13 +262,10 @@ ApplicationProtocolHandler::MaybeCreateJob(
     }
   }
 
-  const std::string& path = request->url().path();
-  if (application &&
-      path.size() > 1 &&
-      path.substr(1) == kGeneratedMainDocumentFilename) {
-    return new GeneratedMainDocumentJob(request, network_delegate,
-                                        relative_path, application,
-                                        content_security_policy);
+  std::list<std::string> locales;
+  if (application && application->manifest_type() == Manifest::TYPE_WIDGET) {
+    GetUserAgentLocales(GetSystemLocale(), locales);
+    GetUserAgentLocales(application->GetManifest()->default_locale(), locales);
   }
 
   return new URLRequestApplicationJob(
@@ -307,6 +278,7 @@ ApplicationProtocolHandler::MaybeCreateJob(
       directory_path,
       relative_path,
       content_security_policy,
+      locales,
       application);
 }