PluginProbe
Tagembed: Social Media Feeds and Customer Reviews Widget / 8.0
Tagembed: Social Media Feeds and Customer Reviews Widget v8.0
7.9 8.0 7.8 7.5 7.6 7.7 7.4 trunk 3.10 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 All 45 releases
← All changes | assets/js/tagembed.common.js +115 -32 7.4 → 8.0 View file →
@@ -1,4 +1,41 @@
1 +/*--Start--Validation : Accept An Identifier Only When It Is Digits Only*/
2 +/* Validation, as described in the WordPress security handbook : test the value against a
3 + known pattern and treat anything else as invalid. */
4 +function __tagembed__isValidId(value) {
5 + return /^\d+$/.test(String(value === undefined || value === null ? "" : value).trim());
6 +}
7 +function __tagembed__validId(value) {
8 + return __tagembed__isValidId(value) ? String(value).trim() : "";
9 +}
10 +/*--End--Validation*/
11 +/*--Start--Escaping : WordPress Core @wordpress/escape-html Package*/
12 +/* wp.escapeHtml is shipped by WordPress core (script handle wp-escape-html).
13 + escapeHTML() is for text between tags, escapeAttribute() is for a double quoted attribute. */
14 +function __tagembed__escapeText(value) {
15 + let __tagembed__stringValue = String(value === undefined || value === null ? "" : value);
16 + return window.wp.escapeHtml.escapeHTML(__tagembed__stringValue);
17 +}
18 +function __tagembed__escapeAttr(value) {
19 + let __tagembed__stringValue = String(value === undefined || value === null ? "" : value);
20 + return window.wp.escapeHtml.escapeAttribute(__tagembed__stringValue);
21 +}
22 +/*--End--Escaping*/
23 +/*--Start--Sanitization : DOMPurify, Applied To Every Markup String Before It Reaches The DOM*/
24 +/* Our own DOMPurify instance is captured as soon as this file loads, so a copy loaded
25 + later by another plugin can never replace the one this plugin uses. */
26 +var __tagembed__purifier = window.__tagembed__DOMPurify || window.DOMPurify;
27 +function __tagembed__setSafeHtml(element, html) {
28 + if (!element) return;
29 + var __tagembed__sanitizer = __tagembed__purifier || window.__tagembed__DOMPurify || window.DOMPurify;
30 + if (!__tagembed__sanitizer || typeof __tagembed__sanitizer.sanitize !== "function") {
31 + /* Without the sanitizer nothing is rendered, so unsanitized markup can never reach the page. */
32 + element.textContent = "";
33 + return;
34 + }
35 + element.innerHTML = __tagembed__sanitizer.sanitize(String(html === undefined || html === null ? "" : html), { USE_PROFILES: { html: true } });
36 +}
37 +/*--End--Sanitization*/
1 38 /*--Start-- Manage Window Popup In New Tab*/
2 39 /*function __tagmebed__openWindowPopup(url, windowName = "Tagembed") {
3 40 __tagmebed__window_popup = window.open(url, '_blank');
4 41 __tagmebed__window_popup.focus();
@@ -60,31 +97,77 @@
60 97 } else {
61 98 __tagembed__toast.danger({ message: __tagembed__message.__tagembed__message.replace(/-/g, ' '), position: '__tagembed__is-top-right' });
62 99 }
63 100 /*--Start--Show Popup On Plan Upgrade Time*/
64 - if (__tagembed__message.hasOwnProperty("planName") && __tagembed__message.hasOwnProperty("amount") && __tagembed__message.hasOwnProperty("paymentId")) {
101 + /* Every query string value is read through one trimmed lookup, so a key that arrives with
102 + no value at all (&paymentId) counts as absent instead of printing a blank box. */
103 + let __tagembed__queryValue = function (key) {
104 + let __tagembed__raw = __tagembed__message[key];
105 + return String(__tagembed__raw === undefined || __tagembed__raw === null ? "" : __tagembed__raw).trim();
106 + };
107 + let __tagembed__planName = __tagembed__queryValue("planName");
108 + if (__tagembed__planName) {
65 109 let __tagembed__upgrade_account_popup = document.querySelector("#__tagembed__upgrade_account_popup");
66 - let elemHTML = `<div class="__tagembed__popupwrap __tagembed__popup_md">`;
67 - elemHTML = `${elemHTML}<button id="__tagembed__upgrade_account_popup_close_btn" onclick="__tagembed__hide_upgrade_account_popup();" type="button" class="__tagembed__closebtn"></button>`;
68 - elemHTML = `${elemHTML}<div class="__tagembed__popupinn">`;
69 - elemHTML = `${elemHTML}<div class="__tagembed__formwbody">`;
70 - elemHTML = `${elemHTML}<div class="__tagembed__thankyou">`;
71 - elemHTML = `${elemHTML}<img src="${__tagembed__plugin_url_for_js}assets/images/check-green.png" alt="check">`;
72 - elemHTML = `${elemHTML}<h2>Congratulations! <span>Your account has been upgraded</span></h2>`;
73 - elemHTML = `${elemHTML}<div class="__tagembed__plandetail">`;
74 - elemHTML = `${elemHTML}<div class="__tagembed__planbox">`;
75 - elemHTML = `${elemHTML}<p>Amount</p>`;
76 - elemHTML = `${elemHTML}<span>$${__tagembed__message.amount}</span>`;
77 - elemHTML = `${elemHTML}</div>`;
78 - elemHTML = `${elemHTML}<div class="__tagembed__planbox">`;
79 - elemHTML = `${elemHTML}<p>Payment Id</p>`;
80 - elemHTML = `${elemHTML}<span>${__tagembed__message.paymentId}</span>`;
81 - elemHTML = `${elemHTML}</div>`;
82 - elemHTML = `${elemHTML}<div class="__tagembed__planbox">`;
83 - elemHTML = `${elemHTML}<p>Plan</p>`;
84 - elemHTML = `${elemHTML}<span>${__tagembed__message.planName}</span>`;
85 - elemHTML = `${elemHTML}</div></div></div></div></div></div>`;
86 - __tagembed__upgrade_account_popup.innerHTML = elemHTML;
110 + /* The popup markup only exists on the upgrade screen, so nothing is built when it is absent. */
111 + if (!__tagembed__upgrade_account_popup) return;
112 + /* Built with DOM methods. The query string values are inserted as text
113 + nodes only, so no markup can be produced from them. */
114 + let __tagembed__makeElement = function (tag, className) {
115 + let __tagembed__element = document.createElement(tag);
116 + if (className) __tagembed__element.className = className;
117 + return __tagembed__element;
118 + };
119 + let __tagembed__makePlanBox = function (label, value) {
120 + let __tagembed__box = __tagembed__makeElement("div", "__tagembed__planbox");
121 + let __tagembed__label = document.createElement("p");
122 + __tagembed__label.textContent = label;
123 + let __tagembed__value = document.createElement("span");
124 + __tagembed__value.textContent = (value === undefined || value === null) ? "" : String(value);
125 + __tagembed__box.appendChild(__tagembed__label);
126 + __tagembed__box.appendChild(__tagembed__value);
127 + return __tagembed__box;
128 + };
129 + let __tagembed__wrap = __tagembed__makeElement("div", "__tagembed__popupwrap __tagembed__popup_md");
130 + let __tagembed__closeBtn = __tagembed__makeElement("button", "__tagembed__closebtn");
131 + __tagembed__closeBtn.setAttribute("id", "__tagembed__upgrade_account_popup_close_btn");
132 + __tagembed__closeBtn.setAttribute("type", "button");
133 + __tagembed__closeBtn.addEventListener("click", __tagembed__hide_upgrade_account_popup);
134 + let __tagembed__inn = __tagembed__makeElement("div", "__tagembed__popupinn");
135 + let __tagembed__body = __tagembed__makeElement("div", "__tagembed__formwbody");
136 + let __tagembed__thankyou = __tagembed__makeElement("div", "__tagembed__thankyou");
137 + let __tagembed__checkImg = document.createElement("img");
138 + __tagembed__checkImg.setAttribute("src", __tagembed__plugin_url_for_js + "assets/images/check-green.png");
139 + __tagembed__checkImg.setAttribute("alt", "check");
140 + let __tagembed__heading = document.createElement("h2");
141 + __tagembed__heading.appendChild(document.createTextNode("Congratulations! "));
142 + let __tagembed__headingSpan = document.createElement("span");
143 + /* The popup repeats the message that came back in the query string, so an upgrade and a
144 + downgrade each read correctly instead of both claiming an upgrade. */
145 + __tagembed__headingSpan.textContent = __tagembed__message.__tagembed__message.replace(/-/g, ' ');
146 + __tagembed__heading.appendChild(__tagembed__headingSpan);
147 + let __tagembed__detail = __tagembed__makeElement("div", "__tagembed__plandetail");
148 + /* A free plan costs nothing, so a missing or zero amount is left out rather than shown as $0. */
149 + let __tagembed__amount = __tagembed__queryValue("amount");
150 + let __tagembed__amountValue = Number(__tagembed__amount);
151 + if (__tagembed__amount && !(isFinite(__tagembed__amountValue) && 0 === __tagembed__amountValue))
152 + __tagembed__detail.appendChild(__tagembed__makePlanBox("Amount", "$" + __tagembed__amount));
153 + /* A downgrade carries no payment, so the payment id is shown only when one actually arrived. */
154 + let __tagembed__paymentId = __tagembed__queryValue("paymentId");
155 + if (__tagembed__paymentId)
156 + __tagembed__detail.appendChild(__tagembed__makePlanBox("Payment Id", __tagembed__paymentId));
157 + /* The free plan is the fallback every downgrade lands on, so naming it adds nothing. */
158 + if ("free" !== __tagembed__planName.toLowerCase())
159 + __tagembed__detail.appendChild(__tagembed__makePlanBox("Plan", __tagembed__planName));
160 + __tagembed__thankyou.appendChild(__tagembed__checkImg);
161 + __tagembed__thankyou.appendChild(__tagembed__heading);
162 + /* A free downgrade leaves out every detail, so the empty row is not added at all. */
163 + if (__tagembed__detail.hasChildNodes())
164 + __tagembed__thankyou.appendChild(__tagembed__detail);
165 + __tagembed__body.appendChild(__tagembed__thankyou);
166 + __tagembed__inn.appendChild(__tagembed__body);
167 + __tagembed__wrap.appendChild(__tagembed__closeBtn);
168 + __tagembed__wrap.appendChild(__tagembed__inn);
169 + __tagembed__upgrade_account_popup.replaceChildren(__tagembed__wrap);
87 170 __tagembed__upgrade_account_popup.style.display = "block";
88 171 }
89 172 /*--End--Show Popup On Plan Upgrade Time*/
90 173 }
@@ -102,11 +185,11 @@
102 185 /*--Start-- Logout*/
103 186 var __tagembed__logout = document.querySelector("#__tagembed__logout");
104 187 if (__tagembed__logout) {
105 188 __tagembed__logout.addEventListener('click', function (event) {
106 - confirmDialog({ title: 'Yes, sign out', message: 'Are you sure! do you want to sign out?', buttonText: 'Sign Out', type: 'warning' }, function () {
189 + __tagembed__confirmDialog({ title: 'Yes, sign out', message: 'Are you sure! do you want to sign out?', buttonText: 'Sign Out', type: 'warning' }, function () {
107 190 let formData = new FormData();
108 - formData.append('action', 'data');
191 + formData.append('action', 'tagembed_data');
109 192 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
110 193 formData.append('__tagembed__ajax_action', '__tagembed__logout');
111 194 __tagembed__open_loader();
112 195 let __tagembed__toast = new TagembedToast;
@@ -145,9 +228,9 @@
145 228 __tagembed__manageActiveWidget(__tagembed__widgetId);
146 229 __tagembed__open_loader();
147 230 let __tagembed__toast = new TagembedToast;
148 231 let formData = new FormData();
149 - formData.append('action', 'data');
232 + formData.append('action', 'tagembed_data');
150 233 formData.append('menueId', __tagembed__menu_id);
151 234 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
152 235 formData.append('__tagembed__ajax_action', '__tagembed__menue');
153 236 fetch(__tagembed__ajax_url, {
@@ -182,9 +265,9 @@
182 265 if (!__tagembed__network_id)
183 266 return;
184 267 let formData = new FormData();
185 268 formData.append('networkId', __tagembed__network_id);
186 - formData.append('action', 'data');
269 + formData.append('action', 'tagembed_data');
187 270 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
188 271 formData.append('__tagembed__ajax_action', '__tagembed__get_already_exist_auth');
189 272 fetch(__tagembed__ajax_url, {
190 273 method: 'POST',
@@ -205,9 +288,9 @@
205 288 return;
206 289 __tagembed__open_loader();
207 290 let formData = new FormData();
208 291 formData.append('networkId', __tagembed__network_id);
209 - formData.append('action', 'data');
292 + formData.append('action', 'tagembed_data');
210 293 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
211 294 formData.append('__tagembed__ajax_action', '__tagembed__get_already_exist_auth');
212 295 fetch(__tagembed__ajax_url, {
213 296 method: 'POST',
@@ -251,9 +334,9 @@
251 334 __tagembed__widgetId = __tagembed__widgetId.value.split('#')[0];
252 335 }
253 336 let __tagembed__toast = new TagembedToast;
254 337 let formData = new FormData();
255 - formData.append('action', 'data');
338 + formData.append('action', 'tagembed_data');
256 339 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
257 340 formData.append('__tagembed__ajax_action', '__tagembed__manage_active_widget');
258 341 formData.append('widgetId', __tagembed__widgetId);
259 342 if (__tagembed__loader_status)
@@ -305,9 +388,9 @@
305 388 return;
306 389 }
307 390 __tagembed__open_loader();
308 391 let __tagembed__toast = new TagembedToast;
309 - formData.append('action', 'data');
392 + formData.append('action', 'tagembed_data');
310 393 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
311 394 formData.append('__tagembed__ajax_action', '__tagembed__create_widget');
312 395 fetch(__tagembed__ajax_url, {
313 396 method: 'POST',
@@ -374,9 +457,9 @@
374 457 function __tageembed__addUpdateAndRefreshAccount(__tagembed__networkId, __tagembed__type, __tagembed__connected_account_id = null, __tagembed__feed_id = null, __tagembed__feed_filter_id = null, __tagembed__other_data = null) {
375 458 if (__tagembed__networkId) {
376 459 let __tagembed__toast = new TagembedToast;
377 460 let formData = new FormData();
378 - formData.append('action', 'data');
461 + formData.append('action', 'tagembed_data');
379 462 formData.append('__tagembed__ajax_call_nones', __tagembed__ajax_call_nones);
380 463 formData.append('__tagembed__ajax_action', '__tagembed__add_or_update_account');
381 464 formData.append('type', __tagembed__type);
382 465 formData.append('connectedAccountId', __tagembed__connected_account_id);
@@ -422,9 +505,9 @@
422 505 if (widgetData) {
423 506 let __tagembed__widgetId = widgetData.selectedOptions[0].value.split('#')[0];
424 507 let __tagembed__shortCode = document.querySelector("#__tagembed__shortCode");
425 508 if (__tagembed__shortCode)
426 - __tagembed__shortCode.innerHTML = `[tagembed widgetid ${__tagembed__widgetId}]`;
509 + __tagembed__shortCode.textContent = `[tagembed widgetid ${__tagembed__widgetId}]`;
427 510 }
428 511 }
429 512 /*--Start--Copy Short Code*/
430 513 async function __tagembed__copyCodeEmbed(__tagembed__codeType, __tagembed__copyEmbedId) {
@@ -435,9 +518,9 @@
435 518 let __tagembed__toast = new TagembedToast;
436 519 let __tagembed__copyEmbedCode = "";
437 520 switch (__tagembed__codeType) {
438 521 case "shortCode":
439 - __tagembed__copyEmbedCode = document.querySelector(`#${__tagembed__copyEmbedId}`).innerHTML;
522 + __tagembed__copyEmbedCode = document.querySelector(`#${__tagembed__copyEmbedId}`).textContent;
440 523 break;
441 524 case "embedCode":
442 525 __tagembed__copyEmbedCode = document.querySelector(`#${__tagembed__copyEmbedId}`).value;
443 526 break;