From d505eeb2695cf12a1ba41fc5adc74f8e243d7477 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" Date: Mon, 13 Jul 2020 11:49:21 +0100 Subject: [PATCH] Consent widget Block the raw widget unless consent has been granted. This is helpful because the tw2parser generates <$raw> widgets for content embedded with , and thus this blocks YouTube embeds. --- .../config/blocked-raw-message.tid | 19 +++++ .../tiddlywiki/consent-banner/raw-widget.js | 69 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid create mode 100644 plugins/tiddlywiki/consent-banner/raw-widget.js diff --git a/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid b/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid new file mode 100644 index 000000000..494cf879c --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid @@ -0,0 +1,19 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message + +
+ +
+ +
+ +Blocked raw content + +
+ +{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock + +
+ +
+ +
diff --git a/plugins/tiddlywiki/consent-banner/raw-widget.js b/plugins/tiddlywiki/consent-banner/raw-widget.js new file mode 100644 index 000000000..a38deee39 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/raw-widget.js @@ -0,0 +1,69 @@ +/*\ +title: $:/core/modules/widgets/raw.js +type: application/javascript +module-type: widget + +An override of the raw widget that blocks raw content until the user has consented to accept cookies + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var RawWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +RawWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +RawWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; + this.execute(); + this.blocked = this.getVariable("tv-block-embedded-content","no") === "yes"; + if(this.blocked) { + this.makeChildWidgets([{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: "$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message"} + } + }]); + // Render child widgets + this.renderChildren(parent,null); + } else { + var div = this.document.createElement("div"); + div.innerHTML=this.parseTreeNode.html; + parent.insertBefore(div,nextSibling); + this.domNodes.push(div); + } +}; + +/* +Compute the internal state of the widget +*/ +RawWidget.prototype.execute = function() { +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +RawWidget.prototype.refresh = function(changedTiddlers) { + if(this.blocked) { + return this.refreshChildren(changedTiddlers); + } else { + return false; + } +}; + +exports.raw = RawWidget; + +})();