| Index: ios/web/webui/web_ui_ios_data_source_impl.cc
|
| diff --git a/ios/web/webui/web_ui_ios_data_source_impl.cc b/ios/web/webui/web_ui_ios_data_source_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6180836331ff1d29b58742b5845179ecd01462ea
|
| --- /dev/null
|
| +++ b/ios/web/webui/web_ui_ios_data_source_impl.cc
|
| @@ -0,0 +1,167 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ios/web/webui/web_ui_ios_data_source_impl.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/ref_counted_memory.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "ios/web/public/web_client.h"
|
| +#include "ui/base/webui/jstemplate_builder.h"
|
| +#include "ui/base/webui/web_ui_util.h"
|
| +
|
| +namespace web {
|
| +
|
| +// static
|
| +WebUIIOSDataSource* WebUIIOSDataSource::Create(const std::string& source_name) {
|
| + return new WebUIIOSDataSourceImpl(source_name);
|
| +}
|
| +
|
| +// static
|
| +void WebUIIOSDataSource::Add(BrowserState* browser_state,
|
| + WebUIIOSDataSource* source) {
|
| + URLDataManagerIOS::AddWebUIIOSDataSource(browser_state, source);
|
| +}
|
| +
|
| +// Internal class to hide the fact that WebUIIOSDataSourceImpl implements
|
| +// URLDataSourceIOS.
|
| +class WebUIIOSDataSourceImpl::InternalDataSource : public URLDataSourceIOS {
|
| + public:
|
| + InternalDataSource(WebUIIOSDataSourceImpl* parent) : parent_(parent) {}
|
| +
|
| + ~InternalDataSource() override {}
|
| +
|
| + // URLDataSourceIOS implementation.
|
| + std::string GetSource() const override { return parent_->GetSource(); }
|
| + std::string GetMimeType(const std::string& path) const override {
|
| + return parent_->GetMimeType(path);
|
| + }
|
| + void StartDataRequest(
|
| + const std::string& path,
|
| + const URLDataSourceIOS::GotDataCallback& callback) override {
|
| + return parent_->StartDataRequest(path, callback);
|
| + }
|
| + bool ShouldReplaceExistingSource() const override {
|
| + return parent_->replace_existing_source_;
|
| + }
|
| + bool AllowCaching() const override { return false; }
|
| + bool ShouldDenyXFrameOptions() const override {
|
| + return parent_->deny_xframe_options_;
|
| + }
|
| +
|
| + private:
|
| + WebUIIOSDataSourceImpl* parent_;
|
| +};
|
| +
|
| +WebUIIOSDataSourceImpl::WebUIIOSDataSourceImpl(const std::string& source_name)
|
| + : URLDataSourceIOSImpl(source_name, new InternalDataSource(this)),
|
| + source_name_(source_name),
|
| + default_resource_(-1),
|
| + deny_xframe_options_(true),
|
| + disable_set_font_strings_(false),
|
| + replace_existing_source_(true) {
|
| +}
|
| +
|
| +WebUIIOSDataSourceImpl::~WebUIIOSDataSourceImpl() {
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::AddString(const std::string& name,
|
| + const base::string16& value) {
|
| + localized_strings_.SetString(name, value);
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::AddString(const std::string& name,
|
| + const std::string& value) {
|
| + localized_strings_.SetString(name, value);
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::AddLocalizedString(const std::string& name,
|
| + int ids) {
|
| + localized_strings_.SetString(name, GetWebClient()->GetLocalizedString(ids));
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::AddBoolean(const std::string& name, bool value) {
|
| + localized_strings_.SetBoolean(name, value);
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::SetJsonPath(const std::string& path) {
|
| + json_path_ = path;
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::AddResourcePath(const std::string& path,
|
| + int resource_id) {
|
| + path_to_idr_map_[path] = resource_id;
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::SetDefaultResource(int resource_id) {
|
| + default_resource_ = resource_id;
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::DisableDenyXFrameOptions() {
|
| + deny_xframe_options_ = false;
|
| +}
|
| +
|
| +std::string WebUIIOSDataSourceImpl::GetSource() const {
|
| + return source_name_;
|
| +}
|
| +
|
| +std::string WebUIIOSDataSourceImpl::GetMimeType(const std::string& path) const {
|
| + if (EndsWith(path, ".js", false))
|
| + return "application/javascript";
|
| +
|
| + if (EndsWith(path, ".json", false))
|
| + return "application/json";
|
| +
|
| + if (EndsWith(path, ".pdf", false))
|
| + return "application/pdf";
|
| +
|
| + if (EndsWith(path, ".css", false))
|
| + return "text/css";
|
| +
|
| + if (EndsWith(path, ".svg", false))
|
| + return "image/svg+xml";
|
| +
|
| + return "text/html";
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::StartDataRequest(
|
| + const std::string& path,
|
| + const URLDataSourceIOS::GotDataCallback& callback) {
|
| + if (!json_path_.empty() && path == json_path_) {
|
| + SendLocalizedStringsAsJSON(callback);
|
| + return;
|
| + }
|
| +
|
| + int resource_id = default_resource_;
|
| + std::map<std::string, int>::iterator result;
|
| + result = path_to_idr_map_.find(path);
|
| + if (result != path_to_idr_map_.end())
|
| + resource_id = result->second;
|
| + DCHECK_NE(resource_id, -1);
|
| + SendFromResourceBundle(callback, resource_id);
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::SendLocalizedStringsAsJSON(
|
| + const URLDataSourceIOS::GotDataCallback& callback) {
|
| + std::string template_data;
|
| + if (!disable_set_font_strings_) {
|
| + webui::SetLoadTimeDataDefaults(web::GetWebClient()->GetApplicationLocale(),
|
| + &localized_strings_);
|
| + }
|
| +
|
| + webui::AppendJsonJS(&localized_strings_, &template_data);
|
| + callback.Run(base::RefCountedString::TakeString(&template_data));
|
| +}
|
| +
|
| +void WebUIIOSDataSourceImpl::SendFromResourceBundle(
|
| + const URLDataSourceIOS::GotDataCallback& callback,
|
| + int idr) {
|
| + scoped_refptr<base::RefCountedStaticMemory> response(
|
| + GetWebClient()->GetDataResourceBytes(idr));
|
| + callback.Run(response.get());
|
| +}
|
| +
|
| +} // namespace web
|
|
|