Upstream version 7.35.141.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / browser / application_protocols.cc
index 39d16d2..be917ca 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include <map>
+#include <list>
 #include <string>
 #include <utility>
 #include <vector>
@@ -26,6 +27,7 @@
 #include "net/url_request/url_request_error_job.h"
 #include "net/url_request/url_request_file_job.h"
 #include "net/url_request/url_request_simple_job.h"
+#include "xwalk/runtime/browser/xwalk_runner.h"
 #include "xwalk/application/browser/application_service.h"
 #include "xwalk/application/common/application_data.h"
 #include "xwalk/application/common/application_file_util.h"
@@ -33,7 +35,6 @@
 #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"
 
 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,6 +213,22 @@ 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) {
+  if (sys_locale.empty())
+    return;
+
+  std::string locale = 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 {
@@ -273,8 +242,9 @@ ApplicationProtocolHandler::MaybeCreateJob(
   if (application) {
     directory_path = application->Path();
 
+    const char* csp_key = GetCSPKey(application->GetPackageType());
     const CSPInfo* csp_info = static_cast<CSPInfo*>(
-      application->GetManifestData(keys::kCSPKey));
+          application->GetManifestData(csp_key));
     if (csp_info) {
       const std::map<std::string, std::vector<std::string> >& policies =
           csp_info->GetDirectives();
@@ -288,12 +258,12 @@ 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->GetPackageType() == Package::WGT) {
+    GetUserAgentLocales(
+        xwalk::XWalkRunner::GetInstance()->GetLocale(), locales);
+    GetUserAgentLocales(application->GetManifest()->default_locale(), locales);
   }
 
   return new URLRequestApplicationJob(
@@ -306,6 +276,7 @@ ApplicationProtocolHandler::MaybeCreateJob(
       directory_path,
       relative_path,
       content_security_policy,
+      locales,
       application);
 }