diff options
| -rw-r--r-- | addons/web/static/src/js/core/ajax.js | 2 | ||||
| -rw-r--r-- | addons/website/static/src/js/editor/snippets.options.js | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/addons/web/static/src/js/core/ajax.js b/addons/web/static/src/js/core/ajax.js index ae3194e2a45..a35c793e5c6 100644 --- a/addons/web/static/src/js/core/ajax.js +++ b/addons/web/static/src/js/core/ajax.js @@ -164,6 +164,8 @@ var loadCSS = (function () { urlDefs[url] = new Promise(function (resolve, reject) { $link.on('load', function () { resolve(); + }).on('error', function () { + reject(new Error("Couldn't load css dependency: " + $link[0].href)); }); }); $('head').append($link); diff --git a/addons/website/static/src/js/editor/snippets.options.js b/addons/website/static/src/js/editor/snippets.options.js index 5225c57b249..abd32016131 100644 --- a/addons/website/static/src/js/editor/snippets.options.js +++ b/addons/website/static/src/js/editor/snippets.options.js @@ -159,7 +159,7 @@ const FontFamilyPickerUserValueWidget = SelectUserValueWidget.extend({ { text: _t("Save & Reload"), classes: 'btn-primary', - click: () => { + click: async () => { const inputEl = dialog.el.querySelector('.o_input_google_font'); // if font page link (what is expected) let m = inputEl.value.match(/\bspecimen\/([\w+]+)/); @@ -171,6 +171,24 @@ const FontFamilyPickerUserValueWidget = SelectUserValueWidget.extend({ return; } } + + let isValidFamily = false; + + try { + const result = await fetch("https://fonts.googleapis.com/css?family=" + m[1], {method: 'HEAD'}); + // Google fonts server returns a 400 status code if family is not valid. + if (result.ok) { + isValidFamily = true; + } + } catch (error) { + console.error(error); + } + + if (!isValidFamily) { + inputEl.classList.add('is-invalid'); + return; + } + const font = m[1].replace(/\+/g, ' '); this.googleFonts.push(font); this.trigger_up('google_fonts_custo_request', { |
