[rtems-docs commit] html: Embed the catalogue XML in JS.

Chris Johns chrisj at rtems.org
Wed Jan 11 06:06:37 UTC 2017


Module:    rtems-docs
Branch:    4.11
Commit:    1ce8d29c91b53922b6e1714c1dd074ed15c74f99
Changeset: http://git.rtems.org/rtems-docs/commit/?id=1ce8d29c91b53922b6e1714c1dd074ed15c74f99

Author:    Chris Johns <chrisj at rtems.org>
Date:      Wed Jan 11 17:04:02 2017 +1100

html: Embed the catalogue XML in JS.

The is to work around a security issue with Chrome on Windows. This
patches let the cover page load on Chrome and Edge on Windows 10.

---

 .../html-coverpage/{index.html => coverpage.html}  |  3 +-
 common/html-coverpage/coverpage.js                 | 13 ++++
 common/html-coverpage/static/rtems/js/catalogue.js | 81 +++++++++++-----------
 wscript                                            | 27 +++++++-
 4 files changed, 81 insertions(+), 43 deletions(-)

diff --git a/common/html-coverpage/index.html b/common/html-coverpage/coverpage.html
similarity index 95%
rename from common/html-coverpage/index.html
rename to common/html-coverpage/coverpage.html
index 301196d..dc13f88 100644
--- a/common/html-coverpage/index.html
+++ b/common/html-coverpage/coverpage.html
@@ -55,7 +55,8 @@
    </div>
    <!-- Load the catalogues and generate the content -->
    <script type="text/javascript" src="static/rtems/js/catalogue.js"></script>
-   <script> loadCatalogue('catalogue.xml'); </script>
+   <script type="text/javascript" src="coverpage.js"></script>
+   <script> coverPageCatalogue(); </script>
    <!-- current-bottom -->
   </div>
   <!-- layout-bottom -->
diff --git a/common/html-coverpage/coverpage.js b/common/html-coverpage/coverpage.js
new file mode 100644
index 0000000..4655c29
--- /dev/null
+++ b/common/html-coverpage/coverpage.js
@@ -0,0 +1,13 @@
+/*!
+ * Copyright 2017 Chris Johns <chrisj at rtems.org>
+ */
+
+/*
+ * Embed the XML catalogue in this JS code to get around the Chrome on Windows
+ * security "feature" where loading of a local disk file under the same path as
+ * the HTML Chrome just loaded from disk is not allowed.
+ */
+function coverPageCatalogue() {
+    xml = '@CATALOGUE';
+    paintCatalogue($.parseXML(xml));
+}
diff --git a/common/html-coverpage/static/rtems/js/catalogue.js b/common/html-coverpage/static/rtems/js/catalogue.js
index d54def2..ae32aed 100644
--- a/common/html-coverpage/static/rtems/js/catalogue.js
+++ b/common/html-coverpage/static/rtems/js/catalogue.js
@@ -29,48 +29,51 @@ function catalogueFooter() {
 	'</table>\n';
 }
 
