12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_data_source_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted_memory.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_client.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/jstemplate_builder.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebUIDataSource* WebUIDataSource::Create(const std::string& source_name) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new WebUIDataSourceImpl(source_name);
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSource::Add(BrowserContext* browser_context,
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          WebUIDataSource* source) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLDataManager::AddWebUIDataSource(browser_context, source);
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Internal class to hide the fact that WebUIDataSourceImpl implements
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLDataSource.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUIDataSourceImpl::InternalDataSource : public URLDataSource {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalDataSource(WebUIDataSourceImpl* parent) : parent_(parent) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~InternalDataSource() {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URLDataSource implementation.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetSource() const OVERRIDE {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return parent_->GetSource();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string GetMimeType(const std::string& path) const OVERRIDE {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return parent_->GetMimeType(path);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartDataRequest(
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& path,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int render_process_id,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int render_view_id,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const URLDataSource::GotDataCallback& callback) OVERRIDE {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return parent_->StartDataRequest(path, render_process_id, render_view_id,
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     callback);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual bool ShouldReplaceExistingSource() const OVERRIDE {
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return parent_->replace_existing_source_;
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual bool AllowCaching() const OVERRIDE {
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return false;
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldAddContentSecurityPolicy() const OVERRIDE {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return parent_->add_csp_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string GetContentSecurityPolicyObjectSrc() const OVERRIDE {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_->object_src_set_)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return parent_->object_src_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return URLDataSource::GetContentSecurityPolicyObjectSrc();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string GetContentSecurityPolicyFrameSrc() const OVERRIDE {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_->frame_src_set_)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return parent_->frame_src_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return URLDataSource::GetContentSecurityPolicyFrameSrc();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldDenyXFrameOptions() const OVERRIDE {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return parent_->deny_xframe_options_;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebUIDataSourceImpl* parent_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebUIDataSourceImpl::WebUIDataSourceImpl(const std::string& source_name)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : URLDataSourceImpl(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          source_name,
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          new InternalDataSource(this)),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      source_name_(source_name),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_resource_(-1),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      json_js_format_v2_(false),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      add_csp_(true),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      object_src_set_(false),
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      frame_src_set_(false),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      deny_xframe_options_(true),
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      disable_set_font_strings_(false),
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      replace_existing_source_(true) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebUIDataSourceImpl::~WebUIDataSourceImpl() {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddString(const std::string& name,
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    const base::string16& value) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings_.SetString(name, value);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddString(const std::string& name,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const std::string& value) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings_.SetString(name, value);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddLocalizedString(const std::string& name,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             int ids) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings_.SetString(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name, GetContentClient()->GetLocalizedString(ids));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddLocalizedStrings(
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::DictionaryValue& localized_strings) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings_.MergeDictionary(&localized_strings);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddBoolean(const std::string& name, bool value) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings_.SetBoolean(name, value);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SetJsonPath(const std::string& path) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  json_path_ = path;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SetUseJsonJSFormatV2() {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  json_js_format_v2_ = true;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::AddResourcePath(const std::string &path,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          int resource_id) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path_to_idr_map_[path] = resource_id;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SetDefaultResource(int resource_id) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_resource_ = resource_id;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SetRequestFilter(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebUIDataSource::HandleRequestCallback& callback) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_callback_ = callback;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebUIDataSourceImpl::DisableReplaceExistingSource() {
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  replace_existing_source_ = false;
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::DisableContentSecurityPolicy() {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  add_csp_ = false;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::OverrideContentSecurityPolicyObjectSrc(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& data) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  object_src_set_ = true;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  object_src_ = data;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::OverrideContentSecurityPolicyFrameSrc(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& data) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame_src_set_ = true;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame_src_ = data;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::DisableDenyXFrameOptions() {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deny_xframe_options_ = false;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string WebUIDataSourceImpl::GetSource() const {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return source_name_;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string WebUIDataSourceImpl::GetMimeType(const std::string& path) const {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (EndsWith(path, ".js", false))
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "application/javascript";
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (EndsWith(path, ".json", false))
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "application/json";
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (EndsWith(path, ".pdf", false))
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "application/pdf";
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (EndsWith(path, ".svg", false))
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return "image/svg+xml";
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return "text/html";
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::StartDataRequest(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& path,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int render_process_id,
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int render_view_id,
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const URLDataSource::GotDataCallback& callback) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!filter_callback_.is_null() &&
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      filter_callback_.Run(path, callback)) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!json_path_.empty() && path == json_path_) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendLocalizedStringsAsJSON(callback);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int resource_id = default_resource_;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, int>::iterator result;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result = path_to_idr_map_.find(path);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (result != path_to_idr_map_.end())
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_id = result->second;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_NE(resource_id, -1);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendFromResourceBundle(callback, resource_id);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SendLocalizedStringsAsJSON(
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const URLDataSource::GotDataCallback& callback) {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string template_data;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!disable_set_font_strings_)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    webui::SetFontAndTextDirection(&localized_strings_);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<webui::UseVersion2> version2;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (json_js_format_v2_)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    version2.reset(new webui::UseVersion2);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::AppendJsonJS(&localized_strings_, &template_data);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(base::RefCountedString::TakeString(&template_data));
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIDataSourceImpl::SendFromResourceBundle(
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const URLDataSource::GotDataCallback& callback, int idr) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedStaticMemory> response(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentClient()->GetDataResourceBytes(idr));
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  callback.Run(response.get());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
234