From 4eefe9451ed9135ace1149cd6d942df860351705 Mon Sep 17 00:00:00 2001
From: Anton Sarukhanov <code@ant.sr>
Date: Wed, 13 Apr 2016 23:03:19 -0400
Subject: [PATCH] 'responsive' option for embed; X-Frame-Options:DENY for
 non-embed URL

---
 app.py                     |  6 ++++--
 static/js/embed.js         | 25 +++++++++++++++++++++----
 templates/modal-embed.html |  4 ++--
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/app.py b/app.py
index fbd5ea2..a8e4057 100644
--- a/app.py
+++ b/app.py
@@ -1,5 +1,5 @@
 import os
-from flask import Flask, jsonify, render_template, request, abort
+from flask import Flask, jsonify, make_response, render_template, request, abort
 from flask.ext.bower import Bower
 from jinja2.exceptions import TemplateNotFound
 from sqlalchemy.orm import joinedload
@@ -26,7 +26,9 @@ def map():
     # TODO: serve different agency depending on cookie (or special domain)
     agency_tag = app.config['AGENCIES'][0]
     agency = db.session.query(Agency).filter(Agency.tag==agency_tag).one()
-    return render_template('map.html', agency=agency, config=app.config)
+    r = make_response(render_template('map.html', agency=agency, config=app.config))
+    r.headers.add('X-Frame-Options', 'DENY')
+    return r
 
 @app.route('/e')
 def map_embed():
diff --git a/static/js/embed.js b/static/js/embed.js
index c7b522d..7107a0e 100644
--- a/static/js/embed.js
+++ b/static/js/embed.js
@@ -1,20 +1,37 @@
 /* Logic for embed code generator form */
 
 var updateCode = function() {
-    var code = $("#embed-preview").html();
-    $("#embed-code").html(code.trim());
+    // Grab HTML representation of preview; trim whitespace.
+    var code = $("#embed-preview").html().trim();
+    // Remove empty style attribute. OCD is good!
+    code = code.replace(" style=''","");
+    code = code.replace(' style=""',"");
+    // Put it in the textarea.
+    $("#embed-code").html(code);
 }
 
+// OnChange event handlers for Embed Options form
 $("#embed-height").change(function() {
     $("#embed-preview iframe").attr('height', $(this).val() + "px");
-    updateCode();
 });
 $("#embed-width").change(function() {
     $("#embed-preview iframe").attr('width', $(this).val() + "px");
+});
+$("#embed-responsive").change(function() {
+    if ($(this).prop("checked")) {
+        $("#embed-preview iframe").css('max-width', '100%');
+    } else {
+        $("#embed-preview iframe").css('max-width', '');
+    }
+});
+$("#embed-form :input").change(function() {
     updateCode();
 });
+
+// Hilight code for easy copying
 $("#embed-code").on('focus click keydown keyup', function() {
     $(this).select();
 });
 
-updateCode();
+// Fire a fake change event to ensure sync between form, preview, and code.
+$("#embed-form :input").change();
diff --git a/templates/modal-embed.html b/templates/modal-embed.html
index 77a9521..9e7aa4b 100644
--- a/templates/modal-embed.html
+++ b/templates/modal-embed.html
@@ -3,10 +3,10 @@
     This map can be used in websites, displays, or digital signage solutions. To embed a list of predictions instead, change the <strong>Mode</strong> selector.
 </p>
 <h3>Embed Code</h3>
-<textarea id="embed-code" cols=100 rows=3  readonly=true></textarea>
+<textarea id="embed-code" cols=100 rows=3  readonly=true><!-- Loading... --></textarea>
 <h3>Preview</h3>
 <div id="embed-preview">
-<iframe src="{{ url_for('map_embed', _external=True, _scheme='') }}" width="400px" height="250px" frameborder=0></iframe>
+<iframe src="{{ url_for('map_embed', _external=True, _scheme='') }}" frameborder=0></iframe>
 </div>
 <h3>Options</h3>
 <form id="embed-form">
-- 
GitLab