blob: eda6a1fa347bf76a38370b70773b6f5795580b6a [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/webui/shared_resources_data_source_ios.h"
#import <stddef.h>
#import "base/check.h"
#import "base/memory/ref_counted_memory.h"
#import "base/strings/string_util.h"
#import "ios/web/grit/ios_web_resources.h"
#import "ios/web/grit/ios_web_resources_map.h"
#import "ios/web/public/web_client.h"
#import "mojo/public/js/grit/mojo_bindings_resources.h"
#import "mojo/public/js/grit/mojo_bindings_resources_map.h"
#import "net/base/mime_util.h"
#import "ui/base/webui/resource_path.h"
#import "ui/base/webui/web_ui_util.h"
#import "ui/resources/grit/webui_resources.h"
#import "ui/resources/grit/webui_resources_map.h"
namespace web {
namespace {
// Value duplicated from content/public/common/url_constants.h
// TODO(stuartmorgan): Revisit how to share this in a more maintainable way.
const char kWebUIResourcesHost[] = "resources";
// Maps a path name (i.e. "/js/path.js") to a resource map entry. Returns
// nullptr if not found.
const webui::ResourcePath* PathToResource(const std::string& path) {
for (size_t i = 0; i < kWebuiResourcesSize; ++i) {
if (path == kWebuiResources[i].path) {
return &kWebuiResources[i];
}
}
for (size_t i = 0; i < kMojoBindingsResourcesSize; ++i) {
if (path == kMojoBindingsResources[i].path)
return &kMojoBindingsResources[i];
}
for (size_t i = 0; i < kIosWebResourcesSize; ++i) {
if (path == kIosWebResources[i].path)
return &kIosWebResources[i];
}
return nullptr;
}
} // namespace
SharedResourcesDataSourceIOS::SharedResourcesDataSourceIOS() {}
SharedResourcesDataSourceIOS::~SharedResourcesDataSourceIOS() {}
std::string SharedResourcesDataSourceIOS::GetSource() const {
return kWebUIResourcesHost;
}
void SharedResourcesDataSourceIOS::StartDataRequest(
const std::string& path,
URLDataSourceIOS::GotDataCallback callback) {
const webui::ResourcePath* resource = PathToResource(path);
DCHECK(resource) << " path: " << path;
scoped_refptr<base::RefCountedMemory> bytes;
WebClient* web_client = GetWebClient();
int idr = resource ? resource->id : -1;
if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS) {
bytes = base::MakeRefCounted<base::RefCountedString>(
webui::GetWebUiCssTextDefaults());
} else {
bytes = web_client->GetDataResourceBytes(idr);
}
std::move(callback).Run(bytes.get());
}
std::string SharedResourcesDataSourceIOS::GetMimeType(
const std::string& path) const {
std::string mime_type;
net::GetMimeTypeFromFile(base::FilePath().AppendASCII(path), &mime_type);
return mime_type;
}
} // namespace web