#include <algorithm>
#include <map>
+#include <list>
#include <string>
#include <utility>
#include <vector>
#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;
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) {
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),
content_security_policy_(content_security_policy),
is_authority_match_(is_authority_match),
resource_(application_id, directory_path, relative_path),
+ locales_(locales),
weak_factory_(this) {
}
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_,
std::string content_security_policy_;
bool is_authority_match_;
ApplicationResource resource_;
+ std::list<std::string> locales_;
base::WeakPtrFactory<URLRequestApplicationJob> weak_factory_;
};
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;
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) {
}
}
- 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(
directory_path,
relative_path,
content_security_policy,
+ locales,
application);
}