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