summaryrefslogtreecommitdiffstats
path: root/ui/webui
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 19:22:37 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 19:22:37 +0000
commit7359238b124bc0a5ff08fb128c052115fc431d96 (patch)
tree1a9e4e75222b474c36ac823ad836f3d4d162335c /ui/webui
parent73fd536e3c955029e636b311a663b82a84635ce7 (diff)
downloadchromium_src-7359238b124bc0a5ff08fb128c052115fc431d96.zip
chromium_src-7359238b124bc0a5ff08fb128c052115fc431d96.tar.gz
chromium_src-7359238b124bc0a5ff08fb128c052115fc431d96.tar.bz2
Move jstemplate_builder.* to ui\webui so it can be reused by webui implementations outside of chrome.
BUG=169170 TBR=estade Review URL: https://codereview.chromium.org/11929016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177729 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/webui')
-rw-r--r--ui/webui/DEPS3
-rw-r--r--ui/webui/jstemplate_builder.cc156
-rw-r--r--ui/webui/jstemplate_builder.h90
-rw-r--r--ui/webui/resources/webui_resources.grd4
4 files changed, 253 insertions, 0 deletions
diff --git a/ui/webui/DEPS b/ui/webui/DEPS
new file mode 100644
index 0000000..b67db9c
--- /dev/null
+++ b/ui/webui/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+grit/webui_resources.h",
+]
diff --git a/ui/webui/jstemplate_builder.cc b/ui/webui/jstemplate_builder.cc
new file mode 100644
index 0000000..631672f
--- /dev/null
+++ b/ui/webui/jstemplate_builder.cc
@@ -0,0 +1,156 @@
+// Copyright (c) 2012 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/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/string_util.h"
+#include "grit/webui_resources.h"
+#include "ui/base/layout.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace {
+
+// Non-zero when building version 2 templates. See UseVersion2 class.
+int g_version2 = 0;
+
+} // namespace
+
+namespace jstemplate_builder {
+
+UseVersion2::UseVersion2() {
+ g_version2++;
+}
+
+UseVersion2::~UseVersion2() {
+ g_version2--;
+}
+
+std::string GetTemplateHtml(const base::StringPiece& html_template,
+ const DictionaryValue* json,
+ const base::StringPiece& template_id) {
+ std::string output(html_template.data(), html_template.size());
+ AppendJsonHtml(json, &output);
+ AppendJsTemplateSourceHtml(&output);
+ AppendJsTemplateProcessHtml(template_id, &output);
+ return output;
+}
+
+std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
+ const DictionaryValue* json) {
+ std::string output(html_template.data(), html_template.size());
+ AppendJsonHtml(json, &output);
+ AppendI18nTemplateSourceHtml(&output);
+ AppendI18nTemplateProcessHtml(&output);
+ return output;
+}
+
+std::string GetTemplatesHtml(const base::StringPiece& html_template,
+ const DictionaryValue* json,
+ const base::StringPiece& template_id) {
+ std::string output(html_template.data(), html_template.size());
+ AppendI18nTemplateSourceHtml(&output);
+ AppendJsTemplateSourceHtml(&output);
+ AppendJsonHtml(json, &output);
+ AppendI18nTemplateProcessHtml(&output);
+ AppendJsTemplateProcessHtml(template_id, &output);
+ return output;
+}
+
+void AppendJsonHtml(const DictionaryValue* json, std::string* output) {
+ std::string javascript_string;
+ jstemplate_builder::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>");
+}
+
+void AppendJsonJS(const 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(g_version2 ? "loadTimeData.data = " : "var templateData = ");
+ output->append(jstext);
+ output->append(";");
+}
+
+void AppendJsTemplateSourceHtml(std::string* output) {
+ // fetch and cache the pointer of the jstemplate resource source text.
+ static const 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>");
+ output->append(jstemplate_src.data(), jstemplate_src.size());
+ output->append("</script>");
+}
+
+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(new JsEvalContext(templateData), tp);");
+ output->append("</script>");
+}
+
+void AppendI18nTemplateSourceHtml(std::string* output) {
+ // fetch and cache the pointer of the jstemplate resource source text.
+ static const base::StringPiece i18n_template_src(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_WEBUI_I18N_TEMPLATE_JS));
+ static const base::StringPiece i18n_template2_src(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_WEBUI_I18N_TEMPLATE2_JS));
+ const base::StringPiece* template_src = g_version2 ?
+ &i18n_template2_src : &i18n_template_src;
+
+ if (template_src->empty()) {
+ NOTREACHED() << "Unable to get i18n template src";
+ return;
+ }
+
+ output->append("<script>");
+ output->append(template_src->data(), template_src->size());
+ output->append("</script>");
+}
+
+void AppendI18nTemplateProcessHtml(std::string* output) {
+ if (g_version2)
+ return;
+
+ static const base::StringPiece i18n_process_src(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_WEBUI_I18N_PROCESS_JS));
+
+ if (i18n_process_src.empty()) {
+ NOTREACHED() << "Unable to get i18n process src";
+ return;
+ }
+
+ output->append("<script>");
+ output->append(i18n_process_src.data(), i18n_process_src.size());
+ output->append("</script>");
+}
+
+} // namespace jstemplate_builder
diff --git a/ui/webui/jstemplate_builder.h b/ui/webui/jstemplate_builder.h
new file mode 100644
index 0000000..5446250
--- /dev/null
+++ b/ui/webui/jstemplate_builder.h
@@ -0,0 +1,90 @@
+// Copyright (c) 2012 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.
+
+// This provides some helper methods for building and rendering an
+// internal html page. The flow is as follows:
+// - instantiate a builder given a webframe that we're going to render content
+// into
+// - load the template html and load the jstemplate javascript into the frame
+// - given a json data object, run the jstemplate javascript which fills in
+// template values
+
+#ifndef UI_WEBUI_JSTEMPLATE_BUILDER_H_
+#define UI_WEBUI_JSTEMPLATE_BUILDER_H_
+
+#include <string>
+
+#include "base/string_piece.h"
+#include "ui/base/ui_export.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace jstemplate_builder {
+
+// While an object of this class is in scope, the template builder will output
+// version 2 html. Version 2 uses load_time_data.js and i18n_template2.js, and
+// should soon become the default.
+class UI_EXPORT UseVersion2 {
+ public:
+ UseVersion2();
+ ~UseVersion2();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(UseVersion2);
+};
+
+// A helper function that generates a string of HTML to be loaded. The
+// string includes the HTML and the javascript code necessary to generate the
+// full page with support for JsTemplates.
+UI_EXPORT std::string GetTemplateHtml(const base::StringPiece& html_template,
+ const base::DictionaryValue* json,
+ const base::StringPiece& template_id);
+
+// A helper function that generates a string of HTML to be loaded. The
+// string includes the HTML and the javascript code necessary to generate the
+// full page with support for i18n Templates.
+UI_EXPORT std::string GetI18nTemplateHtml(
+ const base::StringPiece& html_template,
+ const base::DictionaryValue* json);
+
+// A helper function that generates a string of HTML to be loaded. The
+// string includes the HTML and the javascript code necessary to generate the
+// full page with support for both i18n Templates and JsTemplates.
+UI_EXPORT std::string GetTemplatesHtml(const base::StringPiece& html_template,
+ const base::DictionaryValue* json,
+ const base::StringPiece& template_id);
+
+// The following functions build up the different parts that the above
+// templates use.
+
+// Appends a script tag with a variable name |templateData| that has the JSON
+// assigned to it.
+UI_EXPORT void AppendJsonHtml(const base::DictionaryValue* json,
+ std::string* output);
+
+// Same as AppendJsonHtml(), except does not include the <script></script>
+// tag wrappers.
+UI_EXPORT void AppendJsonJS(const base::DictionaryValue* json,
+ std::string* output);
+
+// Appends the source for JsTemplates in a script tag.
+UI_EXPORT void AppendJsTemplateSourceHtml(std::string* output);
+
+// Appends the code that processes the JsTemplate with the JSON. You should
+// call AppendJsTemplateSourceHtml and AppendJsonHtml before calling this.
+UI_EXPORT void AppendJsTemplateProcessHtml(const base::StringPiece& template_id,
+ std::string* output);
+
+// Appends the source for i18n Templates in a script tag.
+UI_EXPORT void AppendI18nTemplateSourceHtml(std::string* output);
+
+// Appends the code that processes the i18n Template with the JSON. You
+// should call AppendJsTemplateSourceHtml and AppendJsonHtml before calling
+// this.
+UI_EXPORT void AppendI18nTemplateProcessHtml(std::string* output);
+
+} // namespace jstemplate_builder
+#endif // UI_WEBUI_JSTEMPLATE_BUILDER_H_
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index d85a707..146cf39 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -13,6 +13,10 @@ without changes to the corresponding grd file. -->
</outputs>
<release seq="1">
<includes>
+ <include name="IDR_WEBUI_I18N_PROCESS_JS" file="js/i18n_process.js" type="BINDATA" />
+ <include name="IDR_WEBUI_I18N_TEMPLATE_JS" file="js/i18n_template.js" type="BINDATA" />
+ <include name="IDR_WEBUI_I18N_TEMPLATE2_JS" file="js/i18n_template2.js" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_WEBUI_JSTEMPLATE_JS" file="js/jstemplate_compiled.js" flattenhtml="true" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_CHECK"
file="images/check.png" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK"