diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-18 19:22:37 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-18 19:22:37 +0000 |
commit | 7359238b124bc0a5ff08fb128c052115fc431d96 (patch) | |
tree | 1a9e4e75222b474c36ac823ad836f3d4d162335c /ui/webui | |
parent | 73fd536e3c955029e636b311a663b82a84635ce7 (diff) | |
download | chromium_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/DEPS | 3 | ||||
-rw-r--r-- | ui/webui/jstemplate_builder.cc | 156 | ||||
-rw-r--r-- | ui/webui/jstemplate_builder.h | 90 | ||||
-rw-r--r-- | ui/webui/resources/webui_resources.grd | 4 |
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" |