1 // Copyright 2014 The Chromium Authors. 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 "ios/web/webui/web_ui_ios_data_source_impl.h"
10 #include "base/memory/ref_counted_memory.h"
11 #include "base/strings/string_util.h"
12 #include "ios/web/public/web_client.h"
13 #include "ui/base/webui/jstemplate_builder.h"
14 #include "ui/base/webui/web_ui_util.h"
19 WebUIIOSDataSource
* WebUIIOSDataSource::Create(const std::string
& source_name
) {
20 return new WebUIIOSDataSourceImpl(source_name
);
24 void WebUIIOSDataSource::Add(BrowserState
* browser_state
,
25 WebUIIOSDataSource
* source
) {
26 URLDataManagerIOS::AddWebUIIOSDataSource(browser_state
, source
);
29 // Internal class to hide the fact that WebUIIOSDataSourceImpl implements
31 class WebUIIOSDataSourceImpl::InternalDataSource
: public URLDataSourceIOS
{
33 InternalDataSource(WebUIIOSDataSourceImpl
* parent
) : parent_(parent
) {}
35 ~InternalDataSource() override
{}
37 // URLDataSourceIOS implementation.
38 std::string
GetSource() const override
{ return parent_
->GetSource(); }
39 std::string
GetMimeType(const std::string
& path
) const override
{
40 return parent_
->GetMimeType(path
);
42 void StartDataRequest(
43 const std::string
& path
,
44 const URLDataSourceIOS::GotDataCallback
& callback
) override
{
45 return parent_
->StartDataRequest(path
, callback
);
47 bool ShouldReplaceExistingSource() const override
{
48 return parent_
->replace_existing_source_
;
50 bool AllowCaching() const override
{ return false; }
51 bool ShouldDenyXFrameOptions() const override
{
52 return parent_
->deny_xframe_options_
;
56 WebUIIOSDataSourceImpl
* parent_
;
59 WebUIIOSDataSourceImpl::WebUIIOSDataSourceImpl(const std::string
& source_name
)
60 : URLDataSourceIOSImpl(source_name
, new InternalDataSource(this)),
61 source_name_(source_name
),
62 default_resource_(-1),
63 deny_xframe_options_(true),
64 disable_set_font_strings_(false),
65 replace_existing_source_(true) {
68 WebUIIOSDataSourceImpl::~WebUIIOSDataSourceImpl() {
71 void WebUIIOSDataSourceImpl::AddString(const std::string
& name
,
72 const base::string16
& value
) {
73 localized_strings_
.SetString(name
, value
);
76 void WebUIIOSDataSourceImpl::AddString(const std::string
& name
,
77 const std::string
& value
) {
78 localized_strings_
.SetString(name
, value
);
81 void WebUIIOSDataSourceImpl::AddLocalizedString(const std::string
& name
,
83 localized_strings_
.SetString(name
, GetWebClient()->GetLocalizedString(ids
));
86 void WebUIIOSDataSourceImpl::AddBoolean(const std::string
& name
, bool value
) {
87 localized_strings_
.SetBoolean(name
, value
);
90 void WebUIIOSDataSourceImpl::SetJsonPath(const std::string
& path
) {
94 void WebUIIOSDataSourceImpl::AddResourcePath(const std::string
& path
,
96 path_to_idr_map_
[path
] = resource_id
;
99 void WebUIIOSDataSourceImpl::SetDefaultResource(int resource_id
) {
100 default_resource_
= resource_id
;
103 void WebUIIOSDataSourceImpl::DisableDenyXFrameOptions() {
104 deny_xframe_options_
= false;
107 std::string
WebUIIOSDataSourceImpl::GetSource() const {
111 std::string
WebUIIOSDataSourceImpl::GetMimeType(const std::string
& path
) const {
112 if (base::EndsWith(path
, ".js", base::CompareCase::INSENSITIVE_ASCII
))
113 return "application/javascript";
115 if (base::EndsWith(path
, ".json", base::CompareCase::INSENSITIVE_ASCII
))
116 return "application/json";
118 if (base::EndsWith(path
, ".pdf", base::CompareCase::INSENSITIVE_ASCII
))
119 return "application/pdf";
121 if (base::EndsWith(path
, ".css", base::CompareCase::INSENSITIVE_ASCII
))
124 if (base::EndsWith(path
, ".svg", base::CompareCase::INSENSITIVE_ASCII
))
125 return "image/svg+xml";
130 void WebUIIOSDataSourceImpl::StartDataRequest(
131 const std::string
& path
,
132 const URLDataSourceIOS::GotDataCallback
& callback
) {
133 if (!json_path_
.empty() && path
== json_path_
) {
134 SendLocalizedStringsAsJSON(callback
);
138 int resource_id
= default_resource_
;
139 std::map
<std::string
, int>::iterator result
;
140 result
= path_to_idr_map_
.find(path
);
141 if (result
!= path_to_idr_map_
.end())
142 resource_id
= result
->second
;
143 DCHECK_NE(resource_id
, -1);
144 SendFromResourceBundle(callback
, resource_id
);
147 void WebUIIOSDataSourceImpl::SendLocalizedStringsAsJSON(
148 const URLDataSourceIOS::GotDataCallback
& callback
) {
149 std::string template_data
;
150 if (!disable_set_font_strings_
) {
151 webui::SetLoadTimeDataDefaults(web::GetWebClient()->GetApplicationLocale(),
152 &localized_strings_
);
155 webui::AppendJsonJS(&localized_strings_
, &template_data
);
156 callback
.Run(base::RefCountedString::TakeString(&template_data
));
159 void WebUIIOSDataSourceImpl::SendFromResourceBundle(
160 const URLDataSourceIOS::GotDataCallback
& callback
,
162 scoped_refptr
<base::RefCountedStaticMemory
> response(
163 GetWebClient()->GetDataResourceBytes(idr
));
164 callback
.Run(response
.get());