-function loadCatalogue(path) {
+function paintCatalogue(xml) {
     var el_cat_title = $('#rtems-catalogue-title');
     var el_cat = $('#rtems-catalogue');
+    /*
+     * Use jquery as XMLDocument is consider not stable on Firefox's web site.
+     */
+    var pdfIcon = 'static/images/Adobe_PDF_file_icon_32x32.png';
+    var htmlIcon = 'static/images/html-xxl.png';
+    var docs = $(xml).find('rtems-docs');
+    var date = $(docs).attr('date');
+    var title = $(docs).find('catalogue');
+    var table = catalogueHeader(date);
+    $(docs).find('doc').each(function() {
+	var name = $(this).find('name').text();
+	var title = $(this).find('title').text();
+	var release = $(this).find('release').text();
+	var version = $(this).find('version').text();
+	var html = $(this).find('html').text();
+	var pdf = $(this).find('pdf').text();
+	var singlehtml = $(this).find('singlehtml').text();
+	var empty = '<td></a></td>\n';
+	table += '<tr>\n';
+	if (html)
+	    table += '<td><a href="' + html + '">' + title + '</a></td>\n';
+	else
+	    table += empty;
+	if (pdf)
+	    table += '<td><a href="' + '/' + pdf + '">' +
+ 	    '<img src="' + pdfIcon + '" width="20" height="20"></a></td>\n';
+	else
+	    table += empty;
+	if (singlehtml)
+	    table += '<td><a href="' + '/' + singlehtml + '">' +
+	    '<img src="' + htmlIcon + '" width="20" height="20"></a></td>\n';
+	else
+	    table += empty;
+	table += '</tr>\n';
+    });
+    table += catalogueFooter();
+    el_cat_title.html('<h3>' + $(title).text() + '</h3>');
+    el_cat.html(table);
+}
 
+function loadCatalogue(path) {
     var f = $.get(path, function(xml) {
-	/*
-	 * Use jquery as XMLDocument is consider not stable on Firefox's web site.
-	 */
-	var pdfIcon = 'static/images/Adobe_PDF_file_icon_32x32.png';
-	var htmlIcon = 'static/images/html-xxl.png';
-	var docs = $(xml).find('rtems-docs');
-	var date = $(docs).attr('date');
-	var title = $(docs).find('catalogue');
-	var table = catalogueHeader(date);
-	$(docs).find('doc').each(function() {
-	    var name = $(this).find('name').text();
-	    var title = $(this).find('title').text();
-	    var release = $(this).find('release').text();
-	    var version = $(this).find('version').text();
-	    var html = $(this).find('html').text();
-	    var pdf = $(this).find('pdf').text();
-	    var singlehtml = $(this).find('singlehtml').text();
-	    var empty = '<td></a></td>\n';
-	    table += '<tr>\n';
-	    if (html)
-		table += '<td><a href="' + html + '">' + title + '</a></td>\n';
-	    else
-		table += empty;
-	    if (pdf)
-		table += '<td><a href="' + '/' + pdf + '">' +
- 		    '<img src="' + pdfIcon + '" width="20" height="20"></a></td>\n';
-	    else
-		table += empty;
-	    if (singlehtml)
-		table += '<td><a href="' + '/' + singlehtml + '">' +
-		    '<img src="' + htmlIcon + '" width="20" height="20"></a></td>\n';
-	    else
-		table += empty;
-	    table += '</tr>\n';
-	});
-	table += catalogueFooter();
-	el_cat_title.html('<h3>' + $(title).text() + '</h3>');
-	el_cat.html(table);
+	paintCatalogue(xml);
     }, 'xml');
 }
diff --git a/wscript b/wscript
index 96a8574..955e68f 100644
--- a/wscript
+++ b/wscript
@@ -9,7 +9,7 @@ path.append(abspath('common'))
 import waflib
 import waf as docs_waf
 
-version = '4.11 (4.11.2)'
+version = 'Master (4.11.99)'
 
 build_all = ['user',
              'rsb',
@@ -36,18 +36,39 @@ def configure(conf):
 def catalogue(ctx):
     docs_waf.xml_catalogue(ctx, building, version)
 
+def coverpage_js(ctx):
+    js = None
+    xml = None
+    for f in ctx.inputs:
+        if f.abspath().endswith('.js'):
+            with open(f.abspath()) as i:
+                js = i.read()
+        elif f.abspath().endswith('.xml'):
+            with open(f.abspath()) as i:
+                xml = i.read()
+    xml = xml.replace('\n', ' \\\n');
+    with open(ctx.outputs[0].abspath(), 'w') as o:
+        o.write(js.replace('@CATALOGUE', xml))
+
 def build(ctx):
     for b in building:
         ctx.recurse(b)
 
     #
-    # Build the catalogue and install with the coverpage and static content.
+    # Build the catalogue, coverpage.js and install.
     #
     ctx(rule = catalogue,
         target = 'catalogue.xml',
         source = ['wscript', 'common/waf.py'])
     ctx.install_files('${PREFIX}', 'catalogue.xml')
-    ctx.install_files('${PREFIX}', 'common/html-coverpage/index.html')
+    ctx(rule = coverpage_js,
+        target = 'coverpage.js',
+        source = ['wscript', 'catalogue.xml', 'common/html-coverpage/coverpage.js'])
+    ctx.install_as('${PREFIX}/coverpage.js', 'coverpage.js')
+    #
+    # Install the static content.
+    #
+    ctx.install_as('${PREFIX}/index.html', 'common/html-coverpage/coverpage.html')
     static_dir = ctx.path.find_dir('common/html-coverpage/static')
     ctx.install_files('${PREFIX}/static',
                       static_dir.ant_glob('**'),



More information about the vc mailing list