1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// Copyright 2013 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.
// A helper function for using JsTemplate. See jstemplate_builder.h for more
// info.
#include "ui/base/webui/jstemplate_builder.h"
#include "base/json/json_file_value_serializer.h"
#include "base/json/json_string_value_serializer.h"
#include "base/logging.h"
#include "base/strings/string_util.h"
#include "ui/base/layout.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/resources/grit/webui_resources.h"
namespace webui {
namespace {
// Appends a script tag with a variable name |templateData| that has the JSON
// assigned to it.
void AppendJsonHtml(const base::DictionaryValue* json, std::string* output) {
std::string javascript_string;
AppendJsonJS(json, &javascript_string);
// </ confuses the HTML parser because it could be a </script> tag. So we
// replace </ with <\/. The extra \ will be ignored by the JS engine.
ReplaceSubstringsAfterOffset(&javascript_string, 0, "</", "<\\/");
output->append("<script>");
output->append(javascript_string);
output->append("</script>");
}
// Appends the source for load_time_data.js in a script tag.
void AppendLoadTimeData(std::string* output) {
// fetch and cache the pointer of the jstemplate resource source text.
base::StringPiece load_time_data_src(
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_WEBUI_JS_LOAD_TIME_DATA));
if (load_time_data_src.empty()) {
NOTREACHED() << "Unable to get loadTimeData src";
return;
}
output->append("<script>");
load_time_data_src.AppendToString(output);
output->append("</script>");
}
// Appends the source for JsTemplates in a script tag.
void AppendJsTemplateSourceHtml(std::string* output) {
// fetch and cache the pointer of the jstemplate resource source text.
base::StringPiece jstemplate_src(
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_WEBUI_JSTEMPLATE_JS));
if (jstemplate_src.empty()) {
NOTREACHED() << "Unable to get jstemplate src";
return;
}
output->append("<script>");
jstemplate_src.AppendToString(output);
output->append("</script>");
}
// Appends the code that processes the JsTemplate with the JSON. You should
// call AppendJsTemplateSourceHtml and AppendJsonHtml before calling this.
void AppendJsTemplateProcessHtml(
const base::StringPiece& template_id,
std::string* output) {
output->append("<script>");
output->append("var tp = document.getElementById('");
output->append(template_id.data(), template_id.size());
output->append("');");
output->append("jstProcess(loadTimeData.createJsEvalContext(), tp);");
output->append("</script>");
}
// Appends the source for i18n Templates in a script tag.
void AppendI18nTemplateSourceHtml(std::string* output) {
base::StringPiece i18n_template_src(
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_WEBUI_I18N_TEMPLATE2_JS));
if (i18n_template_src.empty()) {
NOTREACHED() << "Unable to get i18n template src";
return;
}
output->append("<script>");
i18n_template_src.AppendToString(output);
output->append("</script>");
}
} // namespace
std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
const base::DictionaryValue* json) {
std::string output(html_template.data(), html_template.size());
AppendLoadTimeData(&output);
AppendJsonHtml(json, &output);
AppendI18nTemplateSourceHtml(&output);
return output;
}
std::string GetTemplatesHtml(const base::StringPiece& html_template,
const base::DictionaryValue* json,
const base::StringPiece& template_id) {
std::string output(html_template.data(), html_template.size());
AppendLoadTimeData(&output);
AppendJsonHtml(json, &output);
AppendI18nTemplateSourceHtml(&output);
AppendJsTemplateSourceHtml(&output);
AppendJsTemplateProcessHtml(template_id, &output);
return output;
}
void AppendJsonJS(const base::DictionaryValue* json, std::string* output) {
// Convert the template data to a json string.
DCHECK(json) << "must include json data structure";
std::string jstext;
JSONStringValueSerializer serializer(&jstext);
serializer.Serialize(*json);
output->append("loadTimeData.data = ");
output->append(jstext);
output->append(";");
}
} // namespace webui
|